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.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 {147 "components": [148 { "internalType": "address", "name": "eth", "type": "address" },149 { "internalType": "uint256", "name": "sub", "type": "uint256" }150 ],151 "internalType": "struct EthCrossAccount",152 "name": "approved",153 "type": "tuple"154 },155 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156 ],157 "name": "approveCross",158 "outputs": [],159 "stateMutability": "nonpayable",160 "type": "function"161 },162 {163 "inputs": [164 { "internalType": "address", "name": "owner", "type": "address" }165 ],166 "name": "balanceOf",167 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],168 "stateMutability": "view",169 "type": "function"170 },171 {172 "inputs": [173 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174 ],175 "name": "burn",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": "from",189 "type": "tuple"190 },191 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }192 ],193 "name": "burnFromCross",194 "outputs": [],195 "stateMutability": "nonpayable",196 "type": "function"197 },198 {199 "inputs": [200 {201 "components": [202 { "internalType": "address", "name": "eth", "type": "address" },203 { "internalType": "uint256", "name": "sub", "type": "uint256" }204 ],205 "internalType": "struct EthCrossAccount",206 "name": "newOwner",207 "type": "tuple"208 }209 ],210 "name": "changeCollectionOwnerCross",211 "outputs": [],212 "stateMutability": "nonpayable",213 "type": "function"214 },215 {216 "inputs": [],217 "name": "collectionAdmins",218 "outputs": [219 {220 "components": [221 { "internalType": "address", "name": "eth", "type": "address" },222 { "internalType": "uint256", "name": "sub", "type": "uint256" }223 ],224 "internalType": "struct EthCrossAccount[]",225 "name": "",226 "type": "tuple[]"227 }228 ],229 "stateMutability": "view",230 "type": "function"231 },232 {233 "inputs": [],234 "name": "collectionHelperAddress",235 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],236 "stateMutability": "view",237 "type": "function"238 },239 {240 "inputs": [],241 "name": "collectionLimits",242 "outputs": [243 {244 "components": [245 {246 "internalType": "enum CollectionLimits",247 "name": "field_0",248 "type": "uint8"249 },250 { "internalType": "bool", "name": "field_1", "type": "bool" },251 { "internalType": "uint256", "name": "field_2", "type": "uint256" }252 ],253 "internalType": "struct Tuple33[]",254 "name": "",255 "type": "tuple[]"256 }257 ],258 "stateMutability": "view",259 "type": "function"260 },261 {262 "inputs": [],263 "name": "collectionNestingPermissions",264 "outputs": [265 {266 "components": [267 {268 "internalType": "enum CollectionPermissions",269 "name": "field_0",270 "type": "uint8"271 },272 { "internalType": "bool", "name": "field_1", "type": "bool" }273 ],274 "internalType": "struct Tuple42[]",275 "name": "",276 "type": "tuple[]"277 }278 ],279 "stateMutability": "view",280 "type": "function"281 },282 {283 "inputs": [],284 "name": "collectionNestingRestrictedCollectionIds",285 "outputs": [286 {287 "components": [288 { "internalType": "bool", "name": "field_0", "type": "bool" },289 {290 "internalType": "uint256[]",291 "name": "field_1",292 "type": "uint256[]"293 }294 ],295 "internalType": "struct Tuple39",296 "name": "",297 "type": "tuple"298 }299 ],300 "stateMutability": "view",301 "type": "function"302 },303 {304 "inputs": [],305 "name": "collectionOwner",306 "outputs": [307 {308 "components": [309 { "internalType": "address", "name": "eth", "type": "address" },310 { "internalType": "uint256", "name": "sub", "type": "uint256" }311 ],312 "internalType": "struct EthCrossAccount",313 "name": "",314 "type": "tuple"315 }316 ],317 "stateMutability": "view",318 "type": "function"319 },320 {321 "inputs": [322 { "internalType": "string[]", "name": "keys", "type": "string[]" }323 ],324 "name": "collectionProperties",325 "outputs": [326 {327 "components": [328 { "internalType": "string", "name": "key", "type": "string" },329 { "internalType": "bytes", "name": "value", "type": "bytes" }330 ],331 "internalType": "struct Property[]",332 "name": "",333 "type": "tuple[]"334 }335 ],336 "stateMutability": "view",337 "type": "function"338 },339 {340 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],341 "name": "collectionProperty",342 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],343 "stateMutability": "view",344 "type": "function"345 },346 {347 "inputs": [],348 "name": "collectionSponsor",349 "outputs": [350 {351 "components": [352 { "internalType": "address", "name": "field_0", "type": "address" },353 { "internalType": "uint256", "name": "field_1", "type": "uint256" }354 ],355 "internalType": "struct Tuple30",356 "name": "",357 "type": "tuple"358 }359 ],360 "stateMutability": "view",361 "type": "function"362 },363 {364 "inputs": [],365 "name": "confirmCollectionSponsorship",366 "outputs": [],367 "stateMutability": "nonpayable",368 "type": "function"369 },370 {371 "inputs": [],372 "name": "contractAddress",373 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],374 "stateMutability": "view",375 "type": "function"376 },377 {378 "inputs": [379 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }380 ],381 "name": "crossOwnerOf",382 "outputs": [383 {384 "components": [385 { "internalType": "address", "name": "eth", "type": "address" },386 { "internalType": "uint256", "name": "sub", "type": "uint256" }387 ],388 "internalType": "struct EthCrossAccount",389 "name": "",390 "type": "tuple"391 }392 ],393 "stateMutability": "view",394 "type": "function"395 },396 {397 "inputs": [398 { "internalType": "string[]", "name": "keys", "type": "string[]" }399 ],400 "name": "deleteCollectionProperties",401 "outputs": [],402 "stateMutability": "nonpayable",403 "type": "function"404 },405 {406 "inputs": [407 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },408 { "internalType": "string[]", "name": "keys", "type": "string[]" }409 ],410 "name": "deleteProperties",411 "outputs": [],412 "stateMutability": "nonpayable",413 "type": "function"414 },415 {416 "inputs": [],417 "name": "description",418 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],419 "stateMutability": "view",420 "type": "function"421 },422 {423 "inputs": [],424 "name": "finishMinting",425 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],426 "stateMutability": "nonpayable",427 "type": "function"428 },429 {430 "inputs": [431 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }432 ],433 "name": "getApproved",434 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],435 "stateMutability": "view",436 "type": "function"437 },438 {439 "inputs": [],440 "name": "hasCollectionPendingSponsor",441 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],442 "stateMutability": "view",443 "type": "function"444 },445 {446 "inputs": [447 { "internalType": "address", "name": "owner", "type": "address" },448 { "internalType": "address", "name": "operator", "type": "address" }449 ],450 "name": "isApprovedForAll",451 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],452 "stateMutability": "view",453 "type": "function"454 },455 {456 "inputs": [457 {458 "components": [459 { "internalType": "address", "name": "eth", "type": "address" },460 { "internalType": "uint256", "name": "sub", "type": "uint256" }461 ],462 "internalType": "struct EthCrossAccount",463 "name": "user",464 "type": "tuple"465 }466 ],467 "name": "isOwnerOrAdminCross",468 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],469 "stateMutability": "view",470 "type": "function"471 },472 {473 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],474 "name": "mint",475 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],476 "stateMutability": "nonpayable",477 "type": "function"478 },479 {480 "inputs": [481 { "internalType": "address", "name": "to", "type": "address" },482 { "internalType": "string", "name": "tokenUri", "type": "string" }483 ],484 "name": "mintWithTokenURI",485 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],486 "stateMutability": "nonpayable",487 "type": "function"488 },489 {490 "inputs": [],491 "name": "mintingFinished",492 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],493 "stateMutability": "view",494 "type": "function"495 },496 {497 "inputs": [],498 "name": "name",499 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],500 "stateMutability": "view",501 "type": "function"502 },503 {504 "inputs": [],505 "name": "nextTokenId",506 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],507 "stateMutability": "view",508 "type": "function"509 },510 {511 "inputs": [512 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }513 ],514 "name": "ownerOf",515 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],516 "stateMutability": "view",517 "type": "function"518 },519 {520 "inputs": [521 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },522 { "internalType": "string[]", "name": "keys", "type": "string[]" }523 ],524 "name": "properties",525 "outputs": [526 {527 "components": [528 { "internalType": "string", "name": "key", "type": "string" },529 { "internalType": "bytes", "name": "value", "type": "bytes" }530 ],531 "internalType": "struct Property[]",532 "name": "",533 "type": "tuple[]"534 }535 ],536 "stateMutability": "view",537 "type": "function"538 },539 {540 "inputs": [541 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },542 { "internalType": "string", "name": "key", "type": "string" }543 ],544 "name": "property",545 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],546 "stateMutability": "view",547 "type": "function"548 },549 {550 "inputs": [551 {552 "components": [553 { "internalType": "address", "name": "eth", "type": "address" },554 { "internalType": "uint256", "name": "sub", "type": "uint256" }555 ],556 "internalType": "struct EthCrossAccount",557 "name": "admin",558 "type": "tuple"559 }560 ],561 "name": "removeCollectionAdminCross",562 "outputs": [],563 "stateMutability": "nonpayable",564 "type": "function"565 },566 {567 "inputs": [],568 "name": "removeCollectionSponsor",569 "outputs": [],570 "stateMutability": "nonpayable",571 "type": "function"572 },573 {574 "inputs": [575 {576 "components": [577 { "internalType": "address", "name": "eth", "type": "address" },578 { "internalType": "uint256", "name": "sub", "type": "uint256" }579 ],580 "internalType": "struct EthCrossAccount",581 "name": "user",582 "type": "tuple"583 }584 ],585 "name": "removeFromCollectionAllowListCross",586 "outputs": [],587 "stateMutability": "nonpayable",588 "type": "function"589 },590 {591 "inputs": [592 { "internalType": "address", "name": "from", "type": "address" },593 { "internalType": "address", "name": "to", "type": "address" },594 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }595 ],596 "name": "safeTransferFrom",597 "outputs": [],598 "stateMutability": "nonpayable",599 "type": "function"600 },601 {602 "inputs": [603 { "internalType": "address", "name": "from", "type": "address" },604 { "internalType": "address", "name": "to", "type": "address" },605 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },606 { "internalType": "bytes", "name": "data", "type": "bytes" }607 ],608 "name": "safeTransferFrom",609 "outputs": [],610 "stateMutability": "nonpayable",611 "type": "function"612 },613 {614 "inputs": [615 { "internalType": "address", "name": "operator", "type": "address" },616 { "internalType": "bool", "name": "approved", "type": "bool" }617 ],618 "name": "setApprovalForAll",619 "outputs": [],620 "stateMutability": "nonpayable",621 "type": "function"622 },623 {624 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],625 "name": "setCollectionAccess",626 "outputs": [],627 "stateMutability": "nonpayable",628 "type": "function"629 },630 {631 "inputs": [632 {633 "internalType": "enum CollectionLimits",634 "name": "limit",635 "type": "uint8"636 },637 { "internalType": "bool", "name": "status", "type": "bool" },638 { "internalType": "uint256", "name": "value", "type": "uint256" }639 ],640 "name": "setCollectionLimit",641 "outputs": [],642 "stateMutability": "nonpayable",643 "type": "function"644 },645 {646 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],647 "name": "setCollectionMintMode",648 "outputs": [],649 "stateMutability": "nonpayable",650 "type": "function"651 },652 {653 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],654 "name": "setCollectionNesting",655 "outputs": [],656 "stateMutability": "nonpayable",657 "type": "function"658 },659 {660 "inputs": [661 { "internalType": "bool", "name": "enable", "type": "bool" },662 {663 "internalType": "address[]",664 "name": "collections",665 "type": "address[]"666 }667 ],668 "name": "setCollectionNesting",669 "outputs": [],670 "stateMutability": "nonpayable",671 "type": "function"672 },673 {674 "inputs": [675 {676 "components": [677 { "internalType": "string", "name": "key", "type": "string" },678 { "internalType": "bytes", "name": "value", "type": "bytes" }679 ],680 "internalType": "struct Property[]",681 "name": "properties",682 "type": "tuple[]"683 }684 ],685 "name": "setCollectionProperties",686 "outputs": [],687 "stateMutability": "nonpayable",688 "type": "function"689 },690 {691 "inputs": [692 {693 "components": [694 { "internalType": "address", "name": "eth", "type": "address" },695 { "internalType": "uint256", "name": "sub", "type": "uint256" }696 ],697 "internalType": "struct EthCrossAccount",698 "name": "sponsor",699 "type": "tuple"700 }701 ],702 "name": "setCollectionSponsorCross",703 "outputs": [],704 "stateMutability": "nonpayable",705 "type": "function"706 },707 {708 "inputs": [709 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },710 {711 "components": [712 { "internalType": "string", "name": "key", "type": "string" },713 { "internalType": "bytes", "name": "value", "type": "bytes" }714 ],715 "internalType": "struct Property[]",716 "name": "properties",717 "type": "tuple[]"718 }719 ],720 "name": "setProperties",721 "outputs": [],722 "stateMutability": "nonpayable",723 "type": "function"724 },725 {726 "inputs": [727 {728 "components": [729 { "internalType": "string", "name": "field_0", "type": "string" },730 {731 "components": [732 {733 "internalType": "enum EthTokenPermissions",734 "name": "field_0",735 "type": "uint8"736 },737 { "internalType": "bool", "name": "field_1", "type": "bool" }738 ],739 "internalType": "struct Tuple57[]",740 "name": "field_1",741 "type": "tuple[]"742 }743 ],744 "internalType": "struct Tuple59[]",745 "name": "permissions",746 "type": "tuple[]"747 }748 ],749 "name": "setTokenPropertyPermissions",750 "outputs": [],751 "stateMutability": "nonpayable",752 "type": "function"753 },754 {755 "inputs": [756 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }757 ],758 "name": "supportsInterface",759 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],760 "stateMutability": "view",761 "type": "function"762 },763 {764 "inputs": [],765 "name": "symbol",766 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],767 "stateMutability": "view",768 "type": "function"769 },770 {771 "inputs": [772 { "internalType": "uint256", "name": "index", "type": "uint256" }773 ],774 "name": "tokenByIndex",775 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],776 "stateMutability": "view",777 "type": "function"778 },779 {780 "inputs": [781 { "internalType": "address", "name": "owner", "type": "address" },782 { "internalType": "uint256", "name": "index", "type": "uint256" }783 ],784 "name": "tokenOfOwnerByIndex",785 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],786 "stateMutability": "view",787 "type": "function"788 },789 {790 "inputs": [],791 "name": "tokenPropertyPermissions",792 "outputs": [793 {794 "components": [795 { "internalType": "string", "name": "field_0", "type": "string" },796 {797 "components": [798 {799 "internalType": "enum EthTokenPermissions",800 "name": "field_0",801 "type": "uint8"802 },803 { "internalType": "bool", "name": "field_1", "type": "bool" }804 ],805 "internalType": "struct Tuple57[]",806 "name": "field_1",807 "type": "tuple[]"808 }809 ],810 "internalType": "struct Tuple59[]",811 "name": "",812 "type": "tuple[]"813 }814 ],815 "stateMutability": "view",816 "type": "function"817 },818 {819 "inputs": [820 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }821 ],822 "name": "tokenURI",823 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],824 "stateMutability": "view",825 "type": "function"826 },827 {828 "inputs": [],829 "name": "totalSupply",830 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],831 "stateMutability": "view",832 "type": "function"833 },834 {835 "inputs": [836 { "internalType": "address", "name": "to", "type": "address" },837 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }838 ],839 "name": "transfer",840 "outputs": [],841 "stateMutability": "nonpayable",842 "type": "function"843 },844 {845 "inputs": [846 {847 "components": [848 { "internalType": "address", "name": "eth", "type": "address" },849 { "internalType": "uint256", "name": "sub", "type": "uint256" }850 ],851 "internalType": "struct EthCrossAccount",852 "name": "to",853 "type": "tuple"854 },855 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }856 ],857 "name": "transferCross",858 "outputs": [],859 "stateMutability": "nonpayable",860 "type": "function"861 },862 {863 "inputs": [864 { "internalType": "address", "name": "from", "type": "address" },865 { "internalType": "address", "name": "to", "type": "address" },866 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }867 ],868 "name": "transferFrom",869 "outputs": [],870 "stateMutability": "nonpayable",871 "type": "function"872 },873 {874 "inputs": [875 {876 "components": [877 { "internalType": "address", "name": "eth", "type": "address" },878 { "internalType": "uint256", "name": "sub", "type": "uint256" }879 ],880 "internalType": "struct EthCrossAccount",881 "name": "from",882 "type": "tuple"883 },884 {885 "components": [886 { "internalType": "address", "name": "eth", "type": "address" },887 { "internalType": "uint256", "name": "sub", "type": "uint256" }888 ],889 "internalType": "struct EthCrossAccount",890 "name": "to",891 "type": "tuple"892 },893 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }894 ],895 "name": "transferFromCross",896 "outputs": [],897 "stateMutability": "nonpayable",898 "type": "function"899 },900 {901 "inputs": [],902 "name": "uniqueCollectionType",903 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],904 "stateMutability": "view",905 "type": "function"906 }907]1[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 {147 "components": [148 { "internalType": "address", "name": "eth", "type": "address" },149 { "internalType": "uint256", "name": "sub", "type": "uint256" }150 ],151 "internalType": "struct EthCrossAccount",152 "name": "approved",153 "type": "tuple"154 },155 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156 ],157 "name": "approveCross",158 "outputs": [],159 "stateMutability": "nonpayable",160 "type": "function"161 },162 {163 "inputs": [164 { "internalType": "address", "name": "owner", "type": "address" }165 ],166 "name": "balanceOf",167 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],168 "stateMutability": "view",169 "type": "function"170 },171 {172 "inputs": [173 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174 ],175 "name": "burn",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": "from",189 "type": "tuple"190 },191 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }192 ],193 "name": "burnFromCross",194 "outputs": [],195 "stateMutability": "nonpayable",196 "type": "function"197 },198 {199 "inputs": [200 {201 "components": [202 { "internalType": "address", "name": "eth", "type": "address" },203 { "internalType": "uint256", "name": "sub", "type": "uint256" }204 ],205 "internalType": "struct EthCrossAccount",206 "name": "newOwner",207 "type": "tuple"208 }209 ],210 "name": "changeCollectionOwnerCross",211 "outputs": [],212 "stateMutability": "nonpayable",213 "type": "function"214 },215 {216 "inputs": [],217 "name": "collectionAdmins",218 "outputs": [219 {220 "components": [221 { "internalType": "address", "name": "eth", "type": "address" },222 { "internalType": "uint256", "name": "sub", "type": "uint256" }223 ],224 "internalType": "struct EthCrossAccount[]",225 "name": "",226 "type": "tuple[]"227 }228 ],229 "stateMutability": "view",230 "type": "function"231 },232 {233 "inputs": [],234 "name": "collectionHelperAddress",235 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],236 "stateMutability": "view",237 "type": "function"238 },239 {240 "inputs": [],241 "name": "collectionLimits",242 "outputs": [243 {244 "components": [245 {246 "internalType": "enum CollectionLimits",247 "name": "field_0",248 "type": "uint8"249 },250 { "internalType": "bool", "name": "field_1", "type": "bool" },251 { "internalType": "uint256", "name": "field_2", "type": "uint256" }252 ],253 "internalType": "struct Tuple33[]",254 "name": "",255 "type": "tuple[]"256 }257 ],258 "stateMutability": "view",259 "type": "function"260 },261 {262 "inputs": [],263 "name": "collectionNestingPermissions",264 "outputs": [265 {266 "components": [267 {268 "internalType": "enum CollectionPermissions",269 "name": "field_0",270 "type": "uint8"271 },272 { "internalType": "bool", "name": "field_1", "type": "bool" }273 ],274 "internalType": "struct Tuple42[]",275 "name": "",276 "type": "tuple[]"277 }278 ],279 "stateMutability": "view",280 "type": "function"281 },282 {283 "inputs": [],284 "name": "collectionNestingRestrictedCollectionIds",285 "outputs": [286 {287 "components": [288 { "internalType": "bool", "name": "field_0", "type": "bool" },289 {290 "internalType": "uint256[]",291 "name": "field_1",292 "type": "uint256[]"293 }294 ],295 "internalType": "struct Tuple39",296 "name": "",297 "type": "tuple"298 }299 ],300 "stateMutability": "view",301 "type": "function"302 },303 {304 "inputs": [],305 "name": "collectionOwner",306 "outputs": [307 {308 "components": [309 { "internalType": "address", "name": "eth", "type": "address" },310 { "internalType": "uint256", "name": "sub", "type": "uint256" }311 ],312 "internalType": "struct EthCrossAccount",313 "name": "",314 "type": "tuple"315 }316 ],317 "stateMutability": "view",318 "type": "function"319 },320 {321 "inputs": [322 { "internalType": "string[]", "name": "keys", "type": "string[]" }323 ],324 "name": "collectionProperties",325 "outputs": [326 {327 "components": [328 { "internalType": "string", "name": "key", "type": "string" },329 { "internalType": "bytes", "name": "value", "type": "bytes" }330 ],331 "internalType": "struct Property[]",332 "name": "",333 "type": "tuple[]"334 }335 ],336 "stateMutability": "view",337 "type": "function"338 },339 {340 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],341 "name": "collectionProperty",342 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],343 "stateMutability": "view",344 "type": "function"345 },346 {347 "inputs": [],348 "name": "collectionSponsor",349 "outputs": [350 {351 "components": [352 { "internalType": "address", "name": "field_0", "type": "address" },353 { "internalType": "uint256", "name": "field_1", "type": "uint256" }354 ],355 "internalType": "struct Tuple32",356 "name": "",357 "type": "tuple"358 }359 ],360 "stateMutability": "view",361 "type": "function"362 },363 {364 "inputs": [],365 "name": "confirmCollectionSponsorship",366 "outputs": [],367 "stateMutability": "nonpayable",368 "type": "function"369 },370 {371 "inputs": [],372 "name": "contractAddress",373 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],374 "stateMutability": "view",375 "type": "function"376 },377 {378 "inputs": [379 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }380 ],381 "name": "crossOwnerOf",382 "outputs": [383 {384 "components": [385 { "internalType": "address", "name": "eth", "type": "address" },386 { "internalType": "uint256", "name": "sub", "type": "uint256" }387 ],388 "internalType": "struct EthCrossAccount",389 "name": "",390 "type": "tuple"391 }392 ],393 "stateMutability": "view",394 "type": "function"395 },396 {397 "inputs": [398 { "internalType": "string[]", "name": "keys", "type": "string[]" }399 ],400 "name": "deleteCollectionProperties",401 "outputs": [],402 "stateMutability": "nonpayable",403 "type": "function"404 },405 {406 "inputs": [407 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },408 { "internalType": "string[]", "name": "keys", "type": "string[]" }409 ],410 "name": "deleteProperties",411 "outputs": [],412 "stateMutability": "nonpayable",413 "type": "function"414 },415 {416 "inputs": [],417 "name": "description",418 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],419 "stateMutability": "view",420 "type": "function"421 },422 {423 "inputs": [],424 "name": "finishMinting",425 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],426 "stateMutability": "nonpayable",427 "type": "function"428 },429 {430 "inputs": [431 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }432 ],433 "name": "getApproved",434 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],435 "stateMutability": "view",436 "type": "function"437 },438 {439 "inputs": [],440 "name": "hasCollectionPendingSponsor",441 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],442 "stateMutability": "view",443 "type": "function"444 },445 {446 "inputs": [447 { "internalType": "address", "name": "owner", "type": "address" },448 { "internalType": "address", "name": "operator", "type": "address" }449 ],450 "name": "isApprovedForAll",451 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],452 "stateMutability": "view",453 "type": "function"454 },455 {456 "inputs": [457 {458 "components": [459 { "internalType": "address", "name": "eth", "type": "address" },460 { "internalType": "uint256", "name": "sub", "type": "uint256" }461 ],462 "internalType": "struct EthCrossAccount",463 "name": "user",464 "type": "tuple"465 }466 ],467 "name": "isOwnerOrAdminCross",468 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],469 "stateMutability": "view",470 "type": "function"471 },472 {473 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],474 "name": "mint",475 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],476 "stateMutability": "nonpayable",477 "type": "function"478 },479 {480 "inputs": [481 {482 "components": [483 { "internalType": "address", "name": "eth", "type": "address" },484 { "internalType": "uint256", "name": "sub", "type": "uint256" }485 ],486 "internalType": "struct EthCrossAccount",487 "name": "to",488 "type": "tuple"489 },490 {491 "components": [492 { "internalType": "string", "name": "key", "type": "string" },493 { "internalType": "bytes", "name": "value", "type": "bytes" }494 ],495 "internalType": "struct Property[]",496 "name": "properties",497 "type": "tuple[]"498 }499 ],500 "name": "mintCross",501 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],502 "stateMutability": "nonpayable",503 "type": "function"504 },505 {506 "inputs": [507 { "internalType": "address", "name": "to", "type": "address" },508 { "internalType": "string", "name": "tokenUri", "type": "string" }509 ],510 "name": "mintWithTokenURI",511 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],512 "stateMutability": "nonpayable",513 "type": "function"514 },515 {516 "inputs": [],517 "name": "mintingFinished",518 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],519 "stateMutability": "view",520 "type": "function"521 },522 {523 "inputs": [],524 "name": "name",525 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],526 "stateMutability": "view",527 "type": "function"528 },529 {530 "inputs": [],531 "name": "nextTokenId",532 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],533 "stateMutability": "view",534 "type": "function"535 },536 {537 "inputs": [538 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }539 ],540 "name": "ownerOf",541 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],542 "stateMutability": "view",543 "type": "function"544 },545 {546 "inputs": [547 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },548 { "internalType": "string[]", "name": "keys", "type": "string[]" }549 ],550 "name": "properties",551 "outputs": [552 {553 "components": [554 { "internalType": "string", "name": "key", "type": "string" },555 { "internalType": "bytes", "name": "value", "type": "bytes" }556 ],557 "internalType": "struct Property[]",558 "name": "",559 "type": "tuple[]"560 }561 ],562 "stateMutability": "view",563 "type": "function"564 },565 {566 "inputs": [567 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },568 { "internalType": "string", "name": "key", "type": "string" }569 ],570 "name": "property",571 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],572 "stateMutability": "view",573 "type": "function"574 },575 {576 "inputs": [577 {578 "components": [579 { "internalType": "address", "name": "eth", "type": "address" },580 { "internalType": "uint256", "name": "sub", "type": "uint256" }581 ],582 "internalType": "struct EthCrossAccount",583 "name": "admin",584 "type": "tuple"585 }586 ],587 "name": "removeCollectionAdminCross",588 "outputs": [],589 "stateMutability": "nonpayable",590 "type": "function"591 },592 {593 "inputs": [],594 "name": "removeCollectionSponsor",595 "outputs": [],596 "stateMutability": "nonpayable",597 "type": "function"598 },599 {600 "inputs": [601 {602 "components": [603 { "internalType": "address", "name": "eth", "type": "address" },604 { "internalType": "uint256", "name": "sub", "type": "uint256" }605 ],606 "internalType": "struct EthCrossAccount",607 "name": "user",608 "type": "tuple"609 }610 ],611 "name": "removeFromCollectionAllowListCross",612 "outputs": [],613 "stateMutability": "nonpayable",614 "type": "function"615 },616 {617 "inputs": [618 { "internalType": "address", "name": "from", "type": "address" },619 { "internalType": "address", "name": "to", "type": "address" },620 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }621 ],622 "name": "safeTransferFrom",623 "outputs": [],624 "stateMutability": "nonpayable",625 "type": "function"626 },627 {628 "inputs": [629 { "internalType": "address", "name": "from", "type": "address" },630 { "internalType": "address", "name": "to", "type": "address" },631 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },632 { "internalType": "bytes", "name": "data", "type": "bytes" }633 ],634 "name": "safeTransferFrom",635 "outputs": [],636 "stateMutability": "nonpayable",637 "type": "function"638 },639 {640 "inputs": [641 { "internalType": "address", "name": "operator", "type": "address" },642 { "internalType": "bool", "name": "approved", "type": "bool" }643 ],644 "name": "setApprovalForAll",645 "outputs": [],646 "stateMutability": "nonpayable",647 "type": "function"648 },649 {650 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],651 "name": "setCollectionAccess",652 "outputs": [],653 "stateMutability": "nonpayable",654 "type": "function"655 },656 {657 "inputs": [658 {659 "internalType": "enum CollectionLimits",660 "name": "limit",661 "type": "uint8"662 },663 { "internalType": "bool", "name": "status", "type": "bool" },664 { "internalType": "uint256", "name": "value", "type": "uint256" }665 ],666 "name": "setCollectionLimit",667 "outputs": [],668 "stateMutability": "nonpayable",669 "type": "function"670 },671 {672 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],673 "name": "setCollectionMintMode",674 "outputs": [],675 "stateMutability": "nonpayable",676 "type": "function"677 },678 {679 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],680 "name": "setCollectionNesting",681 "outputs": [],682 "stateMutability": "nonpayable",683 "type": "function"684 },685 {686 "inputs": [687 { "internalType": "bool", "name": "enable", "type": "bool" },688 {689 "internalType": "address[]",690 "name": "collections",691 "type": "address[]"692 }693 ],694 "name": "setCollectionNesting",695 "outputs": [],696 "stateMutability": "nonpayable",697 "type": "function"698 },699 {700 "inputs": [701 {702 "components": [703 { "internalType": "string", "name": "key", "type": "string" },704 { "internalType": "bytes", "name": "value", "type": "bytes" }705 ],706 "internalType": "struct Property[]",707 "name": "properties",708 "type": "tuple[]"709 }710 ],711 "name": "setCollectionProperties",712 "outputs": [],713 "stateMutability": "nonpayable",714 "type": "function"715 },716 {717 "inputs": [718 {719 "components": [720 { "internalType": "address", "name": "eth", "type": "address" },721 { "internalType": "uint256", "name": "sub", "type": "uint256" }722 ],723 "internalType": "struct EthCrossAccount",724 "name": "sponsor",725 "type": "tuple"726 }727 ],728 "name": "setCollectionSponsorCross",729 "outputs": [],730 "stateMutability": "nonpayable",731 "type": "function"732 },733 {734 "inputs": [735 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },736 {737 "components": [738 { "internalType": "string", "name": "key", "type": "string" },739 { "internalType": "bytes", "name": "value", "type": "bytes" }740 ],741 "internalType": "struct Property[]",742 "name": "properties",743 "type": "tuple[]"744 }745 ],746 "name": "setProperties",747 "outputs": [],748 "stateMutability": "nonpayable",749 "type": "function"750 },751 {752 "inputs": [753 {754 "components": [755 { "internalType": "string", "name": "field_0", "type": "string" },756 {757 "components": [758 {759 "internalType": "enum EthTokenPermissions",760 "name": "field_0",761 "type": "uint8"762 },763 { "internalType": "bool", "name": "field_1", "type": "bool" }764 ],765 "internalType": "struct Tuple57[]",766 "name": "field_1",767 "type": "tuple[]"768 }769 ],770 "internalType": "struct Tuple59[]",771 "name": "permissions",772 "type": "tuple[]"773 }774 ],775 "name": "setTokenPropertyPermissions",776 "outputs": [],777 "stateMutability": "nonpayable",778 "type": "function"779 },780 {781 "inputs": [782 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }783 ],784 "name": "supportsInterface",785 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],786 "stateMutability": "view",787 "type": "function"788 },789 {790 "inputs": [],791 "name": "symbol",792 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],793 "stateMutability": "view",794 "type": "function"795 },796 {797 "inputs": [798 { "internalType": "uint256", "name": "index", "type": "uint256" }799 ],800 "name": "tokenByIndex",801 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],802 "stateMutability": "view",803 "type": "function"804 },805 {806 "inputs": [807 { "internalType": "address", "name": "owner", "type": "address" },808 { "internalType": "uint256", "name": "index", "type": "uint256" }809 ],810 "name": "tokenOfOwnerByIndex",811 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],812 "stateMutability": "view",813 "type": "function"814 },815 {816 "inputs": [],817 "name": "tokenPropertyPermissions",818 "outputs": [819 {820 "components": [821 { "internalType": "string", "name": "field_0", "type": "string" },822 {823 "components": [824 {825 "internalType": "enum EthTokenPermissions",826 "name": "field_0",827 "type": "uint8"828 },829 { "internalType": "bool", "name": "field_1", "type": "bool" }830 ],831 "internalType": "struct Tuple57[]",832 "name": "field_1",833 "type": "tuple[]"834 }835 ],836 "internalType": "struct Tuple59[]",837 "name": "",838 "type": "tuple[]"839 }840 ],841 "stateMutability": "view",842 "type": "function"843 },844 {845 "inputs": [846 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }847 ],848 "name": "tokenURI",849 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],850 "stateMutability": "view",851 "type": "function"852 },853 {854 "inputs": [],855 "name": "totalSupply",856 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],857 "stateMutability": "view",858 "type": "function"859 },860 {861 "inputs": [862 { "internalType": "address", "name": "to", "type": "address" },863 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }864 ],865 "name": "transfer",866 "outputs": [],867 "stateMutability": "nonpayable",868 "type": "function"869 },870 {871 "inputs": [872 {873 "components": [874 { "internalType": "address", "name": "eth", "type": "address" },875 { "internalType": "uint256", "name": "sub", "type": "uint256" }876 ],877 "internalType": "struct EthCrossAccount",878 "name": "to",879 "type": "tuple"880 },881 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }882 ],883 "name": "transferCross",884 "outputs": [],885 "stateMutability": "nonpayable",886 "type": "function"887 },888 {889 "inputs": [890 { "internalType": "address", "name": "from", "type": "address" },891 { "internalType": "address", "name": "to", "type": "address" },892 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }893 ],894 "name": "transferFrom",895 "outputs": [],896 "stateMutability": "nonpayable",897 "type": "function"898 },899 {900 "inputs": [901 {902 "components": [903 { "internalType": "address", "name": "eth", "type": "address" },904 { "internalType": "uint256", "name": "sub", "type": "uint256" }905 ],906 "internalType": "struct EthCrossAccount",907 "name": "from",908 "type": "tuple"909 },910 {911 "components": [912 { "internalType": "address", "name": "eth", "type": "address" },913 { "internalType": "uint256", "name": "sub", "type": "uint256" }914 ],915 "internalType": "struct EthCrossAccount",916 "name": "to",917 "type": "tuple"918 },919 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }920 ],921 "name": "transferFromCross",922 "outputs": [],923 "stateMutability": "nonpayable",924 "type": "function"925 },926 {927 "inputs": [],928 "name": "uniqueCollectionType",929 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],930 "stateMutability": "view",931 "type": "function"932 }933]tests/src/eth/abi/reFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -334,7 +334,7 @@
{ "internalType": "address", "name": "field_0", "type": "address" },
{ "internalType": "uint256", "name": "field_1", "type": "uint256" }
],
- "internalType": "struct Tuple29",
+ "internalType": "struct Tuple31",
"name": "",
"type": "tuple"
}
@@ -460,6 +460,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/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);