git.delta.rocks / unique-network / refs/commits / db8b9bab3341

difftreelog

CORE-386 Fix PR

Trubnikov Sergey2022-06-10parent: #fd95478.patch.diff
in: master

5 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -22,7 +22,10 @@
 pub use pallet_evm::{PrecompileOutput, PrecompileResult, PrecompileHandle, account::CrossAccountId};
 use pallet_evm_coder_substrate::dispatch_to_evm;
 use sp_std::vec::Vec;
-use up_data_structs::{Property, SponsoringRateLimit, NestingRule, OwnerRestrictedSet, AccessMode};
+use up_data_structs::{
+	Property, SponsoringRateLimit, NestingRule, OwnerRestrictedSet, AccessMode,
+	CollectionPermissions,
+};
 use alloc::format;
 
 use crate::{Pallet, CollectionHandle, Config, CollectionProperties};
@@ -211,10 +214,20 @@
 	#[solidity(rename_selector = "setNesting")]
 	fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
-		self.collection.permissions.nesting = Some(match enable {
-			false => NestingRule::Disabled,
-			true => NestingRule::Owner,
-		});
+		let permissions = CollectionPermissions {
+			nesting: Some(match enable {
+				false => NestingRule::Disabled,
+				true => NestingRule::Owner,
+			}),
+			..Default::default()
+		};
+		self.collection.permissions = <Pallet<T>>::clamp_permissions(
+			self.collection.mode.clone(),
+			&self.collection.permissions,
+			permissions,
+		)
+		.map_err(dispatch_to_evm::<T>)?;
+
 		save(self)?;
 		Ok(())
 	}
@@ -237,19 +250,29 @@
 			)));
 		}
 		check_is_owner_or_admin(caller, self)?;
-		self.collection.permissions.nesting = Some(match enable {
-			false => NestingRule::Disabled,
-			true => {
-				let mut bv = OwnerRestrictedSet::new();
-				for i in collections {
-					bv.try_insert(crate::eth::map_eth_to_id(&i).ok_or_else(|| {
-						Error::Revert("Can't convert address into collection id".into())
-					})?)
-					.map_err(|e| Error::Revert(format!("{:?}", e)))?;
+		let permissions = CollectionPermissions {
+			nesting: Some(match enable {
+				false => NestingRule::Disabled,
+				true => {
+					let mut bv = OwnerRestrictedSet::new();
+					for i in collections {
+						bv.try_insert(crate::eth::map_eth_to_id(&i).ok_or_else(|| {
+							Error::Revert("Can't convert address into collection id".into())
+						})?)
+						.map_err(|e| Error::Revert(format!("{:?}", e)))?;
+					}
+					NestingRule::OwnerRestricted(bv)
 				}
-				NestingRule::OwnerRestricted(bv)
-			}
-		});
+			}),
+			..Default::default()
+		};
+		self.collection.permissions = <Pallet<T>>::clamp_permissions(
+			self.collection.mode.clone(),
+			&self.collection.permissions,
+			permissions,
+		)
+		.map_err(dispatch_to_evm::<T>)?;
+		
 		save(self)?;
 		Ok(())
 	}
modifiedtests/src/setCollectionLimits.test.tsdiffbeforeafterboth
--- a/tests/src/setCollectionLimits.test.ts
+++ b/tests/src/setCollectionLimits.test.ts
@@ -46,6 +46,7 @@
   before(async () => {
     await usingApi(async (api, privateKeyWrapper) => {
       alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
       collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}});
     });
   });
@@ -115,6 +116,21 @@
     });
   });
 
+  it('execute setCollectionLimits from admin collection', async () => {
+    await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address);
+    await usingApi(async (api: ApiPromise) => {
+      tx = api.tx.unique.setCollectionLimits(
+        collectionIdForTesting,
+        {
+          accountTokenOwnershipLimit,
+          sponsoredDataSize,
+          // sponsoredMintSize,
+          tokenLimit,
+        },
+      );
+      await expect(submitTransactionAsync(bob, tx)).to.be.not.rejected;
+    });
+  });
 });
 
 describe('setCollectionLimits negative', () => {
@@ -143,21 +159,6 @@
     });
   });
   it('execute setCollectionLimits from user who is not owner of this collection', async () => {
-    await usingApi(async (api: ApiPromise) => {
-      tx = api.tx.unique.setCollectionLimits(
-        collectionIdForTesting,
-        {
-          accountTokenOwnershipLimit,
-          sponsoredDataSize,
-          // sponsoredMintSize,
-          tokenLimit,
-        },
-      );
-      await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;
-    });
-  });
-  it('execute setCollectionLimits from admin collection', async () => {
-    await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address);
     await usingApi(async (api: ApiPromise) => {
       tx = api.tx.unique.setCollectionLimits(
         collectionIdForTesting,
modifiedtests/src/setCollectionSponsor.test.tsdiffbeforeafterboth
--- a/tests/src/setCollectionSponsor.test.ts
+++ b/tests/src/setCollectionSponsor.test.ts
@@ -65,6 +65,11 @@
     await setCollectionSponsorExpectSuccess(collectionId, bob.address);
     await setCollectionSponsorExpectSuccess(collectionId, charlie.address);
   });
+  it('Collection admin add sponsor', async () => {
+    const collectionId = await createCollectionExpectSuccess();
+    await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
+    await setCollectionSponsorExpectSuccess(collectionId, charlie.address, '//Bob');
+  });
 });
 
 describe('(!negative test!) integration test: ext. setCollectionSponsor():', () => {
@@ -93,10 +98,5 @@
     const collectionId = await createCollectionExpectSuccess();
     await destroyCollectionExpectSuccess(collectionId);
     await setCollectionSponsorExpectFailure(collectionId, bob.address);
-  });
-  it('(!negative test!) Collection admin add sponsor', async () => {
-    const collectionId = await createCollectionExpectSuccess();
-    await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
-    await setCollectionSponsorExpectFailure(collectionId, charlie.address, '//Bob');
   });
 });
