difftreelog
feature: Added `transfer_cross` in eth functions.
in: master
22 files changed
Cargo.lockdiffbeforeafterboth612161216122[[package]]6122[[package]]6123name = "pallet-fungible"6123name = "pallet-fungible"6124version = "0.1.6"6124version = "0.1.7"6125dependencies = [6125dependencies = [6126 "ethereum",6126 "ethereum",6127 "evm-coder",6127 "evm-coder",637663766377[[package]]6377[[package]]6378name = "pallet-nonfungible"6378name = "pallet-nonfungible"6379version = "0.1.8"6379version = "0.1.9"6380dependencies = [6380dependencies = [6381 "ethereum",6381 "ethereum",6382 "evm-coder",6382 "evm-coder",649864986499[[package]]6499[[package]]6500name = "pallet-refungible"6500name = "pallet-refungible"6501version = "0.2.7"6501version = "0.2.8"6502dependencies = [6502dependencies = [6503 "derivative",6503 "derivative",6504 "ethereum",6504 "ethereum",pallets/fungible/CHANGELOG.mddiffbeforeafterboth223All notable changes to this project will be documented in this file.3All notable changes to this project will be documented in this file.445<!-- bureaucrate goes here -->67## [0.1.7] - 2022-11-1489### Changed1011- Added `transfer_cross` in eth functions.125## [0.1.6] - 2022-11-0213## [0.1.6] - 2022-11-02146### Changed15### Changed7 - Use named structure `EthCrossAccount` in eth functions.81617- Use named structure `EthCrossAccount` in eth functions.189## [0.1.5] - 2022-08-2919## [0.1.5] - 2022-08-29102011### Added21### Added122213 - Implementation of `mint` and `mint_bulk` methods for ERC20 API.23- Implementation of `mint` and `mint_bulk` methods for ERC20 API.142415## [v0.1.4] - 2022-08-2425## [v0.1.4] - 2022-08-24162617### Change27### Change18 - Add bound `AsRef<[u8; 32]>` to `T::CrossAccountId`.192820<!-- bureaucrate goes here -->29- Add bound `AsRef<[u8; 32]>` to `T::CrossAccountId`.3021## [v0.1.3] 2022-08-1631## [v0.1.3] 2022-08-162232415142### Fixed52### Fixed435344 - Issue with ItemCreated event containing total supply of tokens instead minted amount54- Issue with ItemCreated event containing total supply of tokens instead minted amount455546## [0.1.1] - 2022-07-1456## [0.1.1] - 2022-07-14475748### Added58### Added495950 - Implementation of RPC method `token_owners` returning 10 owners in no particular order.60- Implementation of RPC method `token_owners` returning 10 owners in no particular order.51 This was an internal request to improve the web interface and support fractionalization event.61 This was an internal request to improve the web interface and support fractionalization event.5262pallets/fungible/Cargo.tomldiffbeforeafterboth1[package]1[package]2name = "pallet-fungible"2name = "pallet-fungible"3version = "0.1.6"3version = "0.1.7"4license = "GPLv3"4license = "GPLv3"5edition = "2021"5edition = "2021"66pallets/fungible/src/erc.rsdiffbeforeafterboth238 Ok(true)239 Ok(true)239 }240 }241242 #[weight(<SelfWeightOf<T>>::transfer())]243 fn transfer_cross(244 &mut self,245 caller: caller,246 to: EthCrossAccount,247 amount: uint256,248 ) -> Result<bool> {249 let caller = T::CrossAccountId::from_eth(caller);250 let to = to.into_sub_cross_account::<T>()?;251 let amount = amount.try_into().map_err(|_| "amount overflow")?;252 let budget = self253 .recorder254 .weight_calls_budget(<StructureWeight<T>>::find_parent());255256 <Pallet<T>>::transfer(self, &caller, &to, amount, &budget).map_err(|_| "transfer error")?;257 Ok(true)258 }240259241 #[weight(<SelfWeightOf<T>>::transfer_from())]260 #[weight(<SelfWeightOf<T>>::transfer_from())]242 fn transfer_from_cross(261 fn transfer_from_cross(pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth38 /// @param properties Vector of properties key/value pair.38 /// @param properties Vector of properties key/value pair.39 /// @dev EVM selector for this function is: 0x50b26b2a,39 /// @dev EVM selector for this function is: 0x50b26b2a,40 /// or in textual repr: setCollectionProperties((string,bytes)[])40 /// or in textual repr: setCollectionProperties((string,bytes)[])41 function setCollectionProperties(Tuple14[] memory properties) public {41 function setCollectionProperties(Tuple15[] memory properties) public {42 require(false, stub_error);42 require(false, stub_error);43 properties;43 properties;44 dummy = 0;44 dummy = 0;87 /// @return Vector of properties key/value pairs.87 /// @return Vector of properties key/value pairs.88 /// @dev EVM selector for this function is: 0x285fb8e6,88 /// @dev EVM selector for this function is: 0x285fb8e6,89 /// or in textual repr: collectionProperties(string[])89 /// or in textual repr: collectionProperties(string[])90 function collectionProperties(string[] memory keys) public view returns (Tuple14[] memory) {90 function collectionProperties(string[] memory keys) public view returns (Tuple15[] memory) {91 require(false, stub_error);91 require(false, stub_error);92 keys;92 keys;93 dummy;93 dummy;94 return new Tuple14[](0);94 return new Tuple15[](0);95 }95 }969697 /// Set the sponsor of the collection.97 /// Set the sponsor of the collection.439}439}440440441/// @dev anonymous struct441/// @dev anonymous struct442struct Tuple14 {442struct Tuple15 {443 string field_0;443 string field_0;444 bytes field_1;444 bytes field_1;445}445}446446447/// @dev the ERC-165 identifier for this interface is 0x032e5926447/// @dev the ERC-165 identifier for this interface is 0x29f4dcd9448contract ERC20UniqueExtensions is Dummy, ERC165 {448contract ERC20UniqueExtensions is Dummy, ERC165 {449 /// @dev EVM selector for this function is: 0x0ecd0ab0,449 /// @dev EVM selector for this function is: 0x0ecd0ab0,450 /// or in textual repr: approveCross((address,uint256),uint256)450 /// or in textual repr: approveCross((address,uint256),uint256)497 return false;497 return false;498 }498 }499500 /// @dev EVM selector for this function is: 0x2ada85ff,501 /// or in textual repr: transferCross((address,uint256),uint256)502 function transferCross(EthCrossAccount memory to, uint256 amount) public returns (bool) {503 require(false, stub_error);504 to;505 amount;506 dummy = 0;507 return false;508 }499509500 /// @dev EVM selector for this function is: 0xd5cf430b,510 /// @dev EVM selector for this function is: 0xd5cf430b,501 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)511 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)pallets/nonfungible/CHANGELOG.mddiffbeforeafterboth445<!-- bureaucrate goes here -->5<!-- bureaucrate goes here -->667## [0.1.9] - 2022-11-1489### Changed1011- Added `transfer_cross` in eth functions.127## [v0.1.8] - 2022-11-1113## [v0.1.8] - 2022-11-118149### Changed15### Changedpallets/nonfungible/Cargo.tomldiffbeforeafterboth1[package]1[package]2name = "pallet-nonfungible"2name = "pallet-nonfungible"3version = "0.1.8"3version = "0.1.9"4license = "GPLv3"4license = "GPLv3"5edition = "2021"5edition = "2021"66pallets/nonfungible/src/erc.rsdiffbeforeafterboth739 Ok(())739 Ok(())740 }740 }741741 742 /// @notice Transfer ownership of an NFT743 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`744 /// is the zero address. Throws if `tokenId` is not a valid NFT.745 /// @param to The new owner746 /// @param tokenId The NFT to transfer747 #[weight(<SelfWeightOf<T>>::transfer())]748 fn transfer_cross(&mut self, caller: caller, to: EthCrossAccount, token_id: uint256) -> Result<void> {749 let caller = T::CrossAccountId::from_eth(caller);750 let to = to.into_sub_cross_account::<T>()?;751 let token = token_id.try_into()?;752 let budget = self753 .recorder754 .weight_calls_budget(<StructureWeight<T>>::find_parent());755756 <Pallet<T>>::transfer(self, &caller, &to, token, &budget).map_err(dispatch_to_evm::<T>)?;757 Ok(())758 }759 742 /// @notice Transfer ownership of an NFT from cross account address to cross account address760 /// @notice Transfer ownership of an NFT from cross account address to cross account address743 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`761 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth67 /// @param properties settable properties67 /// @param properties settable properties68 /// @dev EVM selector for this function is: 0x14ed3a6e,68 /// @dev EVM selector for this function is: 0x14ed3a6e,69 /// or in textual repr: setProperties(uint256,(string,bytes)[])69 /// or in textual repr: setProperties(uint256,(string,bytes)[])70 function setProperties(uint256 tokenId, Tuple21[] memory properties) public {70 function setProperties(uint256 tokenId, Tuple22[] memory properties) public {71 require(false, stub_error);71 require(false, stub_error);72 tokenId;72 tokenId;73 properties;73 properties;137 /// @param properties Vector of properties key/value pair.137 /// @param properties Vector of properties key/value pair.138 /// @dev EVM selector for this function is: 0x50b26b2a,138 /// @dev EVM selector for this function is: 0x50b26b2a,139 /// or in textual repr: setCollectionProperties((string,bytes)[])139 /// or in textual repr: setCollectionProperties((string,bytes)[])140 function setCollectionProperties(Tuple21[] memory properties) public {140 function setCollectionProperties(Tuple22[] memory properties) public {141 require(false, stub_error);141 require(false, stub_error);142 properties;142 properties;143 dummy = 0;143 dummy = 0;186 /// @return Vector of properties key/value pairs.186 /// @return Vector of properties key/value pairs.187 /// @dev EVM selector for this function is: 0x285fb8e6,187 /// @dev EVM selector for this function is: 0x285fb8e6,188 /// or in textual repr: collectionProperties(string[])188 /// or in textual repr: collectionProperties(string[])189 function collectionProperties(string[] memory keys) public view returns (Tuple21[] memory) {189 function collectionProperties(string[] memory keys) public view returns (Tuple22[] memory) {190 require(false, stub_error);190 require(false, stub_error);191 keys;191 keys;192 dummy;192 dummy;193 return new Tuple21[](0);193 return new Tuple22[](0);194 }194 }195195196 /// Set the sponsor of the collection.196 /// Set the sponsor of the collection.251 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.251 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.252 /// @dev EVM selector for this function is: 0x6ec0a9f1,252 /// @dev EVM selector for this function is: 0x6ec0a9f1,253 /// or in textual repr: collectionSponsor()253 /// or in textual repr: collectionSponsor()254 function collectionSponsor() public view returns (Tuple24 memory) {254 function collectionSponsor() public view returns (Tuple25 memory) {255 require(false, stub_error);255 require(false, stub_error);256 dummy;256 dummy;257 return Tuple24(0x0000000000000000000000000000000000000000, 0);257 return Tuple25(0x0000000000000000000000000000000000000000, 0);258 }258 }259259260 /// Set limits for the collection.260 /// Set limits for the collection.538}538}539539540/// @dev anonymous struct540/// @dev anonymous struct541struct Tuple24 {541struct Tuple25 {542 address field_0;542 address field_0;543 uint256 field_1;543 uint256 field_1;544}544}545545546/// @dev anonymous struct546/// @dev anonymous struct547struct Tuple21 {547struct Tuple22 {548 string field_0;548 string field_0;549 bytes field_1;549 bytes field_1;550}550}693}693}694694695/// @title Unique extensions for ERC721.695/// @title Unique extensions for ERC721.696/// @dev the ERC-165 identifier for this interface is 0x244543ee696/// @dev the ERC-165 identifier for this interface is 0x0e9fc611697contract ERC721UniqueExtensions is Dummy, ERC165 {697contract ERC721UniqueExtensions is Dummy, ERC165 {698 /// @notice A descriptive name for a collection of NFTs in this contract698 /// @notice A descriptive name for a collection of NFTs in this contract699 /// @dev EVM selector for this function is: 0x06fdde03,699 /// @dev EVM selector for this function is: 0x06fdde03,742 dummy = 0;742 dummy = 0;743 }743 }744745 /// @notice Transfer ownership of an NFT746 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`747 /// is the zero address. Throws if `tokenId` is not a valid NFT.748 /// @param to The new owner749 /// @param tokenId The NFT to transfer750 /// @dev EVM selector for this function is: 0x2ada85ff,751 /// or in textual repr: transferCross((address,uint256),uint256)752 function transferCross(EthCrossAccount memory to, uint256 tokenId) public {753 require(false, stub_error);754 to;755 tokenId;756 dummy = 0;757 }744758745 /// @notice Transfer ownership of an NFT from cross account address to cross account address759 /// @notice Transfer ownership of an NFT from cross account address to cross account address746 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`760 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`822 // /// @param tokens array of pairs of token ID and token URI for minted tokens836 // /// @param tokens array of pairs of token ID and token URI for minted tokens823 // /// @dev EVM selector for this function is: 0x36543006,837 // /// @dev EVM selector for this function is: 0x36543006,824 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])838 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])825 // function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) public returns (bool) {839 // function mintBulkWithTokenURI(address to, Tuple11[] memory tokens) public returns (bool) {826 // require(false, stub_error);840 // require(false, stub_error);827 // to;841 // to;828 // tokens;842 // tokens;833}847}834848835/// @dev anonymous struct849/// @dev anonymous struct836struct Tuple10 {850struct Tuple11 {837 uint256 field_0;851 uint256 field_0;838 string field_1;852 string field_1;839}853}pallets/refungible/CHANGELOG.mddiffbeforeafterboth445<!-- bureaucrate goes here -->5<!-- bureaucrate goes here -->667## [0.2.8] - 2022-11-1489### Changed1011- Added `transfer_cross` in eth functions.127## [v0.2.7] - 2022-11-1113## [v0.2.7] - 2022-11-118149### Changed15### Changedpallets/refungible/Cargo.tomldiffbeforeafterboth1[package]1[package]2name = "pallet-refungible"2name = "pallet-refungible"3version = "0.2.7"3version = "0.2.8"4license = "GPLv3"4license = "GPLv3"5edition = "2021"5edition = "2021"66pallets/refungible/src/erc.rsdiffbeforeafterboth749 Ok(())749 Ok(())750 }750 }751752 /// @notice Transfer ownership of an RFT753 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`754 /// is the zero address. Throws if `tokenId` is not a valid RFT.755 /// Throws if RFT pieces have multiple owners.756 /// @param to The new owner757 /// @param tokenId The RFT to transfer758 #[weight(<SelfWeightOf<T>>::transfer_creating_removing())]759 fn transfer_cross(&mut self, caller: caller, to: EthCrossAccount, token_id: uint256) -> Result<void> {760 let caller = T::CrossAccountId::from_eth(caller);761 let to = to.into_sub_cross_account::<T>()?;762 let token = token_id.try_into()?;763 let budget = self764 .recorder765 .weight_calls_budget(<StructureWeight<T>>::find_parent());766767 let balance = balance(self, token, &caller)?;768 ensure_single_owner(self, token, balance)?;769770 <Pallet<T>>::transfer(self, &caller, &to, token, balance, &budget)771 .map_err(dispatch_to_evm::<T>)?;772 Ok(())773 }751774752 /// @notice Transfer ownership of an RFT775 /// @notice Transfer ownership of an RFT753 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`776 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth67 /// @param properties settable properties67 /// @param properties settable properties68 /// @dev EVM selector for this function is: 0x14ed3a6e,68 /// @dev EVM selector for this function is: 0x14ed3a6e,69 /// or in textual repr: setProperties(uint256,(string,bytes)[])69 /// or in textual repr: setProperties(uint256,(string,bytes)[])70 function setProperties(uint256 tokenId, Tuple20[] memory properties) public {70 function setProperties(uint256 tokenId, Tuple21[] memory properties) public {71 require(false, stub_error);71 require(false, stub_error);72 tokenId;72 tokenId;73 properties;73 properties;137 /// @param properties Vector of properties key/value pair.137 /// @param properties Vector of properties key/value pair.138 /// @dev EVM selector for this function is: 0x50b26b2a,138 /// @dev EVM selector for this function is: 0x50b26b2a,139 /// or in textual repr: setCollectionProperties((string,bytes)[])139 /// or in textual repr: setCollectionProperties((string,bytes)[])140 function setCollectionProperties(Tuple20[] memory properties) public {140 function setCollectionProperties(Tuple21[] memory properties) public {141 require(false, stub_error);141 require(false, stub_error);142 properties;142 properties;143 dummy = 0;143 dummy = 0;186 /// @return Vector of properties key/value pairs.186 /// @return Vector of properties key/value pairs.187 /// @dev EVM selector for this function is: 0x285fb8e6,187 /// @dev EVM selector for this function is: 0x285fb8e6,188 /// or in textual repr: collectionProperties(string[])188 /// or in textual repr: collectionProperties(string[])189 function collectionProperties(string[] memory keys) public view returns (Tuple20[] memory) {189 function collectionProperties(string[] memory keys) public view returns (Tuple21[] memory) {190 require(false, stub_error);190 require(false, stub_error);191 keys;191 keys;192 dummy;192 dummy;193 return new Tuple20[](0);193 return new Tuple21[](0);194 }194 }195195196 /// Set the sponsor of the collection.196 /// Set the sponsor of the collection.251 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.251 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.252 /// @dev EVM selector for this function is: 0x6ec0a9f1,252 /// @dev EVM selector for this function is: 0x6ec0a9f1,253 /// or in textual repr: collectionSponsor()253 /// or in textual repr: collectionSponsor()254 function collectionSponsor() public view returns (Tuple23 memory) {254 function collectionSponsor() public view returns (Tuple24 memory) {255 require(false, stub_error);255 require(false, stub_error);256 dummy;256 dummy;257 return Tuple23(0x0000000000000000000000000000000000000000, 0);257 return Tuple24(0x0000000000000000000000000000000000000000, 0);258 }258 }259259260 /// Set limits for the collection.260 /// Set limits for the collection.538}538}539539540/// @dev anonymous struct540/// @dev anonymous struct541struct Tuple23 {541struct Tuple24 {542 address field_0;542 address field_0;543 uint256 field_1;543 uint256 field_1;544}544}545545546/// @dev anonymous struct546/// @dev anonymous struct547struct Tuple20 {547struct Tuple21 {548 string field_0;548 string field_0;549 bytes field_1;549 bytes field_1;550}550}691}691}692692693/// @title Unique extensions for ERC721.693/// @title Unique extensions for ERC721.694/// @dev the ERC-165 identifier for this interface is 0x81feb398694/// @dev the ERC-165 identifier for this interface is 0xab243667695contract ERC721UniqueExtensions is Dummy, ERC165 {695contract ERC721UniqueExtensions is Dummy, ERC165 {696 /// @notice A descriptive name for a collection of NFTs in this contract696 /// @notice A descriptive name for a collection of NFTs in this contract697 /// @dev EVM selector for this function is: 0x06fdde03,697 /// @dev EVM selector for this function is: 0x06fdde03,730 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`730 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`731 /// is the zero address. Throws if `tokenId` is not a valid RFT.731 /// is the zero address. Throws if `tokenId` is not a valid RFT.732 /// Throws if RFT pieces have multiple owners.732 /// Throws if RFT pieces have multiple owners.733 /// @param to The new owner734 /// @param tokenId The RFT to transfer735 /// @dev EVM selector for this function is: 0x2ada85ff,736 /// or in textual repr: transferCross((address,uint256),uint256)737 function transferCross(EthCrossAccount memory to, uint256 tokenId) public {738 require(false, stub_error);739 to;740 tokenId;741 dummy = 0;742 }743744 /// @notice Transfer ownership of an RFT745 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`746 /// is the zero address. Throws if `tokenId` is not a valid RFT.747 /// Throws if RFT pieces have multiple owners.733 /// @param to The new owner748 /// @param to The new owner734 /// @param tokenId The RFT to transfer749 /// @param tokenId The RFT to transfer735 /// @dev EVM selector for this function is: 0xd5cf430b,750 /// @dev EVM selector for this function is: 0xd5cf430b,809 // /// @param tokens array of pairs of token ID and token URI for minted tokens824 // /// @param tokens array of pairs of token ID and token URI for minted tokens810 // /// @dev EVM selector for this function is: 0x36543006,825 // /// @dev EVM selector for this function is: 0x36543006,811 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])826 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])812 // function mintBulkWithTokenURI(address to, Tuple9[] memory tokens) public returns (bool) {827 // function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) public returns (bool) {813 // require(false, stub_error);828 // require(false, stub_error);814 // to;829 // to;815 // tokens;830 // tokens;831}846}832847833/// @dev anonymous struct848/// @dev anonymous struct834struct Tuple9 {849struct Tuple10 {835 uint256 field_0;850 uint256 field_0;836 string field_1;851 string field_1;837}852}tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth28 /// @param properties Vector of properties key/value pair.28 /// @param properties Vector of properties key/value pair.29 /// @dev EVM selector for this function is: 0x50b26b2a,29 /// @dev EVM selector for this function is: 0x50b26b2a,30 /// or in textual repr: setCollectionProperties((string,bytes)[])30 /// or in textual repr: setCollectionProperties((string,bytes)[])31 function setCollectionProperties(Tuple14[] memory properties) external;31 function setCollectionProperties(Tuple15[] memory properties) external;323233 /// Delete collection property.33 /// Delete collection property.34 ///34 ///60 /// @return Vector of properties key/value pairs.60 /// @return Vector of properties key/value pairs.61 /// @dev EVM selector for this function is: 0x285fb8e6,61 /// @dev EVM selector for this function is: 0x285fb8e6,62 /// or in textual repr: collectionProperties(string[])62 /// or in textual repr: collectionProperties(string[])63 function collectionProperties(string[] memory keys) external view returns (Tuple14[] memory);63 function collectionProperties(string[] memory keys) external view returns (Tuple15[] memory);646465 /// Set the sponsor of the collection.65 /// Set the sponsor of the collection.66 ///66 ///287}287}288288289/// @dev anonymous struct289/// @dev anonymous struct290struct Tuple14 {290struct Tuple15 {291 string field_0;291 string field_0;292 bytes field_1;292 bytes field_1;293}293}294294295/// @dev the ERC-165 identifier for this interface is 0x032e5926295/// @dev the ERC-165 identifier for this interface is 0x29f4dcd9296interface ERC20UniqueExtensions is Dummy, ERC165 {296interface ERC20UniqueExtensions is Dummy, ERC165 {297 /// @dev EVM selector for this function is: 0x0ecd0ab0,297 /// @dev EVM selector for this function is: 0x0ecd0ab0,298 /// or in textual repr: approveCross((address,uint256),uint256)298 /// or in textual repr: approveCross((address,uint256),uint256)322 /// or in textual repr: mintBulk((address,uint256)[])322 /// or in textual repr: mintBulk((address,uint256)[])323 function mintBulk(Tuple8[] memory amounts) external returns (bool);323 function mintBulk(Tuple8[] memory amounts) external returns (bool);324325 /// @dev EVM selector for this function is: 0x2ada85ff,326 /// or in textual repr: transferCross((address,uint256),uint256)327 function transferCross(EthCrossAccount memory to, uint256 amount) external returns (bool);324328325 /// @dev EVM selector for this function is: 0xd5cf430b,329 /// @dev EVM selector for this function is: 0xd5cf430b,326 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)330 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth49 /// @param properties settable properties49 /// @param properties settable properties50 /// @dev EVM selector for this function is: 0x14ed3a6e,50 /// @dev EVM selector for this function is: 0x14ed3a6e,51 /// or in textual repr: setProperties(uint256,(string,bytes)[])51 /// or in textual repr: setProperties(uint256,(string,bytes)[])52 function setProperties(uint256 tokenId, Tuple21[] memory properties) external;52 function setProperties(uint256 tokenId, Tuple22[] memory properties) external;535354 // /// @notice Delete token property value.54 // /// @notice Delete token property value.55 // /// @dev Throws error if `msg.sender` has no permission to edit the property.55 // /// @dev Throws error if `msg.sender` has no permission to edit the property.93 /// @param properties Vector of properties key/value pair.93 /// @param properties Vector of properties key/value pair.94 /// @dev EVM selector for this function is: 0x50b26b2a,94 /// @dev EVM selector for this function is: 0x50b26b2a,95 /// or in textual repr: setCollectionProperties((string,bytes)[])95 /// or in textual repr: setCollectionProperties((string,bytes)[])96 function setCollectionProperties(Tuple21[] memory properties) external;96 function setCollectionProperties(Tuple22[] memory properties) external;979798 /// Delete collection property.98 /// Delete collection property.99 ///99 ///125 /// @return Vector of properties key/value pairs.125 /// @return Vector of properties key/value pairs.126 /// @dev EVM selector for this function is: 0x285fb8e6,126 /// @dev EVM selector for this function is: 0x285fb8e6,127 /// or in textual repr: collectionProperties(string[])127 /// or in textual repr: collectionProperties(string[])128 function collectionProperties(string[] memory keys) external view returns (Tuple21[] memory);128 function collectionProperties(string[] memory keys) external view returns (Tuple22[] memory);129129130 /// Set the sponsor of the collection.130 /// Set the sponsor of the collection.131 ///131 ///167 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.167 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.168 /// @dev EVM selector for this function is: 0x6ec0a9f1,168 /// @dev EVM selector for this function is: 0x6ec0a9f1,169 /// or in textual repr: collectionSponsor()169 /// or in textual repr: collectionSponsor()170 function collectionSponsor() external view returns (Tuple24 memory);170 function collectionSponsor() external view returns (Tuple25 memory);171171172 /// Set limits for the collection.172 /// Set limits for the collection.173 /// @dev Throws error if limit not found.173 /// @dev Throws error if limit not found.352}352}353353354/// @dev anonymous struct354/// @dev anonymous struct355struct Tuple24 {355struct Tuple25 {356 address field_0;356 address field_0;357 uint256 field_1;357 uint256 field_1;358}358}359359360/// @dev anonymous struct360/// @dev anonymous struct361struct Tuple21 {361struct Tuple22 {362 string field_0;362 string field_0;363 bytes field_1;363 bytes field_1;364}364}458}458}459459460/// @title Unique extensions for ERC721.460/// @title Unique extensions for ERC721.461/// @dev the ERC-165 identifier for this interface is 0x244543ee461/// @dev the ERC-165 identifier for this interface is 0x0e9fc611462interface ERC721UniqueExtensions is Dummy, ERC165 {462interface ERC721UniqueExtensions is Dummy, ERC165 {463 /// @notice A descriptive name for a collection of NFTs in this contract463 /// @notice A descriptive name for a collection of NFTs in this contract464 /// @dev EVM selector for this function is: 0x06fdde03,464 /// @dev EVM selector for this function is: 0x06fdde03,489 /// or in textual repr: transfer(address,uint256)489 /// or in textual repr: transfer(address,uint256)490 function transfer(address to, uint256 tokenId) external;490 function transfer(address to, uint256 tokenId) external;491492 /// @notice Transfer ownership of an NFT493 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`494 /// is the zero address. Throws if `tokenId` is not a valid NFT.495 /// @param to The new owner496 /// @param tokenId The NFT to transfer497 /// @dev EVM selector for this function is: 0x2ada85ff,498 /// or in textual repr: transferCross((address,uint256),uint256)499 function transferCross(EthCrossAccount memory to, uint256 tokenId) external;491500492 /// @notice Transfer ownership of an NFT from cross account address to cross account address501 /// @notice Transfer ownership of an NFT from cross account address to cross account address493 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`502 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`543 // /// @param tokens array of pairs of token ID and token URI for minted tokens552 // /// @param tokens array of pairs of token ID and token URI for minted tokens544 // /// @dev EVM selector for this function is: 0x36543006,553 // /// @dev EVM selector for this function is: 0x36543006,545 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])554 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])546 // function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) external returns (bool);555 // function mintBulkWithTokenURI(address to, Tuple11[] memory tokens) external returns (bool);547556548}557}549558550/// @dev anonymous struct559/// @dev anonymous struct551struct Tuple10 {560struct Tuple11 {552 uint256 field_0;561 uint256 field_0;553 string field_1;562 string field_1;554}563}tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth49 /// @param properties settable properties49 /// @param properties settable properties50 /// @dev EVM selector for this function is: 0x14ed3a6e,50 /// @dev EVM selector for this function is: 0x14ed3a6e,51 /// or in textual repr: setProperties(uint256,(string,bytes)[])51 /// or in textual repr: setProperties(uint256,(string,bytes)[])52 function setProperties(uint256 tokenId, Tuple20[] memory properties) external;52 function setProperties(uint256 tokenId, Tuple21[] memory properties) external;535354 // /// @notice Delete token property value.54 // /// @notice Delete token property value.55 // /// @dev Throws error if `msg.sender` has no permission to edit the property.55 // /// @dev Throws error if `msg.sender` has no permission to edit the property.93 /// @param properties Vector of properties key/value pair.93 /// @param properties Vector of properties key/value pair.94 /// @dev EVM selector for this function is: 0x50b26b2a,94 /// @dev EVM selector for this function is: 0x50b26b2a,95 /// or in textual repr: setCollectionProperties((string,bytes)[])95 /// or in textual repr: setCollectionProperties((string,bytes)[])96 function setCollectionProperties(Tuple20[] memory properties) external;96 function setCollectionProperties(Tuple21[] memory properties) external;979798 /// Delete collection property.98 /// Delete collection property.99 ///99 ///125 /// @return Vector of properties key/value pairs.125 /// @return Vector of properties key/value pairs.126 /// @dev EVM selector for this function is: 0x285fb8e6,126 /// @dev EVM selector for this function is: 0x285fb8e6,127 /// or in textual repr: collectionProperties(string[])127 /// or in textual repr: collectionProperties(string[])128 function collectionProperties(string[] memory keys) external view returns (Tuple20[] memory);128 function collectionProperties(string[] memory keys) external view returns (Tuple21[] memory);129129130 /// Set the sponsor of the collection.130 /// Set the sponsor of the collection.131 ///131 ///167 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.167 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.168 /// @dev EVM selector for this function is: 0x6ec0a9f1,168 /// @dev EVM selector for this function is: 0x6ec0a9f1,169 /// or in textual repr: collectionSponsor()169 /// or in textual repr: collectionSponsor()170 function collectionSponsor() external view returns (Tuple23 memory);170 function collectionSponsor() external view returns (Tuple24 memory);171171172 /// Set limits for the collection.172 /// Set limits for the collection.173 /// @dev Throws error if limit not found.173 /// @dev Throws error if limit not found.352}352}353353354/// @dev anonymous struct354/// @dev anonymous struct355struct Tuple23 {355struct Tuple24 {356 address field_0;356 address field_0;357 uint256 field_1;357 uint256 field_1;358}358}359359360/// @dev anonymous struct360/// @dev anonymous struct361struct Tuple20 {361struct Tuple21 {362 string field_0;362 string field_0;363 bytes field_1;363 bytes field_1;364}364}456}456}457457458/// @title Unique extensions for ERC721.458/// @title Unique extensions for ERC721.459/// @dev the ERC-165 identifier for this interface is 0x81feb398459/// @dev the ERC-165 identifier for this interface is 0xab243667460interface ERC721UniqueExtensions is Dummy, ERC165 {460interface ERC721UniqueExtensions is Dummy, ERC165 {461 /// @notice A descriptive name for a collection of NFTs in this contract461 /// @notice A descriptive name for a collection of NFTs in this contract462 /// @dev EVM selector for this function is: 0x06fdde03,462 /// @dev EVM selector for this function is: 0x06fdde03,482 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`482 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`483 /// is the zero address. Throws if `tokenId` is not a valid RFT.483 /// is the zero address. Throws if `tokenId` is not a valid RFT.484 /// Throws if RFT pieces have multiple owners.484 /// Throws if RFT pieces have multiple owners.485 /// @param to The new owner486 /// @param tokenId The RFT to transfer487 /// @dev EVM selector for this function is: 0x2ada85ff,488 /// or in textual repr: transferCross((address,uint256),uint256)489 function transferCross(EthCrossAccount memory to, uint256 tokenId) external;490491 /// @notice Transfer ownership of an RFT492 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`493 /// is the zero address. Throws if `tokenId` is not a valid RFT.494 /// Throws if RFT pieces have multiple owners.485 /// @param to The new owner495 /// @param to The new owner486 /// @param tokenId The RFT to transfer496 /// @param tokenId The RFT to transfer487 /// @dev EVM selector for this function is: 0xd5cf430b,497 /// @dev EVM selector for this function is: 0xd5cf430b,535 // /// @param tokens array of pairs of token ID and token URI for minted tokens545 // /// @param tokens array of pairs of token ID and token URI for minted tokens536 // /// @dev EVM selector for this function is: 0x36543006,546 // /// @dev EVM selector for this function is: 0x36543006,537 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])547 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])538 // function mintBulkWithTokenURI(address to, Tuple9[] memory tokens) external returns (bool);548 // function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) external returns (bool);539549540 /// Returns EVM address for refungible token550 /// Returns EVM address for refungible token541 ///551 ///546}556}547557548/// @dev anonymous struct558/// @dev anonymous struct549struct Tuple9 {559struct Tuple10 {550 uint256 field_0;560 uint256 field_0;551 string field_1;561 string field_1;552}562}tests/src/eth/fungible.test.tsdiffbeforeafterboth230 }230 }231 });231 });232232233 itEth('Can perform transferCross()', async ({helper}) => {234 const owner = await helper.eth.createAccountWithBalance(donor);235 const receiver = await helper.eth.createAccountWithBalance(donor);236 const to = helper.ethCrossAccount.fromAddress(receiver);237 const collection = await helper.ft.mintCollection(alice);238 await collection.mint(alice, 200n, {Ethereum: owner});239240 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);241 const contract = helper.ethNativeContract.collection(collectionAddress, 'ft', owner);242243 {244 const result = await contract.methods.transferCross(to, 50).send({from: owner});245 246 const event = result.events.Transfer;247 expect(event.address).to.be.equal(collectionAddress);248 expect(event.returnValues.from).to.be.equal(owner);249 expect(event.returnValues.to).to.be.equal(receiver);250 expect(event.returnValues.value).to.be.equal('50');251 }252253 {254 const balance = await contract.methods.balanceOf(owner).call();255 expect(+balance).to.equal(150);256 }257258 {259 const balance = await contract.methods.balanceOf(receiver).call();260 expect(+balance).to.equal(50);261 }262 });263 233 itEth('Can perform transfer()', async ({helper}) => {264 itEth('Can perform transfer()', async ({helper}) => {234 const owner = await helper.eth.createAccountWithBalance(donor);265 const owner = await helper.eth.createAccountWithBalance(donor);tests/src/eth/fungibleAbi.jsondiffbeforeafterboth239 { "internalType": "string", "name": "field_0", "type": "string" },239 { "internalType": "string", "name": "field_0", "type": "string" },240 { "internalType": "bytes", "name": "field_1", "type": "bytes" }240 { "internalType": "bytes", "name": "field_1", "type": "bytes" }241 ],241 ],242 "internalType": "struct Tuple14[]",242 "internalType": "struct Tuple15[]",243 "name": "",243 "name": "",244 "type": "tuple[]"244 "type": "tuple[]"245 }245 }496 { "internalType": "string", "name": "field_0", "type": "string" },496 { "internalType": "string", "name": "field_0", "type": "string" },497 { "internalType": "bytes", "name": "field_1", "type": "bytes" }497 { "internalType": "bytes", "name": "field_1", "type": "bytes" }498 ],498 ],499 "internalType": "struct Tuple14[]",499 "internalType": "struct Tuple15[]",500 "name": "properties",500 "name": "properties",501 "type": "tuple[]"501 "type": "tuple[]"502 }502 }592 "stateMutability": "nonpayable",592 "stateMutability": "nonpayable",593 "type": "function"593 "type": "function"594 },594 },595 {596 "inputs": [597 {598 "components": [599 { "internalType": "address", "name": "eth", "type": "address" },600 { "internalType": "uint256", "name": "sub", "type": "uint256" }601 ],602 "internalType": "struct EthCrossAccount",603 "name": "to",604 "type": "tuple"605 },606 { "internalType": "uint256", "name": "amount", "type": "uint256" }607 ],608 "name": "transferCross",609 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],610 "stateMutability": "nonpayable",611 "type": "function"612 },595 {613 {596 "inputs": [614 "inputs": [597 { "internalType": "address", "name": "from", "type": "address" },615 { "internalType": "address", "name": "from", "type": "address" },tests/src/eth/nonFungible.test.tsdiffbeforeafterboth403 }403 }404 });404 });405 406 itEth('Can perform transferCross()', async ({helper}) => {407 const collection = await helper.nft.mintCollection(minter, {});408 const owner = await helper.eth.createAccountWithBalance(donor);409 const receiver = helper.eth.createAccount();410 const to = helper.ethCrossAccount.fromAddress(receiver);411 const {tokenId} = await collection.mintToken(minter, {Ethereum: owner});412413 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);414 const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);415416 {417 const result = await contract.methods.transferCross(to, tokenId).send({from: owner});418419 const event = result.events.Transfer;420 expect(event.address).to.be.equal(collectionAddress);421 expect(event.returnValues.from).to.be.equal(owner);422 expect(event.returnValues.to).to.be.equal(receiver);423 expect(event.returnValues.tokenId).to.be.equal(`${tokenId}`);424 }425426 {427 const balance = await contract.methods.balanceOf(owner).call();428 expect(+balance).to.equal(0);429 }430431 {432 const balance = await contract.methods.balanceOf(receiver).call();433 expect(+balance).to.equal(1);434 }435 });405});436});406437407describe('NFT: Fees', () => {438describe('NFT: Fees', () => {tests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth269 { "internalType": "string", "name": "field_0", "type": "string" },269 { "internalType": "string", "name": "field_0", "type": "string" },270 { "internalType": "bytes", "name": "field_1", "type": "bytes" }270 { "internalType": "bytes", "name": "field_1", "type": "bytes" }271 ],271 ],272 "internalType": "struct Tuple21[]",272 "internalType": "struct Tuple22[]",273 "name": "",273 "name": "",274 "type": "tuple[]"274 "type": "tuple[]"275 }275 }293 { "internalType": "address", "name": "field_0", "type": "address" },293 { "internalType": "address", "name": "field_0", "type": "address" },294 { "internalType": "uint256", "name": "field_1", "type": "uint256" }294 { "internalType": "uint256", "name": "field_1", "type": "uint256" }295 ],295 ],296 "internalType": "struct Tuple24",296 "internalType": "struct Tuple25",297 "name": "",297 "name": "",298 "type": "tuple"298 "type": "tuple"299 }299 }611 { "internalType": "string", "name": "field_0", "type": "string" },611 { "internalType": "string", "name": "field_0", "type": "string" },612 { "internalType": "bytes", "name": "field_1", "type": "bytes" }612 { "internalType": "bytes", "name": "field_1", "type": "bytes" }613 ],613 ],614 "internalType": "struct Tuple21[]",614 "internalType": "struct Tuple22[]",615 "name": "properties",615 "name": "properties",616 "type": "tuple[]"616 "type": "tuple[]"617 }617 }682 { "internalType": "string", "name": "field_0", "type": "string" },682 { "internalType": "string", "name": "field_0", "type": "string" },683 { "internalType": "bytes", "name": "field_1", "type": "bytes" }683 { "internalType": "bytes", "name": "field_1", "type": "bytes" }684 ],684 ],685 "internalType": "struct Tuple21[]",685 "internalType": "struct Tuple22[]",686 "name": "properties",686 "name": "properties",687 "type": "tuple[]"687 "type": "tuple[]"688 }688 }776 "stateMutability": "nonpayable",776 "stateMutability": "nonpayable",777 "type": "function"777 "type": "function"778 },778 },779 {780 "inputs": [781 {782 "components": [783 { "internalType": "address", "name": "eth", "type": "address" },784 { "internalType": "uint256", "name": "sub", "type": "uint256" }785 ],786 "internalType": "struct EthCrossAccount",787 "name": "to",788 "type": "tuple"789 },790 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }791 ],792 "name": "transferCross",793 "outputs": [],794 "stateMutability": "nonpayable",795 "type": "function"796 },779 {797 {780 "inputs": [798 "inputs": [781 { "internalType": "address", "name": "from", "type": "address" },799 { "internalType": "address", "name": "from", "type": "address" },tests/src/eth/reFungible.test.tsdiffbeforeafterboth360 }360 }361 });361 });362 363 itEth('Can perform transferCross()', async ({helper}) => {364 const caller = await helper.eth.createAccountWithBalance(donor);365 const receiver = helper.eth.createAccount();366 const to = helper.ethCrossAccount.fromAddress(receiver);367 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry', '6', '6');368 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);369370 const result = await contract.methods.mint(caller).send();371 const tokenId = result.events.Transfer.returnValues.tokenId;372373 {374 const result = await contract.methods.transferCross(to, tokenId).send({from: caller});375376 const event = result.events.Transfer;377 expect(event.address).to.equal(collectionAddress);378 expect(event.returnValues.from).to.equal(caller);379 expect(event.returnValues.to).to.equal(receiver);380 expect(event.returnValues.tokenId).to.equal(tokenId.toString());381 }382383 {384 const balance = await contract.methods.balanceOf(caller).call();385 expect(+balance).to.equal(0);386 }387388 {389 const balance = await contract.methods.balanceOf(receiver).call();390 expect(+balance).to.equal(1);391 }392 });362393363 itEth('transfer event on transfer from partial ownership to full ownership', async ({helper}) => {394 itEth('transfer event on transfer from partial ownership to full ownership', async ({helper}) => {364 const caller = await helper.eth.createAccountWithBalance(donor);395 const caller = await helper.eth.createAccountWithBalance(donor);tests/src/eth/reFungibleAbi.jsondiffbeforeafterboth251 { "internalType": "string", "name": "field_0", "type": "string" },251 { "internalType": "string", "name": "field_0", "type": "string" },252 { "internalType": "bytes", "name": "field_1", "type": "bytes" }252 { "internalType": "bytes", "name": "field_1", "type": "bytes" }253 ],253 ],254 "internalType": "struct Tuple20[]",254 "internalType": "struct Tuple21[]",255 "name": "",255 "name": "",256 "type": "tuple[]"256 "type": "tuple[]"257 }257 }275 { "internalType": "address", "name": "field_0", "type": "address" },275 { "internalType": "address", "name": "field_0", "type": "address" },276 { "internalType": "uint256", "name": "field_1", "type": "uint256" }276 { "internalType": "uint256", "name": "field_1", "type": "uint256" }277 ],277 ],278 "internalType": "struct Tuple23",278 "internalType": "struct Tuple24",279 "name": "",279 "name": "",280 "type": "tuple"280 "type": "tuple"281 }281 }593 { "internalType": "string", "name": "field_0", "type": "string" },593 { "internalType": "string", "name": "field_0", "type": "string" },594 { "internalType": "bytes", "name": "field_1", "type": "bytes" }594 { "internalType": "bytes", "name": "field_1", "type": "bytes" }595 ],595 ],596 "internalType": "struct Tuple20[]",596 "internalType": "struct Tuple21[]",597 "name": "properties",597 "name": "properties",598 "type": "tuple[]"598 "type": "tuple[]"599 }599 }664 { "internalType": "string", "name": "field_0", "type": "string" },664 { "internalType": "string", "name": "field_0", "type": "string" },665 { "internalType": "bytes", "name": "field_1", "type": "bytes" }665 { "internalType": "bytes", "name": "field_1", "type": "bytes" }666 ],666 ],667 "internalType": "struct Tuple20[]",667 "internalType": "struct Tuple21[]",668 "name": "properties",668 "name": "properties",669 "type": "tuple[]"669 "type": "tuple[]"670 }670 }767 "stateMutability": "nonpayable",767 "stateMutability": "nonpayable",768 "type": "function"768 "type": "function"769 },769 },770 {771 "inputs": [772 {773 "components": [774 { "internalType": "address", "name": "eth", "type": "address" },775 { "internalType": "uint256", "name": "sub", "type": "uint256" }776 ],777 "internalType": "struct EthCrossAccount",778 "name": "to",779 "type": "tuple"780 },781 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }782 ],783 "name": "transferCross",784 "outputs": [],785 "stateMutability": "nonpayable",786 "type": "function"787 },770 {788 {771 "inputs": [789 "inputs": [772 { "internalType": "address", "name": "from", "type": "address" },790 { "internalType": "address", "name": "from", "type": "address" },