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

difftreelog

initial commit

PraetorP2022-07-11parent: #5ffdcf0.patch.diff
in: master

14 files changed

modifiedclient/rpc/src/lib.rsdiffbeforeafterboth
--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -70,6 +70,15 @@
 		token: TokenId,
 		at: Option<BlockHash>,
 	) -> Result<Option<CrossAccountId>>;
+
+	#[method(name = "unique_tokenOwners")]
+	fn token_owners(
+		&self,
+		collection: CollectionId,
+		token: TokenId,
+		at: Option<BlockHash>,
+	) -> Result<Vec<CrossAccountId>>;
+
 	#[method(name = "unique_topmostTokenOwner")]
 	fn topmost_token_owner(
 		&self,
@@ -473,6 +482,7 @@
 	pass_method!(next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Option<u64>, unique_api);
 	pass_method!(effective_collection_limits(collection_id: CollectionId) -> Option<CollectionLimits>, unique_api);
 	pass_method!(total_pieces(collection_id: CollectionId, token_id: TokenId) -> Option<u128>, unique_api);
+	pass_method!(token_owners(collection: CollectionId, token: TokenId) -> Vec<CrossAccountId>, unique_api);
 }
 
 #[allow(deprecated)]
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -1748,6 +1748,9 @@
 	/// * `token` - The token for which you need to find out the owner.
 	fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId>;
 
+	/// Token owners
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId>;
+
 	/// Get the value of the token property by key.
 	///
 	/// * `token` - Token with the property to get.
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -362,6 +362,10 @@
 		None
 	}
 
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		<Pallet<T>>::token_owners(self.id, token).unwrap_or_else(|| vec![])
+	}
+
 	fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
 		None
 	}
modifiedpallets/fungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -95,7 +95,7 @@
 use pallet_evm_coder_substrate::WithRecorder;
 use sp_core::H160;
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
-use sp_std::{collections::btree_map::BTreeMap};
+use sp_std::{collections::btree_map::BTreeMap, vec::Vec};
 
 pub use pallet::*;
 
@@ -613,4 +613,20 @@
 			nesting_budget,
 		)
 	}
+
+	pub fn token_owners(
+		collection: CollectionId,
+		_token: TokenId,
+	) -> Option<Vec<T::CrossAccountId>> {
+		let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection,))
+			.map(|r| r.0)
+			.take(10)
+			.collect();
+
+		if res.len() == 0 {
+			None
+		} else {
+			Some(res)
+		}
+	}
 }
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -26,7 +26,7 @@
 	weights::WeightInfo as _,
 };
 use sp_runtime::DispatchError;
-use sp_std::vec::Vec;
+use sp_std::{vec::Vec, vec};
 
 use crate::{
 	AccountBalance, Allowance, Config, CreateItemData, Error, NonfungibleHandle, Owned, Pallet,
@@ -422,6 +422,10 @@
 		<TokenData<T>>::get((self.id, token)).map(|t| t.owner)
 	}
 
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		self.token_owner(token).map_or_else(|| vec![], |t| vec![t])
+	}
+
 	fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue> {
 		<Pallet<T>>::token_properties((self.id, token_id))
 			.get(key)
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -438,6 +438,10 @@
 		<Pallet<T>>::token_owner(self.id, token)
 	}
 
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		<Pallet<T>>::token_owners(self.id, token).unwrap_or_else(|| vec![])
+	}
+
 	fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
 		None
 	}
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -1134,4 +1134,20 @@
 	) -> DispatchResult {
 		<PalletCommon<T>>::set_token_property_permissions(collection, sender, property_permissions)
 	}
+	
+	pub fn token_owners(
+		collection_id: CollectionId,
+		token: TokenId,
+	) -> Option<Vec<T::CrossAccountId>> {
+		let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection_id, token))
+			.map(|r| r.0)
+			.take(10)
+			.collect();
+
+		if res.len() == 0 {
+			None
+		} else {
+			Some(res)
+		}
+	}
 }
modifiedprimitives/rpc/src/lib.rsdiffbeforeafterboth
--- a/primitives/rpc/src/lib.rs
+++ b/primitives/rpc/src/lib.rs
@@ -81,5 +81,6 @@
 		fn next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Result<Option<u64>>;
 		fn effective_collection_limits(collection_id: CollectionId) -> Result<Option<CollectionLimits>>;
 		fn total_pieces(collection_id: CollectionId, token_id: TokenId) -> Result<Option<u128>>;
+		fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec::<CrossAccountId>>;
 	}
 }
modifiedruntime/common/src/runtime_apis.rsdiffbeforeafterboth
--- a/runtime/common/src/runtime_apis.rs
+++ b/runtime/common/src/runtime_apis.rs
@@ -40,6 +40,11 @@
                 fn token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
                     dispatch_unique_runtime!(collection.token_owner(token))
                 }
+
+                fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec::<CrossAccountId>, DispatchError>  {
+                   dispatch_unique_runtime!(collection.token_owners(token))
+                }
+
                 fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
                     let budget = up_data_structs::budget::Value::new(10);
 
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -80,6 +80,7 @@
     "testLimits": "mocha --timeout 9999999 -r ts-node/register ./**/limits.test.ts",
     "testEthCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/eth/createCollection.test.ts",
     "testRFT": "mocha --timeout 9999999 -r ts-node/register ./**/refungible.test.ts",
+    "testRPC": "mocha --timeout 9999999 -r ts-node/register ./**/rpc.test.ts",
     "polkadot-types-fetch-metadata": "curl -H 'Content-Type: application/json' -d '{\"id\":\"1\", \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\", \"params\":[]}' http://localhost:9933 > src/interfaces/metadata.json",
     "polkadot-types-from-defs": "ts-node ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .",
     "polkadot-types-from-chain": "ts-node ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .",
