git.delta.rocks / unique-network / refs/commits / 250fe7845583

difftreelog

source

tests/src/benchmarks/opsFee/index.ts29.5 KiBsourcehistory
1import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';2import {readFile} from 'fs/promises';3import {CollectionLimitField,  TokenPermissionField} from '../../eth/util/playgrounds/types';4import {IKeyringPair} from '@polkadot/types/types';5import {UniqueFTCollection, UniqueNFTCollection} from '../../util/playgrounds/unique';6import {Contract} from 'web3-eth-contract';7import {createObjectCsvWriter} from 'csv-writer';8import {FunctionFeeVM, IFunctionFee} from '../utils/types';9import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES, SUBS_PROPERTIES} from '../utils/common';10111213const main = async () => {1415  const headers = [16    'function',17    'ethFee',18    'ethGas',19    'substrate',20    'zeppelinFee',21    'zeppelinGas',22  ];2324  const csvWriter20 = createObjectCsvWriter({25    path: 'erc20.csv',26    header: headers,27  });2829  const csvWriter721 = createObjectCsvWriter({30    path: 'erc721.csv',31    header: headers,32  });3334  await usingEthPlaygrounds(async (helper, privateKey) => {35    console.log('\n ERC20 ops fees');36    const erc20 = FunctionFeeVM.fromModel(await erc20CalculateFeeGas(helper, privateKey));37    console.table(erc20);38    await csvWriter20.writeRecords(FunctionFeeVM.toCsv(erc20));3940    console.log('\n ERC721 ops fees');41    const erc721 = FunctionFeeVM.fromModel(await erc721CalculateFeeGas(helper, privateKey));42    console.table(erc721);4344    await csvWriter721.writeRecords(FunctionFeeVM.toCsv(erc721));45  });46};4748main()49  .then(() => process.exit(0))50  .catch((e) => {51    console.log(e);52    process.exit(1);53  });5455async function erc721CalculateFeeGas(56  helper: EthUniqueHelper,57  privateKey: (seed: string) => Promise<IKeyringPair>,58): Promise<IFunctionFee> {59  const res: IFunctionFee = {};60  const donor = await privateKey('//Alice');61  const [subReceiver] = await helper.arrange.createAccounts([10n], donor);62  const ethSigner = await helper.eth.createAccountWithBalance(donor, 100n);63  const ethReceiver = await helper.eth.createAccountWithBalance(donor, 10n);64  const crossSigner = helper.ethCrossAccount.fromAddress(ethSigner);65  const crossReceiver = helper.ethCrossAccount.fromAddress(ethReceiver);66  const collection = (await createCollectionForBenchmarks(67    'nft',68    helper,69    privateKey,70    ethSigner,71    null,72    PERMISSIONS,73  )) as UniqueNFTCollection;7475  const helperContract = await helper.ethNativeContract.collectionHelpers(ethSigner);76  let zeppelelinContract: Contract | null = null;77  const ZEPPELIN_OBJECT = '0x' + (await readFile(`${__dirname}/../utils/openZeppelin/ERC721/bin/ZeppelinContract.bin`)).toString();78  const ZEPPELIN_ABI = JSON.parse((await readFile(`${__dirname}/../utils/openZeppelin/ERC721/bin/ZeppelinContract.abi`)).toString());7980  const evmContract = await helper.ethNativeContract.collection(81    helper.ethAddress.fromCollectionId(collection.collectionId),82    'nft',83    ethSigner,84    true,85  );8687  res['createCollection'] = await helper.arrange.calculcateFeeGas(88    {Ethereum: ethSigner},89    () => helperContract.methods.createNFTCollection('test','test','test').send({from: ethSigner, value: Number(2n * helper.balance.getOneTokenNominal())}),90  );9192  res['createCollection'].substrate = convertToTokens((await helper.arrange.calculcateFee(93    {Substrate: donor.address},94    () => helper.nft.mintCollection(95      donor,96      {name: 'test', description: 'test', tokenPrefix: 'test'},97    ),98  )));99100  res['createCollection'].zeppelin = await helper.arrange.calculcateFeeGas(101    {Ethereum: ethSigner},102    async () => {103      zeppelelinContract = await helper.ethContract.deployByAbi(104        ethSigner,105        ZEPPELIN_ABI,106        ZEPPELIN_OBJECT,107      );108    },109  );110111  res['mint'] =112    await helper.arrange.calculcateFeeGas(113      {Ethereum: ethSigner},114      () => evmContract.methods.mint(ethSigner).send(),115    );116117  res['mint'].zeppelin =118    await helper.arrange.calculcateFeeGas(119      {Ethereum: ethSigner},120      () => zeppelelinContract!.methods.safeMint(ethSigner, 'test').send({from: ethSigner}),121    );122123  res['mintCross'] =124    await helper.arrange.calculcateFeeGas(125      {Ethereum: ethSigner},126      () => evmContract.methods.mintCross(crossSigner, []).send(),127    );128129  res['mint'].substrate = convertToTokens((await helper.arrange.calculcateFee(130    {Substrate: donor.address},131    () => collection.mintToken(132      donor,133      {Substrate: donor.address},134    ),135  )));136137  res['mintCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(138    {Substrate: donor.address},139    () => collection.mintMultipleTokens(donor, [{140      owner: {Substrate: donor.address},141    }]),142  )));143144  res['mintWithTokenURI'] =145    await helper.arrange.calculcateFeeGas(146      {Ethereum: ethSigner},147      () => evmContract.methods.mintWithTokenURI(ethSigner, 'Test URI').send(),148    );149150  res['mintWithTokenURI'].substrate = convertToTokens((await helper.arrange.calculcateFee(151    {Substrate: donor.address},152    () => collection.mintToken(153      donor,154      {Ethereum: ethSigner},155      [{key: 'URI', value: 'Test URI'}],156    ),157  )));158159  res['setProperties'] =160    await helper.arrange.calculcateFeeGas(161      {Ethereum: ethSigner},162      () => evmContract.methods.setProperties(1, PROPERTIES.slice(0,1)).send(),163    );164165  res['deleteProperties'] =166    await helper.arrange.calculcateFeeGas(167      {Ethereum: ethSigner},168      () => evmContract.methods.deleteProperties(1, [PROPERTIES[0].key]).send(),169    );170171  res['setProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(172    {Substrate: donor.address},173    () => collection.setTokenProperties(174      donor,175      1,176      SUBS_PROPERTIES.slice(0, 1),177    ),178  )));179180  res['deleteProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(181    {Substrate: donor.address},182    () => collection.deleteTokenProperties(183      donor,184      1,185      SUBS_PROPERTIES.slice(0, 1)186        .map(p => p.key),187    ),188  )));189190  res['transfer'] =191    await helper.arrange.calculcateFeeGas(192      {Ethereum: ethSigner},193      () => evmContract.methods.transfer(ethReceiver, 1).send(),194    );195196  res['safeTransferFrom*'] = {197    zeppelin:198      await helper.arrange.calculcateFeeGas(199        {Ethereum: ethSigner},200        () => zeppelelinContract!.methods.safeTransferFrom(ethSigner, ethReceiver, 0).send({from: ethSigner}),201      ),202  };203204  res['transferCross'] =205    await helper.arrange.calculcateFeeGas(206      {Ethereum: ethReceiver},207      () => evmContract.methods.transferCross(crossSigner, 1).send({from: ethReceiver}),208    );209210  res['transferCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(211    {Substrate: donor.address},212    () => collection.transferToken(213      donor,214      3,215      {Substrate: subReceiver.address},216    ),217  )));218  await collection.approveToken(subReceiver, 3, {Substrate: donor.address});219220  res['transferFrom*'] =221    await helper.arrange.calculcateFeeGas(222      {Ethereum: ethSigner},223      () => evmContract.methods.transferFrom(ethSigner, ethReceiver, 1).send(),224    );225226  res['transferFrom*'].zeppelin =227    await helper.arrange.calculcateFeeGas(228      {Ethereum: ethReceiver},229      () => zeppelelinContract!.methods.transferFrom(ethReceiver, ethSigner, 0).send({from: ethReceiver}),230    );231232233  res['transferFromCross'] =234    await helper.arrange.calculcateFeeGas(235      {Ethereum: ethReceiver},236      () => evmContract.methods.transferFromCross(crossReceiver, crossSigner, 1).send({from:ethReceiver}),237    );238239  res['transferFromCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(240    {Substrate: donor.address},241    () => collection.transferTokenFrom(donor, 3, {Substrate: subReceiver.address}, {Substrate: donor.address}),242  )));243244  res['burn'] =245    await helper.arrange.calculcateFeeGas(246      {Ethereum: ethSigner},247      () => evmContract.methods.burn(1).send(),248    );249250  res['burn'].substrate = convertToTokens((await helper.arrange.calculcateFee(251    {Substrate: donor.address},252    () => collection.burnToken(donor, 3),253  )));254255  res['approve*'] =256    await helper.arrange.calculcateFeeGas(257      {Ethereum: ethSigner},258      () => evmContract.methods.approve(ethReceiver, 2).send(),259    );260261  res['approve*'].zeppelin =262    await helper.arrange.calculcateFeeGas(263      {Ethereum: ethSigner},264      () => zeppelelinContract!.methods.approve(ethReceiver, 0).send({from: ethSigner}),265    );266267  res['approveCross'] =268    await helper.arrange.calculcateFeeGas(269      {Ethereum: ethSigner},270      () => evmContract.methods.approveCross(crossReceiver, 2).send(),271    );272273  res['approveCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(274    {Substrate: donor.address},275    () => collection.approveToken(donor, 4, {Substrate: subReceiver.address}),276  )));277278  res['setApprovalForAll*'] =279    await helper.arrange.calculcateFeeGas(280      {Ethereum: ethSigner},281      () => evmContract.methods.setApprovalForAll(ethReceiver, true).send(),282    );283284  res['setApprovalForAll*'].zeppelin =285    await helper.arrange.calculcateFeeGas(286      {Ethereum: ethSigner},287      () => zeppelelinContract!.methods.setApprovalForAll(ethReceiver, true).send({from: ethSigner}),288    );289290  res['setApprovalForAll*'].substrate = convertToTokens((await helper.arrange.calculcateFee(291    {Substrate: donor.address},292    () => helper.nft.setAllowanceForAll(donor, collection.collectionId, {Substrate: subReceiver.address}, true),293  )));294295  res['burnFromCross'] =296    await helper.arrange.calculcateFeeGas(297      {Ethereum: ethReceiver},298      () => evmContract.methods.burnFromCross(crossSigner, 2).send({from:ethReceiver}),299    );300301  res['burnFromCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(302    {Substrate: subReceiver.address},303    () => collection.burnTokenFrom(subReceiver, 4, {Substrate: donor.address}),304  )));305306  res['setTokenPropertyPermissions'] =307    await helper.arrange.calculcateFeeGas(308      {Ethereum: ethSigner},309      () =>  evmContract.methods.setTokenPropertyPermissions([310        ['url', [311          [TokenPermissionField.Mutable, true],312          [TokenPermissionField.TokenOwner, true],313          [TokenPermissionField.CollectionAdmin, true]],314        ],315      ]).send(),316    );317318  res['setTokenPropertyPermissions'].substrate = convertToTokens((await helper.arrange.calculcateFee(319    {Substrate: donor.address},320    () => collection.setTokenPropertyPermissions(donor, [{key: 'url', permission: {321      tokenOwner: true,322      collectionAdmin: true,323      mutable: true,324    }}]),325  )));326327  res['setCollectionSponsorCross'] =328    await helper.arrange.calculcateFeeGas(329      {Ethereum: ethSigner},330      () =>  evmContract.methods.setCollectionSponsorCross(crossReceiver).send(),331    );332333  res['confirmCollectionSponsorship'] =334    await helper.arrange.calculcateFeeGas(335      {Ethereum: ethReceiver},336      () =>  evmContract.methods.confirmCollectionSponsorship().send({from: ethReceiver}),337    );338339  res['removeCollectionSponsor'] =340    await helper.arrange.calculcateFeeGas(341      {Ethereum: ethSigner},342      () =>  evmContract.methods.removeCollectionSponsor().send(),343    );344345  res['setCollectionSponsorCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(346    {Substrate: donor.address},347    () => collection.setSponsor(donor, subReceiver.address),348  )));349350  res['confirmCollectionSponsorship'].substrate = convertToTokens((await helper.arrange.calculcateFee(351    {Substrate: subReceiver.address},352    () => collection.confirmSponsorship(subReceiver),353  )));354355  res['removeCollectionSponsor'].substrate = convertToTokens((await helper.arrange.calculcateFee(356    {Substrate: donor.address},357    () => collection.removeSponsor(donor),358  )));359360  res['setCollectionProperties'] =361    await helper.arrange.calculcateFeeGas(362      {Ethereum: ethSigner},363      () => evmContract.methods.setCollectionProperties(PROPERTIES.slice(0, 1)).send(),364    );365366  res['deleteCollectionProperties'] =367    await helper.arrange.calculcateFeeGas(368      {Ethereum: ethSigner},369      () =>  evmContract.methods.deleteCollectionProperties(PROPERTIES.slice(0,1).map(p => p.key)).send(),370    );371  res['setCollectionProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(372    {Substrate: donor.address},373    () => collection.setProperties(donor, PROPERTIES.slice(0, 1)374      .map(p => { return {key: p.key, value: p.value.toString()}; })),375  )));376377  res['deleteCollectionProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(378    {Substrate: donor.address},379    () => collection.deleteProperties(donor, PROPERTIES.slice(0, 1)380      .map(p => p.key)),381  )));382383  res['setCollectionLimit'] =384    await helper.arrange.calculcateFeeGas(385      {Ethereum: ethSigner},386      () =>  evmContract.methods.setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}).send(),387    );388389  res['setCollectionLimit'].substrate = convertToTokens((await helper.arrange.calculcateFee(390    {Substrate: donor.address},391    () => collection.setLimits(donor, {accountTokenOwnershipLimit: 1000}),392  )));393394  const {collectionAddress} = await helper.eth.createCollection('nft', ethSigner, 'A', 'B', 'C');395  const collectionWithEthOwner = await helper.ethNativeContract.collection(collectionAddress, 'nft', ethSigner, true);396397398  res['addCollectionAdminCross'] =399    await helper.arrange.calculcateFeeGas(400      {Ethereum: ethSigner},401      () =>  collectionWithEthOwner.methods.addCollectionAdminCross(crossReceiver).send(),402    );403404  res['removeCollectionAdminCross'] =405    await helper.arrange.calculcateFeeGas(406      {Ethereum: ethSigner},407      () =>  collectionWithEthOwner.methods.removeCollectionAdminCross(crossReceiver).send(),408    );409410  res['addCollectionAdminCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(411    {Substrate: donor.address},412    () => collection.addAdmin(donor, {Ethereum: ethReceiver}),413  )));414415  res['removeCollectionAdminCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(416    {Substrate: donor.address},417    () => collection.removeAdmin(donor, {Ethereum: ethReceiver}),418  )));419420  res['setCollectionNesting'] =421    await helper.arrange.calculcateFeeGas(422      {Ethereum: ethSigner},423      () =>  evmContract.methods.setCollectionNesting(true).send(),424    );425426  res['setCollectionNesting[]'] =427    await helper.arrange.calculcateFeeGas(428      {Ethereum: ethSigner},429      () =>  evmContract.methods.setCollectionNesting(true, [collectionAddress]).send(),430    );431432  res['setCollectionNesting'].substrate = convertToTokens((await helper.arrange.calculcateFee(433    {Substrate: donor.address},434    () => collection.disableNesting(donor),435  )));436437  res['setCollectionNesting[]'].substrate = convertToTokens((await helper.arrange.calculcateFee(438    {Substrate: donor.address},439    () => collection.setPermissions(440      donor,441      {442        nesting: {443          tokenOwner: true,444          restricted: [collection.collectionId],445        },446      },447    ),448  )));449450  res['setCollectionAccess'] =451    await helper.arrange.calculcateFeeGas(452      {Ethereum: ethSigner},453      () =>  evmContract.methods.setCollectionAccess(1).send(),454    );455456  res['setCollectionAccess'].substrate = convertToTokens((await helper.arrange.calculcateFee(457    {Substrate: donor.address},458    () => collection.setPermissions(donor, {access: 'AllowList'}),459  )));460461  res['addToCollectionAllowListCross'] =462    await helper.arrange.calculcateFeeGas(463      {Ethereum: ethSigner},464      () =>  evmContract.methods.addToCollectionAllowListCross(crossReceiver).send(),465    );466467  res['removeFromCollectionAllowListCross'] =468    await helper.arrange.calculcateFeeGas(469      {Ethereum: ethSigner},470      () =>  evmContract.methods.removeFromCollectionAllowListCross(crossReceiver).send(),471    );472473  res['addToCollectionAllowListCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(474    {Substrate: donor.address},475    () => collection.addToAllowList(donor, {Ethereum: ethReceiver}),476  )));477478  res['removeFromCollectionAllowListCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(479    {Substrate: donor.address},480    () => collection.removeFromAllowList(donor, {Ethereum: ethReceiver}),481  )));482483  res['setCollectionMintMode'] =484    await helper.arrange.calculcateFeeGas(485      {Ethereum: ethSigner},486      () =>  evmContract.methods.setCollectionMintMode(true).send(),487    );488489  res['setCollectionMintMode'].substrate = convertToTokens((await helper.arrange.calculcateFee(490    {Substrate: donor.address},491    () => collection.setPermissions(donor, {mintMode: false}),492  )));493494  res['changeCollectionOwnerCross'] =495    await helper.arrange.calculcateFeeGas(496      {Ethereum: ethSigner},497      () =>  collectionWithEthOwner.methods.changeCollectionOwnerCross(crossReceiver).send(),498    );499500  res['changeCollectionOwnerCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(501    {Substrate: donor.address},502    () => collection.changeOwner(donor, subReceiver.address),503  )));504505  return res;506}507508async function erc20CalculateFeeGas(509  helper: EthUniqueHelper,510  privateKey: (seed: string) => Promise<IKeyringPair>,511512): Promise<IFunctionFee> {513  const res: IFunctionFee = {};514  const donor = await privateKey('//Alice');515  const [subReceiver] = await helper.arrange.createAccounts([10n], donor);516  const ethSigner = await helper.eth.createAccountWithBalance(donor, 100n);517  const ethReceiver = await helper.eth.createAccountWithBalance(donor, 10n);518  const crossSigner = helper.ethCrossAccount.fromAddress(ethSigner);519  const crossReceiver = helper.ethCrossAccount.fromAddress(ethReceiver);520  const collection = (await createCollectionForBenchmarks(521    'ft',522    helper,523    privateKey,524    ethSigner,525    null,526    PERMISSIONS,527  )) as UniqueFTCollection;528529  const helperContract = await helper.ethNativeContract.collectionHelpers(ethSigner);530  let zeppelelinContract: Contract | null = null;531  const ZEPPELIN_OBJECT = '0x' + (await readFile(`${__dirname}/../utils/openZeppelin/ERC20/bin/ZeppelinContract.bin`)).toString();532  const ZEPPELIN_ABI = JSON.parse((await readFile(`${__dirname}/../utils/openZeppelin/ERC20/bin/ZeppelinContract.abi`)).toString());533534  const evmContract = await helper.ethNativeContract.collection(535    helper.ethAddress.fromCollectionId(collection.collectionId),536    'ft',537    ethSigner,538    true,539  );540541  res['createCollection'] = await helper.arrange.calculcateFeeGas(542    {Ethereum: ethSigner},543    () => helperContract.methods.createFTCollection('test', 18,'test','test').send({from: ethSigner, value: Number(2n * helper.balance.getOneTokenNominal())}),544  );545546  res['createCollection'].substrate = convertToTokens((await helper.arrange.calculcateFee(547    {Substrate: donor.address},548    () => helper.ft.mintCollection(549      donor,550      {name: 'test', description: 'test', tokenPrefix: 'test'},551      18,552    ),553  )));554555  res['createCollection'].zeppelin = await helper.arrange.calculcateFeeGas(556    {Ethereum: ethSigner},557    async () => {558      zeppelelinContract = await helper.ethContract.deployByAbi(559        ethSigner,560        ZEPPELIN_ABI,561        ZEPPELIN_OBJECT,562      );563    },564  );565566  res['mint'] =567    await helper.arrange.calculcateFeeGas(568      {Ethereum: ethSigner},569      () => evmContract.methods.mint(ethSigner, 1).send(),570    );571572  res['mint'].zeppelin =573    await helper.arrange.calculcateFeeGas(574      {Ethereum: ethSigner},575      () => zeppelelinContract!.methods.mint(ethSigner, 1).send(),576    );577578  res['mintCross'] =579    await helper.arrange.calculcateFeeGas(580      {Ethereum: ethSigner},581      () => evmContract.methods.mintCross(crossSigner, 1).send(),582    );583584  res['mintCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(585    {Substrate: donor.address},586    () => collection.mint(587      donor,588      10n,589      {Substrate: donor.address},590    ),591  )));592593  res['mintBulk'] =594    await helper.arrange.calculcateFeeGas(595      {Ethereum: ethSigner},596      () => evmContract.methods.mintBulk([{to: ethSigner, amount: 1}]).send(),597    );598599  res['mintBulk'].substrate = convertToTokens((await helper.arrange.calculcateFee(600    {Substrate: donor.address},601    () => helper.executeExtrinsic(donor, 'api.tx.unique.createMultipleItemsEx',[collection.collectionId, {602      Fungible: new Map([603        [JSON.stringify({Ethereum: ethSigner}), 1],604      ]),605    }], true),606  )));607608  res['transfer*'] =609    await helper.arrange.calculcateFeeGas(610      {Ethereum: ethSigner},611      () => evmContract.methods.transfer(ethReceiver, 1).send(),612    );613614  res['transfer*'].zeppelin =615    await helper.arrange.calculcateFeeGas(616      {Ethereum: ethSigner},617      () => zeppelelinContract!.methods.transfer(ethReceiver, 1).send(),618    );619620  res['transferCross'] =621    await helper.arrange.calculcateFeeGas(622      {Ethereum: ethReceiver},623      () => evmContract.methods.transferCross(crossSigner, 1).send({from: ethReceiver}),624    );625626  res['transferCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(627    {Substrate: donor.address},628    () => collection.transfer(629      donor,630      {Substrate: subReceiver.address},631      1n,632    ),633  )));634  await collection.approveTokens(subReceiver, {Substrate: donor.address}, 1n);635636  res['transferFrom*'] =637    await helper.arrange.calculcateFeeGas(638      {Ethereum: ethSigner},639      () => evmContract.methods.transferFrom(ethSigner, ethReceiver, 1).send(),640    );641642  await zeppelelinContract!.methods.approve(ethSigner, 10).send({from: ethReceiver});643644  res['transferFrom*'].zeppelin =645    await helper.arrange.calculcateFeeGas(646      {Ethereum: ethSigner},647      () => zeppelelinContract!.methods.transferFrom(ethReceiver, ethSigner, 1).send({from: ethSigner}),648    );649650  res['transferFromCross'] =651    await helper.arrange.calculcateFeeGas(652      {Ethereum: ethReceiver},653      () => evmContract.methods.transferFromCross(crossReceiver, crossSigner, 1).send({from:ethReceiver}),654    );655656  res['transferFromCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(657    {Substrate: donor.address},658    () => collection.transferFrom(donor, {Substrate: subReceiver.address}, {Substrate: donor.address}, 1n),659  )));660661662  res['burnTokens'] = {fee: 0n, gas: 0n};663  res['burnTokens'].substrate = convertToTokens((await helper.arrange.calculcateFee(664    {Substrate: donor.address},665    () => collection.burnTokens(donor, 1n),666  )));667668669  res['approve*'] =670    await helper.arrange.calculcateFeeGas(671      {Ethereum: ethSigner},672      () => evmContract.methods.approve(ethReceiver, 2).send(),673    );674675  res['approve*'].zeppelin =676    await helper.arrange.calculcateFeeGas(677      {Ethereum: ethSigner},678      () => zeppelelinContract!.methods.approve(ethReceiver, 10).send(),679    );680681  res['approveCross'] =682    await helper.arrange.calculcateFeeGas(683      {Ethereum: ethSigner},684      () => evmContract.methods.approveCross(crossReceiver, 2).send(),685    );686687  res['approveCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(688    {Substrate: donor.address},689    () => collection.approveTokens(donor, {Substrate: subReceiver.address}, 1n),690  )));691692  res['burnFromCross'] =693    await helper.arrange.calculcateFeeGas(694      {Ethereum: ethReceiver},695      () => evmContract.methods.burnFromCross(crossSigner, 1).send({from:ethReceiver}),696    );697698  res['burnFromCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(699    {Substrate: subReceiver.address},700    () => collection.burnTokensFrom(subReceiver, {Substrate: donor.address}, 1n),701  )));702703  res['setCollectionSponsorCross'] =704    await helper.arrange.calculcateFeeGas(705      {Ethereum: ethSigner},706      () =>  evmContract.methods.setCollectionSponsorCross(crossReceiver).send(),707    );708709  res['confirmCollectionSponsorship'] =710    await helper.arrange.calculcateFeeGas(711      {Ethereum: ethReceiver},712      () =>  evmContract.methods.confirmCollectionSponsorship().send({from: ethReceiver}),713    );714715  res['removeCollectionSponsor'] =716    await helper.arrange.calculcateFeeGas(717      {Ethereum: ethSigner},718      () =>  evmContract.methods.removeCollectionSponsor().send(),719    );720721  res['setCollectionSponsorCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(722    {Substrate: donor.address},723    () => collection.setSponsor(donor, subReceiver.address),724  )));725726  res['confirmCollectionSponsorship'].substrate = convertToTokens((await helper.arrange.calculcateFee(727    {Substrate: subReceiver.address},728    () => collection.confirmSponsorship(subReceiver),729  )));730731  res['removeCollectionSponsor'].substrate = convertToTokens((await helper.arrange.calculcateFee(732    {Substrate: donor.address},733    () => collection.removeSponsor(donor),734  )));735736  res['setCollectionProperties'] =737    await helper.arrange.calculcateFeeGas(738      {Ethereum: ethSigner},739      () => evmContract.methods.setCollectionProperties(PROPERTIES.slice(0, 1)).send(),740    );741742  res['deleteCollectionProperties'] =743    await helper.arrange.calculcateFeeGas(744      {Ethereum: ethSigner},745      () =>  evmContract.methods.deleteCollectionProperties(PROPERTIES.slice(0,1).map(p => p.key)).send(),746    );747  res['setCollectionProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(748    {Substrate: donor.address},749    () => collection.setProperties(donor, PROPERTIES.slice(0, 1)750      .map(p => { return {key: p.key, value: p.value.toString()}; })),751  )));752753  res['deleteCollectionProperties'].substrate = convertToTokens((await helper.arrange.calculcateFee(754    {Substrate: donor.address},755    () => collection.deleteProperties(donor, PROPERTIES.slice(0, 1)756      .map(p => p.key)),757  )));758759  res['setCollectionLimit'] =760    await helper.arrange.calculcateFeeGas(761      {Ethereum: ethSigner},762      () =>  evmContract.methods.setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}).send(),763    );764765  res['setCollectionLimit'].substrate = convertToTokens((await helper.arrange.calculcateFee(766    {Substrate: donor.address},767    () => collection.setLimits(donor, {accountTokenOwnershipLimit: 1000}),768  )));769770  const {collectionAddress} = await helper.eth.createCollection('nft', ethSigner, 'A', 'B', 'C');771  const collectionWithEthOwner = await helper.ethNativeContract.collection(collectionAddress, 'nft', ethSigner, true);772773774  res['addCollectionAdminCross'] =775    await helper.arrange.calculcateFeeGas(776      {Ethereum: ethSigner},777      () =>  collectionWithEthOwner.methods.addCollectionAdminCross(crossReceiver).send(),778    );779780  res['removeCollectionAdminCross'] =781    await helper.arrange.calculcateFeeGas(782      {Ethereum: ethSigner},783      () =>  collectionWithEthOwner.methods.removeCollectionAdminCross(crossReceiver).send(),784    );785786  res['addCollectionAdminCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(787    {Substrate: donor.address},788    () => collection.addAdmin(donor, {Ethereum: ethReceiver}),789  )));790791  res['removeCollectionAdminCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(792    {Substrate: donor.address},793    () => collection.removeAdmin(donor, {Ethereum: ethReceiver}),794  )));795796  res['setCollectionNesting'] =797    await helper.arrange.calculcateFeeGas(798      {Ethereum: ethSigner},799      () =>  evmContract.methods.setCollectionNesting(true).send(),800    );801802  res['setCollectionNesting[]'] =803    await helper.arrange.calculcateFeeGas(804      {Ethereum: ethSigner},805      () =>  evmContract.methods.setCollectionNesting(true, [collectionAddress]).send(),806    );807808  res['setCollectionNesting'].substrate = convertToTokens((await helper.arrange.calculcateFee(809    {Substrate: donor.address},810    () => collection.disableNesting(donor),811  )));812813  res['setCollectionNesting[]'].substrate = convertToTokens((await helper.arrange.calculcateFee(814    {Substrate: donor.address},815    () => collection.setPermissions(816      donor,817      {818        nesting: {819          tokenOwner: true,820          restricted: [collection.collectionId],821        },822      },823    ),824  )));825826  res['setCollectionAccess'] =827    await helper.arrange.calculcateFeeGas(828      {Ethereum: ethSigner},829      () =>  evmContract.methods.setCollectionAccess(1).send(),830    );831832  res['setCollectionAccess'].substrate = convertToTokens((await helper.arrange.calculcateFee(833    {Substrate: donor.address},834    () => collection.setPermissions(donor, {access: 'AllowList'}),835  )));836837  res['addToCollectionAllowListCross'] =838    await helper.arrange.calculcateFeeGas(839      {Ethereum: ethSigner},840      () =>  evmContract.methods.addToCollectionAllowListCross(crossReceiver).send(),841    );842843  res['removeFromCollectionAllowListCross'] =844    await helper.arrange.calculcateFeeGas(845      {Ethereum: ethSigner},846      () =>  evmContract.methods.removeFromCollectionAllowListCross(crossReceiver).send(),847    );848849  res['addToCollectionAllowListCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(850    {Substrate: donor.address},851    () => collection.addToAllowList(donor, {Ethereum: ethReceiver}),852  )));853854  res['removeFromCollectionAllowListCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(855    {Substrate: donor.address},856    () => collection.removeFromAllowList(donor, {Ethereum: ethReceiver}),857  )));858859  res['setCollectionMintMode'] =860    await helper.arrange.calculcateFeeGas(861      {Ethereum: ethSigner},862      () =>  evmContract.methods.setCollectionMintMode(true).send(),863    );864865  res['setCollectionMintMode'].substrate = convertToTokens((await helper.arrange.calculcateFee(866    {Substrate: donor.address},867    () => collection.setPermissions(donor, {mintMode: false}),868  )));869870  res['changeCollectionOwnerCross'] =871    await helper.arrange.calculcateFeeGas(872      {Ethereum: ethSigner},873      () =>  collectionWithEthOwner.methods.changeCollectionOwnerCross(crossReceiver).send(),874    );875876  res['changeCollectionOwnerCross'].substrate = convertToTokens((await helper.arrange.calculcateFee(877    {Substrate: donor.address},878    () => collection.changeOwner(donor, subReceiver.address),879  )));880881  return res;882}