difftreelog
added `mintCross` function for `UniqueExtensoins` interfaces
in: master
20 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6085,7 +6085,7 @@
[[package]]
name = "pallet-fungible"
-version = "0.1.7"
+version = "0.1.9"
dependencies = [
"ethereum 0.14.0",
"evm-coder",
pallets/fungible/CHANGELOG.mddiffbeforeafterboth--- a/pallets/fungible/CHANGELOG.md
+++ b/pallets/fungible/CHANGELOG.md
@@ -4,6 +4,12 @@
<!-- bureaucrate goes here -->
+## [0.1.9] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC20UniqueExtensions` interface.
+
## [0.1.8] - 2022-11-18
### Added
pallets/fungible/Cargo.tomldiffbeforeafterboth--- a/pallets/fungible/Cargo.toml
+++ b/pallets/fungible/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-fungible"
-version = "0.1.7"
+version = "0.1.9"
license = "GPLv3"
edition = "2021"
pallets/fungible/src/erc.rsdiffbeforeafterboth--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -174,6 +174,19 @@
.collect::<string>())
}
+ #[weight(<SelfWeightOf<T>>::create_item())]
+ fn mint_cross(&mut self, caller: caller, to: EthCrossAccount, amount: uint256) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let to = to.into_sub_cross_account::<T>()?;
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+ <Pallet<T>>::create_item(&self, &caller, (to, amount), &budget)
+ .map_err(dispatch_to_evm::<T>)?;
+ Ok(true)
+ }
+
#[weight(<SelfWeightOf<T>>::approve())]
fn approve_cross(
&mut self,
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -152,10 +152,10 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() public view returns (Tuple8 memory) {
+ function collectionSponsor() public view returns (Tuple9 memory) {
require(false, stub_error);
dummy;
- return Tuple8(0x0000000000000000000000000000000000000000, 0);
+ return Tuple9(0x0000000000000000000000000000000000000000, 0);
}
/// Get current collection limits.
@@ -522,7 +522,7 @@
bytes value;
}
-/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
+/// @dev the ERC-165 identifier for this interface is 0x7dee5997
contract ERC20UniqueExtensions is Dummy, ERC165 {
/// @notice A description for the collection.
/// @dev EVM selector for this function is: 0x7284e416,
@@ -533,6 +533,16 @@
return "";
}
+ /// @dev EVM selector for this function is: 0x269e6158,
+ /// or in textual repr: mintCross((address,uint256),uint256)
+ function mintCross(EthCrossAccount memory to, uint256 amount) public returns (bool) {
+ require(false, stub_error);
+ to;
+ amount;
+ dummy = 0;
+ return false;
+ }
+
/// @dev EVM selector for this function is: 0x0ecd0ab0,
/// or in textual repr: approveCross((address,uint256),uint256)
function approveCross(EthCrossAccount memory spender, uint256 amount) public returns (bool) {
@@ -577,7 +587,7 @@
/// @param amounts array of pairs of account address and amount
/// @dev EVM selector for this function is: 0x1acf2d55,
/// or in textual repr: mintBulk((address,uint256)[])
- function mintBulk(Tuple8[] memory amounts) public returns (bool) {
+ function mintBulk(Tuple9[] memory amounts) public returns (bool) {
require(false, stub_error);
amounts;
dummy = 0;
@@ -611,7 +621,7 @@
}
/// @dev anonymous struct
-struct Tuple8 {
+struct Tuple9 {
address field_0;
uint256 field_1;
}
pallets/nonfungible/CHANGELOG.mddiffbeforeafterboth--- a/pallets/nonfungible/CHANGELOG.md
+++ b/pallets/nonfungible/CHANGELOG.md
@@ -4,7 +4,7 @@
<!-- bureaucrate goes here -->
-## [0.1.11] - 2022-12-16
+## [0.1.12] - 2022-12-16
### Added
@@ -14,6 +14,12 @@
- Hide `setTokenPropertyPermission` function in `TokenProperties` interface.
+## [0.1.11] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC721UniqueExtensions` interface.
+
## [0.1.10] - 2022-11-18
### Added
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -1069,6 +1069,58 @@
.map_err(dispatch_to_evm::<T>)?;
Ok(true)
}
+
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ #[weight(<SelfWeightOf<T>>::create_item())]
+ fn mint_cross(
+ &mut self,
+ caller: caller,
+ to: EthCrossAccount,
+ properties: Vec<PropertyStruct>,
+ ) -> Result<uint256> {
+ let token_id = <TokensMinted<T>>::get(self.id)
+ .checked_add(1)
+ .ok_or("item id overflow")?;
+
+ let to = to.into_sub_cross_account::<T>()?;
+
+ let properties = properties
+ .into_iter()
+ .map(|PropertyStruct { key, value }| {
+ let key = <Vec<u8>>::from(key)
+ .try_into()
+ .map_err(|_| "key too large")?;
+
+ let value = value.0.try_into().map_err(|_| "value too large")?;
+
+ Ok(Property { key, value })
+ })
+ .collect::<Result<Vec<_>>>()?
+ .try_into()
+ .map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
+
+ let caller = T::CrossAccountId::from_eth(caller);
+
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+ <Pallet<T>>::create_item(
+ self,
+ &caller,
+ CreateItemData::<T> {
+ properties,
+ owner: to,
+ },
+ &budget,
+ )
+ .map_err(dispatch_to_evm::<T>)?;
+
+ Ok(token_id.into())
+ }
}
#[solidity_interface(
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -290,10 +290,10 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() public view returns (Tuple30 memory) {
+ function collectionSponsor() public view returns (Tuple32 memory) {
require(false, stub_error);
dummy;
- return Tuple30(0x0000000000000000000000000000000000000000, 0);
+ return Tuple32(0x0000000000000000000000000000000000000000, 0);
}
/// Get current collection limits.
@@ -655,7 +655,7 @@
}
/// @dev anonymous struct
-struct Tuple30 {
+struct Tuple32 {
address field_0;
uint256 field_1;
}
@@ -804,7 +804,7 @@
}
/// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xb74c26b7
+/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4
contract ERC721UniqueExtensions is Dummy, ERC165 {
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev EVM selector for this function is: 0x06fdde03,
@@ -961,6 +961,7 @@
dummy;
return 0;
}
+
// /// @notice Function to mint multiple tokens.
// /// @dev `tokenIds` should be an array of consecutive numbers and first number
// /// should be obtained with `nextTokenId` method
@@ -991,6 +992,19 @@
// return false;
// }
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ /// @dev EVM selector for this function is: 0xb904db03,
+ /// or in textual repr: mintCross((address,uint256),(string,bytes)[])
+ function mintCross(EthCrossAccount memory to, Property[] memory properties) public returns (uint256) {
+ require(false, stub_error);
+ to;
+ properties;
+ dummy = 0;
+ return 0;
+ }
}
/// @dev anonymous struct
pallets/refungible/CHANGELOG.mddiffbeforeafterboth--- a/pallets/refungible/CHANGELOG.md
+++ b/pallets/refungible/CHANGELOG.md
@@ -4,7 +4,7 @@
<!-- bureaucrate goes here -->
-## [0.2.10] - 2022-12-16
+## [0.2.11] - 2022-12-16
### Added
@@ -14,6 +14,12 @@
- Hide `setTokenPropertyPermission` function in `TokenProperties` interface.
+## [0.2.10] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC721UniqueExtensions` interface.
+
## [0.2.9] - 2022-11-18
### Added
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -1120,6 +1120,60 @@
Ok(true)
}
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ #[weight(<SelfWeightOf<T>>::create_item())]
+ fn mint_cross(
+ &mut self,
+ caller: caller,
+ to: EthCrossAccount,
+ properties: Vec<PropertyStruct>,
+ ) -> Result<uint256> {
+ let token_id = <TokensMinted<T>>::get(self.id)
+ .checked_add(1)
+ .ok_or("item id overflow")?;
+
+ let to = to.into_sub_cross_account::<T>()?;
+
+ let properties = properties
+ .into_iter()
+ .map(|PropertyStruct { key, value }| {
+ let key = <Vec<u8>>::from(key)
+ .try_into()
+ .map_err(|_| "key too large")?;
+
+ let value = value.0.try_into().map_err(|_| "value too large")?;
+
+ Ok(Property { key, value })
+ })
+ .collect::<Result<Vec<_>>>()?
+ .try_into()
+ .map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
+
+ let caller = T::CrossAccountId::from_eth(caller);
+
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+ let users = [(to, 1)]
+ .into_iter()
+ .collect::<BTreeMap<_, _>>()
+ .try_into()
+ .unwrap();
+ <Pallet<T>>::create_item(
+ self,
+ &caller,
+ CreateItemData::<T::CrossAccountId> { users, properties },
+ &budget,
+ )
+ .map_err(dispatch_to_evm::<T>)?;
+
+ Ok(token_id.into())
+ }
+
/// Returns EVM address for refungible token
///
/// @param token ID of the token
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -290,10 +290,10 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() public view returns (Tuple29 memory) {
+ function collectionSponsor() public view returns (Tuple31 memory) {
require(false, stub_error);
dummy;
- return Tuple29(0x0000000000000000000000000000000000000000, 0);
+ return Tuple31(0x0000000000000000000000000000000000000000, 0);
}
/// Get current collection limits.
@@ -655,7 +655,7 @@
}
/// @dev anonymous struct
-struct Tuple29 {
+struct Tuple31 {
address field_0;
uint256 field_1;
}
@@ -802,7 +802,7 @@
}
/// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x12f7d6c1
+/// @dev the ERC-165 identifier for this interface is 0xabf30dc2
contract ERC721UniqueExtensions is Dummy, ERC165 {
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev EVM selector for this function is: 0x06fdde03,
@@ -979,6 +979,20 @@
// return false;
// }
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ /// @dev EVM selector for this function is: 0xb904db03,
+ /// or in textual repr: mintCross((address,uint256),(string,bytes)[])
+ function mintCross(EthCrossAccount memory to, Property[] memory properties) public returns (uint256) {
+ require(false, stub_error);
+ to;
+ properties;
+ dummy = 0;
+ return 0;
+ }
+
/// Returns EVM address for refungible token
///
/// @param token ID of the token
tests/src/eth/abi/fungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -322,7 +322,7 @@
{ "internalType": "address", "name": "field_0", "type": "address" },
{ "internalType": "uint256", "name": "field_1", "type": "uint256" }
],
- "internalType": "struct Tuple8",
+ "internalType": "struct Tuple9",
"name": "",
"type": "tuple"
}
@@ -408,7 +408,7 @@
{ "internalType": "address", "name": "field_0", "type": "address" },
{ "internalType": "uint256", "name": "field_1", "type": "uint256" }
],
- "internalType": "struct Tuple8[]",
+ "internalType": "struct Tuple9[]",
"name": "amounts",
"type": "tuple[]"
}
@@ -419,6 +419,24 @@
"type": "function"
},
{
+ "inputs": [
+ {
+ "components": [
+ { "internalType": "address", "name": "eth", "type": "address" },
+ { "internalType": "uint256", "name": "sub", "type": "uint256" }
+ ],
+ "internalType": "struct EthCrossAccount",
+ "name": "to",
+ "type": "tuple"
+ },
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "mintCross",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
"inputs": [],
"name": "name",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -352,7 +352,7 @@
{ "internalType": "address", "name": "field_0", "type": "address" },
{ "internalType": "uint256", "name": "field_1", "type": "uint256" }
],
- "internalType": "struct Tuple30",
+ "internalType": "struct Tuple32",
"name": "",
"type": "tuple"
}
@@ -478,6 +478,32 @@
},
{
"inputs": [
+ {
+ "components": [
+ { "internalType": "address", "name": "eth", "type": "address" },
+ { "internalType": "uint256", "name": "sub", "type": "uint256" }
+ ],
+ "internalType": "struct EthCrossAccount",
+ "name": "to",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ { "internalType": "string", "name": "key", "type": "string" },
+ { "internalType": "bytes", "name": "value", "type": "bytes" }
+ ],
+ "internalType": "struct Property[]",
+ "name": "properties",
+ "type": "tuple[]"
+ }
+ ],
+ "name": "mintCross",
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
{ "internalType": "address", "name": "to", "type": "address" },
{ "internalType": "string", "name": "tokenUri", "type": "string" }
],
tests/src/eth/abi/reFungible.jsondiffbeforeafterboth1[2 {3 "anonymous": false,4 "inputs": [5 {6 "indexed": true,7 "internalType": "address",8 "name": "owner",9 "type": "address"10 },11 {12 "indexed": true,13 "internalType": "address",14 "name": "approved",15 "type": "address"16 },17 {18 "indexed": true,19 "internalType": "uint256",20 "name": "tokenId",21 "type": "uint256"22 }23 ],24 "name": "Approval",25 "type": "event"26 },27 {28 "anonymous": false,29 "inputs": [30 {31 "indexed": true,32 "internalType": "address",33 "name": "owner",34 "type": "address"35 },36 {37 "indexed": true,38 "internalType": "address",39 "name": "operator",40 "type": "address"41 },42 {43 "indexed": false,44 "internalType": "bool",45 "name": "approved",46 "type": "bool"47 }48 ],49 "name": "ApprovalForAll",50 "type": "event"51 },52 {53 "anonymous": false,54 "inputs": [],55 "name": "MintingFinished",56 "type": "event"57 },58 {59 "anonymous": false,60 "inputs": [61 {62 "indexed": true,63 "internalType": "address",64 "name": "from",65 "type": "address"66 },67 {68 "indexed": true,69 "internalType": "address",70 "name": "to",71 "type": "address"72 },73 {74 "indexed": true,75 "internalType": "uint256",76 "name": "tokenId",77 "type": "uint256"78 }79 ],80 "name": "Transfer",81 "type": "event"82 },83 {84 "inputs": [85 {86 "components": [87 { "internalType": "address", "name": "eth", "type": "address" },88 { "internalType": "uint256", "name": "sub", "type": "uint256" }89 ],90 "internalType": "struct EthCrossAccount",91 "name": "newAdmin",92 "type": "tuple"93 }94 ],95 "name": "addCollectionAdminCross",96 "outputs": [],97 "stateMutability": "nonpayable",98 "type": "function"99 },100 {101 "inputs": [102 {103 "components": [104 { "internalType": "address", "name": "eth", "type": "address" },105 { "internalType": "uint256", "name": "sub", "type": "uint256" }106 ],107 "internalType": "struct EthCrossAccount",108 "name": "user",109 "type": "tuple"110 }111 ],112 "name": "addToCollectionAllowListCross",113 "outputs": [],114 "stateMutability": "nonpayable",115 "type": "function"116 },117 {118 "inputs": [119 {120 "components": [121 { "internalType": "address", "name": "eth", "type": "address" },122 { "internalType": "uint256", "name": "sub", "type": "uint256" }123 ],124 "internalType": "struct EthCrossAccount",125 "name": "user",126 "type": "tuple"127 }128 ],129 "name": "allowlistedCross",130 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],131 "stateMutability": "view",132 "type": "function"133 },134 {135 "inputs": [136 { "internalType": "address", "name": "approved", "type": "address" },137 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }138 ],139 "name": "approve",140 "outputs": [],141 "stateMutability": "nonpayable",142 "type": "function"143 },144 {145 "inputs": [146 { "internalType": "address", "name": "owner", "type": "address" }147 ],148 "name": "balanceOf",149 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],150 "stateMutability": "view",151 "type": "function"152 },153 {154 "inputs": [155 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156 ],157 "name": "burn",158 "outputs": [],159 "stateMutability": "nonpayable",160 "type": "function"161 },162 {163 "inputs": [164 {165 "components": [166 { "internalType": "address", "name": "eth", "type": "address" },167 { "internalType": "uint256", "name": "sub", "type": "uint256" }168 ],169 "internalType": "struct EthCrossAccount",170 "name": "from",171 "type": "tuple"172 },173 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174 ],175 "name": "burnFromCross",176 "outputs": [],177 "stateMutability": "nonpayable",178 "type": "function"179 },180 {181 "inputs": [182 {183 "components": [184 { "internalType": "address", "name": "eth", "type": "address" },185 { "internalType": "uint256", "name": "sub", "type": "uint256" }186 ],187 "internalType": "struct EthCrossAccount",188 "name": "newOwner",189 "type": "tuple"190 }191 ],192 "name": "changeCollectionOwnerCross",193 "outputs": [],194 "stateMutability": "nonpayable",195 "type": "function"196 },197 {198 "inputs": [],199 "name": "collectionAdmins",200 "outputs": [201 {202 "components": [203 { "internalType": "address", "name": "eth", "type": "address" },204 { "internalType": "uint256", "name": "sub", "type": "uint256" }205 ],206 "internalType": "struct EthCrossAccount[]",207 "name": "",208 "type": "tuple[]"209 }210 ],211 "stateMutability": "view",212 "type": "function"213 },214 {215 "inputs": [],216 "name": "collectionHelperAddress",217 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],218 "stateMutability": "view",219 "type": "function"220 },221 {222 "inputs": [],223 "name": "collectionLimits",224 "outputs": [225 {226 "components": [227 {228 "internalType": "enum CollectionLimits",229 "name": "field_0",230 "type": "uint8"231 },232 { "internalType": "bool", "name": "field_1", "type": "bool" },233 { "internalType": "uint256", "name": "field_2", "type": "uint256" }234 ],235 "internalType": "struct Tuple32[]",236 "name": "",237 "type": "tuple[]"238 }239 ],240 "stateMutability": "view",241 "type": "function"242 },243 {244 "inputs": [],245 "name": "collectionNestingPermissions",246 "outputs": [247 {248 "components": [249 {250 "internalType": "enum CollectionPermissions",251 "name": "field_0",252 "type": "uint8"253 },254 { "internalType": "bool", "name": "field_1", "type": "bool" }255 ],256 "internalType": "struct Tuple41[]",257 "name": "",258 "type": "tuple[]"259 }260 ],261 "stateMutability": "view",262 "type": "function"263 },264 {265 "inputs": [],266 "name": "collectionNestingRestrictedCollectionIds",267 "outputs": [268 {269 "components": [270 { "internalType": "bool", "name": "field_0", "type": "bool" },271 {272 "internalType": "uint256[]",273 "name": "field_1",274 "type": "uint256[]"275 }276 ],277 "internalType": "struct Tuple38",278 "name": "",279 "type": "tuple"280 }281 ],282 "stateMutability": "view",283 "type": "function"284 },285 {286 "inputs": [],287 "name": "collectionOwner",288 "outputs": [289 {290 "components": [291 { "internalType": "address", "name": "eth", "type": "address" },292 { "internalType": "uint256", "name": "sub", "type": "uint256" }293 ],294 "internalType": "struct EthCrossAccount",295 "name": "",296 "type": "tuple"297 }298 ],299 "stateMutability": "view",300 "type": "function"301 },302 {303 "inputs": [304 { "internalType": "string[]", "name": "keys", "type": "string[]" }305 ],306 "name": "collectionProperties",307 "outputs": [308 {309 "components": [310 { "internalType": "string", "name": "key", "type": "string" },311 { "internalType": "bytes", "name": "value", "type": "bytes" }312 ],313 "internalType": "struct Property[]",314 "name": "",315 "type": "tuple[]"316 }317 ],318 "stateMutability": "view",319 "type": "function"320 },321 {322 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],323 "name": "collectionProperty",324 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],325 "stateMutability": "view",326 "type": "function"327 },328 {329 "inputs": [],330 "name": "collectionSponsor",331 "outputs": [332 {333 "components": [334 { "internalType": "address", "name": "field_0", "type": "address" },335 { "internalType": "uint256", "name": "field_1", "type": "uint256" }336 ],337 "internalType": "struct Tuple31",338 "name": "",339 "type": "tuple"340 }341 ],342 "stateMutability": "view",343 "type": "function"344 },345 {346 "inputs": [],347 "name": "confirmCollectionSponsorship",348 "outputs": [],349 "stateMutability": "nonpayable",350 "type": "function"351 },352 {353 "inputs": [],354 "name": "contractAddress",355 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],356 "stateMutability": "view",357 "type": "function"358 },359 {360 "inputs": [361 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }362 ],363 "name": "crossOwnerOf",364 "outputs": [365 {366 "components": [367 { "internalType": "address", "name": "eth", "type": "address" },368 { "internalType": "uint256", "name": "sub", "type": "uint256" }369 ],370 "internalType": "struct EthCrossAccount",371 "name": "",372 "type": "tuple"373 }374 ],375 "stateMutability": "view",376 "type": "function"377 },378 {379 "inputs": [380 { "internalType": "string[]", "name": "keys", "type": "string[]" }381 ],382 "name": "deleteCollectionProperties",383 "outputs": [],384 "stateMutability": "nonpayable",385 "type": "function"386 },387 {388 "inputs": [389 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },390 { "internalType": "string[]", "name": "keys", "type": "string[]" }391 ],392 "name": "deleteProperties",393 "outputs": [],394 "stateMutability": "nonpayable",395 "type": "function"396 },397 {398 "inputs": [],399 "name": "description",400 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],401 "stateMutability": "view",402 "type": "function"403 },404 {405 "inputs": [],406 "name": "finishMinting",407 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],408 "stateMutability": "nonpayable",409 "type": "function"410 },411 {412 "inputs": [413 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }414 ],415 "name": "getApproved",416 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],417 "stateMutability": "view",418 "type": "function"419 },420 {421 "inputs": [],422 "name": "hasCollectionPendingSponsor",423 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],424 "stateMutability": "view",425 "type": "function"426 },427 {428 "inputs": [429 { "internalType": "address", "name": "owner", "type": "address" },430 { "internalType": "address", "name": "operator", "type": "address" }431 ],432 "name": "isApprovedForAll",433 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],434 "stateMutability": "view",435 "type": "function"436 },437 {438 "inputs": [439 {440 "components": [441 { "internalType": "address", "name": "eth", "type": "address" },442 { "internalType": "uint256", "name": "sub", "type": "uint256" }443 ],444 "internalType": "struct EthCrossAccount",445 "name": "user",446 "type": "tuple"447 }448 ],449 "name": "isOwnerOrAdminCross",450 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],451 "stateMutability": "view",452 "type": "function"453 },454 {455 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],456 "name": "mint",457 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],458 "stateMutability": "nonpayable",459 "type": "function"460 },461 {462 "inputs": [463 {464 "components": [465 { "internalType": "address", "name": "eth", "type": "address" },466 { "internalType": "uint256", "name": "sub", "type": "uint256" }467 ],468 "internalType": "struct EthCrossAccount",469 "name": "to",470 "type": "tuple"471 },472 {473 "components": [474 { "internalType": "string", "name": "key", "type": "string" },475 { "internalType": "bytes", "name": "value", "type": "bytes" }476 ],477 "internalType": "struct Property[]",478 "name": "properties",479 "type": "tuple[]"480 }481 ],482 "name": "mintCross",483 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],484 "stateMutability": "nonpayable",485 "type": "function"486 },487 {488 "inputs": [489 { "internalType": "address", "name": "to", "type": "address" },490 { "internalType": "string", "name": "tokenUri", "type": "string" }491 ],492 "name": "mintWithTokenURI",493 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],494 "stateMutability": "nonpayable",495 "type": "function"496 },497 {498 "inputs": [],499 "name": "mintingFinished",500 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],501 "stateMutability": "view",502 "type": "function"503 },504 {505 "inputs": [],506 "name": "name",507 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],508 "stateMutability": "view",509 "type": "function"510 },511 {512 "inputs": [],513 "name": "nextTokenId",514 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],515 "stateMutability": "view",516 "type": "function"517 },518 {519 "inputs": [520 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }521 ],522 "name": "ownerOf",523 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],524 "stateMutability": "view",525 "type": "function"526 },527 {528 "inputs": [529 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },530 { "internalType": "string[]", "name": "keys", "type": "string[]" }531 ],532 "name": "properties",533 "outputs": [534 {535 "components": [536 { "internalType": "string", "name": "key", "type": "string" },537 { "internalType": "bytes", "name": "value", "type": "bytes" }538 ],539 "internalType": "struct Property[]",540 "name": "",541 "type": "tuple[]"542 }543 ],544 "stateMutability": "view",545 "type": "function"546 },547 {548 "inputs": [549 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },550 { "internalType": "string", "name": "key", "type": "string" }551 ],552 "name": "property",553 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],554 "stateMutability": "view",555 "type": "function"556 },557 {558 "inputs": [559 {560 "components": [561 { "internalType": "address", "name": "eth", "type": "address" },562 { "internalType": "uint256", "name": "sub", "type": "uint256" }563 ],564 "internalType": "struct EthCrossAccount",565 "name": "admin",566 "type": "tuple"567 }568 ],569 "name": "removeCollectionAdminCross",570 "outputs": [],571 "stateMutability": "nonpayable",572 "type": "function"573 },574 {575 "inputs": [],576 "name": "removeCollectionSponsor",577 "outputs": [],578 "stateMutability": "nonpayable",579 "type": "function"580 },581 {582 "inputs": [583 {584 "components": [585 { "internalType": "address", "name": "eth", "type": "address" },586 { "internalType": "uint256", "name": "sub", "type": "uint256" }587 ],588 "internalType": "struct EthCrossAccount",589 "name": "user",590 "type": "tuple"591 }592 ],593 "name": "removeFromCollectionAllowListCross",594 "outputs": [],595 "stateMutability": "nonpayable",596 "type": "function"597 },598 {599 "inputs": [600 { "internalType": "address", "name": "from", "type": "address" },601 { "internalType": "address", "name": "to", "type": "address" },602 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }603 ],604 "name": "safeTransferFrom",605 "outputs": [],606 "stateMutability": "nonpayable",607 "type": "function"608 },609 {610 "inputs": [611 { "internalType": "address", "name": "from", "type": "address" },612 { "internalType": "address", "name": "to", "type": "address" },613 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },614 { "internalType": "bytes", "name": "data", "type": "bytes" }615 ],616 "name": "safeTransferFromWithData",617 "outputs": [],618 "stateMutability": "nonpayable",619 "type": "function"620 },621 {622 "inputs": [623 { "internalType": "address", "name": "operator", "type": "address" },624 { "internalType": "bool", "name": "approved", "type": "bool" }625 ],626 "name": "setApprovalForAll",627 "outputs": [],628 "stateMutability": "nonpayable",629 "type": "function"630 },631 {632 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],633 "name": "setCollectionAccess",634 "outputs": [],635 "stateMutability": "nonpayable",636 "type": "function"637 },638 {639 "inputs": [640 {641 "internalType": "enum CollectionLimits",642 "name": "limit",643 "type": "uint8"644 },645 { "internalType": "bool", "name": "status", "type": "bool" },646 { "internalType": "uint256", "name": "value", "type": "uint256" }647 ],648 "name": "setCollectionLimit",649 "outputs": [],650 "stateMutability": "nonpayable",651 "type": "function"652 },653 {654 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],655 "name": "setCollectionMintMode",656 "outputs": [],657 "stateMutability": "nonpayable",658 "type": "function"659 },660 {661 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],662 "name": "setCollectionNesting",663 "outputs": [],664 "stateMutability": "nonpayable",665 "type": "function"666 },667 {668 "inputs": [669 { "internalType": "bool", "name": "enable", "type": "bool" },670 {671 "internalType": "address[]",672 "name": "collections",673 "type": "address[]"674 }675 ],676 "name": "setCollectionNesting",677 "outputs": [],678 "stateMutability": "nonpayable",679 "type": "function"680 },681 {682 "inputs": [683 {684 "components": [685 { "internalType": "string", "name": "key", "type": "string" },686 { "internalType": "bytes", "name": "value", "type": "bytes" }687 ],688 "internalType": "struct Property[]",689 "name": "properties",690 "type": "tuple[]"691 }692 ],693 "name": "setCollectionProperties",694 "outputs": [],695 "stateMutability": "nonpayable",696 "type": "function"697 },698 {699 "inputs": [700 {701 "components": [702 { "internalType": "address", "name": "eth", "type": "address" },703 { "internalType": "uint256", "name": "sub", "type": "uint256" }704 ],705 "internalType": "struct EthCrossAccount",706 "name": "sponsor",707 "type": "tuple"708 }709 ],710 "name": "setCollectionSponsorCross",711 "outputs": [],712 "stateMutability": "nonpayable",713 "type": "function"714 },715 {716 "inputs": [717 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },718 {719 "components": [720 { "internalType": "string", "name": "key", "type": "string" },721 { "internalType": "bytes", "name": "value", "type": "bytes" }722 ],723 "internalType": "struct Property[]",724 "name": "properties",725 "type": "tuple[]"726 }727 ],728 "name": "setProperties",729 "outputs": [],730 "stateMutability": "nonpayable",731 "type": "function"732 },733 {734 "inputs": [735 {736 "components": [737 { "internalType": "string", "name": "field_0", "type": "string" },738 {739 "components": [740 {741 "internalType": "enum EthTokenPermissions",742 "name": "field_0",743 "type": "uint8"744 },745 { "internalType": "bool", "name": "field_1", "type": "bool" }746 ],747 "internalType": "struct Tuple56[]",748 "name": "field_1",749 "type": "tuple[]"750 }751 ],752 "internalType": "struct Tuple58[]",753 "name": "permissions",754 "type": "tuple[]"755 }756 ],757 "name": "setTokenPropertyPermissions",758 "outputs": [],759 "stateMutability": "nonpayable",760 "type": "function"761 },762 {763 "inputs": [764 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }765 ],766 "name": "supportsInterface",767 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],768 "stateMutability": "view",769 "type": "function"770 },771 {772 "inputs": [],773 "name": "symbol",774 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],775 "stateMutability": "view",776 "type": "function"777 },778 {779 "inputs": [780 { "internalType": "uint256", "name": "index", "type": "uint256" }781 ],782 "name": "tokenByIndex",783 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],784 "stateMutability": "view",785 "type": "function"786 },787 {788 "inputs": [789 { "internalType": "uint256", "name": "token", "type": "uint256" }790 ],791 "name": "tokenContractAddress",792 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],793 "stateMutability": "view",794 "type": "function"795 },796 {797 "inputs": [798 { "internalType": "address", "name": "owner", "type": "address" },799 { "internalType": "uint256", "name": "index", "type": "uint256" }800 ],801 "name": "tokenOfOwnerByIndex",802 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],803 "stateMutability": "view",804 "type": "function"805 },806 {807 "inputs": [],808 "name": "tokenPropertyPermissions",809 "outputs": [810 {811 "components": [812 { "internalType": "string", "name": "field_0", "type": "string" },813 {814 "components": [815 {816 "internalType": "enum EthTokenPermissions",817 "name": "field_0",818 "type": "uint8"819 },820 { "internalType": "bool", "name": "field_1", "type": "bool" }821 ],822 "internalType": "struct Tuple56[]",823 "name": "field_1",824 "type": "tuple[]"825 }826 ],827 "internalType": "struct Tuple58[]",828 "name": "",829 "type": "tuple[]"830 }831 ],832 "stateMutability": "view",833 "type": "function"834 },835 {836 "inputs": [837 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }838 ],839 "name": "tokenURI",840 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],841 "stateMutability": "view",842 "type": "function"843 },844 {845 "inputs": [],846 "name": "totalSupply",847 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],848 "stateMutability": "view",849 "type": "function"850 },851 {852 "inputs": [853 { "internalType": "address", "name": "to", "type": "address" },854 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }855 ],856 "name": "transfer",857 "outputs": [],858 "stateMutability": "nonpayable",859 "type": "function"860 },861 {862 "inputs": [863 {864 "components": [865 { "internalType": "address", "name": "eth", "type": "address" },866 { "internalType": "uint256", "name": "sub", "type": "uint256" }867 ],868 "internalType": "struct EthCrossAccount",869 "name": "to",870 "type": "tuple"871 },872 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }873 ],874 "name": "transferCross",875 "outputs": [],876 "stateMutability": "nonpayable",877 "type": "function"878 },879 {880 "inputs": [881 { "internalType": "address", "name": "from", "type": "address" },882 { "internalType": "address", "name": "to", "type": "address" },883 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }884 ],885 "name": "transferFrom",886 "outputs": [],887 "stateMutability": "nonpayable",888 "type": "function"889 },890 {891 "inputs": [892 {893 "components": [894 { "internalType": "address", "name": "eth", "type": "address" },895 { "internalType": "uint256", "name": "sub", "type": "uint256" }896 ],897 "internalType": "struct EthCrossAccount",898 "name": "from",899 "type": "tuple"900 },901 {902 "components": [903 { "internalType": "address", "name": "eth", "type": "address" },904 { "internalType": "uint256", "name": "sub", "type": "uint256" }905 ],906 "internalType": "struct EthCrossAccount",907 "name": "to",908 "type": "tuple"909 },910 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }911 ],912 "name": "transferFromCross",913 "outputs": [],914 "stateMutability": "nonpayable",915 "type": "function"916 },917 {918 "inputs": [],919 "name": "uniqueCollectionType",920 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],921 "stateMutability": "view",922 "type": "function"923 }924]tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -102,7 +102,7 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() external view returns (Tuple8 memory);
+ function collectionSponsor() external view returns (Tuple9 memory);
/// Get current collection limits.
///
@@ -362,13 +362,17 @@
bytes value;
}
-/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
+/// @dev the ERC-165 identifier for this interface is 0x7dee5997
interface ERC20UniqueExtensions is Dummy, ERC165 {
/// @notice A description for the collection.
/// @dev EVM selector for this function is: 0x7284e416,
/// or in textual repr: description()
function description() external view returns (string memory);
+ /// @dev EVM selector for this function is: 0x269e6158,
+ /// or in textual repr: mintCross((address,uint256),uint256)
+ function mintCross(EthCrossAccount memory to, uint256 amount) external returns (bool);
+
/// @dev EVM selector for this function is: 0x0ecd0ab0,
/// or in textual repr: approveCross((address,uint256),uint256)
function approveCross(EthCrossAccount memory spender, uint256 amount) external returns (bool);
@@ -395,7 +399,7 @@
/// @param amounts array of pairs of account address and amount
/// @dev EVM selector for this function is: 0x1acf2d55,
/// or in textual repr: mintBulk((address,uint256)[])
- function mintBulk(Tuple8[] memory amounts) external returns (bool);
+ function mintBulk(Tuple9[] memory amounts) external returns (bool);
/// @dev EVM selector for this function is: 0x2ada85ff,
/// or in textual repr: transferCross((address,uint256),uint256)
@@ -411,7 +415,7 @@
}
/// @dev anonymous struct
-struct Tuple8 {
+struct Tuple9 {
address field_0;
uint256 field_1;
}
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -198,7 +198,7 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() external view returns (Tuple27 memory);
+ function collectionSponsor() external view returns (Tuple29 memory);
/// Get current collection limits.
///
@@ -553,7 +553,7 @@
}
/// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xb74c26b7
+/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4
interface ERC721UniqueExtensions is Dummy, ERC165 {
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev EVM selector for this function is: 0x06fdde03,
@@ -652,6 +652,7 @@
/// @dev EVM selector for this function is: 0x75794a3c,
/// or in textual repr: nextTokenId()
function nextTokenId() external view returns (uint256);
+
// /// @notice Function to mint multiple tokens.
// /// @dev `tokenIds` should be an array of consecutive numbers and first number
// /// should be obtained with `nextTokenId` method
@@ -670,6 +671,13 @@
// /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
// function mintBulkWithTokenURI(address to, Tuple13[] memory tokens) external returns (bool);
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ /// @dev EVM selector for this function is: 0xb904db03,
+ /// or in textual repr: mintCross((address,uint256),(string,bytes)[])
+ function mintCross(EthCrossAccount memory to, Property[] memory properties) external returns (uint256);
}
/// @dev anonymous struct
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -198,7 +198,7 @@
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
/// @dev EVM selector for this function is: 0x6ec0a9f1,
/// or in textual repr: collectionSponsor()
- function collectionSponsor() external view returns (Tuple26 memory);
+ function collectionSponsor() external view returns (Tuple28 memory);
/// Get current collection limits.
///
@@ -551,7 +551,7 @@
}
/// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x12f7d6c1
+/// @dev the ERC-165 identifier for this interface is 0xabf30dc2
interface ERC721UniqueExtensions is Dummy, ERC165 {
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev EVM selector for this function is: 0x06fdde03,
@@ -663,6 +663,14 @@
// /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
// function mintBulkWithTokenURI(address to, Tuple12[] memory tokens) external returns (bool);
+ /// @notice Function to mint token.
+ /// @param to The new owner crossAccountId
+ /// @param properties Properties of minted token
+ /// @return uint256 The id of the newly minted token
+ /// @dev EVM selector for this function is: 0xb904db03,
+ /// or in textual repr: mintCross((address,uint256),(string,bytes)[])
+ function mintCross(EthCrossAccount memory to, Property[] memory properties) external returns (uint256);
+
/// Returns EVM address for refungible token
///
/// @param token ID of the token
tests/src/eth/fungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/fungible.test.ts
+++ b/tests/src/eth/fungible.test.ts
@@ -78,6 +78,25 @@
expect(event.returnValues.to).to.equal(receiver);
expect(event.returnValues.value).to.equal('100');
});
+
+
+ itEth('Can perform mintCross()', async ({helper}) => {
+ const receiverCross = helper.ethCrossAccount.fromKeyringPair(owner);
+ const ethOwner = await helper.eth.createAccountWithBalance(donor);
+ const collection = await helper.ft.mintCollection(alice);
+ await collection.addAdmin(alice, {Ethereum: ethOwner});
+
+ const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+ const contract = helper.ethNativeContract.collection(collectionAddress, 'ft', ethOwner);
+
+ const result = await contract.methods.mintCross(receiverCross, 100).send();
+
+ const event = result.events.Transfer;
+ expect(event.address).to.equal(collectionAddress);
+ expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');
+ expect(event.returnValues.to).to.equal(helper.address.substrateToEth(owner.address));
+ expect(event.returnValues.value).to.equal('100');
+ });
itEth('Can perform mintBulk()', async ({helper}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
tests/src/eth/nonFungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/nonFungible.test.ts
+++ b/tests/src/eth/nonFungible.test.ts
@@ -17,6 +17,8 @@
import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util';
import {IKeyringPair} from '@polkadot/types/types';
import {Contract} from 'web3-eth-contract';
+import exp from 'constants';
+import {ITokenPropertyPermission} from '../util/playgrounds/types';
describe('NFT: Information getting', () => {
@@ -173,7 +175,45 @@
// const tokenUri = await contract.methods.tokenURI(nextTokenId).call();
// expect(tokenUri).to.be.equal(`https://offchain-service.local/token-info/${nextTokenId}`);
});
+
+ itEth('Can perform mintCross()', async ({helper}) => {
+ const caller = await helper.eth.createAccountWithBalance(donor);
+ const receiverCross = helper.ethCrossAccount.fromKeyringPair(bob);
+ const properties = Array(5).fill(0).map((_, i) => { return {key: `key_${i}`, value: Buffer.from(`value_${i}`)}; });
+ const permissions: ITokenPropertyPermission[] = properties.map(p => { return {key: p.key, permission: {tokenOwner: true,
+ collectionAdmin: true,
+ mutable: true}}; });
+
+
+ const collection = await helper.nft.mintCollection(minter, {
+ tokenPrefix: 'ethp',
+ tokenPropertyPermissions: permissions,
+ });
+ await collection.addAdmin(minter, {Ethereum: caller});
+
+ const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+ const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', caller, true);
+ let expectedTokenId = await contract.methods.nextTokenId().call();
+ let result = await contract.methods.mintCross(receiverCross, []).send();
+ let tokenId = result.events.Transfer.returnValues.tokenId;
+ expect(tokenId).to.be.equal(expectedTokenId);
+
+ const event = result.events.Transfer;
+ expect(event.address).to.be.equal(collectionAddress);
+ expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000');
+ expect(event.returnValues.to).to.be.equal(helper.address.substrateToEth(bob.address));
+ expect(await contract.methods.properties(tokenId, []).call()).to.be.like([]);
+
+ expectedTokenId = await contract.methods.nextTokenId().call();
+ result = await contract.methods.mintCross(receiverCross, properties).send();
+ tokenId = result.events.Transfer.returnValues.tokenId;
+ expect(tokenId).to.be.equal(expectedTokenId);
+
+ expect(await contract.methods.properties(tokenId, []).call()).to.be.like(properties
+ .map(p => { return helper.ethProperty.property(p.key, p.value.toString()); }));
+ });
+
//TODO: CORE-302 add eth methods
itEth.skip('Can perform mintBulk()', async ({helper}) => {
const caller = await helper.eth.createAccountWithBalance(donor);
tests/src/eth/reFungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/reFungible.test.ts
+++ b/tests/src/eth/reFungible.test.ts
@@ -17,6 +17,7 @@
import {Pallets, requirePalletsOrSkip} from '../util';
import {expect, itEth, usingEthPlaygrounds} from './util';
import {IKeyringPair} from '@polkadot/types/types';
+import { ITokenPropertyPermission } from '../util/playgrounds/types';
describe('Refungible: Information getting', () => {
let donor: IKeyringPair;
@@ -135,6 +136,44 @@
expect(await contract.methods.crossOwnerOf(tokenId).call()).to.be.like([receiver, '0']);
expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');
});
+
+ itEth('Can perform mintCross()', async ({helper}) => {
+ const caller = await helper.eth.createAccountWithBalance(donor);
+ const receiverCross = helper.ethCrossAccount.fromKeyringPair(bob);
+ const properties = Array(5).fill(0).map((_, i) => { return {key: `key_${i}`, value: Buffer.from(`value_${i}`)}; });
+ const permissions: ITokenPropertyPermission[] = properties.map(p => { return {key: p.key, permission: {tokenOwner: true,
+ collectionAdmin: true,
+ mutable: true}}; });
+
+
+ const collection = await helper.rft.mintCollection(minter, {
+ tokenPrefix: 'ethp',
+ tokenPropertyPermissions: permissions,
+ });
+ await collection.addAdmin(minter, {Ethereum: caller});
+
+ const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+ const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller, true);
+ let expectedTokenId = await contract.methods.nextTokenId().call();
+ let result = await contract.methods.mintCross(receiverCross, []).send();
+ let tokenId = result.events.Transfer.returnValues.tokenId;
+ expect(tokenId).to.be.equal(expectedTokenId);
+
+ const event = result.events.Transfer;
+ expect(event.address).to.be.equal(collectionAddress);
+ expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000');
+ expect(event.returnValues.to).to.be.equal(helper.address.substrateToEth(bob.address));
+ expect(await contract.methods.properties(tokenId, []).call()).to.be.like([]);
+
+ expectedTokenId = await contract.methods.nextTokenId().call();
+ result = await contract.methods.mintCross(receiverCross, properties).send();
+ tokenId = result.events.Transfer.returnValues.tokenId;
+
+ expect(tokenId).to.be.equal(expectedTokenId);
+
+ expect(await contract.methods.properties(tokenId, []).call()).to.be.like(properties
+ .map(p => { return helper.ethProperty.property(p.key, p.value.toString()); }));
+ });
itEth.skip('Can perform mintBulk()', async ({helper}) => {
const owner = await helper.eth.createAccountWithBalance(donor);