modifiedtests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth
before · tests/src/interfaces/augment-api-rpc.ts
1// Auto-generated via `yarn polkadot-types-from-chain`, do not edit2/* eslint-disable */34import type { PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsPartPartType, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData } from './default';5import type { AugmentedRpc } from '@polkadot/rpc-core/types';6import type { Metadata, StorageKey } from '@polkadot/types';7import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, u128, u32, u64 } from '@polkadot/types-codec';8import type { AnyNumber, Codec } from '@polkadot/types-codec/types';9import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';10import type { EpochAuthorship } from '@polkadot/types/interfaces/babe';11import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy';12import type { BlockHash } from '@polkadot/types/interfaces/chain';13import type { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate';14import type { AuthorityId } from '@polkadot/types/interfaces/consensus';15import type { CodeUploadRequest, CodeUploadResult, ContractCallRequest, ContractExecResult, ContractInstantiateResult, InstantiateRequest } from '@polkadot/types/interfaces/contracts';16import type { BlockStats } from '@polkadot/types/interfaces/dev';17import type { CreatedBlock } from '@polkadot/types/interfaces/engine';18import type { EthAccount, EthCallRequest, EthFilter, EthFilterChanges, EthLog, EthReceipt, EthRichBlock, EthSubKind, EthSubParams, EthSyncStatus, EthTransaction, EthTransactionRequest, EthWork } from '@polkadot/types/interfaces/eth';19import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics';20import type { EncodedFinalityProofs, JustificationNotification, ReportedRoundStates } from '@polkadot/types/interfaces/grandpa';21import type { MmrLeafBatchProof, MmrLeafProof } from '@polkadot/types/interfaces/mmr';22import type { StorageKind } from '@polkadot/types/interfaces/offchain';23import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment';24import type { RpcMethods } from '@polkadot/types/interfaces/rpc';25import type { AccountId, AccountId32, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime';26import type { MigrationStatusResult, ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state';27import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system';28import type { IExtrinsic, Observable } from '@polkadot/types/types';2930declare module '@polkadot/rpc-core/types/jsonrpc' {31  export interface RpcInterface {32    author: {33      /**34       * Returns true if the keystore has private keys for the given public key and key type.35       **/36      hasKey: AugmentedRpc<(publicKey: Bytes | string | Uint8Array, keyType: Text | string) => Observable<bool>>;37      /**38       * Returns true if the keystore has private keys for the given session public keys.39       **/40      hasSessionKeys: AugmentedRpc<(sessionKeys: Bytes | string | Uint8Array) => Observable<bool>>;41      /**42       * Insert a key into the keystore.43       **/44      insertKey: AugmentedRpc<(keyType: Text | string, suri: Text | string, publicKey: Bytes | string | Uint8Array) => Observable<Bytes>>;45      /**46       * Returns all pending extrinsics, potentially grouped by sender47       **/48      pendingExtrinsics: AugmentedRpc<() => Observable<Vec<Extrinsic>>>;49      /**50       * Remove given extrinsic from the pool and temporarily ban it to prevent reimporting51       **/52      removeExtrinsic: AugmentedRpc<(bytesOrHash: Vec<ExtrinsicOrHash> | (ExtrinsicOrHash | { Hash: any } | { Extrinsic: any } | string | Uint8Array)[]) => Observable<Vec<Hash>>>;53      /**54       * Generate new session keys and returns the corresponding public keys55       **/56      rotateKeys: AugmentedRpc<() => Observable<Bytes>>;57      /**58       * Submit and subscribe to watch an extrinsic until unsubscribed59       **/60      submitAndWatchExtrinsic: AugmentedRpc<(extrinsic: IExtrinsic) => Observable<ExtrinsicStatus>>;61      /**62       * Submit a fully formatted extrinsic for block inclusion63       **/64      submitExtrinsic: AugmentedRpc<(extrinsic: IExtrinsic) => Observable<Hash>>;65    };66    babe: {67      /**68       * Returns data about which slots (primary or secondary) can be claimed in the current epoch with the keys in the keystore69       **/70      epochAuthorship: AugmentedRpc<() => Observable<HashMap<AuthorityId, EpochAuthorship>>>;71    };72    beefy: {73      /**74       * Returns hash of the latest BEEFY finalized block as seen by this client.75       **/76      getFinalizedHead: AugmentedRpc<() => Observable<H256>>;77      /**78       * Returns the block most recently finalized by BEEFY, alongside side its justification.79       **/80      subscribeJustifications: AugmentedRpc<() => Observable<BeefySignedCommitment>>;81    };82    chain: {83      /**84       * Get header and body of a relay chain block85       **/86      getBlock: AugmentedRpc<(hash?: BlockHash | string | Uint8Array) => Observable<SignedBlock>>;87      /**88       * Get the block hash for a specific block89       **/90      getBlockHash: AugmentedRpc<(blockNumber?: BlockNumber | AnyNumber | Uint8Array) => Observable<BlockHash>>;91      /**92       * Get hash of the last finalized block in the canon chain93       **/94      getFinalizedHead: AugmentedRpc<() => Observable<BlockHash>>;95      /**96       * Retrieves the header for a specific block97       **/98      getHeader: AugmentedRpc<(hash?: BlockHash | string | Uint8Array) => Observable<Header>>;99      /**100       * Retrieves the newest header via subscription101       **/102      subscribeAllHeads: AugmentedRpc<() => Observable<Header>>;103      /**104       * Retrieves the best finalized header via subscription105       **/106      subscribeFinalizedHeads: AugmentedRpc<() => Observable<Header>>;107      /**108       * Retrieves the best header via subscription109       **/110      subscribeNewHeads: AugmentedRpc<() => Observable<Header>>;111    };112    childstate: {113      /**114       * Returns the keys with prefix from a child storage, leave empty to get all the keys115       **/116      getKeys: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, prefix: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Vec<StorageKey>>>;117      /**118       * Returns the keys with prefix from a child storage with pagination support119       **/120      getKeysPaged: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, prefix: StorageKey | string | Uint8Array | any, count: u32 | AnyNumber | Uint8Array, startKey?: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Vec<StorageKey>>>;121      /**122       * Returns a child storage entry at a specific block state123       **/124      getStorage: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<StorageData>>>;125      /**126       * Returns child storage entries for multiple keys at a specific block state127       **/128      getStorageEntries: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: Hash | string | Uint8Array) => Observable<Vec<Option<StorageData>>>>;129      /**130       * Returns the hash of a child storage entry at a block state131       **/132      getStorageHash: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<Hash>>>;133      /**134       * Returns the size of a child storage entry at a block state135       **/136      getStorageSize: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<u64>>>;137    };138    contracts: {139      /**140       * Executes a call to a contract141       **/142      call: AugmentedRpc<(callRequest: ContractCallRequest | { origin?: any; dest?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; inputData?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractExecResult>>;143      /**144       * Returns the value under a specified storage key in a contract145       **/146      getStorage: AugmentedRpc<(address: AccountId | string | Uint8Array, key: H256 | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<Bytes>>>;147      /**148       * Instantiate a new contract149       **/150      instantiate: AugmentedRpc<(request: InstantiateRequest | { origin?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; code?: any; data?: any; salt?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractInstantiateResult>>;151      /**152       * Returns the projected time a given contract will be able to sustain paying its rent153       **/154      rentProjection: AugmentedRpc<(address: AccountId | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<BlockNumber>>>;155      /**156       * Upload new code without instantiating a contract from it157       **/158      uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<CodeUploadResult>>;159    };160    dev: {161      /**162       * Reexecute the specified `block_hash` and gather statistics while doing so163       **/164      getBlockStats: AugmentedRpc<(at: Hash | string | Uint8Array) => Observable<Option<BlockStats>>>;165    };166    engine: {167      /**168       * Instructs the manual-seal authorship task to create a new block169       **/170      createBlock: AugmentedRpc<(createEmpty: bool | boolean | Uint8Array, finalize: bool | boolean | Uint8Array, parentHash?: BlockHash | string | Uint8Array) => Observable<CreatedBlock>>;171      /**172       * Instructs the manual-seal authorship task to finalize a block173       **/174      finalizeBlock: AugmentedRpc<(hash: BlockHash | string | Uint8Array, justification?: Justification) => Observable<bool>>;175    };176    eth: {177      /**178       * Returns accounts list.179       **/180      accounts: AugmentedRpc<() => Observable<Vec<H160>>>;181      /**182       * Returns the blockNumber183       **/184      blockNumber: AugmentedRpc<() => Observable<U256>>;185      /**186       * Call contract, returning the output data.187       **/188      call: AugmentedRpc<(request: EthCallRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<Bytes>>;189      /**190       * Returns the chain ID used for transaction signing at the current best block. None is returned if not available.191       **/192      chainId: AugmentedRpc<() => Observable<U64>>;193      /**194       * Returns block author.195       **/196      coinbase: AugmentedRpc<() => Observable<H160>>;197      /**198       * Estimate gas needed for execution of given contract.199       **/200      estimateGas: AugmentedRpc<(request: EthCallRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;201      /**202       * Returns current gas price.203       **/204      gasPrice: AugmentedRpc<() => Observable<U256>>;205      /**206       * Returns balance of the given account.207       **/208      getBalance: AugmentedRpc<(address: H160 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;209      /**210       * Returns block with given hash.211       **/212      getBlockByHash: AugmentedRpc<(hash: H256 | string | Uint8Array, full: bool | boolean | Uint8Array) => Observable<Option<EthRichBlock>>>;213      /**214       * Returns block with given number.215       **/216      getBlockByNumber: AugmentedRpc<(block: BlockNumber | AnyNumber | Uint8Array, full: bool | boolean | Uint8Array) => Observable<Option<EthRichBlock>>>;217      /**218       * Returns the number of transactions in a block with given hash.219       **/220      getBlockTransactionCountByHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<U256>>;221      /**222       * Returns the number of transactions in a block with given block number.223       **/224      getBlockTransactionCountByNumber: AugmentedRpc<(block: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;225      /**226       * Returns the code at given address at given time (block number).227       **/228      getCode: AugmentedRpc<(address: H160 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<Bytes>>;229      /**230       * Returns filter changes since last poll.231       **/232      getFilterChanges: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<EthFilterChanges>>;233      /**234       * Returns all logs matching given filter (in a range 'from' - 'to').235       **/236      getFilterLogs: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<Vec<EthLog>>>;237      /**238       * Returns logs matching given filter object.239       **/240      getLogs: AugmentedRpc<(filter: EthFilter | { fromBlock?: any; toBlock?: any; blockHash?: any; address?: any; topics?: any } | string | Uint8Array) => Observable<Vec<EthLog>>>;241      /**242       * Returns proof for account and storage.243       **/244      getProof: AugmentedRpc<(address: H160 | string | Uint8Array, storageKeys: Vec<H256> | (H256 | string | Uint8Array)[], number: BlockNumber | AnyNumber | Uint8Array) => Observable<EthAccount>>;245      /**246       * Returns content of the storage at given address.247       **/248      getStorageAt: AugmentedRpc<(address: H160 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<H256>>;249      /**250       * Returns transaction at given block hash and index.251       **/252      getTransactionByBlockHashAndIndex: AugmentedRpc<(hash: H256 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthTransaction>>;253      /**254       * Returns transaction by given block number and index.255       **/256      getTransactionByBlockNumberAndIndex: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthTransaction>>;257      /**258       * Get transaction by its hash.259       **/260      getTransactionByHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<EthTransaction>>;261      /**262       * Returns the number of transactions sent from given address at given time (block number).263       **/264      getTransactionCount: AugmentedRpc<(hash: H256 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;265      /**266       * Returns transaction receipt by transaction hash.267       **/268      getTransactionReceipt: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<EthReceipt>>;269      /**270       * Returns an uncles at given block and index.271       **/272      getUncleByBlockHashAndIndex: AugmentedRpc<(hash: H256 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthRichBlock>>;273      /**274       * Returns an uncles at given block and index.275       **/276      getUncleByBlockNumberAndIndex: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthRichBlock>>;277      /**278       * Returns the number of uncles in a block with given hash.279       **/280      getUncleCountByBlockHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<U256>>;281      /**282       * Returns the number of uncles in a block with given block number.283       **/284      getUncleCountByBlockNumber: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;285      /**286       * Returns the hash of the current block, the seedHash, and the boundary condition to be met.287       **/288      getWork: AugmentedRpc<() => Observable<EthWork>>;289      /**290       * Returns the number of hashes per second that the node is mining with.291       **/292      hashrate: AugmentedRpc<() => Observable<U256>>;293      /**294       * Returns true if client is actively mining new blocks.295       **/296      mining: AugmentedRpc<() => Observable<bool>>;297      /**298       * Returns id of new block filter.299       **/300      newBlockFilter: AugmentedRpc<() => Observable<U256>>;301      /**302       * Returns id of new filter.303       **/304      newFilter: AugmentedRpc<(filter: EthFilter | { fromBlock?: any; toBlock?: any; blockHash?: any; address?: any; topics?: any } | string | Uint8Array) => Observable<U256>>;305      /**306       * Returns id of new block filter.307       **/308      newPendingTransactionFilter: AugmentedRpc<() => Observable<U256>>;309      /**310       * Returns protocol version encoded as a string (quotes are necessary).311       **/312      protocolVersion: AugmentedRpc<() => Observable<u64>>;313      /**314       * Sends signed transaction, returning its hash.315       **/316      sendRawTransaction: AugmentedRpc<(bytes: Bytes | string | Uint8Array) => Observable<H256>>;317      /**318       * Sends transaction; will block waiting for signer to return the transaction hash319       **/320      sendTransaction: AugmentedRpc<(tx: EthTransactionRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array) => Observable<H256>>;321      /**322       * Used for submitting mining hashrate.323       **/324      submitHashrate: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array, hash: H256 | string | Uint8Array) => Observable<bool>>;325      /**326       * Used for submitting a proof-of-work solution.327       **/328      submitWork: AugmentedRpc<(nonce: H64 | string | Uint8Array, headerHash: H256 | string | Uint8Array, mixDigest: H256 | string | Uint8Array) => Observable<bool>>;329      /**330       * Subscribe to Eth subscription.331       **/332      subscribe: AugmentedRpc<(kind: EthSubKind | 'newHeads' | 'logs' | 'newPendingTransactions' | 'syncing' | number | Uint8Array, params?: EthSubParams | { None: any } | { Logs: any } | string | Uint8Array) => Observable<Null>>;333      /**334       * Returns an object with data about the sync status or false.335       **/336      syncing: AugmentedRpc<() => Observable<EthSyncStatus>>;337      /**338       * Uninstalls filter.339       **/340      uninstallFilter: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<bool>>;341    };342    grandpa: {343      /**344       * Prove finality for the given block number, returning the Justification for the last block in the set.345       **/346      proveFinality: AugmentedRpc<(blockNumber: BlockNumber | AnyNumber | Uint8Array) => Observable<Option<EncodedFinalityProofs>>>;347      /**348       * Returns the state of the current best round state as well as the ongoing background rounds349       **/350      roundState: AugmentedRpc<() => Observable<ReportedRoundStates>>;351      /**352       * Subscribes to grandpa justifications353       **/354      subscribeJustifications: AugmentedRpc<() => Observable<JustificationNotification>>;355    };356    mmr: {357      /**358       * Generate MMR proof for the given leaf indices.359       **/360      generateBatchProof: AugmentedRpc<(leafIndices: Vec<u64> | (u64 | AnyNumber | Uint8Array)[], at?: BlockHash | string | Uint8Array) => Observable<MmrLeafProof>>;361      /**362       * Generate MMR proof for given leaf index.363       **/364      generateProof: AugmentedRpc<(leafIndex: u64 | AnyNumber | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<MmrLeafBatchProof>>;365    };366    net: {367      /**368       * Returns true if client is actively listening for network connections. Otherwise false.369       **/370      listening: AugmentedRpc<() => Observable<bool>>;371      /**372       * Returns number of peers connected to node.373       **/374      peerCount: AugmentedRpc<() => Observable<Text>>;375      /**376       * Returns protocol version.377       **/378      version: AugmentedRpc<() => Observable<Text>>;379    };380    offchain: {381      /**382       * Get offchain local storage under given key and prefix383       **/384      localStorageGet: AugmentedRpc<(kind: StorageKind | 'PERSISTENT' | 'LOCAL' | number | Uint8Array, key: Bytes | string | Uint8Array) => Observable<Option<Bytes>>>;385      /**386       * Set offchain local storage under given key and prefix387       **/388      localStorageSet: AugmentedRpc<(kind: StorageKind | 'PERSISTENT' | 'LOCAL' | number | Uint8Array, key: Bytes | string | Uint8Array, value: Bytes | string | Uint8Array) => Observable<Null>>;389    };390    payment: {391      /**392       * Query the detailed fee of a given encoded extrinsic393       **/394      queryFeeDetails: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<FeeDetails>>;395      /**396       * Retrieves the fee information for an encoded extrinsic397       **/398      queryInfo: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<RuntimeDispatchInfo>>;399    };400    rmrk: {401      /**402       * Get tokens owned by an account in a collection403       **/404      accountTokens: AugmentedRpc<(accountId: AccountId32 | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;405      /**406       * Get base info407       **/408      base: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsBaseBaseInfo>>>;409      /**410       * Get all Base's parts411       **/412      baseParts: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPartPartType>>>;413      /**414       * Get collection by id415       **/416      collectionById: AugmentedRpc<(id: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsCollectionCollectionInfo>>>;417      /**418       * Get collection properties419       **/420      collectionProperties: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, filterKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPropertyPropertyInfo>>>;421      /**422       * Get the latest created collection id423       **/424      lastCollectionIdx: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<u32>>;425      /**426       * Get NFT by collection id and NFT id427       **/428      nftById: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsNftNftInfo>>>;429      /**430       * Get NFT children431       **/432      nftChildren: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsNftNftChild>>>;433      /**434       * Get NFT properties435       **/436      nftProperties: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, filterKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPropertyPropertyInfo>>>;437      /**438       * Get NFT resource priorities439       **/440      nftResourcePriority: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, resourceId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u32>>>;441      /**442       * Get NFT resources443       **/444      nftResources: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsResourceResourceInfo>>>;445      /**446       * Get Base's theme names447       **/448      themeNames: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<Bytes>>>;449      /**450       * Get Theme's keys values451       **/452      themes: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, themeName: Text | string, keys: Option<Vec<Text>> | null | object | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsTheme>>>;453    };454    rpc: {455      /**456       * Retrieves the list of RPC methods that are exposed by the node457       **/458      methods: AugmentedRpc<() => Observable<RpcMethods>>;459    };460    state: {461      /**462       * Perform a call to a builtin on the chain463       **/464      call: AugmentedRpc<(method: Text | string, data: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Bytes>>;465      /**466       * Retrieves the keys with prefix of a specific child storage467       **/468      getChildKeys: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;469      /**470       * Returns proof of storage for child key entries at a specific block state.471       **/472      getChildReadProof: AugmentedRpc<(childStorageKey: PrefixedStorageKey | string | Uint8Array, keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: BlockHash | string | Uint8Array) => Observable<ReadProof>>;473      /**474       * Retrieves the child storage for a key475       **/476      getChildStorage: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<StorageData>>;477      /**478       * Retrieves the child storage hash479       **/480      getChildStorageHash: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Hash>>;481      /**482       * Retrieves the child storage size483       **/484      getChildStorageSize: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<u64>>;485      /**486       * Retrieves the keys with a certain prefix487       **/488      getKeys: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;489      /**490       * Returns the keys with prefix with pagination support.491       **/492      getKeysPaged: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, count: u32 | AnyNumber | Uint8Array, startKey?: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;493      /**494       * Returns the runtime metadata495       **/496      getMetadata: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<Metadata>>;497      /**498       * Returns the keys with prefix, leave empty to get all the keys (deprecated: Use getKeysPaged)499       **/500      getPairs: AugmentedRpc<(prefix: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<KeyValue>>>;501      /**502       * Returns proof of storage entries at a specific block state503       **/504      getReadProof: AugmentedRpc<(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: BlockHash | string | Uint8Array) => Observable<ReadProof>>;505      /**506       * Get the runtime version507       **/508      getRuntimeVersion: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<RuntimeVersion>>;509      /**510       * Retrieves the storage for a key511       **/512      getStorage: AugmentedRpc<<T = Codec>(key: StorageKey | string | Uint8Array | any, block?: Hash | Uint8Array | string) => Observable<T>>;513      /**514       * Retrieves the storage hash515       **/516      getStorageHash: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Hash>>;517      /**518       * Retrieves the storage size519       **/520      getStorageSize: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<u64>>;521      /**522       * Query historical storage entries (by key) starting from a start block523       **/524      queryStorage: AugmentedRpc<<T = Codec[]>(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], fromBlock?: Hash | Uint8Array | string, toBlock?: Hash | Uint8Array | string) => Observable<[Hash, T][]>>;525      /**526       * Query storage entries (by key) starting at block hash given as the second parameter527       **/528      queryStorageAt: AugmentedRpc<<T = Codec[]>(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: Hash | Uint8Array | string) => Observable<T>>;529      /**530       * Retrieves the runtime version via subscription531       **/532      subscribeRuntimeVersion: AugmentedRpc<() => Observable<RuntimeVersion>>;533      /**534       * Subscribes to storage changes for the provided keys535       **/536      subscribeStorage: AugmentedRpc<<T = Codec[]>(keys?: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[]) => Observable<T>>;537      /**538       * Provides a way to trace the re-execution of a single block539       **/540      traceBlock: AugmentedRpc<(block: Hash | string | Uint8Array, targets: Option<Text> | null | object | string | Uint8Array, storageKeys: Option<Text> | null | object | string | Uint8Array, methods: Option<Text> | null | object | string | Uint8Array) => Observable<TraceBlockResponse>>;541      /**542       * Check current migration state543       **/544      trieMigrationStatus: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<MigrationStatusResult>>;545    };546    syncstate: {547      /**548       * Returns the json-serialized chainspec running the node, with a sync state.549       **/550      genSyncSpec: AugmentedRpc<(raw: bool | boolean | Uint8Array) => Observable<Json>>;551    };552    system: {553      /**554       * Retrieves the next accountIndex as available on the node555       **/556      accountNextIndex: AugmentedRpc<(accountId: AccountId | string | Uint8Array) => Observable<Index>>;557      /**558       * Adds the supplied directives to the current log filter559       **/560      addLogFilter: AugmentedRpc<(directives: Text | string) => Observable<Null>>;561      /**562       * Adds a reserved peer563       **/564      addReservedPeer: AugmentedRpc<(peer: Text | string) => Observable<Text>>;565      /**566       * Retrieves the chain567       **/568      chain: AugmentedRpc<() => Observable<Text>>;569      /**570       * Retrieves the chain type571       **/572      chainType: AugmentedRpc<() => Observable<ChainType>>;573      /**574       * Dry run an extrinsic at a given block575       **/576      dryRun: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ApplyExtrinsicResult>>;577      /**578       * Return health status of the node579       **/580      health: AugmentedRpc<() => Observable<Health>>;581      /**582       * The addresses include a trailing /p2p/ with the local PeerId, and are thus suitable to be passed to addReservedPeer or as a bootnode address for example583       **/584      localListenAddresses: AugmentedRpc<() => Observable<Vec<Text>>>;585      /**586       * Returns the base58-encoded PeerId of the node587       **/588      localPeerId: AugmentedRpc<() => Observable<Text>>;589      /**590       * Retrieves the node name591       **/592      name: AugmentedRpc<() => Observable<Text>>;593      /**594       * Returns current state of the network595       **/596      networkState: AugmentedRpc<() => Observable<NetworkState>>;597      /**598       * Returns the roles the node is running as599       **/600      nodeRoles: AugmentedRpc<() => Observable<Vec<NodeRole>>>;601      /**602       * Returns the currently connected peers603       **/604      peers: AugmentedRpc<() => Observable<Vec<PeerInfo>>>;605      /**606       * Get a custom set of properties as a JSON object, defined in the chain spec607       **/608      properties: AugmentedRpc<() => Observable<ChainProperties>>;609      /**610       * Remove a reserved peer611       **/612      removeReservedPeer: AugmentedRpc<(peerId: Text | string) => Observable<Text>>;613      /**614       * Returns the list of reserved peers615       **/616      reservedPeers: AugmentedRpc<() => Observable<Vec<Text>>>;617      /**618       * Resets the log filter to Substrate defaults619       **/620      resetLogFilter: AugmentedRpc<() => Observable<Null>>;621      /**622       * Returns the state of the syncing of the node623       **/624      syncState: AugmentedRpc<() => Observable<SyncState>>;625      /**626       * Retrieves the version of the node627       **/628      version: AugmentedRpc<() => Observable<Text>>;629    };630    unique: {631      /**632       * Get amount of different user tokens633       **/634      accountBalance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;635      /**636       * Get tokens owned by account637       **/638      accountTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;639      /**640       * Get admin list641       **/642      adminlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;643      /**644       * Get allowed amount645       **/646      allowance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, sender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;647      /**648       * Check if user is allowed to use collection649       **/650      allowed: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;651      /**652       * Get allowlist653       **/654      allowlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;655      /**656       * Get amount of specific account token657       **/658      balance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;659      /**660       * Get collection by specified id661       **/662      collectionById: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsRpcCollection>>>;663      /**664       * Get collection properties665       **/666      collectionProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;667      /**668       * Get collection stats669       **/670      collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<UpDataStructsCollectionStats>>;671      /**672       * Get tokens contained in collection673       **/674      collectionTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;675      /**676       * Get token constant metadata677       **/678      constMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;679      /**680       * Get effective collection limits681       **/682      effectiveCollectionLimits: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollectionLimits>>>;683      /**684       * Get last token id685       **/686      lastTokenId: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;687      /**688       * Get number of blocks when sponsored transaction is available689       **/690      nextSponsored: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u64>>>;691      /**692       * Get property permissions693       **/694      propertyPermissions: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsPropertyKeyPermission>>>;695      /**696       * Get tokens nested directly into the token697       **/698      tokenChildren: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsTokenChild>>>;699      /**700       * Get token data701       **/702      tokenData: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<UpDataStructsTokenData>>;703      /**704       * Check if token exists705       **/706      tokenExists: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;707      /**708       * Get token owner709       **/710      tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;711      /**712       * Get token properties713       **/714      tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;715      /**716       * Get token owner, in case of nested token - find parent recursive717       **/718      topmostTokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;719      /**720       * Get total pieces of token721       **/722      totalPieces: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u128>>>;723      /**724       * Get amount of unique collection tokens725       **/726      totalSupply: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;727      /**728       * Get token variable metadata729       **/730      variableMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;731    };732    web3: {733      /**734       * Returns current client version.735       **/736      clientVersion: AugmentedRpc<() => Observable<Text>>;737      /**738       * Returns sha3 of the given data739       **/740      sha3: AugmentedRpc<(data: Bytes | string | Uint8Array) => Observable<H256>>;741    };742  } // RpcInterface743} // declare module
after · tests/src/interfaces/augment-api-rpc.ts
1// Auto-generated via `yarn polkadot-types-from-chain`, do not edit2/* eslint-disable */34import type { PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsPartPartType, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData } from './default';5import type { AugmentedRpc } from '@polkadot/rpc-core/types';6import type { Metadata, StorageKey } from '@polkadot/types';7import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, u128, u32, u64 } from '@polkadot/types-codec';8import type { AnyNumber, Codec } from '@polkadot/types-codec/types';9import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';10import type { EpochAuthorship } from '@polkadot/types/interfaces/babe';11import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy';12import type { BlockHash } from '@polkadot/types/interfaces/chain';13import type { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate';14import type { AuthorityId } from '@polkadot/types/interfaces/consensus';15import type { CodeUploadRequest, CodeUploadResult, ContractCallRequest, ContractExecResult, ContractInstantiateResult, InstantiateRequest } from '@polkadot/types/interfaces/contracts';16import type { BlockStats } from '@polkadot/types/interfaces/dev';17import type { CreatedBlock } from '@polkadot/types/interfaces/engine';18import type { EthAccount, EthCallRequest, EthFilter, EthFilterChanges, EthLog, EthReceipt, EthRichBlock, EthSubKind, EthSubParams, EthSyncStatus, EthTransaction, EthTransactionRequest, EthWork } from '@polkadot/types/interfaces/eth';19import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics';20import type { EncodedFinalityProofs, JustificationNotification, ReportedRoundStates } from '@polkadot/types/interfaces/grandpa';21import type { MmrLeafBatchProof, MmrLeafProof } from '@polkadot/types/interfaces/mmr';22import type { StorageKind } from '@polkadot/types/interfaces/offchain';23import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment';24import type { RpcMethods } from '@polkadot/types/interfaces/rpc';25import type { AccountId, AccountId32, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime';26import type { MigrationStatusResult, ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state';27import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system';28import type { IExtrinsic, Observable } from '@polkadot/types/types';2930declare module '@polkadot/rpc-core/types/jsonrpc' {31  export interface RpcInterface {32    author: {33      /**34       * Returns true if the keystore has private keys for the given public key and key type.35       **/36      hasKey: AugmentedRpc<(publicKey: Bytes | string | Uint8Array, keyType: Text | string) => Observable<bool>>;37      /**38       * Returns true if the keystore has private keys for the given session public keys.39       **/40      hasSessionKeys: AugmentedRpc<(sessionKeys: Bytes | string | Uint8Array) => Observable<bool>>;41      /**42       * Insert a key into the keystore.43       **/44      insertKey: AugmentedRpc<(keyType: Text | string, suri: Text | string, publicKey: Bytes | string | Uint8Array) => Observable<Bytes>>;45      /**46       * Returns all pending extrinsics, potentially grouped by sender47       **/48      pendingExtrinsics: AugmentedRpc<() => Observable<Vec<Extrinsic>>>;49      /**50       * Remove given extrinsic from the pool and temporarily ban it to prevent reimporting51       **/52      removeExtrinsic: AugmentedRpc<(bytesOrHash: Vec<ExtrinsicOrHash> | (ExtrinsicOrHash | { Hash: any } | { Extrinsic: any } | string | Uint8Array)[]) => Observable<Vec<Hash>>>;53      /**54       * Generate new session keys and returns the corresponding public keys55       **/56      rotateKeys: AugmentedRpc<() => Observable<Bytes>>;57      /**58       * Submit and subscribe to watch an extrinsic until unsubscribed59       **/60      submitAndWatchExtrinsic: AugmentedRpc<(extrinsic: IExtrinsic) => Observable<ExtrinsicStatus>>;61      /**62       * Submit a fully formatted extrinsic for block inclusion63       **/64      submitExtrinsic: AugmentedRpc<(extrinsic: IExtrinsic) => Observable<Hash>>;65    };66    babe: {67      /**68       * Returns data about which slots (primary or secondary) can be claimed in the current epoch with the keys in the keystore69       **/70      epochAuthorship: AugmentedRpc<() => Observable<HashMap<AuthorityId, EpochAuthorship>>>;71    };72    beefy: {73      /**74       * Returns hash of the latest BEEFY finalized block as seen by this client.75       **/76      getFinalizedHead: AugmentedRpc<() => Observable<H256>>;77      /**78       * Returns the block most recently finalized by BEEFY, alongside side its justification.79       **/80      subscribeJustifications: AugmentedRpc<() => Observable<BeefySignedCommitment>>;81    };82    chain: {83      /**84       * Get header and body of a relay chain block85       **/86      getBlock: AugmentedRpc<(hash?: BlockHash | string | Uint8Array) => Observable<SignedBlock>>;87      /**88       * Get the block hash for a specific block89       **/90      getBlockHash: AugmentedRpc<(blockNumber?: BlockNumber | AnyNumber | Uint8Array) => Observable<BlockHash>>;91      /**92       * Get hash of the last finalized block in the canon chain93       **/94      getFinalizedHead: AugmentedRpc<() => Observable<BlockHash>>;95      /**96       * Retrieves the header for a specific block97       **/98      getHeader: AugmentedRpc<(hash?: BlockHash | string | Uint8Array) => Observable<Header>>;99      /**100       * Retrieves the newest header via subscription101       **/102      subscribeAllHeads: AugmentedRpc<() => Observable<Header>>;103      /**104       * Retrieves the best finalized header via subscription105       **/106      subscribeFinalizedHeads: AugmentedRpc<() => Observable<Header>>;107      /**108       * Retrieves the best header via subscription109       **/110      subscribeNewHeads: AugmentedRpc<() => Observable<Header>>;111    };112    childstate: {113      /**114       * Returns the keys with prefix from a child storage, leave empty to get all the keys115       **/116      getKeys: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, prefix: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Vec<StorageKey>>>;117      /**118       * Returns the keys with prefix from a child storage with pagination support119       **/120      getKeysPaged: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, prefix: StorageKey | string | Uint8Array | any, count: u32 | AnyNumber | Uint8Array, startKey?: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Vec<StorageKey>>>;121      /**122       * Returns a child storage entry at a specific block state123       **/124      getStorage: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<StorageData>>>;125      /**126       * Returns child storage entries for multiple keys at a specific block state127       **/128      getStorageEntries: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: Hash | string | Uint8Array) => Observable<Vec<Option<StorageData>>>>;129      /**130       * Returns the hash of a child storage entry at a block state131       **/132      getStorageHash: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<Hash>>>;133      /**134       * Returns the size of a child storage entry at a block state135       **/136      getStorageSize: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<u64>>>;137    };138    contracts: {139      /**140       * Executes a call to a contract141       **/142      call: AugmentedRpc<(callRequest: ContractCallRequest | { origin?: any; dest?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; inputData?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractExecResult>>;143      /**144       * Returns the value under a specified storage key in a contract145       **/146      getStorage: AugmentedRpc<(address: AccountId | string | Uint8Array, key: H256 | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<Bytes>>>;147      /**148       * Instantiate a new contract149       **/150      instantiate: AugmentedRpc<(request: InstantiateRequest | { origin?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; code?: any; data?: any; salt?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractInstantiateResult>>;151      /**152       * Returns the projected time a given contract will be able to sustain paying its rent153       **/154      rentProjection: AugmentedRpc<(address: AccountId | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<BlockNumber>>>;155      /**156       * Upload new code without instantiating a contract from it157       **/158      uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<CodeUploadResult>>;159    };160    dev: {161      /**162       * Reexecute the specified `block_hash` and gather statistics while doing so163       **/164      getBlockStats: AugmentedRpc<(at: Hash | string | Uint8Array) => Observable<Option<BlockStats>>>;165    };166    engine: {167      /**168       * Instructs the manual-seal authorship task to create a new block169       **/170      createBlock: AugmentedRpc<(createEmpty: bool | boolean | Uint8Array, finalize: bool | boolean | Uint8Array, parentHash?: BlockHash | string | Uint8Array) => Observable<CreatedBlock>>;171      /**172       * Instructs the manual-seal authorship task to finalize a block173       **/174      finalizeBlock: AugmentedRpc<(hash: BlockHash | string | Uint8Array, justification?: Justification) => Observable<bool>>;175    };176    eth: {177      /**178       * Returns accounts list.179       **/180      accounts: AugmentedRpc<() => Observable<Vec<H160>>>;181      /**182       * Returns the blockNumber183       **/184      blockNumber: AugmentedRpc<() => Observable<U256>>;185      /**186       * Call contract, returning the output data.187       **/188      call: AugmentedRpc<(request: EthCallRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<Bytes>>;189      /**190       * Returns the chain ID used for transaction signing at the current best block. None is returned if not available.191       **/192      chainId: AugmentedRpc<() => Observable<U64>>;193      /**194       * Returns block author.195       **/196      coinbase: AugmentedRpc<() => Observable<H160>>;197      /**198       * Estimate gas needed for execution of given contract.199       **/200      estimateGas: AugmentedRpc<(request: EthCallRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;201      /**202       * Returns current gas price.203       **/204      gasPrice: AugmentedRpc<() => Observable<U256>>;205      /**206       * Returns balance of the given account.207       **/208      getBalance: AugmentedRpc<(address: H160 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;209      /**210       * Returns block with given hash.211       **/212      getBlockByHash: AugmentedRpc<(hash: H256 | string | Uint8Array, full: bool | boolean | Uint8Array) => Observable<Option<EthRichBlock>>>;213      /**214       * Returns block with given number.215       **/216      getBlockByNumber: AugmentedRpc<(block: BlockNumber | AnyNumber | Uint8Array, full: bool | boolean | Uint8Array) => Observable<Option<EthRichBlock>>>;217      /**218       * Returns the number of transactions in a block with given hash.219       **/220      getBlockTransactionCountByHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<U256>>;221      /**222       * Returns the number of transactions in a block with given block number.223       **/224      getBlockTransactionCountByNumber: AugmentedRpc<(block: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;225      /**226       * Returns the code at given address at given time (block number).227       **/228      getCode: AugmentedRpc<(address: H160 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<Bytes>>;229      /**230       * Returns filter changes since last poll.231       **/232      getFilterChanges: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<EthFilterChanges>>;233      /**234       * Returns all logs matching given filter (in a range 'from' - 'to').235       **/236      getFilterLogs: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<Vec<EthLog>>>;237      /**238       * Returns logs matching given filter object.239       **/240      getLogs: AugmentedRpc<(filter: EthFilter | { fromBlock?: any; toBlock?: any; blockHash?: any; address?: any; topics?: any } | string | Uint8Array) => Observable<Vec<EthLog>>>;241      /**242       * Returns proof for account and storage.243       **/244      getProof: AugmentedRpc<(address: H160 | string | Uint8Array, storageKeys: Vec<H256> | (H256 | string | Uint8Array)[], number: BlockNumber | AnyNumber | Uint8Array) => Observable<EthAccount>>;245      /**246       * Returns content of the storage at given address.247       **/248      getStorageAt: AugmentedRpc<(address: H160 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<H256>>;249      /**250       * Returns transaction at given block hash and index.251       **/252      getTransactionByBlockHashAndIndex: AugmentedRpc<(hash: H256 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthTransaction>>;253      /**254       * Returns transaction by given block number and index.255       **/256      getTransactionByBlockNumberAndIndex: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthTransaction>>;257      /**258       * Get transaction by its hash.259       **/260      getTransactionByHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<EthTransaction>>;261      /**262       * Returns the number of transactions sent from given address at given time (block number).263       **/264      getTransactionCount: AugmentedRpc<(hash: H256 | string | Uint8Array, number?: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;265      /**266       * Returns transaction receipt by transaction hash.267       **/268      getTransactionReceipt: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<EthReceipt>>;269      /**270       * Returns an uncles at given block and index.271       **/272      getUncleByBlockHashAndIndex: AugmentedRpc<(hash: H256 | string | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthRichBlock>>;273      /**274       * Returns an uncles at given block and index.275       **/276      getUncleByBlockNumberAndIndex: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array, index: U256 | AnyNumber | Uint8Array) => Observable<EthRichBlock>>;277      /**278       * Returns the number of uncles in a block with given hash.279       **/280      getUncleCountByBlockHash: AugmentedRpc<(hash: H256 | string | Uint8Array) => Observable<U256>>;281      /**282       * Returns the number of uncles in a block with given block number.283       **/284      getUncleCountByBlockNumber: AugmentedRpc<(number: BlockNumber | AnyNumber | Uint8Array) => Observable<U256>>;285      /**286       * Returns the hash of the current block, the seedHash, and the boundary condition to be met.287       **/288      getWork: AugmentedRpc<() => Observable<EthWork>>;289      /**290       * Returns the number of hashes per second that the node is mining with.291       **/292      hashrate: AugmentedRpc<() => Observable<U256>>;293      /**294       * Returns true if client is actively mining new blocks.295       **/296      mining: AugmentedRpc<() => Observable<bool>>;297      /**298       * Returns id of new block filter.299       **/300      newBlockFilter: AugmentedRpc<() => Observable<U256>>;301      /**302       * Returns id of new filter.303       **/304      newFilter: AugmentedRpc<(filter: EthFilter | { fromBlock?: any; toBlock?: any; blockHash?: any; address?: any; topics?: any } | string | Uint8Array) => Observable<U256>>;305      /**306       * Returns id of new block filter.307       **/308      newPendingTransactionFilter: AugmentedRpc<() => Observable<U256>>;309      /**310       * Returns protocol version encoded as a string (quotes are necessary).311       **/312      protocolVersion: AugmentedRpc<() => Observable<u64>>;313      /**314       * Sends signed transaction, returning its hash.315       **/316      sendRawTransaction: AugmentedRpc<(bytes: Bytes | string | Uint8Array) => Observable<H256>>;317      /**318       * Sends transaction; will block waiting for signer to return the transaction hash319       **/320      sendTransaction: AugmentedRpc<(tx: EthTransactionRequest | { from?: any; to?: any; gasPrice?: any; gas?: any; value?: any; data?: any; nonce?: any } | string | Uint8Array) => Observable<H256>>;321      /**322       * Used for submitting mining hashrate.323       **/324      submitHashrate: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array, hash: H256 | string | Uint8Array) => Observable<bool>>;325      /**326       * Used for submitting a proof-of-work solution.327       **/328      submitWork: AugmentedRpc<(nonce: H64 | string | Uint8Array, headerHash: H256 | string | Uint8Array, mixDigest: H256 | string | Uint8Array) => Observable<bool>>;329      /**330       * Subscribe to Eth subscription.331       **/332      subscribe: AugmentedRpc<(kind: EthSubKind | 'newHeads' | 'logs' | 'newPendingTransactions' | 'syncing' | number | Uint8Array, params?: EthSubParams | { None: any } | { Logs: any } | string | Uint8Array) => Observable<Null>>;333      /**334       * Returns an object with data about the sync status or false.335       **/336      syncing: AugmentedRpc<() => Observable<EthSyncStatus>>;337      /**338       * Uninstalls filter.339       **/340      uninstallFilter: AugmentedRpc<(index: U256 | AnyNumber | Uint8Array) => Observable<bool>>;341    };342    grandpa: {343      /**344       * Prove finality for the given block number, returning the Justification for the last block in the set.345       **/346      proveFinality: AugmentedRpc<(blockNumber: BlockNumber | AnyNumber | Uint8Array) => Observable<Option<EncodedFinalityProofs>>>;347      /**348       * Returns the state of the current best round state as well as the ongoing background rounds349       **/350      roundState: AugmentedRpc<() => Observable<ReportedRoundStates>>;351      /**352       * Subscribes to grandpa justifications353       **/354      subscribeJustifications: AugmentedRpc<() => Observable<JustificationNotification>>;355    };356    mmr: {357      /**358       * Generate MMR proof for the given leaf indices.359       **/360      generateBatchProof: AugmentedRpc<(leafIndices: Vec<u64> | (u64 | AnyNumber | Uint8Array)[], at?: BlockHash | string | Uint8Array) => Observable<MmrLeafProof>>;361      /**362       * Generate MMR proof for given leaf index.363       **/364      generateProof: AugmentedRpc<(leafIndex: u64 | AnyNumber | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<MmrLeafBatchProof>>;365    };366    net: {367      /**368       * Returns true if client is actively listening for network connections. Otherwise false.369       **/370      listening: AugmentedRpc<() => Observable<bool>>;371      /**372       * Returns number of peers connected to node.373       **/374      peerCount: AugmentedRpc<() => Observable<Text>>;375      /**376       * Returns protocol version.377       **/378      version: AugmentedRpc<() => Observable<Text>>;379    };380    offchain: {381      /**382       * Get offchain local storage under given key and prefix383       **/384      localStorageGet: AugmentedRpc<(kind: StorageKind | 'PERSISTENT' | 'LOCAL' | number | Uint8Array, key: Bytes | string | Uint8Array) => Observable<Option<Bytes>>>;385      /**386       * Set offchain local storage under given key and prefix387       **/388      localStorageSet: AugmentedRpc<(kind: StorageKind | 'PERSISTENT' | 'LOCAL' | number | Uint8Array, key: Bytes | string | Uint8Array, value: Bytes | string | Uint8Array) => Observable<Null>>;389    };390    payment: {391      /**392       * Query the detailed fee of a given encoded extrinsic393       **/394      queryFeeDetails: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<FeeDetails>>;395      /**396       * Retrieves the fee information for an encoded extrinsic397       **/398      queryInfo: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<RuntimeDispatchInfo>>;399    };400    rmrk: {401      /**402       * Get tokens owned by an account in a collection403       **/404      accountTokens: AugmentedRpc<(accountId: AccountId32 | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;405      /**406       * Get base info407       **/408      base: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsBaseBaseInfo>>>;409      /**410       * Get all Base's parts411       **/412      baseParts: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPartPartType>>>;413      /**414       * Get collection by id415       **/416      collectionById: AugmentedRpc<(id: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsCollectionCollectionInfo>>>;417      /**418       * Get collection properties419       **/420      collectionProperties: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, filterKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPropertyPropertyInfo>>>;421      /**422       * Get the latest created collection id423       **/424      lastCollectionIdx: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<u32>>;425      /**426       * Get NFT by collection id and NFT id427       **/428      nftById: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsNftNftInfo>>>;429      /**430       * Get NFT children431       **/432      nftChildren: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsNftNftChild>>>;433      /**434       * Get NFT properties435       **/436      nftProperties: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, filterKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsPropertyPropertyInfo>>>;437      /**438       * Get NFT resource priorities439       **/440      nftResourcePriority: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, resourceId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u32>>>;441      /**442       * Get NFT resources443       **/444      nftResources: AugmentedRpc<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<RmrkTraitsResourceResourceInfo>>>;445      /**446       * Get Base's theme names447       **/448      themeNames: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<Bytes>>>;449      /**450       * Get Theme's keys values451       **/452      themes: AugmentedRpc<(baseId: u32 | AnyNumber | Uint8Array, themeName: Text | string, keys: Option<Vec<Text>> | null | object | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<RmrkTraitsTheme>>>;453    };454    rpc: {455      /**456       * Retrieves the list of RPC methods that are exposed by the node457       **/458      methods: AugmentedRpc<() => Observable<RpcMethods>>;459    };460    state: {461      /**462       * Perform a call to a builtin on the chain463       **/464      call: AugmentedRpc<(method: Text | string, data: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Bytes>>;465      /**466       * Retrieves the keys with prefix of a specific child storage467       **/468      getChildKeys: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;469      /**470       * Returns proof of storage for child key entries at a specific block state.471       **/472      getChildReadProof: AugmentedRpc<(childStorageKey: PrefixedStorageKey | string | Uint8Array, keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: BlockHash | string | Uint8Array) => Observable<ReadProof>>;473      /**474       * Retrieves the child storage for a key475       **/476      getChildStorage: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<StorageData>>;477      /**478       * Retrieves the child storage hash479       **/480      getChildStorageHash: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Hash>>;481      /**482       * Retrieves the child storage size483       **/484      getChildStorageSize: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<u64>>;485      /**486       * Retrieves the keys with a certain prefix487       **/488      getKeys: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;489      /**490       * Returns the keys with prefix with pagination support.491       **/492      getKeysPaged: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, count: u32 | AnyNumber | Uint8Array, startKey?: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;493      /**494       * Returns the runtime metadata495       **/496      getMetadata: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<Metadata>>;497      /**498       * Returns the keys with prefix, leave empty to get all the keys (deprecated: Use getKeysPaged)499       **/500      getPairs: AugmentedRpc<(prefix: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<KeyValue>>>;501      /**502       * Returns proof of storage entries at a specific block state503       **/504      getReadProof: AugmentedRpc<(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: BlockHash | string | Uint8Array) => Observable<ReadProof>>;505      /**506       * Get the runtime version507       **/508      getRuntimeVersion: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<RuntimeVersion>>;509      /**510       * Retrieves the storage for a key511       **/512      getStorage: AugmentedRpc<<T = Codec>(key: StorageKey | string | Uint8Array | any, block?: Hash | Uint8Array | string) => Observable<T>>;513      /**514       * Retrieves the storage hash515       **/516      getStorageHash: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Hash>>;517      /**518       * Retrieves the storage size519       **/520      getStorageSize: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<u64>>;521      /**522       * Query historical storage entries (by key) starting from a start block523       **/524      queryStorage: AugmentedRpc<<T = Codec[]>(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], fromBlock?: Hash | Uint8Array | string, toBlock?: Hash | Uint8Array | string) => Observable<[Hash, T][]>>;525      /**526       * Query storage entries (by key) starting at block hash given as the second parameter527       **/528      queryStorageAt: AugmentedRpc<<T = Codec[]>(keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: Hash | Uint8Array | string) => Observable<T>>;529      /**530       * Retrieves the runtime version via subscription531       **/532      subscribeRuntimeVersion: AugmentedRpc<() => Observable<RuntimeVersion>>;533      /**534       * Subscribes to storage changes for the provided keys535       **/536      subscribeStorage: AugmentedRpc<<T = Codec[]>(keys?: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[]) => Observable<T>>;537      /**538       * Provides a way to trace the re-execution of a single block539       **/540      traceBlock: AugmentedRpc<(block: Hash | string | Uint8Array, targets: Option<Text> | null | object | string | Uint8Array, storageKeys: Option<Text> | null | object | string | Uint8Array, methods: Option<Text> | null | object | string | Uint8Array) => Observable<TraceBlockResponse>>;541      /**542       * Check current migration state543       **/544      trieMigrationStatus: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<MigrationStatusResult>>;545    };546    syncstate: {547      /**548       * Returns the json-serialized chainspec running the node, with a sync state.549       **/550      genSyncSpec: AugmentedRpc<(raw: bool | boolean | Uint8Array) => Observable<Json>>;551    };552    system: {553      /**554       * Retrieves the next accountIndex as available on the node555       **/556      accountNextIndex: AugmentedRpc<(accountId: AccountId | string | Uint8Array) => Observable<Index>>;557      /**558       * Adds the supplied directives to the current log filter559       **/560      addLogFilter: AugmentedRpc<(directives: Text | string) => Observable<Null>>;561      /**562       * Adds a reserved peer563       **/564      addReservedPeer: AugmentedRpc<(peer: Text | string) => Observable<Text>>;565      /**566       * Retrieves the chain567       **/568      chain: AugmentedRpc<() => Observable<Text>>;569      /**570       * Retrieves the chain type571       **/572      chainType: AugmentedRpc<() => Observable<ChainType>>;573      /**574       * Dry run an extrinsic at a given block575       **/576      dryRun: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ApplyExtrinsicResult>>;577      /**578       * Return health status of the node579       **/580      health: AugmentedRpc<() => Observable<Health>>;581      /**582       * The addresses include a trailing /p2p/ with the local PeerId, and are thus suitable to be passed to addReservedPeer or as a bootnode address for example583       **/584      localListenAddresses: AugmentedRpc<() => Observable<Vec<Text>>>;585      /**586       * Returns the base58-encoded PeerId of the node587       **/588      localPeerId: AugmentedRpc<() => Observable<Text>>;589      /**590       * Retrieves the node name591       **/592      name: AugmentedRpc<() => Observable<Text>>;593      /**594       * Returns current state of the network595       **/596      networkState: AugmentedRpc<() => Observable<NetworkState>>;597      /**598       * Returns the roles the node is running as599       **/600      nodeRoles: AugmentedRpc<() => Observable<Vec<NodeRole>>>;601      /**602       * Returns the currently connected peers603       **/604      peers: AugmentedRpc<() => Observable<Vec<PeerInfo>>>;605      /**606       * Get a custom set of properties as a JSON object, defined in the chain spec607       **/608      properties: AugmentedRpc<() => Observable<ChainProperties>>;609      /**610       * Remove a reserved peer611       **/612      removeReservedPeer: AugmentedRpc<(peerId: Text | string) => Observable<Text>>;613      /**614       * Returns the list of reserved peers615       **/616      reservedPeers: AugmentedRpc<() => Observable<Vec<Text>>>;617      /**618       * Resets the log filter to Substrate defaults619       **/620      resetLogFilter: AugmentedRpc<() => Observable<Null>>;621      /**622       * Returns the state of the syncing of the node623       **/624      syncState: AugmentedRpc<() => Observable<SyncState>>;625      /**626       * Retrieves the version of the node627       **/628      version: AugmentedRpc<() => Observable<Text>>;629    };630    unique: {631      /**632       * Get amount of different user tokens633       **/634      accountBalance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;635      /**636       * Get tokens owned by account637       **/638      accountTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;639      /**640       * Get admin list641       **/642      adminlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;643      /**644       * Get allowed amount645       **/646      allowance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, sender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;647      /**648       * Check if user is allowed to use collection649       **/650      allowed: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;651      /**652       * Get allowlist653       **/654      allowlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;655      /**656       * Get amount of specific account token657       **/658      balance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;659      /**660       * Get collection by specified id661       **/662      collectionById: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsRpcCollection>>>;663      /**664       * Get collection properties665       **/666      collectionProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;667      /**668       * Get collection stats669       **/670      collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<UpDataStructsCollectionStats>>;671      /**672       * Get tokens contained in collection673       **/674      collectionTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;675      /**676       * Get token constant metadata677       **/678      constMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;679      /**680       * Get effective collection limits681       **/682      effectiveCollectionLimits: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollectionLimits>>>;683      /**684       * Get last token id685       **/686      lastTokenId: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;687      /**688       * Get number of blocks when sponsored transaction is available689       **/690      nextSponsored: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u64>>>;691      /**692       * Get property permissions693       **/694      propertyPermissions: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsPropertyKeyPermission>>>;695      /**696       * Get tokens nested directly into the token697       **/698      tokenChildren: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsTokenChild>>>;699      /**700       * Get token data701       **/702      tokenData: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<UpDataStructsTokenData>>;703      /**704       * Check if token exists705       **/706      tokenExists: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;707      /**708       * Get token owner709       **/710      tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;711      /**712       * Get token owners713       **/714      tokenOwners: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;715      /**716       * Get token properties717       **/718      tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;719      /**720       * Get token owner, in case of nested token - find parent recursive721       **/722      topmostTokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;723      /**724       * Get total pieces of token725       **/726      totalPieces: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u128>>>;727      /**728       * Get amount of unique collection tokens729       **/730      totalSupply: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;731      /**732       * Get token variable metadata733       **/734      variableMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;735    };736    web3: {737      /**738       * Returns current client version.739       **/740      clientVersion: AugmentedRpc<() => Observable<Text>>;741      /**742       * Returns sha3 of the given data743       **/744      sha3: AugmentedRpc<(data: Bytes | string | Uint8Array) => Observable<H256>>;745    };746  } // RpcInterface747} // declare module
modifiedtests/src/interfaces/unique/definitions.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/definitions.ts
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -49,6 +49,7 @@
     balance: fun('Get amount of specific account token', [collectionParam, crossAccountParam(), tokenParam], 'u128'),
     allowance: fun('Get allowed amount', [collectionParam, crossAccountParam('sender'), crossAccountParam('spender'), tokenParam], 'u128'),
     tokenOwner: fun('Get token owner', [collectionParam, tokenParam], `Option<${CROSS_ACCOUNT_ID_TYPE}>`),
