difftreelog
feature/setCollectionLimit Behavior of the `setCollectionLimit` method. Removed method overload: single signature `(string, uint256)` is used for both cases.
in: master
22 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5831,7 +5831,7 @@
[[package]]
name = "pallet-common"
-version = "0.1.10"
+version = "0.1.11"
dependencies = [
"ethereum",
"evm-coder",
pallets/common/CHANGELOG.mddiffbeforeafterboth--- a/pallets/common/CHANGELOG.md
+++ b/pallets/common/CHANGELOG.md
@@ -2,10 +2,22 @@
All notable changes to this project will be documented in this file.
+<!-- bureaucrate goes here -->
+
+## [0.1.11] - 2022-11-16
+
+### Changed
+
+- Behavior of the `setCollectionLimit` method.
+ Removed method overload: single signature `(string, uint256)`
+ is used for both cases.
+
## [0.1.10] - 2022-11-02
+
### Changed
- - Use named structure `EthCrossAccount` in eth functions.
+- Use named structure `EthCrossAccount` in eth functions.
+
## [0.1.9] - 2022-10-13
## Added
@@ -34,8 +46,6 @@
### Added
- New Ethereum API methods: changeOwner, changeOwner(Substrate) and verifyOwnerOrAdmin(Substrate).
-
-<!-- bureaucrate goes here -->
## [v0.1.5] 2022-08-16
pallets/common/Cargo.tomldiffbeforeafterboth--- a/pallets/common/Cargo.toml
+++ b/pallets/common/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-common"
-version = "0.1.10"
+version = "0.1.11"
license = "GPLv3"
edition = "2021"
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -303,11 +303,29 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
/// @param value Value of the limit.
#[solidity(rename_selector = "setCollectionLimit")]
- fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result<void> {
+ fn set_int_limit(&mut self, caller: caller, limit: string, value: uint256) -> Result<void> {
self.consume_store_reads_and_writes(1, 1)?;
+ let value = value
+ .try_into()
+ .map_err(|_| Error::Revert(format!("can't convert value to u32 \"{}\"", value)))?;
+
+ let convert_value_to_bool = || match value {
+ 0 => Ok(false),
+ 1 => Ok(true),
+ _ => {
+ return Err(Error::Revert(format!(
+ "can't convert value to boolean \"{}\"",
+ value
+ )))
+ }
+ };
+
check_is_owner_or_admin(caller, self)?;
let mut limits = self.limits.clone();
@@ -330,48 +348,16 @@
"sponsorApproveTimeout" => {
limits.sponsor_approve_timeout = Some(value);
}
- _ => {
- return Err(Error::Revert(format!(
- "unknown integer limit \"{}\"",
- limit
- )))
- }
- }
- self.limits = <Pallet<T>>::clamp_limits(self.mode.clone(), &self.limits, limits)
- .map_err(dispatch_to_evm::<T>)?;
- save(self)
- }
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
- /// "ownerCanDestroy",
- /// "transfersEnabled"
- /// @param value Value of the limit.
- #[solidity(rename_selector = "setCollectionLimit")]
- fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result<void> {
- self.consume_store_reads_and_writes(1, 1)?;
-
- check_is_owner_or_admin(caller, self)?;
- let mut limits = self.limits.clone();
-
- match limit.as_str() {
"ownerCanTransfer" => {
- limits.owner_can_transfer = Some(value);
+ limits.owner_can_transfer = Some(convert_value_to_bool()?);
}
"ownerCanDestroy" => {
- limits.owner_can_destroy = Some(value);
+ limits.owner_can_destroy = Some(convert_value_to_bool()?);
}
"transfersEnabled" => {
- limits.transfers_enabled = Some(value);
- }
- _ => {
- return Err(Error::Revert(format!(
- "unknown boolean limit \"{}\"",
- limit
- )))
+ limits.transfers_enabled = Some(convert_value_to_bool()?);
}
+ _ => return Err(Error::Revert(format!("unknown limit \"{}\"", limit))),
}
self.limits = <Pallet<T>>::clamp_limits(self.mode.clone(), &self.limits, limits)
.map_err(dispatch_to_evm::<T>)?;
pallets/evm-contract-helpers/src/stubs/ContractHelpers.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -18,7 +18,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
contract Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -167,26 +167,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) public {
- require(false, stub_error);
- limit;
- value;
- dummy = 0;
- }
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) public {
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) public {
require(false, stub_error);
limit;
value;
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -119,7 +119,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
contract Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -268,26 +268,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) public {
- require(false, stub_error);
- limit;
- value;
- dummy = 0;
- }
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) public {
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) public {
require(false, stub_error);
limit;
value;
pallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -119,7 +119,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
contract Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -268,26 +268,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) public {
- require(false, stub_error);
- limit;
- value;
- dummy = 0;
- }
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) public {
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) public {
require(false, stub_error);
limit;
value;
pallets/refungible/src/stubs/UniqueRefungibleToken.rawdiffbeforeafterbothbinary blob — no preview
pallets/unique/src/eth/stubs/CollectionHelpers.rawdiffbeforeafterbothbinary blob — no preview
tests/src/eth/abi/fungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -390,17 +390,7 @@
{
"inputs": [
{ "internalType": "string", "name": "limit", "type": "string" },
- { "internalType": "uint32", "name": "value", "type": "uint32" }
- ],
- "name": "setCollectionLimit",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "string", "name": "limit", "type": "string" },
- { "internalType": "bool", "name": "value", "type": "bool" }
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "setCollectionLimit",
"outputs": [],
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -505,17 +505,7 @@
{
"inputs": [
{ "internalType": "string", "name": "limit", "type": "string" },
- { "internalType": "uint32", "name": "value", "type": "uint32" }
- ],
- "name": "setCollectionLimit",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "string", "name": "limit", "type": "string" },
- { "internalType": "bool", "name": "value", "type": "bool" }
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "setCollectionLimit",
"outputs": [],
tests/src/eth/abi/reFungible.jsondiffbeforeafterboth1[2 {3 "anonymous": false,4 "inputs": [5 {6 "indexed": true,7 "internalType": "address",8 "name": "owner",9 "type": "address"10 },11 {12 "indexed": true,13 "internalType": "address",14 "name": "approved",15 "type": "address"16 },17 {18 "indexed": true,19 "internalType": "uint256",20 "name": "tokenId",21 "type": "uint256"22 }23 ],24 "name": "Approval",25 "type": "event"26 },27 {28 "anonymous": false,29 "inputs": [30 {31 "indexed": true,32 "internalType": "address",33 "name": "owner",34 "type": "address"35 },36 {37 "indexed": true,38 "internalType": "address",39 "name": "operator",40 "type": "address"41 },42 {43 "indexed": false,44 "internalType": "bool",45 "name": "approved",46 "type": "bool"47 }48 ],49 "name": "ApprovalForAll",50 "type": "event"51 },52 {53 "anonymous": false,54 "inputs": [],55 "name": "MintingFinished",56 "type": "event"57 },58 {59 "anonymous": false,60 "inputs": [61 {62 "indexed": true,63 "internalType": "address",64 "name": "from",65 "type": "address"66 },67 {68 "indexed": true,69 "internalType": "address",70 "name": "to",71 "type": "address"72 },73 {74 "indexed": true,75 "internalType": "uint256",76 "name": "tokenId",77 "type": "uint256"78 }79 ],80 "name": "Transfer",81 "type": "event"82 },83 {84 "inputs": [85 {86 "components": [87 { "internalType": "address", "name": "eth", "type": "address" },88 { "internalType": "uint256", "name": "sub", "type": "uint256" }89 ],90 "internalType": "struct EthCrossAccount",91 "name": "newAdmin",92 "type": "tuple"93 }94 ],95 "name": "addCollectionAdminCross",96 "outputs": [],97 "stateMutability": "nonpayable",98 "type": "function"99 },100 {101 "inputs": [102 {103 "components": [104 { "internalType": "address", "name": "eth", "type": "address" },105 { "internalType": "uint256", "name": "sub", "type": "uint256" }106 ],107 "internalType": "struct EthCrossAccount",108 "name": "user",109 "type": "tuple"110 }111 ],112 "name": "addToCollectionAllowListCross",113 "outputs": [],114 "stateMutability": "nonpayable",115 "type": "function"116 },117 {118 "inputs": [119 { "internalType": "address", "name": "user", "type": "address" }120 ],121 "name": "allowed",122 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],123 "stateMutability": "view",124 "type": "function"125 },126 {127 "inputs": [128 { "internalType": "address", "name": "approved", "type": "address" },129 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }130 ],131 "name": "approve",132 "outputs": [],133 "stateMutability": "nonpayable",134 "type": "function"135 },136 {137 "inputs": [138 { "internalType": "address", "name": "owner", "type": "address" }139 ],140 "name": "balanceOf",141 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],142 "stateMutability": "view",143 "type": "function"144 },145 {146 "inputs": [147 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148 ],149 "name": "burn",150 "outputs": [],151 "stateMutability": "nonpayable",152 "type": "function"153 },154 {155 "inputs": [156 {157 "components": [158 { "internalType": "address", "name": "eth", "type": "address" },159 { "internalType": "uint256", "name": "sub", "type": "uint256" }160 ],161 "internalType": "struct EthCrossAccount",162 "name": "from",163 "type": "tuple"164 },165 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166 ],167 "name": "burnFromCross",168 "outputs": [],169 "stateMutability": "nonpayable",170 "type": "function"171 },172 {173 "inputs": [174 {175 "components": [176 { "internalType": "address", "name": "eth", "type": "address" },177 { "internalType": "uint256", "name": "sub", "type": "uint256" }178 ],179 "internalType": "struct EthCrossAccount",180 "name": "newOwner",181 "type": "tuple"182 }183 ],184 "name": "changeCollectionOwnerCross",185 "outputs": [],186 "stateMutability": "nonpayable",187 "type": "function"188 },189 {190 "inputs": [],191 "name": "collectionAdmins",192 "outputs": [193 {194 "components": [195 { "internalType": "address", "name": "eth", "type": "address" },196 { "internalType": "uint256", "name": "sub", "type": "uint256" }197 ],198 "internalType": "struct EthCrossAccount[]",199 "name": "",200 "type": "tuple[]"201 }202 ],203 "stateMutability": "view",204 "type": "function"205 },206 {207 "inputs": [],208 "name": "collectionOwner",209 "outputs": [210 {211 "components": [212 { "internalType": "address", "name": "eth", "type": "address" },213 { "internalType": "uint256", "name": "sub", "type": "uint256" }214 ],215 "internalType": "struct EthCrossAccount",216 "name": "",217 "type": "tuple"218 }219 ],220 "stateMutability": "view",221 "type": "function"222 },223 {224 "inputs": [225 { "internalType": "string[]", "name": "keys", "type": "string[]" }226 ],227 "name": "collectionProperties",228 "outputs": [229 {230 "components": [231 { "internalType": "string", "name": "field_0", "type": "string" },232 { "internalType": "bytes", "name": "field_1", "type": "bytes" }233 ],234 "internalType": "struct Tuple22[]",235 "name": "",236 "type": "tuple[]"237 }238 ],239 "stateMutability": "view",240 "type": "function"241 },242 {243 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],244 "name": "collectionProperty",245 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],246 "stateMutability": "view",247 "type": "function"248 },249 {250 "inputs": [],251 "name": "collectionSponsor",252 "outputs": [253 {254 "components": [255 { "internalType": "address", "name": "field_0", "type": "address" },256 { "internalType": "uint256", "name": "field_1", "type": "uint256" }257 ],258 "internalType": "struct Tuple25",259 "name": "",260 "type": "tuple"261 }262 ],263 "stateMutability": "view",264 "type": "function"265 },266 {267 "inputs": [],268 "name": "confirmCollectionSponsorship",269 "outputs": [],270 "stateMutability": "nonpayable",271 "type": "function"272 },273 {274 "inputs": [],275 "name": "contractAddress",276 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],277 "stateMutability": "view",278 "type": "function"279 },280 {281 "inputs": [282 { "internalType": "string[]", "name": "keys", "type": "string[]" }283 ],284 "name": "deleteCollectionProperties",285 "outputs": [],286 "stateMutability": "nonpayable",287 "type": "function"288 },289 {290 "inputs": [291 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },292 { "internalType": "string[]", "name": "keys", "type": "string[]" }293 ],294 "name": "deleteProperties",295 "outputs": [],296 "stateMutability": "nonpayable",297 "type": "function"298 },299 {300 "inputs": [],301 "name": "finishMinting",302 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],303 "stateMutability": "nonpayable",304 "type": "function"305 },306 {307 "inputs": [308 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }309 ],310 "name": "getApproved",311 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],312 "stateMutability": "view",313 "type": "function"314 },315 {316 "inputs": [],317 "name": "hasCollectionPendingSponsor",318 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],319 "stateMutability": "view",320 "type": "function"321 },322 {323 "inputs": [324 { "internalType": "address", "name": "owner", "type": "address" },325 { "internalType": "address", "name": "operator", "type": "address" }326 ],327 "name": "isApprovedForAll",328 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],329 "stateMutability": "view",330 "type": "function"331 },332 {333 "inputs": [334 {335 "components": [336 { "internalType": "address", "name": "eth", "type": "address" },337 { "internalType": "uint256", "name": "sub", "type": "uint256" }338 ],339 "internalType": "struct EthCrossAccount",340 "name": "user",341 "type": "tuple"342 }343 ],344 "name": "isOwnerOrAdminCross",345 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],346 "stateMutability": "view",347 "type": "function"348 },349 {350 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],351 "name": "mint",352 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],353 "stateMutability": "nonpayable",354 "type": "function"355 },356 {357 "inputs": [358 { "internalType": "address", "name": "to", "type": "address" },359 { "internalType": "string", "name": "tokenUri", "type": "string" }360 ],361 "name": "mintWithTokenURI",362 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],363 "stateMutability": "nonpayable",364 "type": "function"365 },366 {367 "inputs": [],368 "name": "mintingFinished",369 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],370 "stateMutability": "view",371 "type": "function"372 },373 {374 "inputs": [],375 "name": "name",376 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],377 "stateMutability": "view",378 "type": "function"379 },380 {381 "inputs": [],382 "name": "nextTokenId",383 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],384 "stateMutability": "view",385 "type": "function"386 },387 {388 "inputs": [389 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }390 ],391 "name": "ownerOf",392 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],393 "stateMutability": "view",394 "type": "function"395 },396 {397 "inputs": [398 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },399 { "internalType": "string", "name": "key", "type": "string" }400 ],401 "name": "property",402 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],403 "stateMutability": "view",404 "type": "function"405 },406 {407 "inputs": [408 {409 "components": [410 { "internalType": "address", "name": "eth", "type": "address" },411 { "internalType": "uint256", "name": "sub", "type": "uint256" }412 ],413 "internalType": "struct EthCrossAccount",414 "name": "admin",415 "type": "tuple"416 }417 ],418 "name": "removeCollectionAdminCross",419 "outputs": [],420 "stateMutability": "nonpayable",421 "type": "function"422 },423 {424 "inputs": [],425 "name": "removeCollectionSponsor",426 "outputs": [],427 "stateMutability": "nonpayable",428 "type": "function"429 },430 {431 "inputs": [432 {433 "components": [434 { "internalType": "address", "name": "eth", "type": "address" },435 { "internalType": "uint256", "name": "sub", "type": "uint256" }436 ],437 "internalType": "struct EthCrossAccount",438 "name": "user",439 "type": "tuple"440 }441 ],442 "name": "removeFromCollectionAllowListCross",443 "outputs": [],444 "stateMutability": "nonpayable",445 "type": "function"446 },447 {448 "inputs": [449 { "internalType": "address", "name": "from", "type": "address" },450 { "internalType": "address", "name": "to", "type": "address" },451 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }452 ],453 "name": "safeTransferFrom",454 "outputs": [],455 "stateMutability": "nonpayable",456 "type": "function"457 },458 {459 "inputs": [460 { "internalType": "address", "name": "from", "type": "address" },461 { "internalType": "address", "name": "to", "type": "address" },462 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },463 { "internalType": "bytes", "name": "data", "type": "bytes" }464 ],465 "name": "safeTransferFromWithData",466 "outputs": [],467 "stateMutability": "nonpayable",468 "type": "function"469 },470 {471 "inputs": [472 { "internalType": "address", "name": "operator", "type": "address" },473 { "internalType": "bool", "name": "approved", "type": "bool" }474 ],475 "name": "setApprovalForAll",476 "outputs": [],477 "stateMutability": "nonpayable",478 "type": "function"479 },480 {481 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],482 "name": "setCollectionAccess",483 "outputs": [],484 "stateMutability": "nonpayable",485 "type": "function"486 },487 {488 "inputs": [489 { "internalType": "string", "name": "limit", "type": "string" },490 { "internalType": "uint32", "name": "value", "type": "uint32" }491 ],492 "name": "setCollectionLimit",493 "outputs": [],494 "stateMutability": "nonpayable",495 "type": "function"496 },497 {498 "inputs": [499 { "internalType": "string", "name": "limit", "type": "string" },500 { "internalType": "bool", "name": "value", "type": "bool" }501 ],502 "name": "setCollectionLimit",503 "outputs": [],504 "stateMutability": "nonpayable",505 "type": "function"506 },507 {508 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],509 "name": "setCollectionMintMode",510 "outputs": [],511 "stateMutability": "nonpayable",512 "type": "function"513 },514 {515 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],516 "name": "setCollectionNesting",517 "outputs": [],518 "stateMutability": "nonpayable",519 "type": "function"520 },521 {522 "inputs": [523 { "internalType": "bool", "name": "enable", "type": "bool" },524 {525 "internalType": "address[]",526 "name": "collections",527 "type": "address[]"528 }529 ],530 "name": "setCollectionNesting",531 "outputs": [],532 "stateMutability": "nonpayable",533 "type": "function"534 },535 {536 "inputs": [537 {538 "components": [539 { "internalType": "string", "name": "key", "type": "string" },540 { "internalType": "bytes", "name": "value", "type": "bytes" }541 ],542 "internalType": "struct Property[]",543 "name": "properties",544 "type": "tuple[]"545 }546 ],547 "name": "setCollectionProperties",548 "outputs": [],549 "stateMutability": "nonpayable",550 "type": "function"551 },552 {553 "inputs": [554 {555 "components": [556 { "internalType": "address", "name": "eth", "type": "address" },557 { "internalType": "uint256", "name": "sub", "type": "uint256" }558 ],559 "internalType": "struct EthCrossAccount",560 "name": "sponsor",561 "type": "tuple"562 }563 ],564 "name": "setCollectionSponsorCross",565 "outputs": [],566 "stateMutability": "nonpayable",567 "type": "function"568 },569 {570 "inputs": [571 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },572 {573 "components": [574 { "internalType": "string", "name": "key", "type": "string" },575 { "internalType": "bytes", "name": "value", "type": "bytes" }576 ],577 "internalType": "struct Property[]",578 "name": "properties",579 "type": "tuple[]"580 }581 ],582 "name": "setProperties",583 "outputs": [],584 "stateMutability": "nonpayable",585 "type": "function"586 },587 {588 "inputs": [589 { "internalType": "string", "name": "key", "type": "string" },590 { "internalType": "bool", "name": "isMutable", "type": "bool" },591 { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },592 { "internalType": "bool", "name": "tokenOwner", "type": "bool" }593 ],594 "name": "setTokenPropertyPermission",595 "outputs": [],596 "stateMutability": "nonpayable",597 "type": "function"598 },599 {600 "inputs": [601 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }602 ],603 "name": "supportsInterface",604 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],605 "stateMutability": "view",606 "type": "function"607 },608 {609 "inputs": [],610 "name": "symbol",611 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],612 "stateMutability": "view",613 "type": "function"614 },615 {616 "inputs": [617 { "internalType": "uint256", "name": "index", "type": "uint256" }618 ],619 "name": "tokenByIndex",620 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],621 "stateMutability": "view",622 "type": "function"623 },624 {625 "inputs": [626 { "internalType": "uint256", "name": "token", "type": "uint256" }627 ],628 "name": "tokenContractAddress",629 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],630 "stateMutability": "view",631 "type": "function"632 },633 {634 "inputs": [635 { "internalType": "address", "name": "owner", "type": "address" },636 { "internalType": "uint256", "name": "index", "type": "uint256" }637 ],638 "name": "tokenOfOwnerByIndex",639 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],640 "stateMutability": "view",641 "type": "function"642 },643 {644 "inputs": [645 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }646 ],647 "name": "tokenURI",648 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],649 "stateMutability": "view",650 "type": "function"651 },652 {653 "inputs": [],654 "name": "totalSupply",655 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],656 "stateMutability": "view",657 "type": "function"658 },659 {660 "inputs": [661 { "internalType": "address", "name": "to", "type": "address" },662 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }663 ],664 "name": "transfer",665 "outputs": [],666 "stateMutability": "nonpayable",667 "type": "function"668 },669 {670 "inputs": [671 {672 "components": [673 { "internalType": "address", "name": "eth", "type": "address" },674 { "internalType": "uint256", "name": "sub", "type": "uint256" }675 ],676 "internalType": "struct EthCrossAccount",677 "name": "to",678 "type": "tuple"679 },680 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }681 ],682 "name": "transferCross",683 "outputs": [],684 "stateMutability": "nonpayable",685 "type": "function"686 },687 {688 "inputs": [689 { "internalType": "address", "name": "from", "type": "address" },690 { "internalType": "address", "name": "to", "type": "address" },691 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }692 ],693 "name": "transferFrom",694 "outputs": [],695 "stateMutability": "nonpayable",696 "type": "function"697 },698 {699 "inputs": [700 {701 "components": [702 { "internalType": "address", "name": "eth", "type": "address" },703 { "internalType": "uint256", "name": "sub", "type": "uint256" }704 ],705 "internalType": "struct EthCrossAccount",706 "name": "from",707 "type": "tuple"708 },709 {710 "components": [711 { "internalType": "address", "name": "eth", "type": "address" },712 { "internalType": "uint256", "name": "sub", "type": "uint256" }713 ],714 "internalType": "struct EthCrossAccount",715 "name": "to",716 "type": "tuple"717 },718 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }719 ],720 "name": "transferFromCross",721 "outputs": [],722 "stateMutability": "nonpayable",723 "type": "function"724 },725 {726 "inputs": [],727 "name": "uniqueCollectionType",728 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],729 "stateMutability": "view",730 "type": "function"731 }732]1[2 {3 "anonymous": false,4 "inputs": [5 {6 "indexed": true,7 "internalType": "address",8 "name": "owner",9 "type": "address"10 },11 {12 "indexed": true,13 "internalType": "address",14 "name": "approved",15 "type": "address"16 },17 {18 "indexed": true,19 "internalType": "uint256",20 "name": "tokenId",21 "type": "uint256"22 }23 ],24 "name": "Approval",25 "type": "event"26 },27 {28 "anonymous": false,29 "inputs": [30 {31 "indexed": true,32 "internalType": "address",33 "name": "owner",34 "type": "address"35 },36 {37 "indexed": true,38 "internalType": "address",39 "name": "operator",40 "type": "address"41 },42 {43 "indexed": false,44 "internalType": "bool",45 "name": "approved",46 "type": "bool"47 }48 ],49 "name": "ApprovalForAll",50 "type": "event"51 },52 {53 "anonymous": false,54 "inputs": [],55 "name": "MintingFinished",56 "type": "event"57 },58 {59 "anonymous": false,60 "inputs": [61 {62 "indexed": true,63 "internalType": "address",64 "name": "from",65 "type": "address"66 },67 {68 "indexed": true,69 "internalType": "address",70 "name": "to",71 "type": "address"72 },73 {74 "indexed": true,75 "internalType": "uint256",76 "name": "tokenId",77 "type": "uint256"78 }79 ],80 "name": "Transfer",81 "type": "event"82 },83 {84 "inputs": [85 {86 "components": [87 { "internalType": "address", "name": "eth", "type": "address" },88 { "internalType": "uint256", "name": "sub", "type": "uint256" }89 ],90 "internalType": "struct EthCrossAccount",91 "name": "newAdmin",92 "type": "tuple"93 }94 ],95 "name": "addCollectionAdminCross",96 "outputs": [],97 "stateMutability": "nonpayable",98 "type": "function"99 },100 {101 "inputs": [102 {103 "components": [104 { "internalType": "address", "name": "eth", "type": "address" },105 { "internalType": "uint256", "name": "sub", "type": "uint256" }106 ],107 "internalType": "struct EthCrossAccount",108 "name": "user",109 "type": "tuple"110 }111 ],112 "name": "addToCollectionAllowListCross",113 "outputs": [],114 "stateMutability": "nonpayable",115 "type": "function"116 },117 {118 "inputs": [119 { "internalType": "address", "name": "user", "type": "address" }120 ],121 "name": "allowed",122 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],123 "stateMutability": "view",124 "type": "function"125 },126 {127 "inputs": [128 { "internalType": "address", "name": "approved", "type": "address" },129 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }130 ],131 "name": "approve",132 "outputs": [],133 "stateMutability": "nonpayable",134 "type": "function"135 },136 {137 "inputs": [138 { "internalType": "address", "name": "owner", "type": "address" }139 ],140 "name": "balanceOf",141 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],142 "stateMutability": "view",143 "type": "function"144 },145 {146 "inputs": [147 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148 ],149 "name": "burn",150 "outputs": [],151 "stateMutability": "nonpayable",152 "type": "function"153 },154 {155 "inputs": [156 {157 "components": [158 { "internalType": "address", "name": "eth", "type": "address" },159 { "internalType": "uint256", "name": "sub", "type": "uint256" }160 ],161 "internalType": "struct EthCrossAccount",162 "name": "from",163 "type": "tuple"164 },165 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166 ],167 "name": "burnFromCross",168 "outputs": [],169 "stateMutability": "nonpayable",170 "type": "function"171 },172 {173 "inputs": [174 {175 "components": [176 { "internalType": "address", "name": "eth", "type": "address" },177 { "internalType": "uint256", "name": "sub", "type": "uint256" }178 ],179 "internalType": "struct EthCrossAccount",180 "name": "newOwner",181 "type": "tuple"182 }183 ],184 "name": "changeCollectionOwnerCross",185 "outputs": [],186 "stateMutability": "nonpayable",187 "type": "function"188 },189 {190 "inputs": [],191 "name": "collectionAdmins",192 "outputs": [193 {194 "components": [195 { "internalType": "address", "name": "eth", "type": "address" },196 { "internalType": "uint256", "name": "sub", "type": "uint256" }197 ],198 "internalType": "struct EthCrossAccount[]",199 "name": "",200 "type": "tuple[]"201 }202 ],203 "stateMutability": "view",204 "type": "function"205 },206 {207 "inputs": [],208 "name": "collectionOwner",209 "outputs": [210 {211 "components": [212 { "internalType": "address", "name": "eth", "type": "address" },213 { "internalType": "uint256", "name": "sub", "type": "uint256" }214 ],215 "internalType": "struct EthCrossAccount",216 "name": "",217 "type": "tuple"218 }219 ],220 "stateMutability": "view",221 "type": "function"222 },223 {224 "inputs": [225 { "internalType": "string[]", "name": "keys", "type": "string[]" }226 ],227 "name": "collectionProperties",228 "outputs": [229 {230 "components": [231 { "internalType": "string", "name": "field_0", "type": "string" },232 { "internalType": "bytes", "name": "field_1", "type": "bytes" }233 ],234 "internalType": "struct Tuple22[]",235 "name": "",236 "type": "tuple[]"237 }238 ],239 "stateMutability": "view",240 "type": "function"241 },242 {243 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],244 "name": "collectionProperty",245 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],246 "stateMutability": "view",247 "type": "function"248 },249 {250 "inputs": [],251 "name": "collectionSponsor",252 "outputs": [253 {254 "components": [255 { "internalType": "address", "name": "field_0", "type": "address" },256 { "internalType": "uint256", "name": "field_1", "type": "uint256" }257 ],258 "internalType": "struct Tuple25",259 "name": "",260 "type": "tuple"261 }262 ],263 "stateMutability": "view",264 "type": "function"265 },266 {267 "inputs": [],268 "name": "confirmCollectionSponsorship",269 "outputs": [],270 "stateMutability": "nonpayable",271 "type": "function"272 },273 {274 "inputs": [],275 "name": "contractAddress",276 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],277 "stateMutability": "view",278 "type": "function"279 },280 {281 "inputs": [282 { "internalType": "string[]", "name": "keys", "type": "string[]" }283 ],284 "name": "deleteCollectionProperties",285 "outputs": [],286 "stateMutability": "nonpayable",287 "type": "function"288 },289 {290 "inputs": [291 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },292 { "internalType": "string[]", "name": "keys", "type": "string[]" }293 ],294 "name": "deleteProperties",295 "outputs": [],296 "stateMutability": "nonpayable",297 "type": "function"298 },299 {300 "inputs": [],301 "name": "finishMinting",302 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],303 "stateMutability": "nonpayable",304 "type": "function"305 },306 {307 "inputs": [308 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }309 ],310 "name": "getApproved",311 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],312 "stateMutability": "view",313 "type": "function"314 },315 {316 "inputs": [],317 "name": "hasCollectionPendingSponsor",318 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],319 "stateMutability": "view",320 "type": "function"321 },322 {323 "inputs": [324 { "internalType": "address", "name": "owner", "type": "address" },325 { "internalType": "address", "name": "operator", "type": "address" }326 ],327 "name": "isApprovedForAll",328 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],329 "stateMutability": "view",330 "type": "function"331 },332 {333 "inputs": [334 {335 "components": [336 { "internalType": "address", "name": "eth", "type": "address" },337 { "internalType": "uint256", "name": "sub", "type": "uint256" }338 ],339 "internalType": "struct EthCrossAccount",340 "name": "user",341 "type": "tuple"342 }343 ],344 "name": "isOwnerOrAdminCross",345 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],346 "stateMutability": "view",347 "type": "function"348 },349 {350 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],351 "name": "mint",352 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],353 "stateMutability": "nonpayable",354 "type": "function"355 },356 {357 "inputs": [358 { "internalType": "address", "name": "to", "type": "address" },359 { "internalType": "string", "name": "tokenUri", "type": "string" }360 ],361 "name": "mintWithTokenURI",362 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],363 "stateMutability": "nonpayable",364 "type": "function"365 },366 {367 "inputs": [],368 "name": "mintingFinished",369 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],370 "stateMutability": "view",371 "type": "function"372 },373 {374 "inputs": [],375 "name": "name",376 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],377 "stateMutability": "view",378 "type": "function"379 },380 {381 "inputs": [],382 "name": "nextTokenId",383 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],384 "stateMutability": "view",385 "type": "function"386 },387 {388 "inputs": [389 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }390 ],391 "name": "ownerOf",392 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],393 "stateMutability": "view",394 "type": "function"395 },396 {397 "inputs": [398 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },399 { "internalType": "string", "name": "key", "type": "string" }400 ],401 "name": "property",402 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],403 "stateMutability": "view",404 "type": "function"405 },406 {407 "inputs": [408 {409 "components": [410 { "internalType": "address", "name": "eth", "type": "address" },411 { "internalType": "uint256", "name": "sub", "type": "uint256" }412 ],413 "internalType": "struct EthCrossAccount",414 "name": "admin",415 "type": "tuple"416 }417 ],418 "name": "removeCollectionAdminCross",419 "outputs": [],420 "stateMutability": "nonpayable",421 "type": "function"422 },423 {424 "inputs": [],425 "name": "removeCollectionSponsor",426 "outputs": [],427 "stateMutability": "nonpayable",428 "type": "function"429 },430 {431 "inputs": [432 {433 "components": [434 { "internalType": "address", "name": "eth", "type": "address" },435 { "internalType": "uint256", "name": "sub", "type": "uint256" }436 ],437 "internalType": "struct EthCrossAccount",438 "name": "user",439 "type": "tuple"440 }441 ],442 "name": "removeFromCollectionAllowListCross",443 "outputs": [],444 "stateMutability": "nonpayable",445 "type": "function"446 },447 {448 "inputs": [449 { "internalType": "address", "name": "from", "type": "address" },450 { "internalType": "address", "name": "to", "type": "address" },451 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }452 ],453 "name": "safeTransferFrom",454 "outputs": [],455 "stateMutability": "nonpayable",456 "type": "function"457 },458 {459 "inputs": [460 { "internalType": "address", "name": "from", "type": "address" },461 { "internalType": "address", "name": "to", "type": "address" },462 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },463 { "internalType": "bytes", "name": "data", "type": "bytes" }464 ],465 "name": "safeTransferFromWithData",466 "outputs": [],467 "stateMutability": "nonpayable",468 "type": "function"469 },470 {471 "inputs": [472 { "internalType": "address", "name": "operator", "type": "address" },473 { "internalType": "bool", "name": "approved", "type": "bool" }474 ],475 "name": "setApprovalForAll",476 "outputs": [],477 "stateMutability": "nonpayable",478 "type": "function"479 },480 {481 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],482 "name": "setCollectionAccess",483 "outputs": [],484 "stateMutability": "nonpayable",485 "type": "function"486 },487 {488 "inputs": [489 { "internalType": "string", "name": "limit", "type": "string" },490 { "internalType": "uint256", "name": "value", "type": "uint256" }491 ],492 "name": "setCollectionLimit",493 "outputs": [],494 "stateMutability": "nonpayable",495 "type": "function"496 },497 {498 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],499 "name": "setCollectionMintMode",500 "outputs": [],501 "stateMutability": "nonpayable",502 "type": "function"503 },504 {505 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],506 "name": "setCollectionNesting",507 "outputs": [],508 "stateMutability": "nonpayable",509 "type": "function"510 },511 {512 "inputs": [513 { "internalType": "bool", "name": "enable", "type": "bool" },514 {515 "internalType": "address[]",516 "name": "collections",517 "type": "address[]"518 }519 ],520 "name": "setCollectionNesting",521 "outputs": [],522 "stateMutability": "nonpayable",523 "type": "function"524 },525 {526 "inputs": [527 {528 "components": [529 { "internalType": "string", "name": "key", "type": "string" },530 { "internalType": "bytes", "name": "value", "type": "bytes" }531 ],532 "internalType": "struct Property[]",533 "name": "properties",534 "type": "tuple[]"535 }536 ],537 "name": "setCollectionProperties",538 "outputs": [],539 "stateMutability": "nonpayable",540 "type": "function"541 },542 {543 "inputs": [544 {545 "components": [546 { "internalType": "address", "name": "eth", "type": "address" },547 { "internalType": "uint256", "name": "sub", "type": "uint256" }548 ],549 "internalType": "struct EthCrossAccount",550 "name": "sponsor",551 "type": "tuple"552 }553 ],554 "name": "setCollectionSponsorCross",555 "outputs": [],556 "stateMutability": "nonpayable",557 "type": "function"558 },559 {560 "inputs": [561 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },562 {563 "components": [564 { "internalType": "string", "name": "key", "type": "string" },565 { "internalType": "bytes", "name": "value", "type": "bytes" }566 ],567 "internalType": "struct Property[]",568 "name": "properties",569 "type": "tuple[]"570 }571 ],572 "name": "setProperties",573 "outputs": [],574 "stateMutability": "nonpayable",575 "type": "function"576 },577 {578 "inputs": [579 { "internalType": "string", "name": "key", "type": "string" },580 { "internalType": "bool", "name": "isMutable", "type": "bool" },581 { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },582 { "internalType": "bool", "name": "tokenOwner", "type": "bool" }583 ],584 "name": "setTokenPropertyPermission",585 "outputs": [],586 "stateMutability": "nonpayable",587 "type": "function"588 },589 {590 "inputs": [591 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }592 ],593 "name": "supportsInterface",594 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],595 "stateMutability": "view",596 "type": "function"597 },598 {599 "inputs": [],600 "name": "symbol",601 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],602 "stateMutability": "view",603 "type": "function"604 },605 {606 "inputs": [607 { "internalType": "uint256", "name": "index", "type": "uint256" }608 ],609 "name": "tokenByIndex",610 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],611 "stateMutability": "view",612 "type": "function"613 },614 {615 "inputs": [616 { "internalType": "uint256", "name": "token", "type": "uint256" }617 ],618 "name": "tokenContractAddress",619 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],620 "stateMutability": "view",621 "type": "function"622 },623 {624 "inputs": [625 { "internalType": "address", "name": "owner", "type": "address" },626 { "internalType": "uint256", "name": "index", "type": "uint256" }627 ],628 "name": "tokenOfOwnerByIndex",629 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],630 "stateMutability": "view",631 "type": "function"632 },633 {634 "inputs": [635 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }636 ],637 "name": "tokenURI",638 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],639 "stateMutability": "view",640 "type": "function"641 },642 {643 "inputs": [],644 "name": "totalSupply",645 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],646 "stateMutability": "view",647 "type": "function"648 },649 {650 "inputs": [651 { "internalType": "address", "name": "to", "type": "address" },652 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }653 ],654 "name": "transfer",655 "outputs": [],656 "stateMutability": "nonpayable",657 "type": "function"658 },659 {660 "inputs": [661 {662 "components": [663 { "internalType": "address", "name": "eth", "type": "address" },664 { "internalType": "uint256", "name": "sub", "type": "uint256" }665 ],666 "internalType": "struct EthCrossAccount",667 "name": "to",668 "type": "tuple"669 },670 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }671 ],672 "name": "transferCross",673 "outputs": [],674 "stateMutability": "nonpayable",675 "type": "function"676 },677 {678 "inputs": [679 { "internalType": "address", "name": "from", "type": "address" },680 { "internalType": "address", "name": "to", "type": "address" },681 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }682 ],683 "name": "transferFrom",684 "outputs": [],685 "stateMutability": "nonpayable",686 "type": "function"687 },688 {689 "inputs": [690 {691 "components": [692 { "internalType": "address", "name": "eth", "type": "address" },693 { "internalType": "uint256", "name": "sub", "type": "uint256" }694 ],695 "internalType": "struct EthCrossAccount",696 "name": "from",697 "type": "tuple"698 },699 {700 "components": [701 { "internalType": "address", "name": "eth", "type": "address" },702 { "internalType": "uint256", "name": "sub", "type": "uint256" }703 ],704 "internalType": "struct EthCrossAccount",705 "name": "to",706 "type": "tuple"707 },708 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }709 ],710 "name": "transferFromCross",711 "outputs": [],712 "stateMutability": "nonpayable",713 "type": "function"714 },715 {716 "inputs": [],717 "name": "uniqueCollectionType",718 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],719 "stateMutability": "view",720 "type": "function"721 }722]tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -13,7 +13,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
interface Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -113,21 +113,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) external;
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) external;
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) external;
/// Get contract address.
/// @dev EVM selector for this function is: 0xf6b4dfb4,
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -80,7 +80,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
interface Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -180,21 +180,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) external;
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) external;
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) external;
/// Get contract address.
/// @dev EVM selector for this function is: 0xf6b4dfb4,
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -80,7 +80,7 @@
}
/// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x324a7f5b
+/// @dev the ERC-165 identifier for this interface is 0x8b91d192
interface Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -180,21 +180,13 @@
/// "tokenLimit",
/// "sponsorTransferTimeout",
/// "sponsorApproveTimeout"
- /// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x6a3841db,
- /// or in textual repr: setCollectionLimit(string,uint32)
- function setCollectionLimit(string memory limit, uint32 value) external;
-
- /// Set limits for the collection.
- /// @dev Throws error if limit not found.
- /// @param limit Name of the limit. Valid names:
- /// "ownerCanTransfer",
+ /// "ownerCanTransfer",
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x993b7fba,
- /// or in textual repr: setCollectionLimit(string,bool)
- function setCollectionLimit(string memory limit, bool value) external;
+ /// @dev EVM selector for this function is: 0x4ad890a8,
+ /// or in textual repr: setCollectionLimit(string,uint256)
+ function setCollectionLimit(string memory limit, uint256 value) external;
/// Get contract address.
/// @dev EVM selector for this function is: 0xf6b4dfb4,
tests/src/eth/createFTCollection.test.tsdiffbeforeafterboth--- a/tests/src/eth/createFTCollection.test.ts
+++ b/tests/src/eth/createFTCollection.test.ts
@@ -85,32 +85,44 @@
tokenLimit: 1000000,
sponsorTransferTimeout: 6,
sponsorApproveTimeout: 6,
+ ownerCanTransfer: 0,
+ ownerCanDestroy: 0,
+ transfersEnabled: 0,
+ };
+
+ const expectedLimits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ tokenLimit: 1000000,
+ sponsorTransferTimeout: 6,
+ sponsorApproveTimeout: 6,
ownerCanTransfer: false,
ownerCanDestroy: false,
transfersEnabled: false,
};
-
+
const collection = helper.ethNativeContract.collection(collectionAddress, 'ft', owner);
- await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send();
- await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send();
+ await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send();
const data = (await helper.rft.getData(collectionId))!;
- expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit);
- expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize);
- expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit);
- expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit);
- expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout);
- expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout);
- expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer);
- expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy);
- expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled);
+ expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+ expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+ expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+ expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+ expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+ expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+ expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+ expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+ expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
});
itEth('Collection address exist', async ({helper}) => {
@@ -257,11 +269,28 @@
});
itEth('(!negative test!) Set limits', async ({helper}) => {
+
+ const invalidLimits = {
+ accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+ transfersEnabled: 3,
+ };
+
const owner = await helper.eth.createAccountWithBalance(donor);
const {collectionAddress} = await helper.eth.createFungibleCollection(owner, 'Limits', DECIMALS, 'absolutely anything', 'ISNI');
const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'ft', owner);
await expect(collectionEvm.methods
- .setCollectionLimit('badLimit', 'true')
- .call()).to.be.rejectedWith('unknown boolean limit "badLimit"');
+ .setCollectionLimit('badLimit', '1')
+ .call()).to.be.rejectedWith('unknown limit "badLimit"');
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled)
+ .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
});
+
+
+
});
tests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth--- a/tests/src/eth/createNFTCollection.test.ts
+++ b/tests/src/eth/createNFTCollection.test.ts
@@ -124,32 +124,44 @@
tokenLimit: 1000000,
sponsorTransferTimeout: 6,
sponsorApproveTimeout: 6,
+ ownerCanTransfer: 0,
+ ownerCanDestroy: 0,
+ transfersEnabled: 0,
+ };
+
+ const expectedLimits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ tokenLimit: 1000000,
+ sponsorTransferTimeout: 6,
+ sponsorApproveTimeout: 6,
ownerCanTransfer: false,
ownerCanDestroy: false,
transfersEnabled: false,
};
const collection = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
- await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send();
- await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send();
+ await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send();
- const data = (await helper.nft.getData(collectionId))!;
- expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit);
- expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize);
- expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit);
- expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit);
- expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout);
- expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout);
- expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer);
- expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy);
- expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled);
+ const data = (await helper.rft.getData(collectionId))!;
+ expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+ expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+ expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+ expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+ expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+ expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+ expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+ expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+ expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
});
itEth('Collection address exist', async ({helper}) => {
@@ -270,12 +282,22 @@
});
itEth('(!negative test!) Set limits', async ({helper}) => {
+ const invalidLimits = {
+ accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+ transfersEnabled: 3,
+ };
+
const owner = await helper.eth.createAccountWithBalance(donor);
const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'OLF');
const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
await expect(collectionEvm.methods
- .setCollectionLimit('badLimit', 'true')
- .call()).to.be.rejectedWith('unknown boolean limit "badLimit"');
+ .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled)
+ .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
});
itEth('destroyCollection', async ({helper}) => {
tests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -159,32 +159,44 @@
tokenLimit: 1000000,
sponsorTransferTimeout: 6,
sponsorApproveTimeout: 6,
+ ownerCanTransfer: 0,
+ ownerCanDestroy: 0,
+ transfersEnabled: 0,
+ };
+
+ const expectedLimits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ tokenLimit: 1000000,
+ sponsorTransferTimeout: 6,
+ sponsorApproveTimeout: 6,
ownerCanTransfer: false,
ownerCanDestroy: false,
transfersEnabled: false,
};
-
+
const collection = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);
- await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
- await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send();
- await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send();
- await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send();
+ await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send();
const data = (await helper.rft.getData(collectionId))!;
- expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit);
- expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize);
- expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit);
- expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit);
- expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout);
- expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout);
- expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer);
- expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy);
- expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled);
+ expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+ expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+ expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+ expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+ expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+ expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+ expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+ expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+ expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
});
itEth('Collection address exist', async ({helper}) => {
@@ -305,12 +317,22 @@
});
itEth('(!negative test!) Set limits', async ({helper}) => {
+ const invalidLimits = {
+ accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+ transfersEnabled: 3,
+ };
+
const owner = await helper.eth.createAccountWithBalance(donor);
const {collectionAddress} = await helper.eth.createRFTCollection(owner, 'Limits', 'absolutely anything', 'ISNI');
const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
await expect(collectionEvm.methods
- .setCollectionLimit('badLimit', 'true')
- .call()).to.be.rejectedWith('unknown boolean limit "badLimit"');
+ .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled)
+ .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
});
itEth('destroyCollection', async ({helper}) => {