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