difftreelog
added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
in: master
15 files changed
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -37,6 +37,7 @@
Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf,
eth::{
EthCrossAccount, convert_cross_account_to_uint256, CollectionPermissions as EvmPermissions,
+ CollectionLimits as EvmCollectionLimits,
},
weights::WeightInfo,
};
@@ -304,6 +305,101 @@
Ok(result)
}
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ fn collection_limits(&self) -> Result<Vec<(EvmCollectionLimits, bool, uint256)>> {
+ let convert_value_limit = |limit: EvmCollectionLimits,
+ value: Option<u32>|
+ -> (EvmCollectionLimits, bool, uint256) {
+ value
+ .map(|v| (limit, true, v.into()))
+ .unwrap_or((limit, false, Default::default()))
+ };
+
+ let convert_bool_limit = |limit: EvmCollectionLimits,
+ value: Option<bool>|
+ -> (EvmCollectionLimits, bool, uint256) {
+ value
+ .map(|v| {
+ (
+ limit,
+ true,
+ if v {
+ uint256::from(1)
+ } else {
+ Default::default()
+ },
+ )
+ })
+ .unwrap_or((limit, false, Default::default()))
+ };
+
+ let limits = &self.collection.limits;
+
+ Ok(vec![
+ convert_value_limit(
+ EvmCollectionLimits::AccountTokenOwnership,
+ limits.account_token_ownership_limit,
+ ),
+ convert_value_limit(
+ EvmCollectionLimits::SponsoredDataSize,
+ limits.sponsored_data_size,
+ ),
+ limits
+ .sponsored_data_rate_limit
+ .map(|limit| {
+ (
+ EvmCollectionLimits::SponsoredDataRateLimit,
+ match limit {
+ SponsoringRateLimit::Blocks(_) => true,
+ _ => false,
+ },
+ match limit {
+ SponsoringRateLimit::Blocks(blocks) => blocks.into(),
+ _ => Default::default(),
+ },
+ )
+ })
+ .unwrap_or((
+ EvmCollectionLimits::SponsoredDataRateLimit,
+ false,
+ Default::default(),
+ )),
+ convert_value_limit(EvmCollectionLimits::TokenLimit, limits.token_limit),
+ convert_value_limit(
+ EvmCollectionLimits::SponsorTransferTimeout,
+ limits.sponsor_transfer_timeout,
+ ),
+ convert_value_limit(
+ EvmCollectionLimits::SponsorApproveTimeout,
+ limits.sponsor_approve_timeout,
+ ),
+ convert_bool_limit(
+ EvmCollectionLimits::OwnerCanTransfer,
+ limits.owner_can_transfer,
+ ),
+ convert_bool_limit(
+ EvmCollectionLimits::OwnerCanDestroy,
+ limits.owner_can_destroy,
+ ),
+ convert_bool_limit(
+ EvmCollectionLimits::TransferEnabled,
+ limits.transfers_enabled,
+ ),
+ ])
+ }
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -318,9 +414,19 @@
/// "transfersEnabled"
/// @param value Value of the limit.
#[solidity(rename_selector = "setCollectionLimit")]
- fn set_int_limit(&mut self, caller: caller, limit: string, value: uint256) -> Result<void> {
+ fn set_collection_limit(
+ &mut self,
+ caller: caller,
+ limit: EvmCollectionLimits,
+ status: bool,
+ value: uint256,
+ ) -> Result<void> {
self.consume_store_reads_and_writes(1, 1)?;
+ if !status {
+ return Err(Error::Revert("user can't disable limits".into()));
+ }
+
let value = value
.try_into()
.map_err(|_| Error::Revert(format!("can't convert value to u32 \"{}\"", value)))?;
@@ -338,35 +444,35 @@
let mut limits = self.limits.clone();
- match limit.as_str() {
- "accountTokenOwnershipLimit" => {
+ match limit {
+ EvmCollectionLimits::AccountTokenOwnership => {
limits.account_token_ownership_limit = Some(value);
}
- "sponsoredDataSize" => {
+ EvmCollectionLimits::SponsoredDataSize => {
limits.sponsored_data_size = Some(value);
}
- "sponsoredDataRateLimit" => {
+ EvmCollectionLimits::SponsoredDataRateLimit => {
limits.sponsored_data_rate_limit = Some(SponsoringRateLimit::Blocks(value));
}
- "tokenLimit" => {
+ EvmCollectionLimits::TokenLimit => {
limits.token_limit = Some(value);
}
- "sponsorTransferTimeout" => {
+ EvmCollectionLimits::SponsorTransferTimeout => {
limits.sponsor_transfer_timeout = Some(value);
}
- "sponsorApproveTimeout" => {
+ EvmCollectionLimits::SponsorApproveTimeout => {
limits.sponsor_approve_timeout = Some(value);
}
- "ownerCanTransfer" => {
+ EvmCollectionLimits::OwnerCanTransfer => {
limits.owner_can_transfer = Some(convert_value_to_bool()?);
}
- "ownerCanDestroy" => {
+ EvmCollectionLimits::OwnerCanDestroy => {
limits.owner_can_destroy = Some(convert_value_to_bool()?);
}
- "transfersEnabled" => {
+ EvmCollectionLimits::TransferEnabled => {
limits.transfers_enabled = Some(convert_value_to_bool()?);
}
- _ => return Err(Error::Revert(format!("unknown limit \"{}\"", limit))),
+ _ => return Err(Error::Revert(format!("unknown limit \"{:?}\"", limit))),
}
let caller = T::CrossAccountId::from_eth(caller);
@@ -778,3 +884,31 @@
})
}
}
+
+fn convert_value_limit<V: Into<uint256> + Copy>(
+ limit: EvmCollectionLimits,
+ value: &Option<V>,
+) -> (EvmCollectionLimits, bool, uint256) {
+ value
+ .map(|v| (limit, true, v.into()))
+ .unwrap_or((limit, false, Default::default()))
+}
+
+fn convert_bool_limit(
+ limit: EvmCollectionLimits,
+ value: &Option<bool>,
+) -> (EvmCollectionLimits, bool, uint256) {
+ value
+ .map(|v| {
+ (
+ limit,
+ true,
+ if v {
+ uint256::from(1)
+ } else {
+ Default::default()
+ },
+ )
+ })
+ .unwrap_or((limit, false, Default::default()))
+}
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -155,6 +155,20 @@
}
}
}
+#[derive(Debug, Default, Clone, Copy, AbiCoder)]
+#[repr(u8)]
+pub enum CollectionLimits {
+ #[default]
+ AccountTokenOwnership,
+ SponsoredDataSize,
+ SponsoredDataRateLimit,
+ TokenLimit,
+ SponsorTransferTimeout,
+ SponsorApproveTimeout,
+ OwnerCanTransfer,
+ OwnerCanDestroy,
+ TransferEnabled,
+}
#[derive(Default, Debug, Clone, Copy, AbiCoder)]
#[repr(u8)]
pub enum CollectionPermissions {
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -158,6 +158,27 @@
return Tuple8(0x0000000000000000000000000000000000000000, 0);
}
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ /// @dev EVM selector for this function is: 0xf63bc572,
+ /// or in textual repr: collectionLimits()
+ function collectionLimits() public view returns (Tuple20[] memory) {
+ require(false, stub_error);
+ dummy;
+ return new Tuple20[](0);
+ }
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -171,11 +192,16 @@
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x4ad890a8,
- /// or in textual repr: setCollectionLimit(string,uint256)
- function setCollectionLimit(string memory limit, uint256 value) public {
+ /// @dev EVM selector for this function is: 0x88150bd0,
+ /// or in textual repr: setCollectionLimit(uint8,bool,uint256)
+ function setCollectionLimit(
+ CollectionLimits limit,
+ bool status,
+ uint256 value
+ ) public {
require(false, stub_error);
limit;
+ status;
value;
dummy = 0;
}
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -291,6 +291,27 @@
return Tuple30(0x0000000000000000000000000000000000000000, 0);
}
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ /// @dev EVM selector for this function is: 0xf63bc572,
+ /// or in textual repr: collectionLimits()
+ function collectionLimits() public view returns (Tuple33[] memory) {
+ require(false, stub_error);
+ dummy;
+ return new Tuple33[](0);
+ }
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -304,11 +325,16 @@
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x4ad890a8,
- /// or in textual repr: setCollectionLimit(string,uint256)
- function setCollectionLimit(string memory limit, uint256 value) public {
+ /// @dev EVM selector for this function is: 0x88150bd0,
+ /// or in textual repr: setCollectionLimit(uint8,bool,uint256)
+ function setCollectionLimit(
+ CollectionLimits limit,
+ bool status,
+ uint256 value
+ ) public {
require(false, stub_error);
limit;
+ status;
value;
dummy = 0;
}
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -292,6 +292,27 @@
return Tuple29(0x0000000000000000000000000000000000000000, 0);
}
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ /// @dev EVM selector for this function is: 0xf63bc572,
+ /// or in textual repr: collectionLimits()
+ function collectionLimits() public view returns (Tuple32[] memory) {
+ require(false, stub_error);
+ dummy;
+ return new Tuple32[](0);
+ }
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -305,11 +326,16 @@
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x4ad890a8,
- /// or in textual repr: setCollectionLimit(string,uint256)
- function setCollectionLimit(string memory limit, uint256 value) public {
+ /// @dev EVM selector for this function is: 0x88150bd0,
+ /// or in textual repr: setCollectionLimit(uint8,bool,uint256)
+ function setCollectionLimit(
+ CollectionLimits limit,
+ bool status,
+ uint256 value
+ ) public {
require(false, stub_error);
limit;
+ status;
value;
dummy = 0;
}
tests/src/eth/abi/fungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -208,11 +208,16 @@
},
{
"inputs": [],
+<<<<<<< HEAD
"name": "collectionNestingPermissions",
+=======
+ "name": "collectionLimits",
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
"outputs": [
{
"components": [
{
+<<<<<<< HEAD
"internalType": "enum CollectionPermissions",
"name": "field_0",
"type": "uint8"
@@ -220,6 +225,16 @@
{ "internalType": "bool", "name": "field_1", "type": "bool" }
],
"internalType": "struct Tuple24[]",
+=======
+ "internalType": "enum CollectionLimits",
+ "name": "field_0",
+ "type": "uint8"
+ },
+ { "internalType": "bool", "name": "field_1", "type": "bool" },
+ { "internalType": "uint256", "name": "field_2", "type": "uint256" }
+ ],
+ "internalType": "struct Tuple20[]",
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
"name": "",
"type": "tuple[]"
}
@@ -229,6 +244,7 @@
},
{
"inputs": [],
+<<<<<<< HEAD
"name": "collectionNestingRestrictedCollectionIds",
"outputs": [
{
@@ -250,6 +266,8 @@
},
{
"inputs": [],
+=======
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
"name": "collectionOwner",
"outputs": [
{
@@ -453,7 +471,12 @@
},
{
"inputs": [
- { "internalType": "string", "name": "limit", "type": "string" },
+ {
+ "internalType": "enum CollectionLimits",
+ "name": "limit",
+ "type": "uint8"
+ },
+ { "internalType": "bool", "name": "status", "type": "bool" },
{ "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "setCollectionLimit",
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -607,7 +607,12 @@
},
{
"inputs": [
- { "internalType": "string", "name": "limit", "type": "string" },
+ {
+ "internalType": "enum CollectionLimits",
+ "name": "limit",
+ "type": "uint8"
+ },
+ { "internalType": "bool", "name": "status", "type": "bool" },
{ "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "setCollectionLimit",
tests/src/eth/abi/reFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -589,7 +589,12 @@
},
{
"inputs": [
- { "internalType": "string", "name": "limit", "type": "string" },
+ {
+ "internalType": "enum CollectionLimits",
+ "name": "limit",
+ "type": "uint8"
+ },
+ { "internalType": "bool", "name": "status", "type": "bool" },
{ "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "setCollectionLimit",
tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56/// @dev common stubs holder7interface Dummy {89}1011interface ERC165 is Dummy {12 function supportsInterface(bytes4 interfaceID) external view returns (bool);13}1415/// @title A contract that allows you to work with collections.16/// @dev the ERC-165 identifier for this interface is 0xb5e1747f17interface Collection is Dummy, ERC165 {18 // /// Set collection property.19 // ///20 // /// @param key Property key.21 // /// @param value Propery value.22 // /// @dev EVM selector for this function is: 0x2f073f66,23 // /// or in textual repr: setCollectionProperty(string,bytes)24 // function setCollectionProperty(string memory key, bytes memory value) external;2526 /// Set collection properties.27 ///28 /// @param properties Vector of properties key/value pair.29 /// @dev EVM selector for this function is: 0x50b26b2a,30 /// or in textual repr: setCollectionProperties((string,bytes)[])31 function setCollectionProperties(Property[] memory properties) external;3233 // /// Delete collection property.34 // ///35 // /// @param key Property key.36 // /// @dev EVM selector for this function is: 0x7b7debce,37 // /// or in textual repr: deleteCollectionProperty(string)38 // function deleteCollectionProperty(string memory key) external;3940 /// Delete collection properties.41 ///42 /// @param keys Properties keys.43 /// @dev EVM selector for this function is: 0xee206ee3,44 /// or in textual repr: deleteCollectionProperties(string[])45 function deleteCollectionProperties(string[] memory keys) external;4647 /// Get collection property.48 ///49 /// @dev Throws error if key not found.50 ///51 /// @param key Property key.52 /// @return bytes The property corresponding to the key.53 /// @dev EVM selector for this function is: 0xcf24fd6d,54 /// or in textual repr: collectionProperty(string)55 function collectionProperty(string memory key) external view returns (bytes memory);5657 /// Get collection properties.58 ///59 /// @param keys Properties keys. Empty keys for all propertyes.60 /// @return Vector of properties key/value pairs.61 /// @dev EVM selector for this function is: 0x285fb8e6,62 /// or in textual repr: collectionProperties(string[])63 function collectionProperties(string[] memory keys) external view returns (Property[] memory);6465 // /// Set the sponsor of the collection.66 // ///67 // /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.68 // ///69 // /// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.70 // /// @dev EVM selector for this function is: 0x7623402e,71 // /// or in textual repr: setCollectionSponsor(address)72 // function setCollectionSponsor(address sponsor) external;7374 /// Set the sponsor of the collection.75 ///76 /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.77 ///78 /// @param sponsor Cross account address of the sponsor from whose account funds will be debited for operations with the contract.79 /// @dev EVM selector for this function is: 0x84a1d5a8,80 /// or in textual repr: setCollectionSponsorCross((address,uint256))81 function setCollectionSponsorCross(EthCrossAccount memory sponsor) external;8283 /// Whether there is a pending sponsor.84 /// @dev EVM selector for this function is: 0x058ac185,85 /// or in textual repr: hasCollectionPendingSponsor()86 function hasCollectionPendingSponsor() external view returns (bool);8788 /// Collection sponsorship confirmation.89 ///90 /// @dev After setting the sponsor for the collection, it must be confirmed with this function.91 /// @dev EVM selector for this function is: 0x3c50e97a,92 /// or in textual repr: confirmCollectionSponsorship()93 function confirmCollectionSponsorship() external;9495 /// Remove collection sponsor.96 /// @dev EVM selector for this function is: 0x6e0326a3,97 /// or in textual repr: removeCollectionSponsor()98 function removeCollectionSponsor() external;99100 /// Get current sponsor.101 ///102 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.103 /// @dev EVM selector for this function is: 0x6ec0a9f1,104 /// or in textual repr: collectionSponsor()105 function collectionSponsor() external view returns (Tuple8 memory);106107 /// Set limits for the collection.108 /// @dev Throws error if limit not found.109 /// @param limit Name of the limit. Valid names:110 /// "accountTokenOwnershipLimit",111 /// "sponsoredDataSize",112 /// "sponsoredDataRateLimit",113 /// "tokenLimit",114 /// "sponsorTransferTimeout",115 /// "sponsorApproveTimeout"116 /// "ownerCanTransfer",117 /// "ownerCanDestroy",118 /// "transfersEnabled"119 /// @param value Value of the limit.120 /// @dev EVM selector for this function is: 0x4ad890a8,121 /// or in textual repr: setCollectionLimit(string,uint256)122 function setCollectionLimit(string memory limit, uint256 value) external;123124 /// Get contract address.125 /// @dev EVM selector for this function is: 0xf6b4dfb4,126 /// or in textual repr: contractAddress()127 function contractAddress() external view returns (address);128129 /// Add collection admin.130 /// @param newAdmin Cross account administrator address.131 /// @dev EVM selector for this function is: 0x859aa7d6,132 /// or in textual repr: addCollectionAdminCross((address,uint256))133 function addCollectionAdminCross(EthCrossAccount memory newAdmin) external;134135 /// Remove collection admin.136 /// @param admin Cross account administrator address.137 /// @dev EVM selector for this function is: 0x6c0cd173,138 /// or in textual repr: removeCollectionAdminCross((address,uint256))139 function removeCollectionAdminCross(EthCrossAccount memory admin) external;140141 // /// Add collection admin.142 // /// @param newAdmin Address of the added administrator.143 // /// @dev EVM selector for this function is: 0x92e462c7,144 // /// or in textual repr: addCollectionAdmin(address)145 // function addCollectionAdmin(address newAdmin) external;146147 // /// Remove collection admin.148 // ///149 // /// @param admin Address of the removed administrator.150 // /// @dev EVM selector for this function is: 0xfafd7b42,151 // /// or in textual repr: removeCollectionAdmin(address)152 // function removeCollectionAdmin(address admin) external;153154 /// Toggle accessibility of collection nesting.155 ///156 /// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'157 /// @dev EVM selector for this function is: 0x112d4586,158 /// or in textual repr: setCollectionNesting(bool)159 function setCollectionNesting(bool enable) external;160161 /// Toggle accessibility of collection nesting.162 ///163 /// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'164 /// @param collections Addresses of collections that will be available for nesting.165 /// @dev EVM selector for this function is: 0x64872396,166 /// or in textual repr: setCollectionNesting(bool,address[])167 function setCollectionNesting(bool enable, address[] memory collections) external;168169 /// Returns nesting for a collection170 /// @dev EVM selector for this function is: 0x22d25bfe,171 /// or in textual repr: collectionNestingRestrictedCollectionIds()172 function collectionNestingRestrictedCollectionIds() external view returns (Tuple20 memory);173174 /// Returns permissions for a collection175 /// @dev EVM selector for this function is: 0x5b2eaf4b,176 /// or in textual repr: collectionNestingPermissions()177 function collectionNestingPermissions() external view returns (Tuple23[] memory);178179 /// Set the collection access method.180 /// @param mode Access mode181 /// 0 for Normal182 /// 1 for AllowList183 /// @dev EVM selector for this function is: 0x41835d4c,184 /// or in textual repr: setCollectionAccess(uint8)185 function setCollectionAccess(uint8 mode) external;186187 /// Checks that user allowed to operate with collection.188 ///189 /// @param user User address to check.190 /// @dev EVM selector for this function is: 0x91b6df49,191 /// or in textual repr: allowlistedCross((address,uint256))192 function allowlistedCross(EthCrossAccount memory user) external view returns (bool);193194 // /// Add the user to the allowed list.195 // ///196 // /// @param user Address of a trusted user.197 // /// @dev EVM selector for this function is: 0x67844fe6,198 // /// or in textual repr: addToCollectionAllowList(address)199 // function addToCollectionAllowList(address user) external;200201 /// Add user to allowed list.202 ///203 /// @param user User cross account address.204 /// @dev EVM selector for this function is: 0xa0184a3a,205 /// or in textual repr: addToCollectionAllowListCross((address,uint256))206 function addToCollectionAllowListCross(EthCrossAccount memory user) external;207208 // /// Remove the user from the allowed list.209 // ///210 // /// @param user Address of a removed user.211 // /// @dev EVM selector for this function is: 0x85c51acb,212 // /// or in textual repr: removeFromCollectionAllowList(address)213 // function removeFromCollectionAllowList(address user) external;214215 /// Remove user from allowed list.216 ///217 /// @param user User cross account address.218 /// @dev EVM selector for this function is: 0x09ba452a,219 /// or in textual repr: removeFromCollectionAllowListCross((address,uint256))220 function removeFromCollectionAllowListCross(EthCrossAccount memory user) external;221222 /// Switch permission for minting.223 ///224 /// @param mode Enable if "true".225 /// @dev EVM selector for this function is: 0x00018e84,226 /// or in textual repr: setCollectionMintMode(bool)227 function setCollectionMintMode(bool mode) external;228229 // /// Check that account is the owner or admin of the collection230 // ///231 // /// @param user account to verify232 // /// @return "true" if account is the owner or admin233 // /// @dev EVM selector for this function is: 0x9811b0c7,234 // /// or in textual repr: isOwnerOrAdmin(address)235 // function isOwnerOrAdmin(address user) external view returns (bool);236237 /// Check that account is the owner or admin of the collection238 ///239 /// @param user User cross account to verify240 /// @return "true" if account is the owner or admin241 /// @dev EVM selector for this function is: 0x3e75a905,242 /// or in textual repr: isOwnerOrAdminCross((address,uint256))243 function isOwnerOrAdminCross(EthCrossAccount memory user) external view returns (bool);244245 /// Returns collection type246 ///247 /// @return `Fungible` or `NFT` or `ReFungible`248 /// @dev EVM selector for this function is: 0xd34b55b8,249 /// or in textual repr: uniqueCollectionType()250 function uniqueCollectionType() external view returns (string memory);251252 /// Get collection owner.253 ///254 /// @return Tuble with sponsor address and his substrate mirror.255 /// If address is canonical then substrate mirror is zero and vice versa.256 /// @dev EVM selector for this function is: 0xdf727d3b,257 /// or in textual repr: collectionOwner()258 function collectionOwner() external view returns (EthCrossAccount memory);259260 // /// Changes collection owner to another account261 // ///262 // /// @dev Owner can be changed only by current owner263 // /// @param newOwner new owner account264 // /// @dev EVM selector for this function is: 0x4f53e226,265 // /// or in textual repr: changeCollectionOwner(address)266 // function changeCollectionOwner(address newOwner) external;267268 /// Get collection administrators269 ///270 /// @return Vector of tuples with admins address and his substrate mirror.271 /// If address is canonical then substrate mirror is zero and vice versa.272 /// @dev EVM selector for this function is: 0x5813216b,273 /// or in textual repr: collectionAdmins()274 function collectionAdmins() external view returns (EthCrossAccount[] memory);275276 /// Changes collection owner to another account277 ///278 /// @dev Owner can be changed only by current owner279 /// @param newOwner new owner cross account280 /// @dev EVM selector for this function is: 0x6496c497,281 /// or in textual repr: changeCollectionOwnerCross((address,uint256))282 function changeCollectionOwnerCross(EthCrossAccount memory newOwner) external;283}284285/// @dev Cross account struct286struct EthCrossAccount {287 address eth;288 uint256 sub;289}290291/// @dev anonymous struct292struct Tuple23 {293 CollectionPermissions field_0;294 bool field_1;295}296297enum CollectionPermissions {298 CollectionAdmin,299 TokenOwner300}301302/// @dev anonymous struct303struct Tuple20 {304 bool field_0;305 uint256[] field_1;306}307308/// @dev Property struct309struct Property {310 string key;311 bytes value;312}313314/// @dev the ERC-165 identifier for this interface is 0x5b7038cf315interface ERC20UniqueExtensions is Dummy, ERC165 {316 /// @notice A description for the collection.317 /// @dev EVM selector for this function is: 0x7284e416,318 /// or in textual repr: description()319 function description() external view returns (string memory);320321 /// @dev EVM selector for this function is: 0x0ecd0ab0,322 /// or in textual repr: approveCross((address,uint256),uint256)323 function approveCross(EthCrossAccount memory spender, uint256 amount) external returns (bool);324325 // /// Burn tokens from account326 // /// @dev Function that burns an `amount` of the tokens of a given account,327 // /// deducting from the sender's allowance for said account.328 // /// @param from The account whose tokens will be burnt.329 // /// @param amount The amount that will be burnt.330 // /// @dev EVM selector for this function is: 0x79cc6790,331 // /// or in textual repr: burnFrom(address,uint256)332 // function burnFrom(address from, uint256 amount) external returns (bool);333334 /// Burn tokens from account335 /// @dev Function that burns an `amount` of the tokens of a given account,336 /// deducting from the sender's allowance for said account.337 /// @param from The account whose tokens will be burnt.338 /// @param amount The amount that will be burnt.339 /// @dev EVM selector for this function is: 0xbb2f5a58,340 /// or in textual repr: burnFromCross((address,uint256),uint256)341 function burnFromCross(EthCrossAccount memory from, uint256 amount) external returns (bool);342343 /// Mint tokens for multiple accounts.344 /// @param amounts array of pairs of account address and amount345 /// @dev EVM selector for this function is: 0x1acf2d55,346 /// or in textual repr: mintBulk((address,uint256)[])347 function mintBulk(Tuple8[] memory amounts) external returns (bool);348349 /// @dev EVM selector for this function is: 0x2ada85ff,350 /// or in textual repr: transferCross((address,uint256),uint256)351 function transferCross(EthCrossAccount memory to, uint256 amount) external returns (bool);352353 /// @dev EVM selector for this function is: 0xd5cf430b,354 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)355 function transferFromCross(356 EthCrossAccount memory from,357 EthCrossAccount memory to,358 uint256 amount359 ) external returns (bool);360}361362/// @dev anonymous struct363struct Tuple8 {364 address field_0;365 uint256 field_1;366}367368/// @dev the ERC-165 identifier for this interface is 0x40c10f19369interface ERC20Mintable is Dummy, ERC165 {370 /// Mint tokens for `to` account.371 /// @param to account that will receive minted tokens372 /// @param amount amount of tokens to mint373 /// @dev EVM selector for this function is: 0x40c10f19,374 /// or in textual repr: mint(address,uint256)375 function mint(address to, uint256 amount) external returns (bool);376}377378/// @dev inlined interface379interface ERC20Events {380 event Transfer(address indexed from, address indexed to, uint256 value);381 event Approval(address indexed owner, address indexed spender, uint256 value);382}383384/// @dev the ERC-165 identifier for this interface is 0x8cb847c4385interface ERC20 is Dummy, ERC165, ERC20Events {386 /// @dev EVM selector for this function is: 0x06fdde03,387 /// or in textual repr: name()388 function name() external view returns (string memory);389390 /// @dev EVM selector for this function is: 0x95d89b41,391 /// or in textual repr: symbol()392 function symbol() external view returns (string memory);393394 /// @dev EVM selector for this function is: 0x18160ddd,395 /// or in textual repr: totalSupply()396 function totalSupply() external view returns (uint256);397398 /// @dev EVM selector for this function is: 0x313ce567,399 /// or in textual repr: decimals()400 function decimals() external view returns (uint8);401402 /// @dev EVM selector for this function is: 0x70a08231,403 /// or in textual repr: balanceOf(address)404 function balanceOf(address owner) external view returns (uint256);405406 /// @dev EVM selector for this function is: 0xa9059cbb,407 /// or in textual repr: transfer(address,uint256)408 function transfer(address to, uint256 amount) external returns (bool);409410 /// @dev EVM selector for this function is: 0x23b872dd,411 /// or in textual repr: transferFrom(address,address,uint256)412 function transferFrom(413 address from,414 address to,415 uint256 amount416 ) external returns (bool);417418 /// @dev EVM selector for this function is: 0x095ea7b3,419 /// or in textual repr: approve(address,uint256)420 function approve(address spender, uint256 amount) external returns (bool);421422 /// @dev EVM selector for this function is: 0xdd62ed3e,423 /// or in textual repr: allowance(address,address)424 function allowance(address owner, address spender) external view returns (uint256);425426 /// @notice Returns collection helper contract address427 /// @dev EVM selector for this function is: 0x1896cce6,428 /// or in textual repr: collectionHelperAddress()429 function collectionHelperAddress() external view returns (address);430}431432interface UniqueFungible is Dummy, ERC165, ERC20, ERC20Mintable, ERC20UniqueExtensions, Collection {}1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56/// @dev common stubs holder7interface Dummy {89}1011interface ERC165 is Dummy {12 function supportsInterface(bytes4 interfaceID) external view returns (bool);13}1415/// @title A contract that allows you to work with collections.16<<<<<<< HEAD17/// @dev the ERC-165 identifier for this interface is 0xb5e1747f18=======19/// @dev the ERC-165 identifier for this interface is 0xf8ebdec020>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`21interface Collection is Dummy, ERC165 {22 // /// Set collection property.23 // ///24 // /// @param key Property key.25 // /// @param value Propery value.26 // /// @dev EVM selector for this function is: 0x2f073f66,27 // /// or in textual repr: setCollectionProperty(string,bytes)28 // function setCollectionProperty(string memory key, bytes memory value) external;2930 /// Set collection properties.31 ///32 /// @param properties Vector of properties key/value pair.33 /// @dev EVM selector for this function is: 0x50b26b2a,34 /// or in textual repr: setCollectionProperties((string,bytes)[])35 function setCollectionProperties(Property[] memory properties) external;3637 // /// Delete collection property.38 // ///39 // /// @param key Property key.40 // /// @dev EVM selector for this function is: 0x7b7debce,41 // /// or in textual repr: deleteCollectionProperty(string)42 // function deleteCollectionProperty(string memory key) external;4344 /// Delete collection properties.45 ///46 /// @param keys Properties keys.47 /// @dev EVM selector for this function is: 0xee206ee3,48 /// or in textual repr: deleteCollectionProperties(string[])49 function deleteCollectionProperties(string[] memory keys) external;5051 /// Get collection property.52 ///53 /// @dev Throws error if key not found.54 ///55 /// @param key Property key.56 /// @return bytes The property corresponding to the key.57 /// @dev EVM selector for this function is: 0xcf24fd6d,58 /// or in textual repr: collectionProperty(string)59 function collectionProperty(string memory key) external view returns (bytes memory);6061 /// Get collection properties.62 ///63 /// @param keys Properties keys. Empty keys for all propertyes.64 /// @return Vector of properties key/value pairs.65 /// @dev EVM selector for this function is: 0x285fb8e6,66 /// or in textual repr: collectionProperties(string[])67 function collectionProperties(string[] memory keys) external view returns (Property[] memory);6869 // /// Set the sponsor of the collection.70 // ///71 // /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.72 // ///73 // /// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.74 // /// @dev EVM selector for this function is: 0x7623402e,75 // /// or in textual repr: setCollectionSponsor(address)76 // function setCollectionSponsor(address sponsor) external;7778 /// Set the sponsor of the collection.79 ///80 /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.81 ///82 /// @param sponsor Cross account address of the sponsor from whose account funds will be debited for operations with the contract.83 /// @dev EVM selector for this function is: 0x84a1d5a8,84 /// or in textual repr: setCollectionSponsorCross((address,uint256))85 function setCollectionSponsorCross(EthCrossAccount memory sponsor) external;8687 /// Whether there is a pending sponsor.88 /// @dev EVM selector for this function is: 0x058ac185,89 /// or in textual repr: hasCollectionPendingSponsor()90 function hasCollectionPendingSponsor() external view returns (bool);9192 /// Collection sponsorship confirmation.93 ///94 /// @dev After setting the sponsor for the collection, it must be confirmed with this function.95 /// @dev EVM selector for this function is: 0x3c50e97a,96 /// or in textual repr: confirmCollectionSponsorship()97 function confirmCollectionSponsorship() external;9899 /// Remove collection sponsor.100 /// @dev EVM selector for this function is: 0x6e0326a3,101 /// or in textual repr: removeCollectionSponsor()102 function removeCollectionSponsor() external;103104 /// Get current sponsor.105 ///106 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.107 /// @dev EVM selector for this function is: 0x6ec0a9f1,108 /// or in textual repr: collectionSponsor()109 function collectionSponsor() external view returns (Tuple8 memory);110111 /// Get current collection limits.112 ///113 /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:114 /// "accountTokenOwnershipLimit",115 /// "sponsoredDataSize",116 /// "sponsoredDataRateLimit",117 /// "tokenLimit",118 /// "sponsorTransferTimeout",119 /// "sponsorApproveTimeout"120 /// "ownerCanTransfer",121 /// "ownerCanDestroy",122 /// "transfersEnabled"123 /// Return `false` if a limit not set.124 /// @dev EVM selector for this function is: 0xf63bc572,125 /// or in textual repr: collectionLimits()126 function collectionLimits() external view returns (Tuple19[] memory);127128 /// Set limits for the collection.129 /// @dev Throws error if limit not found.130 /// @param limit Name of the limit. Valid names:131 /// "accountTokenOwnershipLimit",132 /// "sponsoredDataSize",133 /// "sponsoredDataRateLimit",134 /// "tokenLimit",135 /// "sponsorTransferTimeout",136 /// "sponsorApproveTimeout"137 /// "ownerCanTransfer",138 /// "ownerCanDestroy",139 /// "transfersEnabled"140 /// @param value Value of the limit.141 /// @dev EVM selector for this function is: 0x88150bd0,142 /// or in textual repr: setCollectionLimit(uint8,bool,uint256)143 function setCollectionLimit(144 CollectionLimits limit,145 bool status,146 uint256 value147 ) external;148149 /// Get contract address.150 /// @dev EVM selector for this function is: 0xf6b4dfb4,151 /// or in textual repr: contractAddress()152 function contractAddress() external view returns (address);153154 /// Add collection admin.155 /// @param newAdmin Cross account administrator address.156 /// @dev EVM selector for this function is: 0x859aa7d6,157 /// or in textual repr: addCollectionAdminCross((address,uint256))158 function addCollectionAdminCross(EthCrossAccount memory newAdmin) external;159160 /// Remove collection admin.161 /// @param admin Cross account administrator address.162 /// @dev EVM selector for this function is: 0x6c0cd173,163 /// or in textual repr: removeCollectionAdminCross((address,uint256))164 function removeCollectionAdminCross(EthCrossAccount memory admin) external;165166 // /// Add collection admin.167 // /// @param newAdmin Address of the added administrator.168 // /// @dev EVM selector for this function is: 0x92e462c7,169 // /// or in textual repr: addCollectionAdmin(address)170 // function addCollectionAdmin(address newAdmin) external;171172 // /// Remove collection admin.173 // ///174 // /// @param admin Address of the removed administrator.175 // /// @dev EVM selector for this function is: 0xfafd7b42,176 // /// or in textual repr: removeCollectionAdmin(address)177 // function removeCollectionAdmin(address admin) external;178179 /// Toggle accessibility of collection nesting.180 ///181 /// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'182 /// @dev EVM selector for this function is: 0x112d4586,183 /// or in textual repr: setCollectionNesting(bool)184 function setCollectionNesting(bool enable) external;185186 /// Toggle accessibility of collection nesting.187 ///188 /// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'189 /// @param collections Addresses of collections that will be available for nesting.190 /// @dev EVM selector for this function is: 0x64872396,191 /// or in textual repr: setCollectionNesting(bool,address[])192 function setCollectionNesting(bool enable, address[] memory collections) external;193194 /// Returns nesting for a collection195 /// @dev EVM selector for this function is: 0x22d25bfe,196 /// or in textual repr: collectionNestingRestrictedCollectionIds()197 function collectionNestingRestrictedCollectionIds() external view returns (Tuple20 memory);198199 /// Returns permissions for a collection200 /// @dev EVM selector for this function is: 0x5b2eaf4b,201 /// or in textual repr: collectionNestingPermissions()202 function collectionNestingPermissions() external view returns (Tuple23[] memory);203204 /// Set the collection access method.205 /// @param mode Access mode206 /// 0 for Normal207 /// 1 for AllowList208 /// @dev EVM selector for this function is: 0x41835d4c,209 /// or in textual repr: setCollectionAccess(uint8)210 function setCollectionAccess(uint8 mode) external;211212 /// Checks that user allowed to operate with collection.213 ///214 /// @param user User address to check.215 /// @dev EVM selector for this function is: 0x91b6df49,216 /// or in textual repr: allowlistedCross((address,uint256))217 function allowlistedCross(EthCrossAccount memory user) external view returns (bool);218219 // /// Add the user to the allowed list.220 // ///221 // /// @param user Address of a trusted user.222 // /// @dev EVM selector for this function is: 0x67844fe6,223 // /// or in textual repr: addToCollectionAllowList(address)224 // function addToCollectionAllowList(address user) external;225226 /// Add user to allowed list.227 ///228 /// @param user User cross account address.229 /// @dev EVM selector for this function is: 0xa0184a3a,230 /// or in textual repr: addToCollectionAllowListCross((address,uint256))231 function addToCollectionAllowListCross(EthCrossAccount memory user) external;232233 // /// Remove the user from the allowed list.234 // ///235 // /// @param user Address of a removed user.236 // /// @dev EVM selector for this function is: 0x85c51acb,237 // /// or in textual repr: removeFromCollectionAllowList(address)238 // function removeFromCollectionAllowList(address user) external;239240 /// Remove user from allowed list.241 ///242 /// @param user User cross account address.243 /// @dev EVM selector for this function is: 0x09ba452a,244 /// or in textual repr: removeFromCollectionAllowListCross((address,uint256))245 function removeFromCollectionAllowListCross(EthCrossAccount memory user) external;246247 /// Switch permission for minting.248 ///249 /// @param mode Enable if "true".250 /// @dev EVM selector for this function is: 0x00018e84,251 /// or in textual repr: setCollectionMintMode(bool)252 function setCollectionMintMode(bool mode) external;253254 // /// Check that account is the owner or admin of the collection255 // ///256 // /// @param user account to verify257 // /// @return "true" if account is the owner or admin258 // /// @dev EVM selector for this function is: 0x9811b0c7,259 // /// or in textual repr: isOwnerOrAdmin(address)260 // function isOwnerOrAdmin(address user) external view returns (bool);261262 /// Check that account is the owner or admin of the collection263 ///264 /// @param user User cross account to verify265 /// @return "true" if account is the owner or admin266 /// @dev EVM selector for this function is: 0x3e75a905,267 /// or in textual repr: isOwnerOrAdminCross((address,uint256))268 function isOwnerOrAdminCross(EthCrossAccount memory user) external view returns (bool);269270 /// Returns collection type271 ///272 /// @return `Fungible` or `NFT` or `ReFungible`273 /// @dev EVM selector for this function is: 0xd34b55b8,274 /// or in textual repr: uniqueCollectionType()275 function uniqueCollectionType() external view returns (string memory);276277 /// Get collection owner.278 ///279 /// @return Tuble with sponsor address and his substrate mirror.280 /// If address is canonical then substrate mirror is zero and vice versa.281 /// @dev EVM selector for this function is: 0xdf727d3b,282 /// or in textual repr: collectionOwner()283 function collectionOwner() external view returns (EthCrossAccount memory);284285 // /// Changes collection owner to another account286 // ///287 // /// @dev Owner can be changed only by current owner288 // /// @param newOwner new owner account289 // /// @dev EVM selector for this function is: 0x4f53e226,290 // /// or in textual repr: changeCollectionOwner(address)291 // function changeCollectionOwner(address newOwner) external;292293 /// Get collection administrators294 ///295 /// @return Vector of tuples with admins address and his substrate mirror.296 /// If address is canonical then substrate mirror is zero and vice versa.297 /// @dev EVM selector for this function is: 0x5813216b,298 /// or in textual repr: collectionAdmins()299 function collectionAdmins() external view returns (EthCrossAccount[] memory);300301 /// Changes collection owner to another account302 ///303 /// @dev Owner can be changed only by current owner304 /// @param newOwner new owner cross account305 /// @dev EVM selector for this function is: 0x6496c497,306 /// or in textual repr: changeCollectionOwnerCross((address,uint256))307 function changeCollectionOwnerCross(EthCrossAccount memory newOwner) external;308}309310/// @dev Cross account struct311struct EthCrossAccount {312 address eth;313 uint256 sub;314}315316<<<<<<< HEAD317/// @dev anonymous struct318struct Tuple23 {319 CollectionPermissions field_0;320 bool field_1;321}322323enum CollectionPermissions {324 CollectionAdmin,325 TokenOwner326}327328/// @dev anonymous struct329struct Tuple20 {330 bool field_0;331 uint256[] field_1;332=======333enum CollectionLimits {334 AccountTokenOwnership,335 SponsoredDataSize,336 SponsoredDataRateLimit,337 TokenLimit,338 SponsorTransferTimeout,339 SponsorApproveTimeout,340 OwnerCanTransfer,341 OwnerCanDestroy,342 TransferEnabled343}344345/// @dev anonymous struct346struct Tuple19 {347 CollectionLimits field_0;348 bool field_1;349 uint256 field_2;350>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`351}352353/// @dev Property struct354struct Property {355 string key;356 bytes value;357}358359/// @dev the ERC-165 identifier for this interface is 0x5b7038cf360interface ERC20UniqueExtensions is Dummy, ERC165 {361 /// @notice A description for the collection.362 /// @dev EVM selector for this function is: 0x7284e416,363 /// or in textual repr: description()364 function description() external view returns (string memory);365366 /// @dev EVM selector for this function is: 0x0ecd0ab0,367 /// or in textual repr: approveCross((address,uint256),uint256)368 function approveCross(EthCrossAccount memory spender, uint256 amount) external returns (bool);369370 // /// Burn tokens from account371 // /// @dev Function that burns an `amount` of the tokens of a given account,372 // /// deducting from the sender's allowance for said account.373 // /// @param from The account whose tokens will be burnt.374 // /// @param amount The amount that will be burnt.375 // /// @dev EVM selector for this function is: 0x79cc6790,376 // /// or in textual repr: burnFrom(address,uint256)377 // function burnFrom(address from, uint256 amount) external returns (bool);378379 /// Burn tokens from account380 /// @dev Function that burns an `amount` of the tokens of a given account,381 /// deducting from the sender's allowance for said account.382 /// @param from The account whose tokens will be burnt.383 /// @param amount The amount that will be burnt.384 /// @dev EVM selector for this function is: 0xbb2f5a58,385 /// or in textual repr: burnFromCross((address,uint256),uint256)386 function burnFromCross(EthCrossAccount memory from, uint256 amount) external returns (bool);387388 /// Mint tokens for multiple accounts.389 /// @param amounts array of pairs of account address and amount390 /// @dev EVM selector for this function is: 0x1acf2d55,391 /// or in textual repr: mintBulk((address,uint256)[])392 function mintBulk(Tuple8[] memory amounts) external returns (bool);393394 /// @dev EVM selector for this function is: 0x2ada85ff,395 /// or in textual repr: transferCross((address,uint256),uint256)396 function transferCross(EthCrossAccount memory to, uint256 amount) external returns (bool);397398 /// @dev EVM selector for this function is: 0xd5cf430b,399 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)400 function transferFromCross(401 EthCrossAccount memory from,402 EthCrossAccount memory to,403 uint256 amount404 ) external returns (bool);405}406407/// @dev anonymous struct408struct Tuple8 {409 address field_0;410 uint256 field_1;411}412413/// @dev the ERC-165 identifier for this interface is 0x40c10f19414interface ERC20Mintable is Dummy, ERC165 {415 /// Mint tokens for `to` account.416 /// @param to account that will receive minted tokens417 /// @param amount amount of tokens to mint418 /// @dev EVM selector for this function is: 0x40c10f19,419 /// or in textual repr: mint(address,uint256)420 function mint(address to, uint256 amount) external returns (bool);421}422423/// @dev inlined interface424interface ERC20Events {425 event Transfer(address indexed from, address indexed to, uint256 value);426 event Approval(address indexed owner, address indexed spender, uint256 value);427}428429/// @dev the ERC-165 identifier for this interface is 0x8cb847c4430interface ERC20 is Dummy, ERC165, ERC20Events {431 /// @dev EVM selector for this function is: 0x06fdde03,432 /// or in textual repr: name()433 function name() external view returns (string memory);434435 /// @dev EVM selector for this function is: 0x95d89b41,436 /// or in textual repr: symbol()437 function symbol() external view returns (string memory);438439 /// @dev EVM selector for this function is: 0x18160ddd,440 /// or in textual repr: totalSupply()441 function totalSupply() external view returns (uint256);442443 /// @dev EVM selector for this function is: 0x313ce567,444 /// or in textual repr: decimals()445 function decimals() external view returns (uint8);446447 /// @dev EVM selector for this function is: 0x70a08231,448 /// or in textual repr: balanceOf(address)449 function balanceOf(address owner) external view returns (uint256);450451 /// @dev EVM selector for this function is: 0xa9059cbb,452 /// or in textual repr: transfer(address,uint256)453 function transfer(address to, uint256 amount) external returns (bool);454455 /// @dev EVM selector for this function is: 0x23b872dd,456 /// or in textual repr: transferFrom(address,address,uint256)457 function transferFrom(458 address from,459 address to,460 uint256 amount461 ) external returns (bool);462463 /// @dev EVM selector for this function is: 0x095ea7b3,464 /// or in textual repr: approve(address,uint256)465 function approve(address spender, uint256 amount) external returns (bool);466467 /// @dev EVM selector for this function is: 0xdd62ed3e,468 /// or in textual repr: allowance(address,address)469 function allowance(address owner, address spender) external view returns (uint256);470471 /// @notice Returns collection helper contract address472 /// @dev EVM selector for this function is: 0x1896cce6,473 /// or in textual repr: collectionHelperAddress()474 function collectionHelperAddress() external view returns (address);475}476477interface UniqueFungible is Dummy, ERC165, ERC20, ERC20Mintable, ERC20UniqueExtensions, Collection {}tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -104,7 +104,11 @@
}
/// @title A contract that allows you to work with collections.
+<<<<<<< HEAD
/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
+=======
+/// @dev the ERC-165 identifier for this interface is 0xf8ebdec0
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
interface Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -195,6 +199,23 @@
/// or in textual repr: collectionSponsor()
function collectionSponsor() external view returns (Tuple27 memory);
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ /// @dev EVM selector for this function is: 0xf63bc572,
+ /// or in textual repr: collectionLimits()
+ function collectionLimits() external view returns (Tuple30[] memory);
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -208,9 +229,13 @@
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x4ad890a8,
- /// or in textual repr: setCollectionLimit(string,uint256)
- function setCollectionLimit(string memory limit, uint256 value) external;
+ /// @dev EVM selector for this function is: 0x88150bd0,
+ /// or in textual repr: setCollectionLimit(uint8,bool,uint256)
+ function setCollectionLimit(
+ CollectionLimits limit,
+ bool status,
+ uint256 value
+ ) external;
/// Get contract address.
/// @dev EVM selector for this function is: 0xf6b4dfb4,
@@ -379,6 +404,25 @@
uint256 sub;
}
+enum CollectionLimits {
+ AccountTokenOwnership,
+ SponsoredDataSize,
+ SponsoredDataRateLimit,
+ TokenLimit,
+ SponsorTransferTimeout,
+ SponsorApproveTimeout,
+ OwnerCanTransfer,
+ OwnerCanDestroy,
+ TransferEnabled
+}
+
+/// @dev anonymous struct
+struct Tuple30 {
+ CollectionLimits field_0;
+ bool field_1;
+ uint256 field_2;
+}
+
/// @dev anonymous struct
struct Tuple34 {
CollectionPermissions field_0;
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -105,7 +105,11 @@
}
/// @title A contract that allows you to work with collections.
+<<<<<<< HEAD
/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
+=======
+/// @dev the ERC-165 identifier for this interface is 0xf8ebdec0
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`
interface Collection is Dummy, ERC165 {
// /// Set collection property.
// ///
@@ -196,6 +200,23 @@
/// or in textual repr: collectionSponsor()
function collectionSponsor() external view returns (Tuple26 memory);
+ /// Get current collection limits.
+ ///
+ /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// Return `false` if a limit not set.
+ /// @dev EVM selector for this function is: 0xf63bc572,
+ /// or in textual repr: collectionLimits()
+ function collectionLimits() external view returns (Tuple29[] memory);
+
/// Set limits for the collection.
/// @dev Throws error if limit not found.
/// @param limit Name of the limit. Valid names:
@@ -209,9 +230,13 @@
/// "ownerCanDestroy",
/// "transfersEnabled"
/// @param value Value of the limit.
- /// @dev EVM selector for this function is: 0x4ad890a8,
- /// or in textual repr: setCollectionLimit(string,uint256)
- function setCollectionLimit(string memory limit, uint256 value) external;
+ /// @dev EVM selector for this function is: 0x88150bd0,
+ /// or in textual repr: setCollectionLimit(uint8,bool,uint256)
+ function setCollectionLimit(
+ CollectionLimits limit,
+ bool status,
+ uint256 value
+ ) external;
/// Get contract address.
/// @dev EVM selector for this function is: 0xf6b4dfb4,
@@ -380,6 +405,25 @@
uint256 sub;
}
+enum CollectionLimits {
+ AccountTokenOwnership,
+ SponsoredDataSize,
+ SponsoredDataRateLimit,
+ TokenLimit,
+ SponsorTransferTimeout,
+ SponsorApproveTimeout,
+ OwnerCanTransfer,
+ OwnerCanDestroy,
+ TransferEnabled
+}
+
+/// @dev anonymous struct
+struct Tuple29 {
+ CollectionLimits field_0;
+ bool field_1;
+ uint256 field_2;
+}
+
/// @dev anonymous struct
struct Tuple33 {
CollectionPermissions field_0;
tests/src/eth/createFTCollection.test.tsdiffbeforeafterboth--- a/tests/src/eth/createFTCollection.test.ts
+++ b/tests/src/eth/createFTCollection.test.ts
@@ -17,7 +17,7 @@
import {IKeyringPair} from '@polkadot/types/types';
import {evmToAddress} from '@polkadot/util-crypto';
import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
const DECIMALS = 18;
@@ -79,6 +79,56 @@
expect(await collection.methods.description().call()).to.deep.equal(description);
});
+ itEth('Set limits', async ({helper}) => {
+ const owner = await helper.eth.createAccountWithBalance(donor);
+ const {collectionId, collectionAddress} = await helper.eth.createFungibleCollection(owner, 'Limits', DECIMALS, 'absolutely anything', 'INSI');
+ const limits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ 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(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+
+ 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}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -197,6 +247,7 @@
{
await expect(peasantCollection.methods
.setCollectionLimit('accountTokenOwnershipLimit', '1000')
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
});
@@ -224,5 +275,31 @@
.setCollectionLimit('accountTokenOwnershipLimit', '1000')
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
- });
+ });
+
+ 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(20, true, '1')
+ .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert Value not convertible into enum "CollectionLimits"');
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(CollectionLimits.TransferEnabled, true, 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
@@ -16,7 +16,7 @@
import {evmToAddress} from '@polkadot/util-crypto';
import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
describe('Create NFT collection from EVM', () => {
@@ -120,6 +120,56 @@
expect(await sponsorCollection.methods.description().call()).to.deep.equal(description);
});
+ itEth('Set limits', async ({helper}) => {
+ const owner = await helper.eth.createAccountWithBalance(donor);
+ const {collectionId, collectionAddress} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'FLO');
+ const limits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ 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(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+
+ 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}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -207,7 +257,7 @@
}
{
await expect(malfeasantCollection.methods
- .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
});
@@ -232,11 +282,30 @@
}
{
await expect(malfeasantCollection.methods
- .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
});
+ 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(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(CollectionLimits.TransferEnabled, true, invalidLimits.transfersEnabled)
+ .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
+ });
+
itEth('destroyCollection', async ({helper}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'OLF');
tests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -17,7 +17,7 @@
import {evmToAddress} from '@polkadot/util-crypto';
import {IKeyringPair} from '@polkadot/types/types';
import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
describe('Create RFT collection from EVM', () => {
@@ -152,6 +152,56 @@
expect(data.raw.sponsorship.Confirmed).to.be.equal(evmToAddress(sponsor, Number(ss58Format)));
});
+ itEth('Set limits', async ({helper}) => {
+ const owner = await helper.eth.createAccountWithBalance(donor);
+ const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(owner, 'Limits', 'absolutely anything', 'INSI');
+ const limits = {
+ accountTokenOwnershipLimit: 1000,
+ sponsoredDataSize: 1024,
+ sponsoredDataRateLimit: 30,
+ 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(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+ await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+
+ 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}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -239,7 +289,7 @@
}
{
await expect(peasantCollection.methods
- .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
});
@@ -264,10 +314,29 @@
}
{
await expect(peasantCollection.methods
- .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+ .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
.call()).to.be.rejectedWith(EXPECTED_ERROR);
}
});
+
+ 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(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+ .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+
+ await expect(collectionEvm.methods
+ .setCollectionLimit(CollectionLimits.TransferEnabled, true, invalidLimits.transfersEnabled)
+ .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
+ });
itEth('destroyCollection', async ({helper}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
tests/src/eth/util/index.tsdiffbeforeafterboth--- a/tests/src/eth/util/index.ts
+++ b/tests/src/eth/util/index.ts
@@ -26,6 +26,17 @@
Allowlisted = 1,
Generous = 2,
}
+export enum CollectionLimits {
+ AccountTokenOwnership,
+ SponsoredDataSize,
+ SponsoredDataRateLimit,
+ TokenLimit,
+ SponsorTransferTimeout,
+ SponsorApproveTimeout,
+ OwnerCanTransfer,
+ OwnerCanDestroy,
+ TransferEnabled
+}
export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair>) => Promise<void>) => {
const silentConsole = new SilentConsole();