git.delta.rocks / unique-network / refs/commits / ec349b062948

difftreelog

feat impl transfer, transer_from, transfer_cross, transfer_from_cross,

Trubnikov Sergey2023-04-21parent: #1e5b247.patch.diff
in: master

6 files changed

modifiedpallets/balances-adapter/src/erc.rsdiffbeforeafterboth
1use crate::Config;1use crate::Config;
2use evm_coder::{abi::AbiType, AbiCoder, ToLog, generate_stubgen, solidity_interface, types::*};2use evm_coder::{abi::AbiType, AbiCoder, ToLog, generate_stubgen, solidity_interface, types::*};
3use frame_support::traits::Currency;3use frame_support::traits::{Currency, ExistenceRequirement};
4use pallet_common::erc::{CommonEvmHandler, CrossAccountId, PrecompileHandle, PrecompileResult};4use pallet_common::{
5 erc::{CommonEvmHandler, CrossAccountId, PrecompileHandle, PrecompileResult},
6 eth::CrossAddress,
7};
5use pallet_evm_coder_substrate::{8use pallet_evm_coder_substrate::{
6 call, dispatch_to_evm,9 call, dispatch_to_evm,
7 execution::{PreDispatch, Result},10 execution::{PreDispatch, Result},
8285
83 // #[weight(<SelfWeightOf<T>>::transfer())]86 // #[weight(<SelfWeightOf<T>>::transfer())]
84 fn transfer(&mut self, caller: Caller, to: Address, amount: U256) -> Result<bool> {87 fn transfer(&mut self, caller: Caller, to: Address, amount: U256) -> Result<bool> {
85 // let caller = T::CrossAccountId::from_eth(caller);88 let caller = T::CrossAccountId::from_eth(caller);
86 // let to = T::CrossAccountId::from_eth(to);89 let to = T::CrossAccountId::from_eth(to);
87 // let amount = amount.try_into().map_err(|_| "amount overflow")?;90 let amount = amount.try_into().map_err(|_| "amount overflow")?;
88 // let budget = self91 // let budget = self
89 // .recorder92 // .recorder
90 // .weight_calls_budget(<StructureWeight<T>>::find_parent());93 // .weight_calls_budget(<StructureWeight<T>>::find_parent());
9194
92 // <Pallet<T>>::transfer(self, &caller, &to, amount, &budget).map_err(|_| "transfer error")?;95 // <Pallet<T>>::transfer(self, &caller, &to, amount, &budget).map_err(|_| "transfer error")?;
93 // Ok(true)96 <T as Config>::Currency::transfer(
97 caller.as_sub(),
94 todo!()98 to.as_sub(),
99 amount,
100 ExistenceRequirement::KeepAlive,
101 )
102 .map_err(dispatch_to_evm::<T>);
103 Ok(true)
95 }104 }
96105
97 // #[weight(<SelfWeightOf<T>>::transfer_from())]106 // #[weight(<SelfWeightOf<T>>::transfer_from())]
102 to: Address,111 to: Address,
103 amount: U256,112 amount: U256,
104 ) -> Result<bool> {113 ) -> Result<bool> {
105 // let caller = T::CrossAccountId::from_eth(caller);114 let caller = T::CrossAccountId::from_eth(caller);
106 // let from = T::CrossAccountId::from_eth(from);115 let from = T::CrossAccountId::from_eth(from);
107 // let to = T::CrossAccountId::from_eth(to);116 let to = T::CrossAccountId::from_eth(to);
108 // let amount = amount.try_into().map_err(|_| "amount overflow")?;117 let amount = amount.try_into().map_err(|_| "amount overflow")?;
118
119 if (from != to) {
120 return Err("no permission".into());
121 }
109 // let budget = self122 // let budget = self
110 // .recorder123 // .recorder
111 // .weight_calls_budget(<StructureWeight<T>>::find_parent());124 // .weight_calls_budget(<StructureWeight<T>>::find_parent());
112125
113 // <Pallet<T>>::transfer_from(self, &caller, &from, &to, amount, &budget)126 // <Pallet<T>>::transfer_from(self, &caller, &from, &to, amount, &budget)
114 // .map_err(dispatch_to_evm::<T>)?;127 // .map_err(dispatch_to_evm::<T>)?;
115 // Ok(true)128 <T as Config>::Currency::transfer(
129 caller.as_sub(),
116 todo!()130 to.as_sub(),
131 amount,
132 ExistenceRequirement::KeepAlive,
133 )
134 .map_err(dispatch_to_evm::<T>);
135 Ok(true)
117 }136 }
118}137}
138
139#[solidity_interface(name = ERC20UniqueExtensions, enum(derive(PreDispatch)), enum_attr(weight))]
140impl<T: Config> NativeFungibleHandle<T>
141where
142 T::AccountId: From<[u8; 32]>,
143{
144 // #[weight(<SelfWeightOf<T>>::transfer())]
145 fn transfer_cross(&mut self, caller: Caller, to: CrossAddress, amount: U256) -> Result<bool> {
146 let caller = T::CrossAccountId::from_eth(caller);
147 let to = to.into_sub_cross_account::<T>()?;
148 let amount = amount.try_into().map_err(|_| "amount overflow")?;
149 // let budget = self
150 // .recorder
151 // .weight_calls_budget(<StructureWeight<T>>::find_parent());
152
153 // <Pallet<T>>::transfer(self, &caller, &to, amount, &budget).map_err(|_| "transfer error")?;
154 <T as Config>::Currency::transfer(
155 caller.as_sub(),
156 to.as_sub(),
157 amount,
158 ExistenceRequirement::KeepAlive,
159 )
160 .map_err(dispatch_to_evm::<T>);
161 Ok(true)
162 }
163
164 // #[weight(<SelfWeightOf<T>>::transfer_from())]
165 fn transfer_from_cross(
166 &mut self,
167 caller: Caller,
168 from: CrossAddress,
169 to: CrossAddress,
170 amount: U256,
171 ) -> Result<bool> {
172 let caller = T::CrossAccountId::from_eth(caller);
173 let from = from.into_sub_cross_account::<T>()?;
174 let to = to.into_sub_cross_account::<T>()?;
175 let amount = amount.try_into().map_err(|_| "amount overflow")?;
176
177 if (from != to) {
178 return Err("no permission".into());
179 }
180
181 // let budget = self
182 // .recorder
183 // .weight_calls_budget(<StructureWeight<T>>::find_parent());
184
185 // <Pallet<T>>::transfer_from(self, &caller, &from, &to, amount, &budget)
186 // .map_err(dispatch_to_evm::<T>)?;
187 <T as Config>::Currency::transfer(
188 caller.as_sub(),
189 to.as_sub(),
190 amount,
191 ExistenceRequirement::KeepAlive,
192 )
193 .map_err(dispatch_to_evm::<T>);
194 Ok(true)
195 }
196}
119197
120#[solidity_interface(198#[solidity_interface(
121 name = UniqueNativeFungible,199 name = UniqueNativeFungible,
122 is(ERC20),200 is(ERC20, ERC20UniqueExtensions),
123 enum(derive(PreDispatch))201 enum(derive(PreDispatch))
124)]202)]
125impl<T: Config> NativeFungibleHandle<T> where T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]> {}203impl<T: Config> NativeFungibleHandle<T> where T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]> {}
modifiedpallets/balances-adapter/src/lib.rsdiffbeforeafterboth
--- a/pallets/balances-adapter/src/lib.rs
+++ b/pallets/balances-adapter/src/lib.rs
@@ -17,7 +17,7 @@
 			Self::AccountId,
 			Balance = Self::CurrencyBalance,
 		>;
