From 3528861548084094412141913c4cd1b57d60705c Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 22 Oct 2021 07:03:37 +0000 Subject: [PATCH] feat(rpc): adminlist/allowlist/last_token_id calls --- --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -1,5 +1,6 @@ use std::sync::Arc; +use codec::Decode; use jsonrpc_core::{Error as RpcError, ErrorCode, Result}; use jsonrpc_derive::rpc; use nft_data_structs::{CollectionId, TokenId}; @@ -72,6 +73,13 @@ token: TokenId, at: Option, ) -> Result; + + #[rpc(name = "nft_adminlist")] + fn adminlist(&self, collection: CollectionId, at: Option) -> Result>; + #[rpc(name = "nft_allowlist")] + fn allowlist(&self, collection: CollectionId, at: Option) -> Result>; + #[rpc(name = "nft_lastTokenId")] + fn last_token_id(&self, collection: CollectionId, at: Option) -> Result; } pub struct Nft { @@ -125,6 +133,7 @@ for Nft where Block: BlockT, + AccountId: Decode, C: 'static + ProvideRuntimeApi + HeaderBackend, C::Api: NftRuntimeApi, CrossAccountId: pallet_common::account::CrossAccountId, @@ -138,4 +147,8 @@ pass_method!(account_balance(collection: CollectionId, account: CrossAccountId) -> u32); pass_method!(balance(collection: CollectionId, account: CrossAccountId, token: TokenId) -> u128); pass_method!(allowance(collection: CollectionId, sender: CrossAccountId, spender: CrossAccountId, token: TokenId) -> u128); + + pass_method!(adminlist(collection: CollectionId) -> Vec); + pass_method!(allowlist(collection: CollectionId) -> Vec); + pass_method!(last_token_id(collection: CollectionId) -> TokenId); } --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -109,12 +109,12 @@ pub fn ignores_owned_amount(&self, user: &T::CrossAccountId) -> Result { Ok(self.limits.owner_can_transfer && self.is_owner_or_admin(user)?) } - pub fn check_whitelist(&self, user: &T::CrossAccountId) -> DispatchResult { + pub fn check_allowlist(&self, user: &T::CrossAccountId) -> DispatchResult { self.consume_sload()?; ensure!( - >::get((self.id, user.as_sub())), - >::AddressNotInWhiteList + >::get((self.id, user.as_sub())), + >::AddressNotInAllowlist ); Ok(()) } @@ -252,7 +252,7 @@ /// Collection is not in mint mode. PublicMintingNotAllowed, /// Address is not in white list. - AddressNotInWhiteList, + AddressNotInAllowlist, /// Collection name can not be longer than 63 char. CollectionNameLimitExceeded, @@ -315,9 +315,9 @@ QueryKind = ValueQuery, >; - /// Whitelisted collection users + /// Allowlisted collection users #[pallet::storage] - pub type WhiteList = StorageNMap< + pub type Allowlist = StorageNMap< Key = ( Key, Key, @@ -398,6 +398,7 @@ >::insert(id, data); Ok(id) } + pub fn destroy_collection( collection: CollectionHandle, sender: &T::CrossAccountId, @@ -417,11 +418,11 @@ >::put(destroyed_collections); >::remove(collection.id); >::remove_prefix((collection.id,), None); - >::remove_prefix((collection.id,), None); + >::remove_prefix((collection.id,), None); Ok(()) } - pub fn toggle_whitelist( + pub fn toggle_allowlist( collection: &CollectionHandle, sender: &T::CrossAccountId, user: &T::CrossAccountId, @@ -432,9 +433,9 @@ // ========= if allowed { - >::insert((collection.id, user.as_sub()), true); + >::insert((collection.id, user.as_sub()), true); } else { - >::remove((collection.id, user.as_sub())); + >::remove((collection.id, user.as_sub())); } Ok(()) @@ -511,6 +512,7 @@ fn account_tokens(&self, account: T::CrossAccountId) -> Vec; fn token_exists(&self, token: TokenId) -> bool; + fn last_token_id(&self) -> TokenId; fn token_owner(&self, token: TokenId) -> T::CrossAccountId; fn const_metadata(&self, token: TokenId) -> Vec; --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -177,6 +177,10 @@ token == TokenId::default() } + fn last_token_id(&self) -> TokenId { + TokenId::default() + } + fn token_owner(&self, _token: TokenId) -> T::CrossAccountId { T::CrossAccountId::default() } --- a/pallets/fungible/src/lib.rs +++ b/pallets/fungible/src/lib.rs @@ -123,7 +123,7 @@ .ok_or(>::TokenValueTooLow)?; if collection.access == AccessMode::WhiteList { - collection.check_whitelist(owner)?; + collection.check_allowlist(owner)?; } // ========= @@ -161,8 +161,8 @@ ); if collection.access == AccessMode::WhiteList { - collection.check_whitelist(from)?; - collection.check_whitelist(to)?; + collection.check_allowlist(from)?; + collection.check_allowlist(to)?; } >::ensure_correct_receiver(to)?; @@ -222,10 +222,10 @@ collection.mint_mode, >::PublicMintingNotAllowed ); - collection.check_whitelist(sender)?; + collection.check_allowlist(sender)?; for (owner, _) in data.iter() { - collection.check_whitelist(owner)?; + collection.check_allowlist(owner)?; } } @@ -305,8 +305,8 @@ amount: u128, ) -> DispatchResult { if collection.access == AccessMode::WhiteList { - collection.check_whitelist(&owner)?; - collection.check_whitelist(&spender)?; + collection.check_allowlist(&owner)?; + collection.check_allowlist(&spender)?; } if >::get((collection.id, owner.as_sub())) < amount { @@ -334,7 +334,7 @@ } if collection.access == AccessMode::WhiteList { // `from`, `to` checked in [`transfer`] - collection.check_whitelist(spender)?; + collection.check_allowlist(spender)?; } let allowance = >::get((collection.id, from.as_sub(), spender.as_sub())) --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -41,7 +41,7 @@ }; use pallet_common::{ account::CrossAccountId, CollectionHandle, IsAdmin, Pallet as PalletCommon, - Error as CommonError, CommonWeightInfo, + Error as CommonError, CommonWeightInfo, Allowlist, }; use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle}; use pallet_fungible::{Pallet as PalletFungible, FungibleHandle}; @@ -311,7 +311,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let collection = >::try_get(collection_id)?; - >::toggle_whitelist( + >::toggle_allowlist( &collection, &sender, &address, @@ -340,7 +340,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let collection = >::try_get(collection_id)?; - >::toggle_whitelist( + >::toggle_allowlist( &collection, &sender, &address, @@ -923,3 +923,17 @@ } } } + +// 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/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -185,6 +185,10 @@ >::token_exists(self, token) } + fn last_token_id(&self) -> TokenId { + TokenId(>::get(self.id)) + } + fn token_owner(&self, token: TokenId) -> T::CrossAccountId { >::get((self.id, token)) } --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -198,7 +198,7 @@ ); if collection.access == AccessMode::WhiteList { - collection.check_whitelist(sender)?; + collection.check_allowlist(sender)?; } let burnt = >::get(collection.id) @@ -246,8 +246,8 @@ ); if collection.access == AccessMode::WhiteList { - collection.check_whitelist(from)?; - collection.check_whitelist(to)?; + collection.check_allowlist(from)?; + collection.check_allowlist(to)?; } >::ensure_correct_receiver(to)?; @@ -314,10 +314,10 @@ collection.mint_mode, >::PublicMintingNotAllowed ); - collection.check_whitelist(sender)?; + collection.check_allowlist(sender)?; for item in data.iter() { - collection.check_whitelist(&item.owner)?; + collection.check_allowlist(&item.owner)?; } } @@ -453,9 +453,9 @@ spender: Option<&T::CrossAccountId>, ) -> DispatchResult { if collection.access == AccessMode::WhiteList { - collection.check_whitelist(&sender)?; + collection.check_allowlist(&sender)?; if let Some(spender) = spender { - collection.check_whitelist(&spender)?; + collection.check_allowlist(&spender)?; } } @@ -488,7 +488,7 @@ } if collection.access == AccessMode::WhiteList { // `from`, `to` checked in [`transfer`] - collection.check_whitelist(spender)?; + collection.check_allowlist(spender)?; } if >::get((collection.id, token)).as_ref() != Some(spender) { --- a/pallets/refungible/src/lib.rs +++ b/pallets/refungible/src/lib.rs @@ -268,8 +268,8 @@ ); if collection.access == AccessMode::WhiteList { - collection.check_whitelist(from)?; - collection.check_whitelist(to)?; + collection.check_allowlist(from)?; + collection.check_allowlist(to)?; } >::ensure_correct_receiver(to)?; @@ -361,11 +361,11 @@ collection.mint_mode, >::PublicMintingNotAllowed ); - collection.check_whitelist(sender)?; + collection.check_allowlist(sender)?; for item in data.iter() { for (user, _) in &item.users { - collection.check_whitelist(&user)?; + collection.check_allowlist(&user)?; } } } @@ -485,8 +485,8 @@ amount: u128, ) -> DispatchResult { if collection.access == AccessMode::WhiteList { - collection.check_whitelist(&sender)?; - collection.check_whitelist(&spender)?; + collection.check_allowlist(&sender)?; + collection.check_allowlist(&spender)?; } >::ensure_correct_receiver(spender)?; @@ -517,7 +517,7 @@ } if collection.access == AccessMode::WhiteList { // `from`, `to` checked in [`transfer`] - collection.check_whitelist(spender)?; + collection.check_allowlist(spender)?; } let allowance = >::get((collection.id, token, from.as_sub(), &spender)) --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -3,9 +3,11 @@ use nft_data_structs::{CollectionId, TokenId}; use sp_std::vec::Vec; use sp_core::H160; +use codec::Decode; sp_api::decl_runtime_apis! { pub trait NftApi where + AccountId: Decode, CrossAccountId: pallet_common::account::CrossAccountId, { fn account_tokens(collection: CollectionId, account: CrossAccountId) -> Vec; @@ -27,5 +29,9 @@ /// Used for ethereum integration fn eth_contract_code(account: H160) -> Option>; + + fn adminlist(collection: CollectionId) -> Vec; + fn allowlist(collection: CollectionId) -> Vec; + fn last_token_id(collection: CollectionId) -> TokenId; } } --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -972,6 +972,15 @@ fn eth_contract_code(account: H160) -> Option> { >::get_code(&account) } + fn adminlist(collection: CollectionId) -> Vec { + >::adminlist(collection) + } + fn allowlist(collection: CollectionId) -> Vec { + >::allowlist(collection) + } + fn last_token_id(collection: CollectionId) -> TokenId { + dispatch_nft_runtime!(collection.last_token_id()) + } } impl sp_api::Core for Runtime { -- gitstuff