difftreelog
misk: Move TokenChanged event into ERC721 contracts
in: master
16 files changed
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -26,7 +26,6 @@
};
use pallet_evm_coder_substrate::dispatch_to_evm;
use sp_std::{vec, vec::Vec};
-use sp_core::U256;
use up_data_structs::{
CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property, SponsoringRateLimit,
SponsorshipState,
@@ -62,18 +61,9 @@
},
/// The collection has been changed.
CollectionChanged {
- /// Collection ID.
- #[indexed]
- collection_id: Address,
- },
-
- /// The token has been changed.
- TokenChanged {
/// Collection ID.
#[indexed]
collection_id: Address,
- /// Token ID.
- token_id: U256,
},
}
pallets/common/src/lib.rsdiffbeforeafterboth--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -1250,6 +1250,7 @@
mut stored_properties: Properties,
is_token_owner: impl Fn() -> Result<bool, DispatchError>,
set_token_properties: impl FnOnce(Properties),
+ log: evm_coder::ethereum::Log,
) -> DispatchResult {
let is_collection_admin = collection.is_owner_or_admin(sender);
let permissions = Self::property_permissions(collection.id);
@@ -1304,13 +1305,7 @@
}
}
- <PalletEvm<T>>::deposit_log(
- CollectionHelpersEvents::TokenChanged {
- collection_id: eth::collection_id_to_address(collection.id),
- token_id: token_id.into(),
- }
- .to_log(T::ContractAddress::get()),
- );
+ <PalletEvm<T>>::deposit_log(log.clone());
}
set_token_properties(stored_properties);
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -50,13 +50,26 @@
TokenProperties, SelfWeightOf, weights::WeightInfo,
};
+/// Nft events.
+#[derive(ToLog)]
+pub enum ERC721TokenEvent {
+ /// The token has been changed.
+ TokenChanged {
+ /// Collection ID.
+ #[indexed]
+ collection_id: Address,
+ /// Token ID.
+ token_id: U256,
+ },
+}
+
frontier_contract! {
macro_rules! NonfungibleHandle_result {...}
impl<T: Config> Contract for NonfungibleHandle<T> {...}
}
/// @title A contract that allows to set and delete token properties and change token property permissions.
-#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))]
+#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))]
impl<T: Config> NonfungibleHandle<T> {
/// @notice Set permissions for token property.
/// @dev Throws error if `msg.sender` is not admin or owner of the collection.
pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -112,7 +112,7 @@
};
use pallet_structure::{Pallet as PalletStructure, Error as StructureError};
use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder};
-use sp_core::H160;
+use sp_core::{Get, H160};
use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
use core::ops::Deref;
@@ -622,6 +622,11 @@
stored_properties,
is_token_owner,
|properties| <TokenProperties<T>>::set((collection.id, token_id), properties),
+ erc::ERC721TokenEvent::TokenChanged {
+ collection_id: collection_id_to_address(collection.id),
+ token_id: token_id.into(),
+ }
+ .to_log(T::ContractAddress::get()),
)
}
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -17,9 +17,14 @@
}
}
+/// @dev inlined interface
+contract ERC721TokenEvent {
+ event TokenChanged(address indexed collectionId, uint256 tokenId);
+}
+
/// @title A contract that allows to set and delete token properties and change token property permissions.
/// @dev the ERC-165 identifier for this interface is 0xde0695c2
-contract TokenProperties is Dummy, ERC165 {
+contract TokenProperties is Dummy, ERC165, ERC721TokenEvent {
// /// @notice Set permissions for token property.
// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
// /// @param key Property key.
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -59,8 +59,21 @@
pub const ADDRESS_FOR_PARTIALLY_OWNED_TOKENS: H160 = H160::repeat_byte(0xff);
+/// Rft events.
+#[derive(ToLog)]
+pub enum ERC721TokenEvent {
+ /// The token has been changed.
+ TokenChanged {
+ /// Collection ID.
+ #[indexed]
+ collection_id: Address,
+ /// Token ID.
+ token_id: U256,
+ },
+}
+
/// @title A contract that allows to set and delete token properties and change token property permissions.
-#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))]
+#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))]
impl<T: Config> RefungibleHandle<T> {
/// @notice Set permissions for token property.
/// @dev Throws error if `msg.sender` is not admin or owner of the collection.
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -100,7 +100,7 @@
Event as CommonEvent, Pallet as PalletCommon,
};
use pallet_structure::Pallet as PalletStructure;
-use sp_core::H160;
+use sp_core::{Get, H160};
use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
use up_data_structs::{
@@ -571,6 +571,11 @@
stored_properties,
is_token_owner,
|properties| <TokenProperties<T>>::set((collection.id, token_id), properties),
+ erc::ERC721TokenEvent::TokenChanged {
+ collection_id: collection_id_to_address(collection.id),
+ token_id: token_id.into(),
+ }
+ .to_log(T::ContractAddress::get()),
)
}
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -17,9 +17,14 @@
}
}
+/// @dev inlined interface
+contract ERC721TokenEvent {
+ event TokenChanged(address indexed collectionId, uint256 tokenId);
+}
+
/// @title A contract that allows to set and delete token properties and change token property permissions.
/// @dev the ERC-165 identifier for this interface is 0xde0695c2
-contract TokenProperties is Dummy, ERC165 {
+contract TokenProperties is Dummy, ERC165, ERC721TokenEvent {
// /// @notice Set permissions for token property.
// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
// /// @param key Property key.
pallets/unique/src/eth/stubs/CollectionHelpers.soldiffbeforeafterboth--- a/pallets/unique/src/eth/stubs/CollectionHelpers.sol
+++ b/pallets/unique/src/eth/stubs/CollectionHelpers.sol
@@ -22,7 +22,6 @@
event CollectionCreated(address indexed owner, address indexed collectionId);
event CollectionDestroyed(address indexed collectionId);
event CollectionChanged(address indexed collectionId);
- event TokenChanged(address indexed collectionId, uint256 tokenId);
}
/// @title Contract, which allows users to operate with collections
tests/src/eth/abi/collectionHelpers.jsondiffbeforeafterboth--- a/tests/src/eth/abi/collectionHelpers.json
+++ b/tests/src/eth/abi/collectionHelpers.json
@@ -45,25 +45,6 @@
"type": "event"
},
{
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "address",
- "name": "collectionId",
- "type": "address"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "tokenId",
- "type": "uint256"
- }
- ],
- "name": "TokenChanged",
- "type": "event"
- },
- {
"inputs": [
{ "internalType": "uint32", "name": "collectionId", "type": "uint32" }
],
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -55,6 +55,25 @@
{
"indexed": true,
"internalType": "address",
+ "name": "collectionId",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "TokenChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
"name": "from",
"type": "address"
},
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 {56 "indexed": true,57 "internalType": "address",58 "name": "from",59 "type": "address"60 },61 {62 "indexed": true,63 "internalType": "address",64 "name": "to",65 "type": "address"66 },67 {68 "indexed": true,69 "internalType": "uint256",70 "name": "tokenId",71 "type": "uint256"72 }73 ],74 "name": "Transfer",75 "type": "event"76 },77 {78 "inputs": [79 {80 "components": [81 { "internalType": "address", "name": "eth", "type": "address" },82 { "internalType": "uint256", "name": "sub", "type": "uint256" }83 ],84 "internalType": "struct CrossAddress",85 "name": "newAdmin",86 "type": "tuple"87 }88 ],89 "name": "addCollectionAdminCross",90 "outputs": [],91 "stateMutability": "nonpayable",92 "type": "function"93 },94 {95 "inputs": [96 {97 "components": [98 { "internalType": "address", "name": "eth", "type": "address" },99 { "internalType": "uint256", "name": "sub", "type": "uint256" }100 ],101 "internalType": "struct CrossAddress",102 "name": "user",103 "type": "tuple"104 }105 ],106 "name": "addToCollectionAllowListCross",107 "outputs": [],108 "stateMutability": "nonpayable",109 "type": "function"110 },111 {112 "inputs": [113 {114 "components": [115 { "internalType": "address", "name": "eth", "type": "address" },116 { "internalType": "uint256", "name": "sub", "type": "uint256" }117 ],118 "internalType": "struct CrossAddress",119 "name": "user",120 "type": "tuple"121 }122 ],123 "name": "allowlistedCross",124 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],125 "stateMutability": "view",126 "type": "function"127 },128 {129 "inputs": [130 { "internalType": "address", "name": "approved", "type": "address" },131 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }132 ],133 "name": "approve",134 "outputs": [],135 "stateMutability": "nonpayable",136 "type": "function"137 },138 {139 "inputs": [140 { "internalType": "address", "name": "owner", "type": "address" }141 ],142 "name": "balanceOf",143 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],144 "stateMutability": "view",145 "type": "function"146 },147 {148 "inputs": [149 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }150 ],151 "name": "burn",152 "outputs": [],153 "stateMutability": "nonpayable",154 "type": "function"155 },156 {157 "inputs": [158 {159 "components": [160 { "internalType": "address", "name": "eth", "type": "address" },161 { "internalType": "uint256", "name": "sub", "type": "uint256" }162 ],163 "internalType": "struct CrossAddress",164 "name": "from",165 "type": "tuple"166 },167 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }168 ],169 "name": "burnFromCross",170 "outputs": [],171 "stateMutability": "nonpayable",172 "type": "function"173 },174 {175 "inputs": [176 {177 "components": [178 { "internalType": "address", "name": "eth", "type": "address" },179 { "internalType": "uint256", "name": "sub", "type": "uint256" }180 ],181 "internalType": "struct CrossAddress",182 "name": "newOwner",183 "type": "tuple"184 }185 ],186 "name": "changeCollectionOwnerCross",187 "outputs": [],188 "stateMutability": "nonpayable",189 "type": "function"190 },191 {192 "inputs": [],193 "name": "collectionAdmins",194 "outputs": [195 {196 "components": [197 { "internalType": "address", "name": "eth", "type": "address" },198 { "internalType": "uint256", "name": "sub", "type": "uint256" }199 ],200 "internalType": "struct CrossAddress[]",201 "name": "",202 "type": "tuple[]"203 }204 ],205 "stateMutability": "view",206 "type": "function"207 },208 {209 "inputs": [],210 "name": "collectionHelperAddress",211 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],212 "stateMutability": "view",213 "type": "function"214 },215 {216 "inputs": [],217 "name": "collectionLimits",218 "outputs": [219 {220 "components": [221 {222 "internalType": "enum CollectionLimitField",223 "name": "field",224 "type": "uint8"225 },226 {227 "components": [228 { "internalType": "bool", "name": "status", "type": "bool" },229 { "internalType": "uint256", "name": "value", "type": "uint256" }230 ],231 "internalType": "struct OptionUint256",232 "name": "value",233 "type": "tuple"234 }235 ],236 "internalType": "struct CollectionLimit[]",237 "name": "",238 "type": "tuple[]"239 }240 ],241 "stateMutability": "view",242 "type": "function"243 },244 {245 "inputs": [],246 "name": "collectionNestingPermissions",247 "outputs": [248 {249 "components": [250 {251 "internalType": "enum CollectionPermissionField",252 "name": "field",253 "type": "uint8"254 },255 { "internalType": "bool", "name": "value", "type": "bool" }256 ],257 "internalType": "struct CollectionNestingPermission[]",258 "name": "",259 "type": "tuple[]"260 }261 ],262 "stateMutability": "view",263 "type": "function"264 },265 {266 "inputs": [],267 "name": "collectionNestingRestrictedCollectionIds",268 "outputs": [269 {270 "components": [271 { "internalType": "bool", "name": "token_owner", "type": "bool" },272 { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }273 ],274 "internalType": "struct CollectionNesting",275 "name": "",276 "type": "tuple"277 }278 ],279 "stateMutability": "view",280 "type": "function"281 },282 {283 "inputs": [],284 "name": "collectionOwner",285 "outputs": [286 {287 "components": [288 { "internalType": "address", "name": "eth", "type": "address" },289 { "internalType": "uint256", "name": "sub", "type": "uint256" }290 ],291 "internalType": "struct CrossAddress",292 "name": "",293 "type": "tuple"294 }295 ],296 "stateMutability": "view",297 "type": "function"298 },299 {300 "inputs": [301 { "internalType": "string[]", "name": "keys", "type": "string[]" }302 ],303 "name": "collectionProperties",304 "outputs": [305 {306 "components": [307 { "internalType": "string", "name": "key", "type": "string" },308 { "internalType": "bytes", "name": "value", "type": "bytes" }309 ],310 "internalType": "struct Property[]",311 "name": "",312 "type": "tuple[]"313 }314 ],315 "stateMutability": "view",316 "type": "function"317 },318 {319 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],320 "name": "collectionProperty",321 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],322 "stateMutability": "view",323 "type": "function"324 },325 {326 "inputs": [],327 "name": "collectionSponsor",328 "outputs": [329 {330 "components": [331 { "internalType": "address", "name": "eth", "type": "address" },332 { "internalType": "uint256", "name": "sub", "type": "uint256" }333 ],334 "internalType": "struct CrossAddress",335 "name": "",336 "type": "tuple"337 }338 ],339 "stateMutability": "view",340 "type": "function"341 },342 {343 "inputs": [],344 "name": "confirmCollectionSponsorship",345 "outputs": [],346 "stateMutability": "nonpayable",347 "type": "function"348 },349 {350 "inputs": [],351 "name": "contractAddress",352 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],353 "stateMutability": "view",354 "type": "function"355 },356 {357 "inputs": [358 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }359 ],360 "name": "crossOwnerOf",361 "outputs": [362 {363 "components": [364 { "internalType": "address", "name": "eth", "type": "address" },365 { "internalType": "uint256", "name": "sub", "type": "uint256" }366 ],367 "internalType": "struct CrossAddress",368 "name": "",369 "type": "tuple"370 }371 ],372 "stateMutability": "view",373 "type": "function"374 },375 {376 "inputs": [377 { "internalType": "string[]", "name": "keys", "type": "string[]" }378 ],379 "name": "deleteCollectionProperties",380 "outputs": [],381 "stateMutability": "nonpayable",382 "type": "function"383 },384 {385 "inputs": [386 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },387 { "internalType": "string[]", "name": "keys", "type": "string[]" }388 ],389 "name": "deleteProperties",390 "outputs": [],391 "stateMutability": "nonpayable",392 "type": "function"393 },394 {395 "inputs": [],396 "name": "description",397 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],398 "stateMutability": "view",399 "type": "function"400 },401 {402 "inputs": [403 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }404 ],405 "name": "getApproved",406 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],407 "stateMutability": "view",408 "type": "function"409 },410 {411 "inputs": [],412 "name": "hasCollectionPendingSponsor",413 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],414 "stateMutability": "view",415 "type": "function"416 },417 {418 "inputs": [419 { "internalType": "address", "name": "owner", "type": "address" },420 { "internalType": "address", "name": "operator", "type": "address" }421 ],422 "name": "isApprovedForAll",423 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],424 "stateMutability": "view",425 "type": "function"426 },427 {428 "inputs": [429 {430 "components": [431 { "internalType": "address", "name": "eth", "type": "address" },432 { "internalType": "uint256", "name": "sub", "type": "uint256" }433 ],434 "internalType": "struct CrossAddress",435 "name": "user",436 "type": "tuple"437 }438 ],439 "name": "isOwnerOrAdminCross",440 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],441 "stateMutability": "view",442 "type": "function"443 },444 {445 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],446 "name": "mint",447 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],448 "stateMutability": "nonpayable",449 "type": "function"450 },451 {452 "inputs": [453 {454 "components": [455 { "internalType": "address", "name": "eth", "type": "address" },456 { "internalType": "uint256", "name": "sub", "type": "uint256" }457 ],458 "internalType": "struct CrossAddress",459 "name": "to",460 "type": "tuple"461 },462 {463 "components": [464 { "internalType": "string", "name": "key", "type": "string" },465 { "internalType": "bytes", "name": "value", "type": "bytes" }466 ],467 "internalType": "struct Property[]",468 "name": "properties",469 "type": "tuple[]"470 }471 ],472 "name": "mintCross",473 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],474 "stateMutability": "nonpayable",475 "type": "function"476 },477 {478 "inputs": [479 { "internalType": "address", "name": "to", "type": "address" },480 { "internalType": "string", "name": "tokenUri", "type": "string" }481 ],482 "name": "mintWithTokenURI",483 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],484 "stateMutability": "nonpayable",485 "type": "function"486 },487 {488 "inputs": [],489 "name": "name",490 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],491 "stateMutability": "view",492 "type": "function"493 },494 {495 "inputs": [],496 "name": "nextTokenId",497 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],498 "stateMutability": "view",499 "type": "function"500 },501 {502 "inputs": [503 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }504 ],505 "name": "ownerOf",506 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],507 "stateMutability": "view",508 "type": "function"509 },510 {511 "inputs": [512 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },513 { "internalType": "string[]", "name": "keys", "type": "string[]" }514 ],515 "name": "properties",516 "outputs": [517 {518 "components": [519 { "internalType": "string", "name": "key", "type": "string" },520 { "internalType": "bytes", "name": "value", "type": "bytes" }521 ],522 "internalType": "struct Property[]",523 "name": "",524 "type": "tuple[]"525 }526 ],527 "stateMutability": "view",528 "type": "function"529 },530 {531 "inputs": [532 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },533 { "internalType": "string", "name": "key", "type": "string" }534 ],535 "name": "property",536 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],537 "stateMutability": "view",538 "type": "function"539 },540 {541 "inputs": [542 {543 "components": [544 { "internalType": "address", "name": "eth", "type": "address" },545 { "internalType": "uint256", "name": "sub", "type": "uint256" }546 ],547 "internalType": "struct CrossAddress",548 "name": "admin",549 "type": "tuple"550 }551 ],552 "name": "removeCollectionAdminCross",553 "outputs": [],554 "stateMutability": "nonpayable",555 "type": "function"556 },557 {558 "inputs": [],559 "name": "removeCollectionSponsor",560 "outputs": [],561 "stateMutability": "nonpayable",562 "type": "function"563 },564 {565 "inputs": [566 {567 "components": [568 { "internalType": "address", "name": "eth", "type": "address" },569 { "internalType": "uint256", "name": "sub", "type": "uint256" }570 ],571 "internalType": "struct CrossAddress",572 "name": "user",573 "type": "tuple"574 }575 ],576 "name": "removeFromCollectionAllowListCross",577 "outputs": [],578 "stateMutability": "nonpayable",579 "type": "function"580 },581 {582 "inputs": [583 { "internalType": "address", "name": "from", "type": "address" },584 { "internalType": "address", "name": "to", "type": "address" },585 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }586 ],587 "name": "safeTransferFrom",588 "outputs": [],589 "stateMutability": "nonpayable",590 "type": "function"591 },592 {593 "inputs": [594 { "internalType": "address", "name": "from", "type": "address" },595 { "internalType": "address", "name": "to", "type": "address" },596 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },597 { "internalType": "bytes", "name": "data", "type": "bytes" }598 ],599 "name": "safeTransferFrom",600 "outputs": [],601 "stateMutability": "nonpayable",602 "type": "function"603 },604 {605 "inputs": [606 { "internalType": "address", "name": "operator", "type": "address" },607 { "internalType": "bool", "name": "approved", "type": "bool" }608 ],609 "name": "setApprovalForAll",610 "outputs": [],611 "stateMutability": "nonpayable",612 "type": "function"613 },614 {615 "inputs": [616 { "internalType": "enum AccessMode", "name": "mode", "type": "uint8" }617 ],618 "name": "setCollectionAccess",619 "outputs": [],620 "stateMutability": "nonpayable",621 "type": "function"622 },623 {624 "inputs": [625 {626 "components": [627 {628 "internalType": "enum CollectionLimitField",629 "name": "field",630 "type": "uint8"631 },632 {633 "components": [634 { "internalType": "bool", "name": "status", "type": "bool" },635 { "internalType": "uint256", "name": "value", "type": "uint256" }636 ],637 "internalType": "struct OptionUint256",638 "name": "value",639 "type": "tuple"640 }641 ],642 "internalType": "struct CollectionLimit",643 "name": "limit",644 "type": "tuple"645 }646 ],647 "name": "setCollectionLimit",648 "outputs": [],649 "stateMutability": "nonpayable",650 "type": "function"651 },652 {653 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],654 "name": "setCollectionMintMode",655 "outputs": [],656 "stateMutability": "nonpayable",657 "type": "function"658 },659 {660 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],661 "name": "setCollectionNesting",662 "outputs": [],663 "stateMutability": "nonpayable",664 "type": "function"665 },666 {667 "inputs": [668 { "internalType": "bool", "name": "enable", "type": "bool" },669 {670 "internalType": "address[]",671 "name": "collections",672 "type": "address[]"673 }674 ],675 "name": "setCollectionNesting",676 "outputs": [],677 "stateMutability": "nonpayable",678 "type": "function"679 },680 {681 "inputs": [682 {683 "components": [684 { "internalType": "string", "name": "key", "type": "string" },685 { "internalType": "bytes", "name": "value", "type": "bytes" }686 ],687 "internalType": "struct Property[]",688 "name": "properties",689 "type": "tuple[]"690 }691 ],692 "name": "setCollectionProperties",693 "outputs": [],694 "stateMutability": "nonpayable",695 "type": "function"696 },697 {698 "inputs": [699 {700 "components": [701 { "internalType": "address", "name": "eth", "type": "address" },702 { "internalType": "uint256", "name": "sub", "type": "uint256" }703 ],704 "internalType": "struct CrossAddress",705 "name": "sponsor",706 "type": "tuple"707 }708 ],709 "name": "setCollectionSponsorCross",710 "outputs": [],711 "stateMutability": "nonpayable",712 "type": "function"713 },714 {715 "inputs": [716 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },717 {718 "components": [719 { "internalType": "string", "name": "key", "type": "string" },720 { "internalType": "bytes", "name": "value", "type": "bytes" }721 ],722 "internalType": "struct Property[]",723 "name": "properties",724 "type": "tuple[]"725 }726 ],727 "name": "setProperties",728 "outputs": [],729 "stateMutability": "nonpayable",730 "type": "function"731 },732 {733 "inputs": [734 {735 "components": [736 { "internalType": "string", "name": "key", "type": "string" },737 {738 "components": [739 {740 "internalType": "enum TokenPermissionField",741 "name": "code",742 "type": "uint8"743 },744 { "internalType": "bool", "name": "value", "type": "bool" }745 ],746 "internalType": "struct PropertyPermission[]",747 "name": "permissions",748 "type": "tuple[]"749 }750 ],751 "internalType": "struct TokenPropertyPermission[]",752 "name": "permissions",753 "type": "tuple[]"754 }755 ],756 "name": "setTokenPropertyPermissions",757 "outputs": [],758 "stateMutability": "nonpayable",759 "type": "function"760 },761 {762 "inputs": [763 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }764 ],765 "name": "supportsInterface",766 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],767 "stateMutability": "view",768 "type": "function"769 },770 {771 "inputs": [],772 "name": "symbol",773 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],774 "stateMutability": "view",775 "type": "function"776 },777 {778 "inputs": [779 { "internalType": "uint256", "name": "index", "type": "uint256" }780 ],781 "name": "tokenByIndex",782 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],783 "stateMutability": "view",784 "type": "function"785 },786 {787 "inputs": [788 { "internalType": "uint256", "name": "token", "type": "uint256" }789 ],790 "name": "tokenContractAddress",791 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],792 "stateMutability": "view",793 "type": "function"794 },795 {796 "inputs": [797 { "internalType": "address", "name": "owner", "type": "address" },798 { "internalType": "uint256", "name": "index", "type": "uint256" }799 ],800 "name": "tokenOfOwnerByIndex",801 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],802 "stateMutability": "view",803 "type": "function"804 },805 {806 "inputs": [],807 "name": "tokenPropertyPermissions",808 "outputs": [809 {810 "components": [811 { "internalType": "string", "name": "key", "type": "string" },812 {813 "components": [814 {815 "internalType": "enum TokenPermissionField",816 "name": "code",817 "type": "uint8"818 },819 { "internalType": "bool", "name": "value", "type": "bool" }820 ],821 "internalType": "struct PropertyPermission[]",822 "name": "permissions",823 "type": "tuple[]"824 }825 ],826 "internalType": "struct TokenPropertyPermission[]",827 "name": "",828 "type": "tuple[]"829 }830 ],831 "stateMutability": "view",832 "type": "function"833 },834 {835 "inputs": [836 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }837 ],838 "name": "tokenURI",839 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],840 "stateMutability": "view",841 "type": "function"842 },843 {844 "inputs": [],845 "name": "totalSupply",846 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],847 "stateMutability": "view",848 "type": "function"849 },850 {851 "inputs": [852 { "internalType": "address", "name": "to", "type": "address" },853 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }854 ],855 "name": "transfer",856 "outputs": [],857 "stateMutability": "nonpayable",858 "type": "function"859 },860 {861 "inputs": [862 {863 "components": [864 { "internalType": "address", "name": "eth", "type": "address" },865 { "internalType": "uint256", "name": "sub", "type": "uint256" }866 ],867 "internalType": "struct CrossAddress",868 "name": "to",869 "type": "tuple"870 },871 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }872 ],873 "name": "transferCross",874 "outputs": [],875 "stateMutability": "nonpayable",876 "type": "function"877 },878 {879 "inputs": [880 { "internalType": "address", "name": "from", "type": "address" },881 { "internalType": "address", "name": "to", "type": "address" },882 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }883 ],884 "name": "transferFrom",885 "outputs": [],886 "stateMutability": "nonpayable",887 "type": "function"888 },889 {890 "inputs": [891 {892 "components": [893 { "internalType": "address", "name": "eth", "type": "address" },894 { "internalType": "uint256", "name": "sub", "type": "uint256" }895 ],896 "internalType": "struct CrossAddress",897 "name": "from",898 "type": "tuple"899 },900 {901 "components": [902 { "internalType": "address", "name": "eth", "type": "address" },903 { "internalType": "uint256", "name": "sub", "type": "uint256" }904 ],905 "internalType": "struct CrossAddress",906 "name": "to",907 "type": "tuple"908 },909 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }910 ],911 "name": "transferFromCross",912 "outputs": [],913 "stateMutability": "nonpayable",914 "type": "function"915 },916 {917 "inputs": [],918 "name": "uniqueCollectionType",919 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],920 "stateMutability": "view",921 "type": "function"922 }923]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 {56 "indexed": true,57 "internalType": "address",58 "name": "collectionId",59 "type": "address"60 },61 {62 "indexed": false,63 "internalType": "uint256",64 "name": "tokenId",65 "type": "uint256"66 }67 ],68 "name": "TokenChanged",69 "type": "event"70 },71 {72 "anonymous": false,73 "inputs": [74 {75 "indexed": true,76 "internalType": "address",77 "name": "from",78 "type": "address"79 },80 {81 "indexed": true,82 "internalType": "address",83 "name": "to",84 "type": "address"85 },86 {87 "indexed": true,88 "internalType": "uint256",89 "name": "tokenId",90 "type": "uint256"91 }92 ],93 "name": "Transfer",94 "type": "event"95 },96 {97 "inputs": [98 {99 "components": [100 { "internalType": "address", "name": "eth", "type": "address" },101 { "internalType": "uint256", "name": "sub", "type": "uint256" }102 ],103 "internalType": "struct CrossAddress",104 "name": "newAdmin",105 "type": "tuple"106 }107 ],108 "name": "addCollectionAdminCross",109 "outputs": [],110 "stateMutability": "nonpayable",111 "type": "function"112 },113 {114 "inputs": [115 {116 "components": [117 { "internalType": "address", "name": "eth", "type": "address" },118 { "internalType": "uint256", "name": "sub", "type": "uint256" }119 ],120 "internalType": "struct CrossAddress",121 "name": "user",122 "type": "tuple"123 }124 ],125 "name": "addToCollectionAllowListCross",126 "outputs": [],127 "stateMutability": "nonpayable",128 "type": "function"129 },130 {131 "inputs": [132 {133 "components": [134 { "internalType": "address", "name": "eth", "type": "address" },135 { "internalType": "uint256", "name": "sub", "type": "uint256" }136 ],137 "internalType": "struct CrossAddress",138 "name": "user",139 "type": "tuple"140 }141 ],142 "name": "allowlistedCross",143 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],144 "stateMutability": "view",145 "type": "function"146 },147 {148 "inputs": [149 { "internalType": "address", "name": "approved", "type": "address" },150 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }151 ],152 "name": "approve",153 "outputs": [],154 "stateMutability": "nonpayable",155 "type": "function"156 },157 {158 "inputs": [159 { "internalType": "address", "name": "owner", "type": "address" }160 ],161 "name": "balanceOf",162 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],163 "stateMutability": "view",164 "type": "function"165 },166 {167 "inputs": [168 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }169 ],170 "name": "burn",171 "outputs": [],172 "stateMutability": "nonpayable",173 "type": "function"174 },175 {176 "inputs": [177 {178 "components": [179 { "internalType": "address", "name": "eth", "type": "address" },180 { "internalType": "uint256", "name": "sub", "type": "uint256" }181 ],182 "internalType": "struct CrossAddress",183 "name": "from",184 "type": "tuple"185 },186 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }187 ],188 "name": "burnFromCross",189 "outputs": [],190 "stateMutability": "nonpayable",191 "type": "function"192 },193 {194 "inputs": [195 {196 "components": [197 { "internalType": "address", "name": "eth", "type": "address" },198 { "internalType": "uint256", "name": "sub", "type": "uint256" }199 ],200 "internalType": "struct CrossAddress",201 "name": "newOwner",202 "type": "tuple"203 }204 ],205 "name": "changeCollectionOwnerCross",206 "outputs": [],207 "stateMutability": "nonpayable",208 "type": "function"209 },210 {211 "inputs": [],212 "name": "collectionAdmins",213 "outputs": [214 {215 "components": [216 { "internalType": "address", "name": "eth", "type": "address" },217 { "internalType": "uint256", "name": "sub", "type": "uint256" }218 ],219 "internalType": "struct CrossAddress[]",220 "name": "",221 "type": "tuple[]"222 }223 ],224 "stateMutability": "view",225 "type": "function"226 },227 {228 "inputs": [],229 "name": "collectionHelperAddress",230 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],231 "stateMutability": "view",232 "type": "function"233 },234 {235 "inputs": [],236 "name": "collectionLimits",237 "outputs": [238 {239 "components": [240 {241 "internalType": "enum CollectionLimitField",242 "name": "field",243 "type": "uint8"244 },245 {246 "components": [247 { "internalType": "bool", "name": "status", "type": "bool" },248 { "internalType": "uint256", "name": "value", "type": "uint256" }249 ],250 "internalType": "struct OptionUint256",251 "name": "value",252 "type": "tuple"253 }254 ],255 "internalType": "struct CollectionLimit[]",256 "name": "",257 "type": "tuple[]"258 }259 ],260 "stateMutability": "view",261 "type": "function"262 },263 {264 "inputs": [],265 "name": "collectionNestingPermissions",266 "outputs": [267 {268 "components": [269 {270 "internalType": "enum CollectionPermissionField",271 "name": "field",272 "type": "uint8"273 },274 { "internalType": "bool", "name": "value", "type": "bool" }275 ],276 "internalType": "struct CollectionNestingPermission[]",277 "name": "",278 "type": "tuple[]"279 }280 ],281 "stateMutability": "view",282 "type": "function"283 },284 {285 "inputs": [],286 "name": "collectionNestingRestrictedCollectionIds",287 "outputs": [288 {289 "components": [290 { "internalType": "bool", "name": "token_owner", "type": "bool" },291 { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }292 ],293 "internalType": "struct CollectionNesting",294 "name": "",295 "type": "tuple"296 }297 ],298 "stateMutability": "view",299 "type": "function"300 },301 {302 "inputs": [],303 "name": "collectionOwner",304 "outputs": [305 {306 "components": [307 { "internalType": "address", "name": "eth", "type": "address" },308 { "internalType": "uint256", "name": "sub", "type": "uint256" }309 ],310 "internalType": "struct CrossAddress",311 "name": "",312 "type": "tuple"313 }314 ],315 "stateMutability": "view",316 "type": "function"317 },318 {319 "inputs": [320 { "internalType": "string[]", "name": "keys", "type": "string[]" }321 ],322 "name": "collectionProperties",323 "outputs": [324 {325 "components": [326 { "internalType": "string", "name": "key", "type": "string" },327 { "internalType": "bytes", "name": "value", "type": "bytes" }328 ],329 "internalType": "struct Property[]",330 "name": "",331 "type": "tuple[]"332 }333 ],334 "stateMutability": "view",335 "type": "function"336 },337 {338 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],339 "name": "collectionProperty",340 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],341 "stateMutability": "view",342 "type": "function"343 },344 {345 "inputs": [],346 "name": "collectionSponsor",347 "outputs": [348 {349 "components": [350 { "internalType": "address", "name": "eth", "type": "address" },351 { "internalType": "uint256", "name": "sub", "type": "uint256" }352 ],353 "internalType": "struct CrossAddress",354 "name": "",355 "type": "tuple"356 }357 ],358 "stateMutability": "view",359 "type": "function"360 },361 {362 "inputs": [],363 "name": "confirmCollectionSponsorship",364 "outputs": [],365 "stateMutability": "nonpayable",366 "type": "function"367 },368 {369 "inputs": [],370 "name": "contractAddress",371 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],372 "stateMutability": "view",373 "type": "function"374 },375 {376 "inputs": [377 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }378 ],379 "name": "crossOwnerOf",380 "outputs": [381 {382 "components": [383 { "internalType": "address", "name": "eth", "type": "address" },384 { "internalType": "uint256", "name": "sub", "type": "uint256" }385 ],386 "internalType": "struct CrossAddress",387 "name": "",388 "type": "tuple"389 }390 ],391 "stateMutability": "view",392 "type": "function"393 },394 {395 "inputs": [396 { "internalType": "string[]", "name": "keys", "type": "string[]" }397 ],398 "name": "deleteCollectionProperties",399 "outputs": [],400 "stateMutability": "nonpayable",401 "type": "function"402 },403 {404 "inputs": [405 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },406 { "internalType": "string[]", "name": "keys", "type": "string[]" }407 ],408 "name": "deleteProperties",409 "outputs": [],410 "stateMutability": "nonpayable",411 "type": "function"412 },413 {414 "inputs": [],415 "name": "description",416 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],417 "stateMutability": "view",418 "type": "function"419 },420 {421 "inputs": [422 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }423 ],424 "name": "getApproved",425 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],426 "stateMutability": "view",427 "type": "function"428 },429 {430 "inputs": [],431 "name": "hasCollectionPendingSponsor",432 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],433 "stateMutability": "view",434 "type": "function"435 },436 {437 "inputs": [438 { "internalType": "address", "name": "owner", "type": "address" },439 { "internalType": "address", "name": "operator", "type": "address" }440 ],441 "name": "isApprovedForAll",442 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],443 "stateMutability": "view",444 "type": "function"445 },446 {447 "inputs": [448 {449 "components": [450 { "internalType": "address", "name": "eth", "type": "address" },451 { "internalType": "uint256", "name": "sub", "type": "uint256" }452 ],453 "internalType": "struct CrossAddress",454 "name": "user",455 "type": "tuple"456 }457 ],458 "name": "isOwnerOrAdminCross",459 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],460 "stateMutability": "view",461 "type": "function"462 },463 {464 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],465 "name": "mint",466 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],467 "stateMutability": "nonpayable",468 "type": "function"469 },470 {471 "inputs": [472 {473 "components": [474 { "internalType": "address", "name": "eth", "type": "address" },475 { "internalType": "uint256", "name": "sub", "type": "uint256" }476 ],477 "internalType": "struct CrossAddress",478 "name": "to",479 "type": "tuple"480 },481 {482 "components": [483 { "internalType": "string", "name": "key", "type": "string" },484 { "internalType": "bytes", "name": "value", "type": "bytes" }485 ],486 "internalType": "struct Property[]",487 "name": "properties",488 "type": "tuple[]"489 }490 ],491 "name": "mintCross",492 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],493 "stateMutability": "nonpayable",494 "type": "function"495 },496 {497 "inputs": [498 { "internalType": "address", "name": "to", "type": "address" },499 { "internalType": "string", "name": "tokenUri", "type": "string" }500 ],501 "name": "mintWithTokenURI",502 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],503 "stateMutability": "nonpayable",504 "type": "function"505 },506 {507 "inputs": [],508 "name": "name",509 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],510 "stateMutability": "view",511 "type": "function"512 },513 {514 "inputs": [],515 "name": "nextTokenId",516 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],517 "stateMutability": "view",518 "type": "function"519 },520 {521 "inputs": [522 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }523 ],524 "name": "ownerOf",525 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],526 "stateMutability": "view",527 "type": "function"528 },529 {530 "inputs": [531 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },532 { "internalType": "string[]", "name": "keys", "type": "string[]" }533 ],534 "name": "properties",535 "outputs": [536 {537 "components": [538 { "internalType": "string", "name": "key", "type": "string" },539 { "internalType": "bytes", "name": "value", "type": "bytes" }540 ],541 "internalType": "struct Property[]",542 "name": "",543 "type": "tuple[]"544 }545 ],546 "stateMutability": "view",547 "type": "function"548 },549 {550 "inputs": [551 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },552 { "internalType": "string", "name": "key", "type": "string" }553 ],554 "name": "property",555 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],556 "stateMutability": "view",557 "type": "function"558 },559 {560 "inputs": [561 {562 "components": [563 { "internalType": "address", "name": "eth", "type": "address" },564 { "internalType": "uint256", "name": "sub", "type": "uint256" }565 ],566 "internalType": "struct CrossAddress",567 "name": "admin",568 "type": "tuple"569 }570 ],571 "name": "removeCollectionAdminCross",572 "outputs": [],573 "stateMutability": "nonpayable",574 "type": "function"575 },576 {577 "inputs": [],578 "name": "removeCollectionSponsor",579 "outputs": [],580 "stateMutability": "nonpayable",581 "type": "function"582 },583 {584 "inputs": [585 {586 "components": [587 { "internalType": "address", "name": "eth", "type": "address" },588 { "internalType": "uint256", "name": "sub", "type": "uint256" }589 ],590 "internalType": "struct CrossAddress",591 "name": "user",592 "type": "tuple"593 }594 ],595 "name": "removeFromCollectionAllowListCross",596 "outputs": [],597 "stateMutability": "nonpayable",598 "type": "function"599 },600 {601 "inputs": [602 { "internalType": "address", "name": "from", "type": "address" },603 { "internalType": "address", "name": "to", "type": "address" },604 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }605 ],606 "name": "safeTransferFrom",607 "outputs": [],608 "stateMutability": "nonpayable",609 "type": "function"610 },611 {612 "inputs": [613 { "internalType": "address", "name": "from", "type": "address" },614 { "internalType": "address", "name": "to", "type": "address" },615 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },616 { "internalType": "bytes", "name": "data", "type": "bytes" }617 ],618 "name": "safeTransferFrom",619 "outputs": [],620 "stateMutability": "nonpayable",621 "type": "function"622 },623 {624 "inputs": [625 { "internalType": "address", "name": "operator", "type": "address" },626 { "internalType": "bool", "name": "approved", "type": "bool" }627 ],628 "name": "setApprovalForAll",629 "outputs": [],630 "stateMutability": "nonpayable",631 "type": "function"632 },633 {634 "inputs": [635 { "internalType": "enum AccessMode", "name": "mode", "type": "uint8" }636 ],637 "name": "setCollectionAccess",638 "outputs": [],639 "stateMutability": "nonpayable",640 "type": "function"641 },642 {643 "inputs": [644 {645 "components": [646 {647 "internalType": "enum CollectionLimitField",648 "name": "field",649 "type": "uint8"650 },651 {652 "components": [653 { "internalType": "bool", "name": "status", "type": "bool" },654 { "internalType": "uint256", "name": "value", "type": "uint256" }655 ],656 "internalType": "struct OptionUint256",657 "name": "value",658 "type": "tuple"659 }660 ],661 "internalType": "struct CollectionLimit",662 "name": "limit",663 "type": "tuple"664 }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 CrossAddress",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": "key", "type": "string" },756 {757 "components": [758 {759 "internalType": "enum TokenPermissionField",760 "name": "code",761 "type": "uint8"762 },763 { "internalType": "bool", "name": "value", "type": "bool" }764 ],765 "internalType": "struct PropertyPermission[]",766 "name": "permissions",767 "type": "tuple[]"768 }769 ],770 "internalType": "struct TokenPropertyPermission[]",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": "uint256", "name": "token", "type": "uint256" }808 ],809 "name": "tokenContractAddress",810 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],811 "stateMutability": "view",812 "type": "function"813 },814 {815 "inputs": [816 { "internalType": "address", "name": "owner", "type": "address" },817 { "internalType": "uint256", "name": "index", "type": "uint256" }818 ],819 "name": "tokenOfOwnerByIndex",820 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],821 "stateMutability": "view",822 "type": "function"823 },824 {825 "inputs": [],826 "name": "tokenPropertyPermissions",827 "outputs": [828 {829 "components": [830 { "internalType": "string", "name": "key", "type": "string" },831 {832 "components": [833 {834 "internalType": "enum TokenPermissionField",835 "name": "code",836 "type": "uint8"837 },838 { "internalType": "bool", "name": "value", "type": "bool" }839 ],840 "internalType": "struct PropertyPermission[]",841 "name": "permissions",842 "type": "tuple[]"843 }844 ],845 "internalType": "struct TokenPropertyPermission[]",846 "name": "",847 "type": "tuple[]"848 }849 ],850 "stateMutability": "view",851 "type": "function"852 },853 {854 "inputs": [855 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }856 ],857 "name": "tokenURI",858 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],859 "stateMutability": "view",860 "type": "function"861 },862 {863 "inputs": [],864 "name": "totalSupply",865 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],866 "stateMutability": "view",867 "type": "function"868 },869 {870 "inputs": [871 { "internalType": "address", "name": "to", "type": "address" },872 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }873 ],874 "name": "transfer",875 "outputs": [],876 "stateMutability": "nonpayable",877 "type": "function"878 },879 {880 "inputs": [881 {882 "components": [883 { "internalType": "address", "name": "eth", "type": "address" },884 { "internalType": "uint256", "name": "sub", "type": "uint256" }885 ],886 "internalType": "struct CrossAddress",887 "name": "to",888 "type": "tuple"889 },890 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }891 ],892 "name": "transferCross",893 "outputs": [],894 "stateMutability": "nonpayable",895 "type": "function"896 },897 {898 "inputs": [899 { "internalType": "address", "name": "from", "type": "address" },900 { "internalType": "address", "name": "to", "type": "address" },901 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }902 ],903 "name": "transferFrom",904 "outputs": [],905 "stateMutability": "nonpayable",906 "type": "function"907 },908 {909 "inputs": [910 {911 "components": [912 { "internalType": "address", "name": "eth", "type": "address" },913 { "internalType": "uint256", "name": "sub", "type": "uint256" }914 ],915 "internalType": "struct CrossAddress",916 "name": "from",917 "type": "tuple"918 },919 {920 "components": [921 { "internalType": "address", "name": "eth", "type": "address" },922 { "internalType": "uint256", "name": "sub", "type": "uint256" }923 ],924 "internalType": "struct CrossAddress",925 "name": "to",926 "type": "tuple"927 },928 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }929 ],930 "name": "transferFromCross",931 "outputs": [],932 "stateMutability": "nonpayable",933 "type": "function"934 },935 {936 "inputs": [],937 "name": "uniqueCollectionType",938 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],939 "stateMutability": "view",940 "type": "function"941 }942]tests/src/eth/api/CollectionHelpers.soldiffbeforeafterboth--- a/tests/src/eth/api/CollectionHelpers.sol
+++ b/tests/src/eth/api/CollectionHelpers.sol
@@ -17,7 +17,6 @@
event CollectionCreated(address indexed owner, address indexed collectionId);
event CollectionDestroyed(address indexed collectionId);
event CollectionChanged(address indexed collectionId);
- event TokenChanged(address indexed collectionId, uint256 tokenId);
}
/// @title Contract, which allows users to operate with collections
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -12,9 +12,14 @@
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
+/// @dev inlined interface
+interface ERC721TokenEvent {
+ event TokenChanged(address indexed collectionId, uint256 tokenId);
+}
+
/// @title A contract that allows to set and delete token properties and change token property permissions.
/// @dev the ERC-165 identifier for this interface is 0xde0695c2
-interface TokenProperties is Dummy, ERC165 {
+interface TokenProperties is Dummy, ERC165, ERC721TokenEvent {
// /// @notice Set permissions for token property.
// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
// /// @param key Property key.
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -12,9 +12,14 @@
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
+/// @dev inlined interface
+interface ERC721TokenEvent {
+ event TokenChanged(address indexed collectionId, uint256 tokenId);
+}
+
/// @title A contract that allows to set and delete token properties and change token property permissions.
/// @dev the ERC-165 identifier for this interface is 0xde0695c2
-interface TokenProperties is Dummy, ERC165 {
+interface TokenProperties is Dummy, ERC165, ERC721TokenEvent {
// /// @notice Set permissions for token property.
// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
// /// @param key Property key.
tests/src/eth/events.test.tsdiffbeforeafterboth--- a/tests/src/eth/events.test.ts
+++ b/tests/src/eth/events.test.ts
@@ -29,8 +29,10 @@
});
});
-function clearEvents(ethEvents: NormalizedEvent[], subEvents: IEvent[]) {
- ethEvents.splice(0);
+function clearEvents(ethEvents: NormalizedEvent[] | null, subEvents: IEvent[]) {
+ if (ethEvents !== null) {
+ ethEvents.splice(0);
+ }
subEvents.splice(0);
}
@@ -374,7 +376,6 @@
const owner = await helper.eth.createAccountWithBalance(donor);
const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');
const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);
- const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);
const result = await collection.methods.mint(owner).send({from: owner});
const tokenId = result.events.Transfer.returnValues.tokenId;
await collection.methods.setTokenPropertyPermissions([
@@ -384,38 +385,31 @@
[TokenPermissionField.CollectionAdmin, true]],
],
]).send({from: owner});
-
- const ethEvents: any = [];
- collectionHelper.events.allEvents((_: any, event: any) => {
- ethEvents.push(event);
- });
const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);
{
- await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});
+ const result = await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});
await helper.wait.newBlocks(1);
- expect(ethEvents).to.containSubset([
- {
- event: 'TokenChanged',
- returnValues: {
- collectionId: collectionAddress,
- },
+ expect(result.events.TokenChanged).to.be.like({
+ event: 'TokenChanged',
+ returnValues: {
+ collectionId: collectionAddress,
+ tokenId: tokenId,
},
- ]);
+ });
expect(subEvents).to.containSubset([{method: 'TokenPropertySet'}]);
- clearEvents(ethEvents, subEvents);
+ clearEvents(null, subEvents);
}
{
- await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});
+ const result = await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});
await helper.wait.newBlocks(1);
- expect(ethEvents).to.containSubset([
- {
- event: 'TokenChanged',
- returnValues: {
- collectionId: collectionAddress,
- },
+ expect(result.events.TokenChanged).to.be.like({
+ event: 'TokenChanged',
+ returnValues: {
+ collectionId: collectionAddress,
+ tokenId: tokenId,
},
- ]);
+ });
expect(subEvents).to.containSubset([{method: 'TokenPropertyDeleted'}]);
}
unsubscribe();