-		type CurrencyBalance: Into<U256>;
+		type CurrencyBalance: Into<U256> + TryFrom<U256>;
 
 		type Decimals: Get<u8>;
 		type Name: Get<String>;
modifiedpallets/balances-adapter/src/stubs/UniqueNativeFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/balances-adapter/src/stubs/UniqueNativeFungible.soldiffbeforeafterboth
--- a/pallets/balances-adapter/src/stubs/UniqueNativeFungible.sol
+++ b/pallets/balances-adapter/src/stubs/UniqueNativeFungible.sol
@@ -17,6 +17,40 @@
 	}
 }
 
+/// @dev the ERC-165 identifier for this interface is 0xff15c6f4
+contract ERC20UniqueExtensions is Dummy, ERC165 {
+	/// @dev EVM selector for this function is: 0x2ada85ff,
+	///  or in textual repr: transferCross((address,uint256),uint256)
+	function transferCross(CrossAddress memory to, uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		to;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
+	/// @dev EVM selector for this function is: 0xd5cf430b,
+	///  or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)
+	function transferFromCross(
+		CrossAddress memory from,
+		CrossAddress memory to,
+		uint256 amount
+	) public returns (bool) {
+		require(false, stub_error);
+		from;
+		to;
+		amount;
+		dummy = 0;
+		return false;
+	}
+}
+
+/// Cross account struct
+struct CrossAddress {
+	address eth;
+	uint256 sub;
+}
+
 /// @dev inlined interface
 contract ERC20Events {
 	event Transfer(address indexed from, address indexed to, uint256 value);
@@ -25,26 +59,31 @@
 
 /// @dev the ERC-165 identifier for this interface is 0x942e8b22
 contract ERC20 is Dummy, ERC165, ERC20Events {
-	/// @dev EVM selector for this function is: 0x06fdde03,
-	///  or in textual repr: name()
-	function name() public view returns (string memory) {
+	/// @dev EVM selector for this function is: 0xdd62ed3e,
+	///  or in textual repr: allowance(address,address)
+	function allowance(address owner, address spender) public view returns (uint256) {
 		require(false, stub_error);
+		owner;
+		spender;
 		dummy;
-		return "";
+		return 0;
 	}
 
-	/// @dev EVM selector for this function is: 0x95d89b41,
-	///  or in textual repr: symbol()
-	function symbol() public view returns (string memory) {
+	/// @dev EVM selector for this function is: 0x095ea7b3,
+	///  or in textual repr: approve(address,uint256)
+	function approve(address spender, uint256 amount) public returns (bool) {
 		require(false, stub_error);
-		dummy;
-		return "";
+		spender;
+		amount;
+		dummy = 0;
+		return false;
 	}
 
-	/// @dev EVM selector for this function is: 0x18160ddd,
-	///  or in textual repr: totalSupply()
-	function totalSupply() public view returns (uint256) {
+	/// @dev EVM selector for this function is: 0x70a08231,
+	///  or in textual repr: balanceOf(address)
+	function balanceOf(address owner) public view returns (uint256) {
 		require(false, stub_error);
+		owner;
 		dummy;
 		return 0;
 	}
@@ -57,11 +96,26 @@
 		return 0;
 	}
 
-	/// @dev EVM selector for this function is: 0x70a08231,
-	///  or in textual repr: balanceOf(address)
-	function balanceOf(address owner) public view returns (uint256) {
+	/// @dev EVM selector for this function is: 0x06fdde03,
+	///  or in textual repr: name()
+	function name() public view returns (string memory) {
+		require(false, stub_error);
+		dummy;
+		return "";
+	}
+
+	/// @dev EVM selector for this function is: 0x95d89b41,
+	///  or in textual repr: symbol()
+	function symbol() public view returns (string memory) {
+		require(false, stub_error);
+		dummy;
+		return "";
+	}
+
+	/// @dev EVM selector for this function is: 0x18160ddd,
+	///  or in textual repr: totalSupply()
+	function totalSupply() public view returns (uint256) {
 		require(false, stub_error);
-		owner;
 		dummy;
 		return 0;
 	}
@@ -90,26 +144,6 @@
 		dummy = 0;
 		return false;
 	}
-
-	/// @dev EVM selector for this function is: 0x095ea7b3,
-	///  or in textual repr: approve(address,uint256)
-	function approve(address spender, uint256 amount) public returns (bool) {
-		require(false, stub_error);
-		spender;
-		amount;
-		dummy = 0;
-		return false;
-	}
-
-	/// @dev EVM selector for this function is: 0xdd62ed3e,
-	///  or in textual repr: allowance(address,address)
-	function allowance(address owner, address spender) public view returns (uint256) {
-		require(false, stub_error);
-		owner;
-		spender;
-		dummy;
-		return 0;
-	}
 }
 
-contract UniqueNativeFungible is Dummy, ERC165, ERC20 {}
+contract UniqueNativeFungible is Dummy, ERC165, ERC20, ERC20UniqueExtensions {}
modifiedtests/src/eth/abi/nativeFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nativeFungible.json
+++ b/tests/src/eth/abi/nativeFungible.json
@@ -127,6 +127,24 @@
   },
   {
     "inputs": [
+      {
+        "components": [
+          { "internalType": "address", "name": "eth", "type": "address" },
+          { "internalType": "uint256", "name": "sub", "type": "uint256" }
+        ],
+        "internalType": "struct CrossAddress",
+        "name": "to",
+        "type": "tuple"
+      },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "transferCross",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "address", "name": "from", "type": "address" },
       { "internalType": "address", "name": "to", "type": "address" },
       { "internalType": "uint256", "name": "amount", "type": "uint256" }
@@ -135,5 +153,32 @@
     "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
     "stateMutability": "nonpayable",
     "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          { "internalType": "address", "name": "eth", "type": "address" },
+          { "internalType": "uint256", "name": "sub", "type": "uint256" }
+        ],
+        "internalType": "struct CrossAddress",
+        "name": "from",
+        "type": "tuple"
+      },
+      {
+        "components": [
+          { "internalType": "address", "name": "eth", "type": "address" },
+          { "internalType": "uint256", "name": "sub", "type": "uint256" }
+        ],
+        "internalType": "struct CrossAddress",
+        "name": "to",
+        "type": "tuple"
+      },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "transferFromCross",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
   }
 ]
