git.delta.rocks / unique-network / refs/commits / 698c51fd21a7

difftreelog

fix move RMRK needed parts of deprecated helpers

Daniel Shiposha2022-10-11parent: #681fe40.patch.diff
in: master

20 files changed

modifiedtests/src/rmrk/acceptNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/acceptNft.test.ts
+++ b/tests/src/rmrk/acceptNft.test.ts
@@ -7,8 +7,7 @@
   acceptNft,
 } from './util/tx';
 import {NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure} from './util/helpers';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
 
 describe('integration test: accept NFT', () => {
   let api: any;
modifiedtests/src/rmrk/addResource.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/addResource.test.ts
+++ b/tests/src/rmrk/addResource.test.ts
@@ -1,7 +1,7 @@
 import {expect} from 'chai';
 import {getApiConnection} from '../substrate/substrate-api';
 import {NftIdTuple} from './util/fetch';
-import {expectTxFailure, getResourceById} from './util/helpers';
+import {expectTxFailure, getResourceById, requirePallets, Pallets} from './util/helpers';
 import {
   addNftBasicResource,
   acceptNftResource,
@@ -12,7 +12,6 @@
   addNftComposableResource,
 } from './util/tx';
 import {RmrkTraitsResourceResourceInfo as ResourceInfo} from '@polkadot/types/lookup';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 
 describe('integration test: add NFT resource', () => {
   const Alice = '//Alice';
modifiedtests/src/rmrk/addTheme.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/addTheme.test.ts
+++ b/tests/src/rmrk/addTheme.test.ts
@@ -1,9 +1,8 @@
 import {expect} from 'chai';
 import {getApiConnection} from '../substrate/substrate-api';
 import {createBase, addTheme} from './util/tx';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {getThemeNames} from './util/fetch';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 
 describe('integration test: add Theme to Base', () => {
   let api: any;
modifiedtests/src/rmrk/burnNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/burnNft.test.ts
+++ b/tests/src/rmrk/burnNft.test.ts
@@ -1,11 +1,10 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {NftIdTuple, getChildren} from './util/fetch';
 import {burnNft, createCollection, sendNft, mintNft} from './util/tx';
 
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 
 chai.use(chaiAsPromised);
 const expect = chai.expect;
modifiedtests/src/rmrk/changeCollectionIssuer.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/changeCollectionIssuer.test.ts
+++ b/tests/src/rmrk/changeCollectionIssuer.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {
   changeIssuer,
   createCollection,
modifiedtests/src/rmrk/createBase.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/createBase.test.ts
+++ b/tests/src/rmrk/createBase.test.ts
@@ -1,5 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {requirePallets, Pallets} from './util/helpers';
 import {createCollection, createBase} from './util/tx';
 
 describe('integration test: create new Base', () => {
modifiedtests/src/rmrk/createCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/createCollection.test.ts
+++ b/tests/src/rmrk/createCollection.test.ts
@@ -1,5 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {requirePallets, Pallets} from './util/helpers';
 import {createCollection} from './util/tx';
 
 describe('Integration test: create new collection', () => {
modifiedtests/src/rmrk/deleteCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/deleteCollection.test.ts
+++ b/tests/src/rmrk/deleteCollection.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, deleteCollection} from './util/tx';
 
 describe('integration test: delete collection', () => {
modifiedtests/src/rmrk/equipNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/equipNft.test.ts
+++ b/tests/src/rmrk/equipNft.test.ts
@@ -1,9 +1,8 @@
 import {ApiPromise} from '@polkadot/api';
 import {expect} from 'chai';
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 import {getNft, getParts, NftIdTuple} from './util/fetch';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {
   addNftComposableResource,
   addNftSlotResource,
modifiedtests/src/rmrk/getOwnedNfts.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/getOwnedNfts.test.ts
+++ b/tests/src/rmrk/getOwnedNfts.test.ts
@@ -1,6 +1,6 @@
 import {expect} from 'chai';
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {requirePallets, Pallets} from './util/helpers';
 import {getOwnedNfts} from './util/fetch';
 import {mintNft, createCollection} from './util/tx';
 
modifiedtests/src/rmrk/lockCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/lockCollection.test.ts
+++ b/tests/src/rmrk/lockCollection.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, lockCollection, mintNft} from './util/tx';
 
 describe('integration test: lock collection', () => {
modifiedtests/src/rmrk/mintNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/mintNft.test.ts
+++ b/tests/src/rmrk/mintNft.test.ts
@@ -1,8 +1,7 @@
 import {expect} from 'chai';
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 import {getNft} from './util/fetch';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, mintNft} from './util/tx';
 
 describe('integration test: mint new NFT', () => {
modifiedtests/src/rmrk/rejectNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/rejectNft.test.ts
+++ b/tests/src/rmrk/rejectNft.test.ts
@@ -7,8 +7,7 @@
   rejectNft,
 } from './util/tx';
 import {getChildren, NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure} from './util/helpers';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
 
 describe('integration test: reject NFT', () => {
   let api: any;
modifiedtests/src/rmrk/removeResource.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/removeResource.test.ts
+++ b/tests/src/rmrk/removeResource.test.ts
@@ -1,9 +1,8 @@
 import {expect} from 'chai';
 import privateKey from '../substrate/privateKey';
 import {executeTransaction, getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 import {getNft, NftIdTuple} from './util/fetch';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {
   acceptNft, acceptResourceRemoval, addNftBasicResource,
   createBase,
modifiedtests/src/rmrk/sendNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/sendNft.test.ts
+++ b/tests/src/rmrk/sendNft.test.ts
@@ -2,8 +2,7 @@
 import {getApiConnection} from '../substrate/substrate-api';
 import {createCollection, mintNft, sendNft} from './util/tx';
 import {NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure} from './util/helpers';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
 
 describe('integration test: send NFT', () => {
   let api: any;
modifiedtests/src/rmrk/setCollectionProperty.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setCollectionProperty.test.ts
+++ b/tests/src/rmrk/setCollectionProperty.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, setPropertyCollection} from './util/tx';
 
 describe('integration test: set collection property', () => {
modifiedtests/src/rmrk/setEquippableList.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setEquippableList.test.ts
+++ b/tests/src/rmrk/setEquippableList.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, createBase, setEquippableList} from './util/tx';
 
 describe("integration test: set slot's Equippable List", () => {
modifiedtests/src/rmrk/setNftProperty.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setNftProperty.test.ts
+++ b/tests/src/rmrk/setNftProperty.test.ts
@@ -1,7 +1,6 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
 import {NftIdTuple} from './util/fetch';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {createCollection, mintNft, sendNft, setNftProperty} from './util/tx';
 
 describe('integration test: set NFT property', () => {
modifiedtests/src/rmrk/setResourcePriorities.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setResourcePriorities.test.ts
+++ b/tests/src/rmrk/setResourcePriorities.test.ts
@@ -1,6 +1,5 @@
 import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from '../deprecated-helpers/helpers';
-import {expectTxFailure} from './util/helpers';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
 import {mintNft, createCollection, setResourcePriorities} from './util/tx';
 
 describe('integration test: set NFT resource priorities', () => {
modifiedtests/src/rmrk/util/helpers.tsdiffbeforeafterboth
before · tests/src/rmrk/util/helpers.ts
1import {ApiPromise} from '@polkadot/api';2import {3  RmrkTraitsNftAccountIdOrCollectionNftTuple as NftOwner,4  RmrkTraitsPropertyPropertyInfo as Property,5  RmrkTraitsResourceResourceInfo as ResourceInfo,6} from '@polkadot/types/lookup';7import type {EventRecord} from '@polkadot/types/interfaces';8import type {GenericEventData} from '@polkadot/types';9import privateKey from '../../substrate/privateKey';10import {NftIdTuple, getChildren, getOwnedNfts, getCollectionProperties, getNftProperties, getResources} from './fetch';11import chaiAsPromised from 'chai-as-promised';12import chai from 'chai';1314chai.use(chaiAsPromised);15const expect = chai.expect;1617interface TxResult<T> {18    success: boolean;19    successData: T | null;20}2122export function makeNftOwner(api: ApiPromise, owner: string | NftIdTuple): NftOwner {23  const isNftSending = (typeof owner !== 'string');2425  if (isNftSending) {26    return api.createType('RmrkTraitsNftAccountIdOrCollectionNftTuple', {27      'CollectionAndNftTuple': owner,28    });29  } else {30    const ss58Format = api.registry.getChainProperties()!.toJSON().ss58Format;31    return api.createType('RmrkTraitsNftAccountIdOrCollectionNftTuple', {32      AccountId: privateKey(owner, Number(ss58Format)).address,33    });34  }35}3637export async function isNftOwnedBy(38  api: ApiPromise,39  owner: string | NftIdTuple,40  collectionId: number,41  nftId: number,42): Promise<boolean> {43  if (typeof owner === 'string') {44    return (await getOwnedNfts(api, owner, collectionId))45      .find(ownedNftId => {46        return ownedNftId === nftId;47      }) !== undefined;48  } else {49    return (await getChildren(api, owner[0], owner[1]))50      .find(child => {51        return collectionId === child.collectionId.toNumber()52                    && nftId === child.nftId.toNumber();53      }) !== undefined;54  }55}5657export function isPropertyExists(58  key: string,59  value: string,60  props: Property[],61): boolean {62  let isPropFound = false;63  for (let i = 0; i < props.length && !isPropFound; i++) {64    const fetchedProp = props[i];6566    isPropFound = fetchedProp.key.eq(key)67                    && fetchedProp.value.eq(value);68  }6970  return isPropFound;71}7273export async function isCollectionPropertyExists(74  api: ApiPromise,75  collectionId: number,76  key: string,77  value: string,78): Promise<boolean> {79  const fetchedProps = await getCollectionProperties(api, collectionId);80  return isPropertyExists(key, value, fetchedProps);81}8283export async function isNftPropertyExists(84  api: ApiPromise,85  collectionId: number,86  nftId: number,87  key: string,88  value: string,89): Promise<boolean> {90  const fetchedProps = await getNftProperties(api, collectionId, nftId);91  return isPropertyExists(key, value, fetchedProps);92}9394export async function isNftChildOfAnother(95  api: ApiPromise,96  collectionId: number,97  nftId: number,98  parentNft: NftIdTuple,99): Promise<boolean> {100  return (await getChildren(api, parentNft[0], parentNft[1]))101    .find((childNft) => {102      return childNft.collectionId.toNumber() === collectionId103                && childNft.nftId.toNumber() === nftId;104    }) !== undefined;105}106107export function isTxResultSuccess(events: EventRecord[]): boolean {108  let success = false;109110  events.forEach(({event: {data, method, section}}) => {111    if (method == 'ExtrinsicSuccess') {112      success = true;113    }114  });115116  return success;117}118119export async function expectTxFailure(expectedError: RegExp, promise: Promise<any>) {120  await expect(promise).to.be.rejectedWith(expectedError);121}122123export function extractTxResult<T>(124  events: EventRecord[],125  expectSection: string,126  expectMethod: string,127  extractAction: (data: any) => T,128): TxResult<T> {129  let success = false;130  let successData = null;131  events.forEach(({event: {data, method, section}}) => {132    if (method == 'ExtrinsicSuccess') {133      success = true;134    } else if ((expectSection == section) && (expectMethod == method)) {135      successData = extractAction(data);136    }137  });138  const result: TxResult<T> = {139    success,140    successData,141  };142  return result;143}144145export function extractRmrkCoreTxResult<T>(146  events: EventRecord[],147  expectMethod: string,148  extractAction: (data: GenericEventData) => T,149): TxResult<T> {150  return extractTxResult(events, 'rmrkCore', expectMethod, extractAction);151}152153export function extractRmrkEquipTxResult<T>(154  events: EventRecord[],155  expectMethod: string,156  extractAction: (data: GenericEventData) => T,157): TxResult<T> {158  return extractTxResult(events, 'rmrkEquip', expectMethod, extractAction);159}160161export async function findResourceById(162  api: ApiPromise,163  collectionId: number,164  nftId: number,165  resourceId: number,166): Promise<ResourceInfo> {167  const resources = await getResources(api, collectionId, nftId);168169  let resource = null;170171  for (let i = 0; i < resources.length; i++) {172    const res = resources[i];173174    if (res.id.eq(resourceId)) {175      resource = res;176      break;177    }178  }179180  return resource!;181}182183export async function getResourceById(184  api: ApiPromise,185  collectionId: number,186  nftId: number,187  resourceId: number,188): Promise<ResourceInfo> {189  const resource = await findResourceById(190    api,191    collectionId,192    nftId,193    resourceId,194  );195196  expect(resource !== null, 'Error: resource was not found').to.be.true;197198  return resource!;199}200201export function checkResourceStatus(202  resource: ResourceInfo,203  expectedStatus: 'pending' | 'added',204) {205  expect(resource.pending.isTrue, `Error: added resource should be ${expectedStatus}`)206    .to.be.equal(expectedStatus === 'pending');207}
after · tests/src/rmrk/util/helpers.ts
1import {ApiPromise} from '@polkadot/api';2import {3  RmrkTraitsNftAccountIdOrCollectionNftTuple as NftOwner,4  RmrkTraitsPropertyPropertyInfo as Property,5  RmrkTraitsResourceResourceInfo as ResourceInfo,6} from '@polkadot/types/lookup';7import type {EventRecord} from '@polkadot/types/interfaces';8import type {GenericEventData} from '@polkadot/types';9import privateKey from '../../substrate/privateKey';10import {NftIdTuple, getChildren, getOwnedNfts, getCollectionProperties, getNftProperties, getResources} from './fetch';11import chaiAsPromised from 'chai-as-promised';12import chai from 'chai';13import {getApiConnection} from '../../substrate/substrate-api';14import {Context} from 'mocha';1516chai.use(chaiAsPromised);17const expect = chai.expect;1819interface TxResult<T> {20    success: boolean;21    successData: T | null;22}2324export enum Pallets {25  Inflation = 'inflation',26  RmrkCore = 'rmrkcore',27  RmrkEquip = 'rmrkequip',28  ReFungible = 'refungible',29  Fungible = 'fungible',30  NFT = 'nonfungible',31  Scheduler = 'scheduler',32  AppPromotion = 'apppromotion',33}3435let modulesNames: any;36export function getModuleNames(api: ApiPromise): string[] {37  if (typeof modulesNames === 'undefined')38    modulesNames = api.runtimeMetadata.asLatest.pallets.map(m => m.name.toString().toLowerCase());39  return modulesNames;40}4142export async function missingRequiredPallets(requiredPallets: string[]): Promise<string[]> {43  const api = await getApiConnection();44  const pallets = getModuleNames(api);4546  return requiredPallets.filter(p => !pallets.includes(p));47}4849export async function requirePallets(mocha: Context, requiredPallets: string[]) {50  const missingPallets = await missingRequiredPallets(requiredPallets);5152  if (missingPallets.length > 0) {53    const skippingTestMsg = `\tSkipping test "${mocha.test?.title}".`;54    const missingPalletsMsg = `\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`;55    const skipMsg = `${skippingTestMsg}\n${missingPalletsMsg}`;5657    console.error('\x1b[38:5:208m%s\x1b[0m', skipMsg);5859    mocha.skip();60  }61}6263export function makeNftOwner(api: ApiPromise, owner: string | NftIdTuple): NftOwner {64  const isNftSending = (typeof owner !== 'string');6566  if (isNftSending) {67    return api.createType('RmrkTraitsNftAccountIdOrCollectionNftTuple', {68      'CollectionAndNftTuple': owner,69    });70  } else {71    const ss58Format = api.registry.getChainProperties()!.toJSON().ss58Format;72    return api.createType('RmrkTraitsNftAccountIdOrCollectionNftTuple', {73      AccountId: privateKey(owner, Number(ss58Format)).address,74    });75  }76}7778export async function isNftOwnedBy(79  api: ApiPromise,80  owner: string | NftIdTuple,81  collectionId: number,82  nftId: number,83): Promise<boolean> {84  if (typeof owner === 'string') {85    return (await getOwnedNfts(api, owner, collectionId))86      .find(ownedNftId => {87        return ownedNftId === nftId;88      }) !== undefined;89  } else {90    return (await getChildren(api, owner[0], owner[1]))91      .find(child => {92        return collectionId === child.collectionId.toNumber()93                    && nftId === child.nftId.toNumber();94      }) !== undefined;95  }96}9798export function isPropertyExists(99  key: string,100  value: string,101  props: Property[],102): boolean {103  let isPropFound = false;104  for (let i = 0; i < props.length && !isPropFound; i++) {105    const fetchedProp = props[i];106107    isPropFound = fetchedProp.key.eq(key)108                    && fetchedProp.value.eq(value);109  }110111  return isPropFound;112}113114export async function isCollectionPropertyExists(115  api: ApiPromise,116  collectionId: number,117  key: string,118  value: string,119): Promise<boolean> {120  const fetchedProps = await getCollectionProperties(api, collectionId);121  return isPropertyExists(key, value, fetchedProps);122}123124export async function isNftPropertyExists(125  api: ApiPromise,126  collectionId: number,127  nftId: number,128  key: string,129  value: string,130): Promise<boolean> {131  const fetchedProps = await getNftProperties(api, collectionId, nftId);132  return isPropertyExists(key, value, fetchedProps);133}134135export async function isNftChildOfAnother(136  api: ApiPromise,137  collectionId: number,138  nftId: number,139  parentNft: NftIdTuple,140): Promise<boolean> {141  return (await getChildren(api, parentNft[0], parentNft[1]))142    .find((childNft) => {143      return childNft.collectionId.toNumber() === collectionId144                && childNft.nftId.toNumber() === nftId;145    }) !== undefined;146}147148export function isTxResultSuccess(events: EventRecord[]): boolean {149  let success = false;150151  events.forEach(({event: {data, method, section}}) => {152    if (method == 'ExtrinsicSuccess') {153      success = true;154    }155  });156157  return success;158}159160export async function expectTxFailure(expectedError: RegExp, promise: Promise<any>) {161  await expect(promise).to.be.rejectedWith(expectedError);162}163164export function extractTxResult<T>(165  events: EventRecord[],166  expectSection: string,167  expectMethod: string,168  extractAction: (data: any) => T,169): TxResult<T> {170  let success = false;171  let successData = null;172  events.forEach(({event: {data, method, section}}) => {173    if (method == 'ExtrinsicSuccess') {174      success = true;175    } else if ((expectSection == section) && (expectMethod == method)) {176      successData = extractAction(data);177    }178  });179  const result: TxResult<T> = {180    success,181    successData,182  };183  return result;184}185186export function extractRmrkCoreTxResult<T>(187  events: EventRecord[],188  expectMethod: string,189  extractAction: (data: GenericEventData) => T,190): TxResult<T> {191  return extractTxResult(events, 'rmrkCore', expectMethod, extractAction);192}193194export function extractRmrkEquipTxResult<T>(195  events: EventRecord[],196  expectMethod: string,197  extractAction: (data: GenericEventData) => T,198): TxResult<T> {199  return extractTxResult(events, 'rmrkEquip', expectMethod, extractAction);200}201202export async function findResourceById(203  api: ApiPromise,204  collectionId: number,205  nftId: number,206  resourceId: number,207): Promise<ResourceInfo> {208  const resources = await getResources(api, collectionId, nftId);209210  let resource = null;211212  for (let i = 0; i < resources.length; i++) {213    const res = resources[i];214215    if (res.id.eq(resourceId)) {216      resource = res;217      break;218    }219  }220221  return resource!;222}223224export async function getResourceById(225  api: ApiPromise,226  collectionId: number,227  nftId: number,228  resourceId: number,229): Promise<ResourceInfo> {230  const resource = await findResourceById(231    api,232    collectionId,233    nftId,234    resourceId,235  );236237  expect(resource !== null, 'Error: resource was not found').to.be.true;238239  return resource!;240}241242export function checkResourceStatus(243  resource: ResourceInfo,244  expectedStatus: 'pending' | 'added',245) {246  expect(resource.pending.isTrue, `Error: added resource should be ${expectedStatus}`)247    .to.be.equal(expectedStatus === 'pending');248}