git.delta.rocks / unique-network / refs/commits / 6dd2322471d4

difftreelog

refactor `collection_limits`, add docs for `CollectionLimits`

PraetorP2022-12-16parent: #07c2857.patch.diff
in: master

9 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -358,18 +358,16 @@
 			),
 			limits
 				.sponsored_data_rate_limit
-				.map(|limit| {
-					(
-						EvmCollectionLimits::SponsoredDataRateLimit,
-						match limit {
-							SponsoringRateLimit::Blocks(_) => true,
-							_ => false,
-						},
-						match limit {
-							SponsoringRateLimit::Blocks(blocks) => blocks.into(),
-							_ => Default::default(),
-						},
-					)
+				.and_then(|limit| {
+					if let SponsoringRateLimit::Blocks(blocks) = limit {
+						Some((
+							EvmCollectionLimits::SponsoredDataRateLimit,
+							true,
+							blocks.into(),
+						))
+					} else {
+						None
+					}
 				})
 				.unwrap_or((
 					EvmCollectionLimits::SponsoredDataRateLimit,
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -155,6 +155,8 @@
 		}
 	}
 }
+
+/// [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM.
 #[derive(Debug, Default, Clone, Copy, AbiCoder)]
 #[repr(u8)]
 pub enum CollectionLimits {
modifiedtests/src/eth/collectionLimits.test.tsdiffbeforeafterboth
before · tests/src/eth/collectionLimits.test.ts
1import {IKeyringPair} from '@polkadot/types/types';2import {Pallets} from '../util';3import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';456describe('Can set collection limits', () => {7  let donor: IKeyringPair;89  before(async () => {10    await usingEthPlaygrounds(async (_helper, privateKey) => {11      donor = await privateKey({filename: __filename});12    });13  });1415  [16    {case: 'nft' as const},17    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},18    {case: 'ft' as const},19  ].map(testCase =>20    itEth.ifWithPallets(`for ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {21      const owner = await helper.eth.createAccountWithBalance(donor);22      const {collectionId, collectionAddress} = await helper.eth.createCollection(testCase.case, owner, 'Limits', 'absolutely anything', 'FLO', 18);23      const limits = {24        accountTokenOwnershipLimit: 1000,25        sponsoredDataSize: 1024,26        sponsoredDataRateLimit: 30,27        tokenLimit: 1000000,28        sponsorTransferTimeout: 6,29        sponsorApproveTimeout: 6,30        ownerCanTransfer: 1,31        ownerCanDestroy: 0,32        transfersEnabled: 0,33      };34      35      const expectedLimits = {36        accountTokenOwnershipLimit: 1000,37        sponsoredDataSize: 1024,38        sponsoredDataRateLimit: {blocks: 30},39        tokenLimit: 1000000,40        sponsorTransferTimeout: 6,41        sponsorApproveTimeout: 6,42        ownerCanTransfer: true,43        ownerCanDestroy: false,44        transfersEnabled: false,45      };46     47      const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner);48      await collectionEvm.methods.setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();49      await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();50      await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();51      await collectionEvm.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();52      await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();53      await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();54      await collectionEvm.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();55      await collectionEvm.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();56      await collectionEvm.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();57      58      // Check limits from sub:59      const data = (await helper.rft.getData(collectionId))!;60      expect(data.raw.limits).to.deep.eq(expectedLimits);61      expect(await helper.collection.getEffectiveLimits(collectionId)).to.deep.eq(expectedLimits);62      // Check limits from eth:63      const limitsEvm = await collectionEvm.methods.collectionLimits().call({from: owner});64      expect(limitsEvm).to.have.length(9);65      expect(limitsEvm[0]).to.deep.eq(['0', true, limits.accountTokenOwnershipLimit.toString()]);66      expect(limitsEvm[1]).to.deep.eq(['1', true, limits.sponsoredDataSize.toString()]);67      expect(limitsEvm[2]).to.deep.eq(['2', true, limits.sponsoredDataRateLimit.toString()]);68      expect(limitsEvm[3]).to.deep.eq(['3', true, limits.tokenLimit.toString()]);69      expect(limitsEvm[4]).to.deep.eq(['4', true, limits.sponsorTransferTimeout.toString()]);70      expect(limitsEvm[5]).to.deep.eq(['5', true, limits.sponsorApproveTimeout.toString()]);71      expect(limitsEvm[6]).to.deep.eq(['6', true, limits.ownerCanTransfer.toString()]);72      expect(limitsEvm[7]).to.deep.eq(['7', true, limits.ownerCanDestroy.toString()]);73      expect(limitsEvm[8]).to.deep.eq(['8', true, limits.transfersEnabled.toString()]);74    }));75});7677describe('Cannot set invalid collection limits', () => {78  let donor: IKeyringPair;7980  before(async () => {81    await usingEthPlaygrounds(async (_helper, privateKey) => {82      donor = await privateKey({filename: __filename});83    });84  });8586  [87    {case: 'nft' as const},88    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},89    {case: 'ft' as const},90  ].map(testCase =>91    itEth.ifWithPallets(`for ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {92      const invalidLimits = {93        accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),94        transfersEnabled: 3,95      };9697      const owner = await helper.eth.createAccountWithBalance(donor);98      const {collectionAddress} = await helper.eth.createCollection(testCase.case, owner, 'Limits', 'absolutely anything', 'ISNI', 18);99      const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner);100101      // Cannot set non-existing limit102      await expect(collectionEvm.methods103        .setCollectionLimit(9, true, 1)104        .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert Value not convertible into enum "CollectionLimits"');      105        106      // Cannot disable limits107      await expect(collectionEvm.methods108        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, false, 200)109        .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert user can\'t disable limits');110111      await expect(collectionEvm.methods112        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)113        .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);114 115      await expect(collectionEvm.methods116        .setCollectionLimit(CollectionLimits.TransferEnabled, true, 3)117        .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);118119      expect(() => collectionEvm.methods120        .setCollectionLimit(CollectionLimits.SponsoredDataSize, true, -1).send()).to.throw('value out-of-bounds');121    }));122123  [124    {case: 'nft' as const, requiredPallets: []},125    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},126    {case: 'ft' as const, requiredPallets: []},127  ].map(testCase =>128    itEth.ifWithPallets(`Non-owner and non-admin cannot set collection limits for ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {129      const owner = await helper.eth.createAccountWithBalance(donor);130      const nonOwner = await helper.eth.createAccountWithBalance(donor);131      const {collectionAddress} = await helper.eth.createCollection(testCase.case, owner, 'Limits', 'absolutely anything', 'FLO', 18);132133      const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner);134      await expect(collectionEvm.methods135        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)136        .call({from: nonOwner}))137        .to.be.rejectedWith('NoPermission');138139      await expect(collectionEvm.methods140        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)141        .send({from: nonOwner}))142        .to.be.rejected;143    }));144});
modifiedtests/src/eth/createFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createFTCollection.test.ts
+++ b/tests/src/eth/createFTCollection.test.ts
@@ -17,7 +17,8 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 const DECIMALS = 18;
 
modifiedtests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createNFTCollection.test.ts
+++ b/tests/src/eth/createNFTCollection.test.ts
@@ -16,7 +16,8 @@
 
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 
 describe('Create NFT collection from EVM', () => {
modifiedtests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -17,7 +17,8 @@
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 
 describe('Create RFT collection from EVM', () => {
modifiedtests/src/eth/events.test.tsdiffbeforeafterboth
--- a/tests/src/eth/events.test.ts
+++ b/tests/src/eth/events.test.ts
@@ -16,10 +16,10 @@
 
 import {expect} from 'chai';
 import {IKeyringPair} from '@polkadot/types/types';
-import {CollectionLimits, EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';
+import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';
 import {IEvent, TCollectionMode} from '../util/playgrounds/types';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {EthTokenPermissions, NormalizedEvent} from './util/playgrounds/types';
+import {CollectionLimits, EthTokenPermissions, NormalizedEvent} from './util/playgrounds/types';
 
 let donor: IKeyringPair;
   
modifiedtests/src/eth/util/index.tsdiffbeforeafterboth
--- a/tests/src/eth/util/index.ts
+++ b/tests/src/eth/util/index.ts
@@ -26,18 +26,8 @@
   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();
   silentConsole.enable();
modifiedtests/src/eth/util/playgrounds/types.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/types.ts
+++ b/tests/src/eth/util/playgrounds/types.ts
@@ -24,4 +24,15 @@
   Mutable,
   TokenOwner,
   CollectionAdmin
-}
\ No newline at end of file
+}
+export enum CollectionLimits {
+  AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}