--- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -3,7 +3,7 @@ use codec::Decode; use jsonrpc_core::{Error as RpcError, ErrorCode, Result}; use jsonrpc_derive::rpc; -use nft_data_structs::{CollectionId, TokenId}; +use nft_data_structs::{Collection, CollectionId, CollectionStats, TokenId}; use sp_api::{BlockId, BlockT, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use up_rpc::NftApi as NftRuntimeApi; @@ -86,8 +86,23 @@ collection: CollectionId, at: Option, ) -> Result>; + #[rpc(name = "nft_allowed")] + fn allowed( + &self, + collection: CollectionId, + user: CrossAccountId, + at: Option, + ) -> Result; #[rpc(name = "nft_lastTokenId")] fn last_token_id(&self, collection: CollectionId, at: Option) -> Result; + #[rpc(name = "nft_collectionById")] + fn collection_by_id( + &self, + collection: CollectionId, + at: Option, + ) -> Result>>; + #[rpc(name = "nft_collectionStats")] + fn collection_stats(&self, at: Option) -> Result; } pub struct Nft { @@ -160,5 +175,8 @@ pass_method!(adminlist(collection: CollectionId) -> Vec); pass_method!(allowlist(collection: CollectionId) -> Vec); + pass_method!(allowed(collection: CollectionId, user: CrossAccountId) -> bool); pass_method!(last_token_id(collection: CollectionId) -> TokenId); + pass_method!(collection_by_id(collection: CollectionId) -> Option>); + pass_method!(collection_stats() -> CollectionStats); } --- a/pallets/common/src/benchmarking.rs +++ b/pallets/common/src/benchmarking.rs @@ -19,7 +19,7 @@ pub fn create_collection_raw( owner: T::AccountId, mode: CollectionMode, - handler: impl FnOnce(Collection) -> Result, + handler: impl FnOnce(Collection) -> Result, cast: impl FnOnce(CollectionHandle) -> R, ) -> Result { T::Currency::deposit_creating(&owner, T::CollectionCreationPrice::get()); --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -12,7 +12,7 @@ COLLECTION_NUMBER_LIMIT, Collection, CollectionId, CreateItemData, ExistenceRequirement, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_COLLECTION_NAME_LENGTH, MAX_TOKEN_PREFIX_LENGTH, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission, Pays, PostDispatchInfo, TokenId, Weight, - WithdrawReasons, + WithdrawReasons, CollectionStats, }; pub use pallet::*; use sp_core::H160; @@ -26,7 +26,7 @@ #[must_use = "Should call submit_logs or save, otherwise some data will be lost for evm side"] pub struct CollectionHandle { pub id: CollectionId, - collection: Collection, + collection: Collection, pub recorder: pallet_evm_coder_substrate::SubstrateRecorder, } impl CollectionHandle { @@ -78,7 +78,7 @@ } } impl Deref for CollectionHandle { - type Target = Collection; + type Target = Collection; fn deref(&self) -> &Self::Target { &self.collection @@ -311,7 +311,7 @@ pub type CollectionById = StorageMap< Hasher = Blake2_128Concat, Key = CollectionId, - Value = Collection, + Value = Collection<::AccountId>, QueryKind = OptionQuery, >; @@ -344,6 +344,10 @@ Value = bool, QueryKind = ValueQuery, >; + + /// Not used by code, exists only to provide some types to metadata + #[pallet::storage] + pub type DummyStorageValue = StorageValue; } impl Pallet { @@ -355,10 +359,32 @@ ); Ok(()) } + pub fn adminlist(collection: CollectionId) -> Vec { + >::iter_prefix((collection,)) + .map(|(a, _)| a) + .collect() + } + pub fn allowlist(collection: CollectionId) -> Vec { + >::iter_prefix((collection,)) + .map(|(a, _)| a) + .collect() + } + pub fn allowed(collection: CollectionId, user: T::CrossAccountId) -> bool { + >::get((collection, user)) + } + pub fn collection_stats() -> CollectionStats { + let created = >::get(); + let destroyed = >::get(); + CollectionStats { + created: created.0, + destroyed: destroyed.0, + alive: created.0 - destroyed.0, + } + } } impl Pallet { - pub fn init_collection(data: Collection) -> Result { + pub fn init_collection(data: Collection) -> Result { { ensure!( data.name.len() <= MAX_COLLECTION_NAME_LENGTH, --- a/pallets/fungible/src/lib.rs +++ b/pallets/fungible/src/lib.rs @@ -91,8 +91,8 @@ } impl Pallet { - pub fn init_collection(data: Collection) -> Result { - PalletCommon::init_collection(data) + pub fn init_collection(data: Collection) -> Result { + >::init_collection(data) } pub fn destroy_collection( collection: FungibleHandle, --- a/pallets/nft/src/eth/sponsoring.rs +++ b/pallets/nft/src/eth/sponsoring.rs @@ -25,7 +25,7 @@ fn try_sponsor( caller: &H160, collection_id: CollectionId, - collection: &Collection, + collection: &Collection, call: &[u8], ) -> Result<(), AnyError> { let (method_id, mut reader) = AbiReader::new_call(call).map_err(|_| AnyError)?; @@ -109,7 +109,7 @@ if !collection.sponsorship.confirmed() { return None; } - if try_sponsor(who, collection_id, &collection, &call.1).is_ok() { + if try_sponsor::(who, collection_id, &collection, &call.1).is_ok() { return collection .sponsorship .sponsor() --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -42,8 +42,8 @@ CollectionId, CollectionMode, TokenId, SchemaVersion, SponsorshipState, MetaUpdatePermission, }; use pallet_common::{ - account::CrossAccountId, CollectionHandle, IsAdmin, Pallet as PalletCommon, - Error as CommonError, CommonWeightInfo, Allowlist, + account::CrossAccountId, CollectionHandle, Pallet as PalletCommon, Error as CommonError, + CommonWeightInfo, }; use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle}; use pallet_fungible::{Pallet as PalletFungible, FungibleHandle}; @@ -190,7 +190,7 @@ let who = ensure_signed(origin)?; // Create new collection - let new_collection = Collection:: { + let new_collection = Collection { owner: who.clone(), name: collection_name, mode: mode.clone(), @@ -208,14 +208,14 @@ }; let _id = match mode { - CollectionMode::NFT => {PalletNonfungible::init_collection(new_collection)?}, + CollectionMode::NFT => {>::init_collection(new_collection)?}, CollectionMode::Fungible(decimal_points) => { // check params ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::::CollectionDecimalPointLimitExceeded); - PalletFungible::init_collection(new_collection)? + >::init_collection(new_collection)? } CollectionMode::ReFungible => { - PalletRefungible::init_collection(new_collection)? + >::init_collection(new_collection)? } }; @@ -936,19 +936,5 @@ target_collection.save() } - } -} - -// TODO: limit returned entries? -impl Pallet { - pub fn adminlist(collection: CollectionId) -> Vec { - >::iter_prefix((collection,)) - .map(|(a, _)| a) - .collect() - } - pub fn allowlist(collection: CollectionId) -> Vec { - >::iter_prefix((collection,)) - .map(|(a, _)| a) - .collect() } } --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -133,8 +133,8 @@ // unchecked calls skips any permission checks impl Pallet { - pub fn init_collection(data: Collection) -> Result { - PalletCommon::init_collection(data) + pub fn init_collection(data: Collection) -> Result { + >::init_collection(data) } pub fn destroy_collection( collection: NonfungibleHandle, --- a/pallets/refungible/src/lib.rs +++ b/pallets/refungible/src/lib.rs @@ -156,8 +156,8 @@ // unchecked calls skips any permission checks impl Pallet { - pub fn init_collection(data: Collection) -> Result { - PalletCommon::init_collection(data) + pub fn init_collection(data: Collection) -> Result { + >::init_collection(data) } pub fn destroy_collection( collection: RefungibleHandle, --- a/primitives/nft/src/lib.rs +++ b/primitives/nft/src/lib.rs @@ -207,8 +207,8 @@ #[derive(Encode, Decode, Clone, PartialEq, TypeInfo)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -pub struct Collection { - pub owner: T::AccountId, +pub struct Collection { + pub owner: AccountId, pub mode: CollectionMode, pub access: AccessMode, pub name: Vec, // 64 include null escape char @@ -217,7 +217,7 @@ pub mint_mode: bool, pub offchain_schema: Vec, pub schema_version: SchemaVersion, - pub sponsorship: SponsorshipState, + pub sponsorship: SponsorshipState, pub limits: CollectionLimits, // Collection private restrictions pub variable_on_chain_schema: Vec, // pub const_on_chain_schema: Vec, // @@ -413,3 +413,11 @@ CreateItemData::Fungible(item) } } + +#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug, TypeInfo)] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] +pub struct CollectionStats { + pub created: u32, + pub destroyed: u32, + pub alive: u32, +} --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -1,6 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -use nft_data_structs::{CollectionId, TokenId}; +use nft_data_structs::{CollectionId, TokenId, Collection, CollectionStats}; use sp_std::vec::Vec; use sp_core::H160; use codec::Decode; @@ -32,6 +32,9 @@ fn adminlist(collection: CollectionId) -> Vec; fn allowlist(collection: CollectionId) -> Vec; + fn allowed(collection: CollectionId, user: CrossAccountId) -> bool; fn last_token_id(collection: CollectionId) -> TokenId; + fn collection_by_id(collection: CollectionId) -> Option>; + fn collection_stats() -> CollectionStats; } } --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1040,14 +1040,23 @@ .or_else(|| >::get_code(&account)) } fn adminlist(collection: CollectionId) -> Vec { - >::adminlist(collection) + >::adminlist(collection) } fn allowlist(collection: CollectionId) -> Vec { - >::allowlist(collection) + >::allowlist(collection) + } + fn allowed(collection: CollectionId, user: CrossAccountId) -> bool { + >::allowed(collection, user) } fn last_token_id(collection: CollectionId) -> TokenId { dispatch_nft_runtime!(collection.last_token_id()) } + fn collection_by_id(collection: CollectionId) -> Option> { + >::get(collection) + } + fn collection_stats() -> CollectionStats { + >::collection_stats() + } } impl sp_api::Core for Runtime { --- a/tests/src/addCollectionAdmin.test.ts +++ b/tests/src/addCollectionAdmin.test.ts @@ -8,7 +8,7 @@ import chaiAsPromised from 'chai-as-promised'; import privateKey from './substrate/privateKey'; import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api'; -import {addCollectionAdminExpectSuccess, createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId} from './util/helpers'; +import {addCollectionAdminExpectSuccess, createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId, queryCollectionExpectSuccess} from './util/helpers'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -20,7 +20,7 @@ const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.equal(alice.address); const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address)); @@ -38,7 +38,7 @@ const bob = privateKey('//Bob'); const charlie = privateKey('//CHARLIE'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.equal(alice.address); const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address)); --- a/tests/src/addToAllowList.test.ts +++ b/tests/src/addToAllowList.test.ts @@ -18,6 +18,7 @@ normalizeAccountId, addCollectionAdminExpectSuccess, addToAllowListExpectFail, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -55,7 +56,7 @@ it('Allow list an address in the collection that does not exist', async () => { await usingApi(async (api) => { // tslint:disable-next-line: no-bitwise - const collectionId = ((await api.query.common.createdCollectionCount()).toNumber()) + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; const bob = privateKey('//Bob'); const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(bob.address)); --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -18,6 +18,7 @@ transferExpectSuccess, addCollectionAdminExpectSuccess, adminApproveFromExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -94,13 +95,13 @@ it('Approve for a collection that does not exist', async () => { await usingApi(async (api: ApiPromise) => { // nft - const nftCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const nftCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(nftCollectionCount + 1, 1, alice, bob); // fungible - const fungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const fungibleCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob); // reFungible - const reFungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const reFungibleCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(reFungibleCollectionCount + 1, 1, alice, bob); }); }); --- a/tests/src/change-collection-owner.test.ts +++ b/tests/src/change-collection-owner.test.ts @@ -22,6 +22,7 @@ setMintPermissionExpectFailure, destroyCollectionExpectFailure, setPublicAccessModeExpectSuccess, + queryCollectionExpectSuccess, } from './util/helpers'; chai.use(chaiAsPromised); @@ -34,13 +35,13 @@ const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection =await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); await submitTransactionAsync(alice, changeOwnerTx); - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address); }); }); @@ -53,7 +54,7 @@ const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); @@ -62,7 +63,7 @@ const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address); await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected; - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address); }); }); @@ -74,13 +75,13 @@ const bob = privateKey('//Bob'); const charlie = privateKey('//Charlie'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); await submitTransactionAsync(alice, changeOwnerTx); - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address); // After changing the owner of the collection, all privileged methods are available to the new owner @@ -118,20 +119,20 @@ const bob = privateKey('//Bob'); const charlie = privateKey('//Charlie'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); await submitTransactionAsync(alice, changeOwnerTx); - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address); const changeOwnerTx2 = api.tx.nft.changeCollectionOwner(collectionId, charlie.address); await submitTransactionAsync(bob, changeOwnerTx2); // ownership lost - const collectionAfterOwnerChange2 = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange2 = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange2.owner.toString()).to.be.deep.eq(charlie.address); }); }); @@ -147,7 +148,7 @@ const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected; - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(alice.address); // Verifying that nothing bad happened (network is live, new collections can be created, etc.) @@ -166,7 +167,7 @@ const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected; - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(alice.address); // Verifying that nothing bad happened (network is live, new collections can be created, etc.) @@ -195,7 +196,7 @@ const bob = privateKey('//Bob'); const charlie = privateKey('//Charlie'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address); @@ -204,7 +205,7 @@ const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address); await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected; - const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap(); + const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId); expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address); await setCollectionSponsorExpectFailure(collectionId, charlie.address, '//Alice'); --- a/tests/src/confirmSponsorship.test.ts +++ b/tests/src/confirmSponsorship.test.ts @@ -20,6 +20,7 @@ addToAllowListExpectSuccess, normalizeAccountId, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; import {Keyring} from '@polkadot/api'; import {IKeyringPair} from '@polkadot/types/types'; @@ -335,7 +336,7 @@ // Find the collection that never existed let collectionId = 0; await usingApi(async (api) => { - collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + collectionId = await getCreatedCollectionCount(api) + 1; }); await confirmSponsorshipExpectFailure(collectionId, '//Bob'); --- a/tests/src/contracts.test.ts +++ b/tests/src/contracts.test.ts @@ -228,7 +228,7 @@ const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, contract.address); await submitTransactionAsync(alice, changeAdminTx); - expect(await isAllowlisted(collectionId, bob.address)).to.be.false; + expect(await isAllowlisted(api, collectionId, bob.address)).to.be.false; { const transferTx = contract.tx.toggleAllowList(value, gasLimit, collectionId, bob.address, true); @@ -236,7 +236,7 @@ const result = getGenericResult(events); expect(result.success).to.be.true; - expect(await isAllowlisted(collectionId, bob.address)).to.be.true; + expect(await isAllowlisted(api, collectionId, bob.address)).to.be.true; } { const transferTx = contract.tx.toggleAllowList(value, gasLimit, collectionId, bob.address, false); @@ -244,7 +244,7 @@ const result = getGenericResult(events); expect(result.success).to.be.true; - expect(await isAllowlisted(collectionId, bob.address)).to.be.false; + expect(await isAllowlisted(api, collectionId, bob.address)).to.be.false; } }); }); --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -20,6 +20,7 @@ getLastTokenId, getVariableMetadata, getConstMetadata, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -273,7 +274,7 @@ it('Create token in not existing collection', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; const createMultipleItemsTx = api.tx.nft .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT']); await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; --- a/tests/src/destroyCollection.test.ts +++ b/tests/src/destroyCollection.test.ts @@ -13,6 +13,7 @@ destroyCollectionExpectFailure, setCollectionLimitsExpectSuccess, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -46,7 +47,7 @@ it('(!negative test!) Destroy a collection that never existed', async () => { await usingApi(async (api) => { // Find the collection that never existed - const collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; await destroyCollectionExpectFailure(collectionId); }); }); --- a/tests/src/interfaces/augment-api-rpc.ts +++ b/tests/src/interfaces/augment-api-rpc.ts @@ -1,7 +1,7 @@ // Auto-generated via `yarn polkadot-types-from-chain`, do not edit /* eslint-disable */ -import type { NftDataStructsCollectionId, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr } from './nft'; +import type { NftDataStructsCollection, NftDataStructsCollectionId, NftDataStructsCollectionStats, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr } from './nft'; import type { Bytes, HashMap, Json, Metadata, Null, Option, StorageKey, Text, U256, U64, Vec, bool, u128, u32, u64 } from '@polkadot/types'; import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author'; import type { EpochAuthorship } from '@polkadot/types/interfaces/babe'; @@ -373,6 +373,10 @@ **/ allowance: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, sender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable>; /** + * Check if user is allowed to use collection + **/ + allowed: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable>; + /** * Get allowlist **/ allowlist: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable>>; @@ -381,6 +385,14 @@ **/ balance: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable>; /** + * Get collection by specified id + **/ + collectionById: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable>>; + /** + * Get collection stats + **/ + collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable>; + /** * Get tokens contained in collection **/ collectionTokens: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable>>; --- a/tests/src/interfaces/augment-types.ts +++ b/tests/src/interfaces/augment-types.ts @@ -2,7 +2,7 @@ /* eslint-disable */ import type { EthereumBlock, EthereumLog, EthereumReceipt, EthereumTransactionLegacyTransaction, EvmCoreErrorExitReason, FpRpcTransactionStatus } from './ethereum'; -import type { NftDataStructsAccessMode, NftDataStructsCollection, NftDataStructsCollectionId, NftDataStructsCollectionLimits, NftDataStructsCollectionMode, NftDataStructsCreateItemData, NftDataStructsMetaUpdatePermission, NftDataStructsSchemaVersion, NftDataStructsSponsorshipState, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, PalletUnqSchedulerCallSpec, PalletUnqSchedulerReleases, PalletUnqSchedulerScheduledV2 } from './nft'; +import type { NftDataStructsAccessMode, NftDataStructsCollection, NftDataStructsCollectionId, NftDataStructsCollectionLimits, NftDataStructsCollectionMode, NftDataStructsCollectionStats, NftDataStructsCreateItemData, NftDataStructsMetaUpdatePermission, NftDataStructsSchemaVersion, NftDataStructsSponsorshipState, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, PalletUnqSchedulerCallSpec, PalletUnqSchedulerReleases, PalletUnqSchedulerScheduledV2 } from './nft'; import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundStatus, CumulusPalletXcmpQueueOutboundStatus, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData } from './polkadot'; import type { BitVec, Bool, Bytes, Data, I128, I16, I256, I32, I64, I8, Json, Null, Raw, StorageKey, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types'; import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets'; @@ -627,6 +627,7 @@ NftDataStructsCollectionId: NftDataStructsCollectionId; NftDataStructsCollectionLimits: NftDataStructsCollectionLimits; NftDataStructsCollectionMode: NftDataStructsCollectionMode; + NftDataStructsCollectionStats: NftDataStructsCollectionStats; NftDataStructsCreateItemData: NftDataStructsCreateItemData; NftDataStructsMetaUpdatePermission: NftDataStructsMetaUpdatePermission; NftDataStructsSchemaVersion: NftDataStructsSchemaVersion; --- a/tests/src/interfaces/nft/definitions.ts +++ b/tests/src/interfaces/nft/definitions.ts @@ -40,6 +40,9 @@ constMetadata: fun('Get token constant metadata', [collectionParam, tokenParam], 'Vec'), variableMetadata: fun('Get token variable metadata', [collectionParam, tokenParam], 'Vec'), tokenExists: fun('Check if token exists', [collectionParam, tokenParam], 'bool'), + collectionById: fun('Get collection by specified id', [collectionParam], 'Option'), + collectionStats: fun('Get collection stats', [], 'NftDataStructsCollectionStats'), + allowed: fun('Check if user is allowed to use collection', [collectionParam, crossAccountParam()], 'bool'), }, types: { PalletCommonAccountBasicCrossAccountIdRepr: { @@ -64,6 +67,11 @@ constOnChainSchema: 'Vec', metaUpdatePermission: 'NftDataStructsMetaUpdatePermission', }, + NftDataStructsCollectionStats: { + created: 'u32', + destroyed: 'u32', + alive: 'u32', + }, NftDataStructsCollectionId: 'u32', NftDataStructsTokenId: 'u32', PalletNonfungibleItemData: mkDummy('NftItemData'), --- a/tests/src/interfaces/nft/types.ts +++ b/tests/src/interfaces/nft/types.ts @@ -48,6 +48,13 @@ readonly dummyCollectionMode: u32; } +/** @name NftDataStructsCollectionStats */ +export interface NftDataStructsCollectionStats extends Struct { + readonly created: u32; + readonly destroyed: u32; + readonly alive: u32; +} + /** @name NftDataStructsCreateItemData */ export interface NftDataStructsCreateItemData extends Struct { readonly dummyCreateItemData: u32; --- a/tests/src/removeCollectionAdmin.test.ts +++ b/tests/src/removeCollectionAdmin.test.ts @@ -8,7 +8,7 @@ import chaiAsPromised from 'chai-as-promised'; import privateKey from './substrate/privateKey'; import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api'; -import {createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId} from './util/helpers'; +import {createCollectionExpectSuccess, destroyCollectionExpectSuccess, getAdminList, normalizeAccountId, queryCollectionExpectSuccess} from './util/helpers'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -19,7 +19,7 @@ const collectionId = await createCollectionExpectSuccess(); const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.deep.eq(alice.address); // first - add collection admin Bob const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address)); @@ -43,7 +43,7 @@ const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); const charlie = privateKey('//Charlie'); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); // first - add collection admin Bob const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address)); --- a/tests/src/removeCollectionSponsor.test.ts +++ b/tests/src/removeCollectionSponsor.test.ts @@ -18,6 +18,7 @@ removeCollectionSponsorExpectFailure, normalizeAccountId, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; import {Keyring} from '@polkadot/api'; import {IKeyringPair} from '@polkadot/types/types'; @@ -98,7 +99,7 @@ // Find the collection that never existed let collectionId = 0; await usingApi(async (api) => { - collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + collectionId = await getCreatedCollectionCount(api) + 1; }); await removeCollectionSponsorExpectFailure(collectionId); --- a/tests/src/removeFromAllowList.test.ts +++ b/tests/src/removeFromAllowList.test.ts @@ -37,13 +37,13 @@ }); it('ensure bob is not in allowlist after removal', async () => { - await usingApi(async () => { + await usingApi(async api => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await enableAllowListExpectSuccess(alice, collectionId); await addToAllowListExpectSuccess(alice, collectionId, bob.address); await removeFromAllowListExpectSuccess(alice, collectionId, normalizeAccountId(bob.address)); - expect(await isAllowlisted(collectionId, bob.address)).to.be.false; + expect(await isAllowlisted(api, collectionId, bob.address)).to.be.false; }); }); @@ -104,13 +104,13 @@ }); it('ensure address is not in allowlist after removal', async () => { - await usingApi(async () => { + await usingApi(async api => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await enableAllowListExpectSuccess(alice, collectionId); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); await addToAllowListExpectSuccess(alice, collectionId, charlie.address); await removeFromAllowListExpectSuccess(bob, collectionId, normalizeAccountId(charlie.address)); - expect(await isAllowlisted(collectionId, charlie.address)).to.be.false; + expect(await isAllowlisted(api, collectionId, charlie.address)).to.be.false; }); }); --- a/tests/src/setCollectionSponsor.test.ts +++ b/tests/src/setCollectionSponsor.test.ts @@ -11,6 +11,7 @@ destroyCollectionExpectSuccess, setCollectionSponsorExpectFailure, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; import {Keyring} from '@polkadot/api'; import {IKeyringPair} from '@polkadot/types/types'; @@ -77,7 +78,7 @@ // Find the collection that never existed let collectionId = 0; await usingApi(async (api) => { - collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + collectionId = await getCreatedCollectionCount(api) + 1; }); await setCollectionSponsorExpectFailure(collectionId, bob.address); --- a/tests/src/setConstOnChainSchema.test.ts +++ b/tests/src/setConstOnChainSchema.test.ts @@ -12,6 +12,8 @@ createCollectionExpectSuccess, destroyCollectionExpectSuccess, addCollectionAdminExpectSuccess, + queryCollectionExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -37,7 +39,7 @@ it('Run extrinsic with parameters of the collection id, set the scheme', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema); await submitTransactionAsync(alice, setShema); @@ -47,7 +49,7 @@ it('Collection admin can set the scheme', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema); @@ -60,7 +62,7 @@ const collectionId = await createCollectionExpectSuccess(); const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema); await submitTransactionAsync(alice, setShema); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.constOnChainSchema.toString()).to.be.eq(shema); }); }); @@ -71,7 +73,7 @@ it('Set a non-existent collection', async () => { await usingApi(async (api) => { // tslint:disable-next-line: radix - const collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema); await expect(submitTransactionExpectFailAsync(alice, setShema)).to.be.rejected; }); @@ -97,7 +99,7 @@ it('Execute method not on behalf of the collection owner', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema); await expect(submitTransactionExpectFailAsync(bob, setShema)).to.be.rejected; --- a/tests/src/setPublicAccessMode.test.ts +++ b/tests/src/setPublicAccessMode.test.ts @@ -19,6 +19,7 @@ enableAllowListExpectSuccess, normalizeAccountId, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -60,7 +61,7 @@ it('Set a non-existent collection', async () => { await usingApi(async (api: ApiPromise) => { // tslint:disable-next-line: radix - const collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; const tx = api.tx.nft.setPublicAccessMode(collectionId, 'AllowList'); await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected; }); --- a/tests/src/setVariableOnChainSchema.test.ts +++ b/tests/src/setVariableOnChainSchema.test.ts @@ -12,6 +12,8 @@ createCollectionExpectSuccess, destroyCollectionExpectSuccess, addCollectionAdminExpectSuccess, + queryCollectionExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -37,7 +39,7 @@ it('Run extrinsic with parameters of the collection id, set the scheme', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); await submitTransactionAsync(alice, setSchema); @@ -49,7 +51,7 @@ const collectionId = await createCollectionExpectSuccess(); const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); await submitTransactionAsync(alice, setSchema); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.variableOnChainSchema.toString()).to.be.eq(schema); }); @@ -61,7 +63,7 @@ it('Run extrinsic with parameters of the collection id, set the scheme', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); @@ -75,7 +77,7 @@ await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); await submitTransactionAsync(bob, setSchema); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.variableOnChainSchema.toString()).to.be.eq(schema); }); @@ -87,7 +89,7 @@ it('Set a non-existent collection', async () => { await usingApi(async (api) => { // tslint:disable-next-line: radix - const collectionId = (await api.query.common.createdCollectionCount()).toNumber() + 1; + const collectionId = await getCreatedCollectionCount(api) + 1; const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected; }); @@ -113,7 +115,7 @@ it('Execute method not on behalf of the collection owner', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess(); - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.owner.toString()).to.be.eq(alice.address); const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema); await expect(submitTransactionExpectFailAsync(bob, setSchema)).to.be.rejected; --- a/tests/src/transfer.test.ts +++ b/tests/src/transfer.test.ts @@ -19,6 +19,7 @@ transferExpectFailure, transferExpectSuccess, addCollectionAdminExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; let alice: IKeyringPair; @@ -132,13 +133,13 @@ it('Transfer with not existed collection_id', async () => { await usingApi(async (api) => { // nft - const nftCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const nftCollectionCount = await getCreatedCollectionCount(api); await transferExpectFailure(nftCollectionCount + 1, 1, alice, bob, 1); // fungible - const fungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const fungibleCollectionCount = await getCreatedCollectionCount(api); await transferExpectFailure(fungibleCollectionCount + 1, 0, alice, bob, 1); // reFungible - const reFungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const reFungibleCollectionCount = await getCreatedCollectionCount(api); await transferExpectFailure(reFungibleCollectionCount + 1, 1, alice, bob, 1); }); }); --- a/tests/src/transferFrom.test.ts +++ b/tests/src/transferFrom.test.ts @@ -19,6 +19,7 @@ transferFromExpectSuccess, burnItemExpectSuccess, setCollectionLimitsExpectSuccess, + getCreatedCollectionCount, } from './util/helpers'; chai.use(chaiAsPromised); @@ -109,18 +110,18 @@ it('transferFrom for a collection that does not exist', async () => { await usingApi(async (api: ApiPromise) => { // nft - const nftCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const nftCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(nftCollectionCount + 1, 1, alice, bob); await transferFromExpectFail(nftCollectionCount + 1, 1, bob, alice, charlie, 1); // fungible - const fungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const fungibleCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob); await transferFromExpectFail(fungibleCollectionCount + 1, 0, bob, alice, charlie, 1); // reFungible - const reFungibleCollectionCount = (await api.query.common.createdCollectionCount()).toNumber(); + const reFungibleCollectionCount = await getCreatedCollectionCount(api); await approveExpectFail(reFungibleCollectionCount + 1, 1, alice, bob); await transferFromExpectFail(reFungibleCollectionCount + 1, 1, bob, alice, charlie, 1); --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -269,7 +269,7 @@ let collectionId = 0; await usingApi(async (api) => { // Get number of collections before the transaction - const collectionCountBefore = (await api.query.common.createdCollectionCount()).toNumber(); + const collectionCountBefore = await getCreatedCollectionCount(api); // Run the CreateCollection transaction const alicePrivateKey = privateKey('//Alice'); @@ -288,10 +288,10 @@ const result = getCreateCollectionResult(events); // Get number of collections after the transaction - const collectionCountAfter = (await api.query.common.createdCollectionCount()).toNumber(); + const collectionCountAfter = await getCreatedCollectionCount(api); // Get the collection - const collection = (await api.query.common.collectionById(result.collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, result.collectionId); // What to expect // tslint:disable-next-line:no-unused-expression @@ -325,7 +325,7 @@ await usingApi(async (api) => { // Get number of collections before the transaction - const collectionCountBefore = (await api.query.common.createdCollectionCount()).toNumber(); + const collectionCountBefore = await getCreatedCollectionCount(api); // Run the CreateCollection transaction const alicePrivateKey = privateKey('//Alice'); @@ -334,7 +334,7 @@ const result = getCreateCollectionResult(events); // Get number of collections after the transaction - const collectionCountAfter = (await api.query.common.createdCollectionCount()).toNumber(); + const collectionCountAfter = await getCreatedCollectionCount(api); // What to expect // tslint:disable-next-line:no-unused-expression @@ -364,7 +364,7 @@ } export async function findNotExistingCollection(api: ApiPromise): Promise { - const totalNumber = (await api.query.common.createdCollectionCount()).toNumber(); + const totalNumber = await getCreatedCollectionCount(api); const newCollection: number = totalNumber + 1; return newCollection; } @@ -398,7 +398,7 @@ expect(result).to.be.true; // What to expect - expect((await api.query.common.collectionById(collectionId)).isNone).to.be.true; + expect(await getDetailedCollectionInfo(api, collectionId)).to.be.null; }); } @@ -432,7 +432,7 @@ const result = getGenericResult(events); // Get the collection - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); // What to expect expect(result.success).to.be.true; @@ -452,7 +452,7 @@ const result = getGenericResult(events); // Get the collection - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); // What to expect expect(result.success).to.be.true; @@ -490,7 +490,7 @@ const result = getGenericResult(events); // Get the collection - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); // What to expect expect(result.success).to.be.true; @@ -1057,7 +1057,7 @@ const result = getGenericResult(events); // Get the collection - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); // What to expect // tslint:disable-next-line:no-unused-expression @@ -1105,7 +1105,7 @@ expect(result.success).to.be.true; // Get the collection - const collection = (await api.query.common.collectionById(collectionId)).unwrap(); + const collection = await queryCollectionExpectSuccess(api, collectionId); expect(collection.mintMode.toHuman()).to.be.equal(enabled); }); @@ -1137,15 +1137,13 @@ }); } -export async function isAllowlisted(collectionId: number, address: string | CrossAccountId) { - return await usingApi(async (api) => { - return (await api.query.common.allowlist(collectionId, normalizeAccountId(address))).toJSON(); - }); +export async function isAllowlisted(api: ApiPromise, collectionId: number, address: string | CrossAccountId) { + return (await api.rpc.nft.allowed(collectionId, normalizeAccountId(address))).toJSON(); } export async function addToAllowListExpectSuccess(sender: IKeyringPair, collectionId: number, address: string | AccountId | CrossAccountId) { await usingApi(async (api) => { - expect(await isAllowlisted(collectionId, normalizeAccountId(address))).to.be.false; + expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.false; // Run the transaction const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(address)); @@ -1153,14 +1151,14 @@ const result = getGenericResult(events); expect(result.success).to.be.true; - expect(await isAllowlisted(collectionId, normalizeAccountId(address))).to.be.true; + expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.true; }); } export async function addToAllowListAgainExpectSuccess(sender: IKeyringPair, collectionId: number, address: string | AccountId) { await usingApi(async (api) => { - expect(await isAllowlisted(collectionId, normalizeAccountId(address))).to.be.true; + expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.true; // Run the transaction const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(address)); @@ -1168,7 +1166,7 @@ const result = getGenericResult(events); expect(result.success).to.be.true; - expect(await isAllowlisted(collectionId, normalizeAccountId(address))).to.be.true; + expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.true; }); } @@ -1214,16 +1212,16 @@ export const getDetailedCollectionInfo = async (api: ApiPromise, collectionId: number) : Promise => { - return (await api.query.common.collectionById(collectionId)).unwrapOr(null); + return (await api.rpc.nft.collectionById(collectionId)).unwrapOr(null); }; export const getCreatedCollectionCount = async (api: ApiPromise): Promise => { // set global object - collectionsCount - return (await api.query.common.createdCollectionCount()).toNumber(); + return (await api.rpc.nft.collectionStats()).created.toNumber(); }; export async function queryCollectionExpectSuccess(api: ApiPromise, collectionId: number): Promise { - return (await api.query.common.collectionById(collectionId)).unwrap(); + return (await api.rpc.nft.collectionById(collectionId)).unwrap(); } export async function waitNewBlocks(blocksCount = 1): Promise {