modifiedtests/src/setMintPermission.test.tsdiffbeforeafterboth
--- a/tests/src/setMintPermission.test.ts
+++ b/tests/src/setMintPermission.test.ts
@@ -67,6 +67,14 @@
       await setMintPermissionExpectSuccess(alice, collectionId, false);
     });
   });
+
+  it('Collection admin success on set', async () => {
+    await usingApi(async () => {
+      const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
+      await setMintPermissionExpectSuccess(bob, collectionId, true);
+    });
+  });
 });
 
 describe('Negative Integration Test setMintPermission', () => {
@@ -100,14 +108,6 @@
     const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
     await enableAllowListExpectSuccess(alice, collectionId);
     await setMintPermissionExpectFailure(bob, collectionId, true);
-  });
-
-  it('Collection admin fails on set', async () => {
-    await usingApi(async () => {
-      const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
-      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
-      await setMintPermissionExpectFailure(bob, collectionId, true);
-    });
   });
 
   it('ensure non-allow-listed non-privileged address can\'t mint tokens', async () => {
modifiedtests/src/setPublicAccessMode.test.tsdiffbeforeafterboth
before · tests/src/setPublicAccessMode.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion18import {ApiPromise} from '@polkadot/api';19import {IKeyringPair} from '@polkadot/types/types';20import chai from 'chai';21import chaiAsPromised from 'chai-as-promised';22import usingApi, {submitTransactionExpectFailAsync} from './substrate/substrate-api';23import {24  addToAllowListExpectSuccess,25  createCollectionExpectSuccess,26  createItemExpectSuccess,27  destroyCollectionExpectSuccess,28  enablePublicMintingExpectSuccess,29  enableAllowListExpectSuccess,30  normalizeAccountId,31  addCollectionAdminExpectSuccess,32  getCreatedCollectionCount,33} from './util/helpers';3435chai.use(chaiAsPromised);36const expect = chai.expect;3738let alice: IKeyringPair;39let bob: IKeyringPair;4041describe('Integration Test setPublicAccessMode(): ', () => {42  before(async () => {43    await usingApi(async (api, privateKeyWrapper) => {44      alice = privateKeyWrapper('//Alice');45      bob = privateKeyWrapper('//Bob');46    });47  });4849  it('Run extrinsic with collection id parameters, set the allowlist mode for the collection', async () => {50    await usingApi(async () => {51      const collectionId: number = await createCollectionExpectSuccess();52      await enableAllowListExpectSuccess(alice, collectionId);53      await enablePublicMintingExpectSuccess(alice, collectionId);54      await addToAllowListExpectSuccess(alice, collectionId, bob.address);55      await createItemExpectSuccess(bob, collectionId, 'NFT', bob.address);56    });57  });5859  it('Allowlisted collection limits', async () => {60    await usingApi(async (api: ApiPromise) => {61      const collectionId = await createCollectionExpectSuccess();62      await enableAllowListExpectSuccess(alice, collectionId);63      await enablePublicMintingExpectSuccess(alice, collectionId);64      const tx = api.tx.unique.createItem(collectionId, normalizeAccountId(bob.address), 'NFT');65      await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;66    });67  });68});6970describe('Negative Integration Test ext. setPublicAccessMode(): ', () => {71  it('Set a non-existent collection', async () => {72    await usingApi(async (api: ApiPromise) => {73      // tslint:disable-next-line: radix74      const collectionId = await getCreatedCollectionCount(api) + 1;75      const tx = api.tx.unique.setCollectionPermissions(collectionId, {access: 'AllowList'});76      await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;77    });78  });7980  it('Set the collection that has been deleted', async () => {81    await usingApi(async (api: ApiPromise) => {82      // tslint:disable-next-line: no-bitwise83      const collectionId = await createCollectionExpectSuccess();84      await destroyCollectionExpectSuccess(collectionId);85      const tx = api.tx.unique.setCollectionPermissions(collectionId, {access: 'AllowList'});86      await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;87    });88  });8990  it('Re-set the list mode already set in quantity', async () => {91    await usingApi(async () => {92      const collectionId: number = await createCollectionExpectSuccess();93      await enableAllowListExpectSuccess(alice, collectionId);94      await enableAllowListExpectSuccess(alice, collectionId);95    });96  });9798  it('Execute method not on behalf of the collection owner', async () => {99    await usingApi(async (api: ApiPromise) => {100      // tslint:disable-next-line: no-bitwise101      const collectionId = await createCollectionExpectSuccess();102      const tx = api.tx.unique.setCollectionPermissions(collectionId, {access: 'AllowList'});103      await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;104    });105  });106});107108describe('Negative Integration Test ext. collection admin setPublicAccessMode(): ', () => {109  before(async () => {110    await usingApi(async (api, privateKeyWrapper) => {111      alice = privateKeyWrapper('//Alice');112      bob = privateKeyWrapper('//Bob');113    });114  });115  it('setPublicAccessMode by collection admin', async () => {116    await usingApi(async (api: ApiPromise) => {117      // tslint:disable-next-line: no-bitwise118      const collectionId = await createCollectionExpectSuccess();119      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);120      const tx = api.tx.unique.setCollectionPermissions(collectionId, {access: 'AllowList'});121      await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;122    });123  });124});