modifiedtests/src/eth/api/UniqueNativeFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNativeFungible.sol
+++ b/tests/src/eth/api/UniqueNativeFungible.sol
@@ -12,6 +12,27 @@
 	function supportsInterface(bytes4 interfaceID) external view returns (bool);
 }
 
+/// @dev the ERC-165 identifier for this interface is 0xff15c6f4
+interface ERC20UniqueExtensions is Dummy, ERC165 {
+	/// @dev EVM selector for this function is: 0x2ada85ff,
+	///  or in textual repr: transferCross((address,uint256),uint256)
+	function transferCross(CrossAddress memory to, uint256 amount) external returns (bool);
+
+	/// @dev EVM selector for this function is: 0xd5cf430b,
+	///  or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)
+	function transferFromCross(
+		CrossAddress memory from,
+		CrossAddress memory to,
+		uint256 amount
+	) external returns (bool);
+}
+
+/// Cross account struct
+struct CrossAddress {
+	address eth;
+	uint256 sub;
+}
+
 /// @dev inlined interface
 interface ERC20Events {
 	event Transfer(address indexed from, address indexed to, uint256 value);
@@ -20,6 +41,22 @@
 
 /// @dev the ERC-165 identifier for this interface is 0x942e8b22
 interface ERC20 is Dummy, ERC165, ERC20Events {
+	/// @dev EVM selector for this function is: 0xdd62ed3e,
+	///  or in textual repr: allowance(address,address)
+	function allowance(address owner, address spender) external view returns (uint256);
+
+	/// @dev EVM selector for this function is: 0x095ea7b3,
+	///  or in textual repr: approve(address,uint256)
+	function approve(address spender, uint256 amount) external returns (bool);
+
+	/// @dev EVM selector for this function is: 0x70a08231,
+	///  or in textual repr: balanceOf(address)
+	function balanceOf(address owner) external view returns (uint256);
+
+	/// @dev EVM selector for this function is: 0x313ce567,
+	///  or in textual repr: decimals()
+	function decimals() external view returns (uint8);
+
 	/// @dev EVM selector for this function is: 0x06fdde03,
 	///  or in textual repr: name()
 	function name() external view returns (string memory);
@@ -32,14 +69,6 @@
 	///  or in textual repr: totalSupply()
 	function totalSupply() external view returns (uint256);
 
-	/// @dev EVM selector for this function is: 0x313ce567,
-	///  or in textual repr: decimals()
-	function decimals() external view returns (uint8);
-
-	/// @dev EVM selector for this function is: 0x70a08231,
-	///  or in textual repr: balanceOf(address)
-	function balanceOf(address owner) external view returns (uint256);
-
 	/// @dev EVM selector for this function is: 0xa9059cbb,
 	///  or in textual repr: transfer(address,uint256)
 	function transfer(address to, uint256 amount) external returns (bool);
@@ -51,14 +80,6 @@
 		address to,
 		uint256 amount
 	) external returns (bool);
-
-	/// @dev EVM selector for this function is: 0x095ea7b3,
-	///  or in textual repr: approve(address,uint256)
-	function approve(address spender, uint256 amount) external returns (bool);
-
-	/// @dev EVM selector for this function is: 0xdd62ed3e,
-	///  or in textual repr: allowance(address,address)
-	function allowance(address owner, address spender) external view returns (uint256);
 }
 
-interface UniqueNativeFungible is Dummy, ERC165, ERC20 {}
+interface UniqueNativeFungible is Dummy, ERC165, ERC20, ERC20UniqueExtensions {}