+    tokenOwners: fun('Get token owners', [collectionParam, tokenParam], `Vec<${CROSS_ACCOUNT_ID_TYPE}>`),
     topmostTokenOwner: fun('Get token owner, in case of nested token - find parent recursive', [collectionParam, tokenParam], `Option<${CROSS_ACCOUNT_ID_TYPE}>`),
     tokenChildren: fun('Get tokens nested directly into the token', [collectionParam, tokenParam], 'Vec<UpDataStructsTokenChild>'),
     constMetadata: fun('Get token constant metadata', [collectionParam, tokenParam], 'Vec<u8>'),
modifiedtests/src/refungible.test.tsdiffbeforeafterboth
--- a/tests/src/refungible.test.ts
+++ b/tests/src/refungible.test.ts
@@ -53,14 +53,14 @@
   it('Create refungible collection and token', async () => {
     await usingApi(async api => {
       const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
-      expect(createCollectionResult.success).to.be.true;    
+      expect(createCollectionResult.success).to.be.true;
       const collectionId  = createCollectionResult.collectionId;
-
+      
       const itemCountBefore = await getLastTokenId(api, collectionId);
       const result = await createRefungibleToken(api, alice, collectionId, 100n);
-
+      
       const itemCountAfter = await getLastTokenId(api, collectionId);
-
+      
       // What to expect
       // tslint:disable-next-line:no-unused-expression
       expect(result.success).to.be.true;
@@ -69,7 +69,39 @@
       expect(itemCountAfter.toString()).to.be.equal(result.itemId.toString());
     });
   });
-
+  
+  it('RPC method tokenOnewrs for refungible collection and token', async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+      
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
+      const collectionId = createCollectionResult.collectionId;
+      
+      const result = await createRefungibleToken(api, alice, collectionId, 10_000n);
+      const aliceTokenId = result.itemId;
+      
+      
+      await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+      await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+      
+      for (let i = 0; i < 7; i++) {
+        await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 50*(i+1));
+      } 
+      
+      const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+      const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+      
+      const aliceID = normalizeAccountId(alice);
+      const bobId = normalizeAccountId(bob);
+      
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+      expect(owners.length == 10).to.be.true;
+    });
+  });
+  
   it('Transfer token pieces', async () => {
     await usingApi(async api => {
       const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
modifiedtests/src/rpc.test.tsdiffbeforeafterboth
--- a/tests/src/rpc.test.ts
+++ b/tests/src/rpc.test.ts
@@ -1,12 +1,53 @@
+import {IKeyringPair} from '@polkadot/types/types';
 import {expect} from 'chai';
 import usingApi from './substrate/substrate-api';
-import {createCollectionExpectSuccess, getTokenOwner} from './util/helpers';
+import {createCollection, createCollectionExpectSuccess, createFungibleItemExpectSuccess, CrossAccountId, getTokenOwner, normalizeAccountId, transfer, U128_MAX} from './util/helpers';
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
+
 
-describe('getTokenOwner', () => {
+describe('integration test: RPC methods', () => {
+  before(async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
+    });
+  });
+
+  
   it('returns None for fungible collection', async () => {
     await usingApi(async api => {
       const collection = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
       await expect(getTokenOwner(api, collection, 0)).to.be.rejectedWith(/^owner == null$/);
     });
   });
+  
+  it('RPC method tokenOnewrs for fungible collection and token', async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+      
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+      const collectionId = createCollectionResult.collectionId;
+      const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+     
+      await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+      await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+            
+      for (let i = 0; i < 7; i++) {
+        await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 1);
+      } 
+      
+      const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+      const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+      const aliceID = normalizeAccountId(alice);
+      const bobId = normalizeAccountId(bob);
+
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+      expect(owners.length == 10).to.be.true;
+    });
+  });
 });
\ No newline at end of file