From e70b541dd2d182e0f115bc45d63cf4665a28d71d Mon Sep 17 00:00:00 2001 From: steven2308 Date: Tue, 9 Jan 2024 15:44:00 -0500 Subject: [PATCH 1/3] Migration to ethers-v6 in progress. --- hardhat.config.ts | 9 +- package.json | 63 +- scripts/deploy_bulkWriter.ts | 10 +- scripts/deploy_catalogUtils.ts | 8 +- scripts/deploy_collectionUtils.ts | 6 +- scripts/deploy_emotable.ts | 32 + scripts/deploy_renderUtils.ts | 10 +- scripts/deploy_royaltiesSplitter.ts | 35 + scripts/deploy_tokenAttributesRepo.ts | 34 + test/behavior/catalog.ts | 4 +- test/behavior/equippableAssets.ts | 102 +- test/behavior/equippableParts.ts | 56 +- test/behavior/equippableSlots.ts | 205 +- test/behavior/erc721.ts | 325 +- test/behavior/metadata.ts | 6 +- test/behavior/mintingImpl.ts | 4 +- test/behavior/multiasset.ts | 98 +- test/behavior/nestable.ts | 712 +- test/behavior/ownableLock.ts | 4 +- test/behavior/royalties.ts | 12 +- test/bulkWriter.ts | 222 +- test/catalogUtils.ts | 154 +- test/collectionUtils.ts | 128 +- test/emotableRepository.ts | 483 +- test/equippable.ts | 31 +- test/extensions/multiAssetAutoIndex.ts | 6 +- test/extensions/nestableAutoIndex.ts | 152 +- test/extensions/reclaimableChild.ts | 162 +- test/extensions/revealable.ts | 18 +- test/extensions/soulbound.ts | 79 +- test/extensions/tokenAttributesRepository.ts | 3593 +++++----- test/extensions/tokenHolder.ts | 127 +- test/extensions/typedMultiasset.ts | 18 +- test/implementations/base.ts | 60 +- test/implementations/catalog.ts | 20 +- test/implementations/generalBehavior.ts | 138 +- test/implementations/lazyMintErc20Pay.ts | 59 +- .../implementations/lazyMintNativeTokenPay.ts | 29 +- test/implementations/premint.ts | 24 +- test/kanariaUtils.ts | 9 +- test/minifiedEquippable.ts | 31 +- test/multiasset.ts | 58 +- test/nestable.ts | 60 +- test/nestableMultiasset.ts | 32 +- test/nestableSecTests.ts | 14 +- test/ownableLock.ts | 2 +- test/renderUtils.ts | 595 +- test/royaltiesSplitter.ts | 66 +- test/setup/equippableParts.ts | 105 +- test/setup/equippableSlots.ts | 81 +- test/utils.ts | 110 +- yarn.lock | 5996 ++--------------- 52 files changed, 5244 insertions(+), 9153 deletions(-) create mode 100644 scripts/deploy_emotable.ts create mode 100644 scripts/deploy_royaltiesSplitter.ts create mode 100644 scripts/deploy_tokenAttributesRepo.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index ae0b89ad..ad423c9f 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,11 +1,10 @@ import * as dotenv from 'dotenv'; import { HardhatUserConfig, task } from 'hardhat/config'; -import '@nomiclabs/hardhat-etherscan'; -import '@nomicfoundation/hardhat-chai-matchers'; -import '@typechain/hardhat'; -import 'hardhat-gas-reporter'; -import 'solidity-coverage'; +// import '@nomiclabs/hardhat-etherscan'; +import '@nomicfoundation/hardhat-ethers'; +// import '@nomicfoundation/hardhat-chai-matchers'; +import '@nomicfoundation/hardhat-toolbox'; import 'hardhat-contract-sizer'; import '@primitivefi/hardhat-dodoc'; diff --git a/package.json b/package.json index a9772854..525d3119 100644 --- a/package.json +++ b/package.json @@ -16,49 +16,30 @@ "node": ">=16.0.0" }, "dependencies": { - "@openzeppelin/contracts": "^5.0.0" - }, - "devDependencies": { - "@defi-wonderland/smock": "^2.3.4", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.1", - "@nomicfoundation/hardhat-network-helpers": "^1.0.7", - "@nomiclabs/hardhat-ethers": "^2.2.1", - "@nomiclabs/hardhat-etherscan": "^3.1.3", - "@openzeppelin/test-helpers": "^0.5.16", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.3", + "@nomicfoundation/hardhat-ethers": "^3.0.5", + "@nomicfoundation/hardhat-network-helpers": "^1.0.10", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.3", + "@nomiclabs/hardhat-etherscan": "^3.1.8", + "@openzeppelin/contracts": "^5.0.0", "@primitivefi/hardhat-dodoc": "^0.2.3", - "@typechain/ethers-v5": "^10.1.1", - "@typechain/hardhat": "^6.1.4", - "@types/chai": "^4.3.4", - "@types/mocha": "^10.0.1", - "@types/node": "^18.11.10", - "@types/rimraf": "^3.0.2", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "chai": "^4.3.6", - "dotenv": "^16.0.3", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.5.1", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", - "ethers": "^5.7.2", - "hardhat": "^2.17.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "@types/chai": "^4.3.11", + "@types/mocha": "^10.0.6", + "@types/node": "^20.10.8", + "chai": "^4.2.0", + "dotenv": "^16.3.1", + "ethers": "^6.9.2", + "hardhat": "^2.19.4", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.9", - "prettier": "2.8.0", - "prettier-plugin-solidity": "^1.1.3", - "rimraf": "^3.0.2", - "solc": "^0.8.21", - "solhint": "^3.3.7", - "solidity-coverage": "^0.8.4", - "ts-node": "^10.9.1", - "typechain": "^8.1.1", - "typescript": "^4.9.3", - "walk-sync": "^3.0.0" + "solidity-coverage": "^0.8.6-sha1.0", + "squirrelly": "^8.0.8", + "ts-node": "^11.0.0-beta.1", + "typechain": "^8.3.2", + "typescript": "^5.3.3" }, - "resolutions": { - "@solidity-parser/parser": "0.16.0" - } + "devDependencies": {} } diff --git a/scripts/deploy_bulkWriter.ts b/scripts/deploy_bulkWriter.ts index 964f7ed5..70a350cd 100644 --- a/scripts/deploy_bulkWriter.ts +++ b/scripts/deploy_bulkWriter.ts @@ -1,4 +1,4 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers, run } from 'hardhat'; export const sleep = (ms: number): Promise => { @@ -10,16 +10,16 @@ export const sleep = (ms: number): Promise => { async function main() { const accounts: SignerWithAddress[] = await ethers.getSigners(); const owner = accounts[0]; - console.log('Deployer address: ' + owner.address); + console.log('Deployer address: ' + (await owner.getAddress())); // We get the contract to deploy const factory = await ethers.getContractFactory('RMRKBulkWriter'); const bulkwriter = await factory.deploy(); - await bulkwriter.deployed(); - console.log('RMRK Bulk Writer deployed to:', bulkwriter.address); + await bulkwriter.waitForDeployment(); + console.log('RMRK Bulk Writer deployed to:', await bulkwriter.getAddress()); await sleep(1000); await run('verify:verify', { - address: bulkwriter.address, + address: await bulkwriter.getAddress(), constructorArguments: [], }); } diff --git a/scripts/deploy_catalogUtils.ts b/scripts/deploy_catalogUtils.ts index e1f0b317..23db4f17 100644 --- a/scripts/deploy_catalogUtils.ts +++ b/scripts/deploy_catalogUtils.ts @@ -11,7 +11,7 @@ async function main() { // // Send eth to this address:0xfbea1b97406c6945d07f50f588e54144ea8b684f // let tx = { // to: '0xfbea1b97406c6945d07f50f588e54144ea8b684f', - // value: ethers.utils.parseEther('0.03'), + // value: ethers.parseEther('0.03'), // nonce: 235, // }; // const [signer] = await ethers.getSigners(); @@ -21,12 +21,12 @@ async function main() { const catalogUtilsFactory = await ethers.getContractFactory('RMRKCatalogUtils'); const catalogUtils = await catalogUtilsFactory.deploy(); - await catalogUtils.deployed(); - console.log('RMRK Catalog Utils deployed to:', catalogUtils.address); + await catalogUtils.waitForDeployment(); + console.log('RMRK Catalog Utils deployed to:', await catalogUtils.getAddress()); await sleep(1000); await run('verify:verify', { - address: catalogUtils.address, + address: await catalogUtils.getAddress(), constructorArguments: [], }); } diff --git a/scripts/deploy_collectionUtils.ts b/scripts/deploy_collectionUtils.ts index 293e26cd..b8e566e9 100644 --- a/scripts/deploy_collectionUtils.ts +++ b/scripts/deploy_collectionUtils.ts @@ -10,12 +10,12 @@ async function main() { // We get the contract to deploy const collectionUtilsFactory = await ethers.getContractFactory('RMRKCollectionUtils'); const collectionUtils = await collectionUtilsFactory.deploy(); - await collectionUtils.deployed(); - console.log('RMRK Collection Utils deployed to:', collectionUtils.address); + await collectionUtils.waitForDeployment(); + console.log('RMRK Collection Utils deployed to:', await collectionUtils.getAddress()); await sleep(1000); await run('verify:verify', { - address: collectionUtils.address, + address: await collectionUtils.getAddress(), constructorArguments: [], }); } diff --git a/scripts/deploy_emotable.ts b/scripts/deploy_emotable.ts new file mode 100644 index 00000000..e638e7e2 --- /dev/null +++ b/scripts/deploy_emotable.ts @@ -0,0 +1,32 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { ethers, run } from 'hardhat'; + +export const sleep = (ms: number): Promise => { + return new Promise((resolve) => { + setTimeout(() => resolve(), ms); + }); +}; + +async function main() { + const accounts: SignerWithAddress[] = await ethers.getSigners(); + const owner = accounts[0]; + console.log('Deployer address: ' + (await owner.getAddress())); + // We get the contract to deploy + const emotableRepoFactory = await ethers.getContractFactory('RMRKEmotesRepository'); + const emotableRepo = await emotableRepoFactory.deploy(); + await emotableRepo.waitForDeployment(); + console.log('RMRKEmotesRepository deployed to:', await emotableRepo.getAddress()); + await sleep(1000); + + await run('verify:verify', { + address: await emotableRepo.getAddress(), + constructorArguments: [], + }); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/deploy_renderUtils.ts b/scripts/deploy_renderUtils.ts index 3d98ffaf..5c6a5ef0 100644 --- a/scripts/deploy_renderUtils.ts +++ b/scripts/deploy_renderUtils.ts @@ -1,4 +1,4 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers, run } from 'hardhat'; export const sleep = (ms: number): Promise => { @@ -10,16 +10,16 @@ export const sleep = (ms: number): Promise => { async function main() { const accounts: SignerWithAddress[] = await ethers.getSigners(); const owner = accounts[0]; - console.log('Deployer address: ' + owner.address); + console.log('Deployer address: ' + (await owner.getAddress())); // We get the contract to deploy const renderUtilsFactory = await ethers.getContractFactory('RMRKEquipRenderUtils'); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); - console.log('RMRK Equip Render Utils deployed to:', renderUtils.address); + await renderUtils.waitForDeployment(); + console.log('RMRK Equip Render Utils deployed to:', await renderUtils.getAddress()); await sleep(1000); await run('verify:verify', { - address: renderUtils.address, + address: await renderUtils.getAddress(), constructorArguments: [], }); } diff --git a/scripts/deploy_royaltiesSplitter.ts b/scripts/deploy_royaltiesSplitter.ts new file mode 100644 index 00000000..dcd36352 --- /dev/null +++ b/scripts/deploy_royaltiesSplitter.ts @@ -0,0 +1,35 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { ethers, run } from 'hardhat'; + +export const sleep = (ms: number): Promise => { + return new Promise((resolve) => { + setTimeout(() => resolve(), ms); + }); +}; + +async function main() { + const accounts: SignerWithAddress[] = await ethers.getSigners(); + const owner = accounts[0]; + console.log('Deployer address: ' + (await owner.getAddress())); + // We get the contract to deploy + const royaltiesSplitterFactory = await ethers.getContractFactory('RMRKRoyaltiesSplitter'); + const royaltiesSplitter = await royaltiesSplitterFactory.deploy( + ['0x147d79f1c9244b85cba959262fb71ad38069febb', '0xacD3d4b7b0706d39e6cA6E8c75dDdD446b8cdB1D'], + [7000, 3000], + ); + await royaltiesSplitter.waitForDeployment(); + console.log('RMRK Royalties Splitter deployed to:', await royaltiesSplitter.getAddress()); + await sleep(10000); + + await run('verify:verify', { + address: await royaltiesSplitter.getAddress(), + constructorArguments: [], + }); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/deploy_tokenAttributesRepo.ts b/scripts/deploy_tokenAttributesRepo.ts new file mode 100644 index 00000000..9945dbd4 --- /dev/null +++ b/scripts/deploy_tokenAttributesRepo.ts @@ -0,0 +1,34 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { ethers, run } from 'hardhat'; + +export const sleep = (ms: number): Promise => { + return new Promise((resolve) => { + setTimeout(() => resolve(), ms); + }); +}; + +async function main() { + const accounts: SignerWithAddress[] = await ethers.getSigners(); + const owner = accounts[0]; + console.log('Deployer address: ' + (await owner.getAddress())); + // We get the contract to deploy + const tokenAttributesRepoFactory = await ethers.getContractFactory( + 'RMRKTokenAttributesRepository', + ); + const tokenAttributesRepo = await tokenAttributesRepoFactory.deploy(); + await tokenAttributesRepo.waitForDeployment(); + console.log('RMRKTokenAttributesRepository deployed to:', await tokenAttributesRepo.getAddress()); + await sleep(10000); + + await run('verify:verify', { + address: await tokenAttributesRepo.getAddress(), + constructorArguments: [], + }); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/behavior/catalog.ts b/test/behavior/catalog.ts index 85754a6d..eb5a0e4e 100644 --- a/test/behavior/catalog.ts +++ b/test/behavior/catalog.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { Contract } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { IOtherInterface, IERC165, IRMRKCatalog } from '../interfaces'; async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string, type: string) { @@ -34,7 +34,7 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string const Catalog = await ethers.getContractFactory(contractName); testCatalog = await Catalog.deploy(metadataURI, type); - await testCatalog.deployed(); + await testCatalog.waitForDeployment(); }); describe('Init Catalog', async function () { diff --git a/test/behavior/equippableAssets.ts b/test/behavior/equippableAssets.ts index c156f070..faf8cebc 100644 --- a/test/behavior/equippableAssets.ts +++ b/test/behavior/equippableAssets.ts @@ -1,12 +1,12 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract } from 'ethers'; import { ADDRESS_ZERO, bn } from '../utils'; import { IERC165, IERC6220, IOtherInterface } from '../interfaces'; async function shouldBehaveLikeEquippableAssets( - mint: (token: Contract, to: string) => Promise, + mint: (token: Contract, to: string) => Promise, ) { let chunky: Contract; let chunkyEquip: Contract; @@ -58,7 +58,7 @@ async function shouldBehaveLikeEquippableAssets( }); it('cannot get extended assets for non existing asset or non existing token', async function () { - const tokenId = await mint(chunkyEquip, owner.address); + const tokenId = await mint(chunkyEquip, await owner.getAddress()); const resId = 1; await chunkyEquip.addEquippableAssetEntry( resId, @@ -72,7 +72,7 @@ async function shouldBehaveLikeEquippableAssets( chunkyEquip.getAssetAndEquippableData(tokenId, resId + 1), ).to.be.revertedWithCustomError(chunkyEquip, 'RMRKTokenDoesNotHaveAsset'); await expect( - chunkyEquip.getAssetAndEquippableData(tokenId.add(1), resId), + chunkyEquip.getAssetAndEquippableData(tokenId + 1n, resId), ).to.be.revertedWithCustomError(chunkyEquip, 'RMRKTokenDoesNotHaveAsset'); }); @@ -164,7 +164,7 @@ async function shouldBehaveLikeEquippableAssets( it('can add asset to token', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await expect(chunkyEquip.addAssetToToken(tokenId, resId, 0)).to.emit( chunkyEquip, @@ -180,7 +180,7 @@ async function shouldBehaveLikeEquippableAssets( it('cannot add non existing asset to token', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await expect(chunkyEquip.addAssetToToken(tokenId, resId, 0)).to.be.revertedWithCustomError( chunkyEquip, 'RMRKNoAssetMatchingId', @@ -189,19 +189,19 @@ async function shouldBehaveLikeEquippableAssets( it('can add asset to non existing token and it is pending when minted', async function () { const resId = bn(1); - const lastTokenId = await mint(chunky, owner.address); - const nextTokenId = lastTokenId.add(1); // not existing yet + const lastTokenId = await mint(chunky, await owner.getAddress()); + const nextTokenId = lastTokenId + 1n; // not existing yet await addAssets([resId]); await chunkyEquip.addAssetToToken(nextTokenId, resId, 0); - await mint(chunky, owner.address); + await mint(chunky, await owner.getAddress()); expect(await chunkyEquip.getPendingAssets(nextTokenId)).to.eql([resId]); }); it('cannot add asset twice to the same token', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await expect(chunkyEquip.addAssetToToken(tokenId, resId, 0)).to.be.revertedWithCustomError( @@ -211,7 +211,7 @@ async function shouldBehaveLikeEquippableAssets( }); it('cannot add too many assets to the same token', async function () { - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); for (let i = 1; i <= 128; i++) { await addAssets([bn(i)]); await chunkyEquip.addAssetToToken(tokenId, i, 0); @@ -228,8 +228,8 @@ async function shouldBehaveLikeEquippableAssets( it('can add same asset to 2 different tokens', async function () { const resId = bn(1); - const tokenId1 = await mint(chunky, owner.address); - const tokenId2 = await mint(chunky, owner.address); + const tokenId1 = await mint(chunky, await owner.getAddress()); + const tokenId2 = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId1, resId, 0); @@ -243,7 +243,7 @@ async function shouldBehaveLikeEquippableAssets( describe('Accepting assets', async function () { it('can accept asset', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await expect(chunkyEquip.acceptAsset(tokenId, 0, resId)) @@ -257,7 +257,7 @@ async function shouldBehaveLikeEquippableAssets( it('can accept multiple assets', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.addAssetToToken(tokenId, resId2, 0); @@ -275,9 +275,9 @@ async function shouldBehaveLikeEquippableAssets( // approved not implemented yet it('can accept asset if approved', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); const approvedAddress = addrs[1]; - await chunkyEquip.approveForAssets(approvedAddress.address, tokenId); + await chunkyEquip.approveForAssets(await approvedAddress.getAddress(), tokenId); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); @@ -288,7 +288,7 @@ async function shouldBehaveLikeEquippableAssets( it('cannot accept asset twice', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.acceptAsset(tokenId, 0, resId); @@ -301,7 +301,7 @@ async function shouldBehaveLikeEquippableAssets( it('cannot accept asset if not owner', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await expect( @@ -310,7 +310,7 @@ async function shouldBehaveLikeEquippableAssets( }); it('cannot accept non existing asset', async function () { - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await expect(chunkyEquip.acceptAsset(tokenId, 0, 0)).to.be.revertedWithCustomError( chunkyEquip, 'RMRKIndexOutOfRange', @@ -322,7 +322,7 @@ async function shouldBehaveLikeEquippableAssets( it('can add asset to token replacing an existing one', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.acceptAsset(tokenId, 0, resId); @@ -346,7 +346,7 @@ async function shouldBehaveLikeEquippableAssets( it('can replace non existing asset to token, it could have been deleted', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 1); await chunkyEquip.acceptAsset(tokenId, 0, resId); @@ -359,7 +359,7 @@ async function shouldBehaveLikeEquippableAssets( describe('Rejecting assets', async function () { it('can reject asset', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); @@ -375,7 +375,7 @@ async function shouldBehaveLikeEquippableAssets( it('can reject asset and replacements are cleared', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.acceptAsset(tokenId, 0, resId); @@ -390,8 +390,8 @@ async function shouldBehaveLikeEquippableAssets( it('can reject asset if approved', async function () { const resId = bn(1); const approvedAddress = addrs[1]; - const tokenId = await mint(chunky, owner.address); - await chunkyEquip.approveForAssets(approvedAddress.address, tokenId); + const tokenId = await mint(chunky, await owner.getAddress()); + await chunkyEquip.approveForAssets(await approvedAddress.getAddress(), tokenId); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); @@ -406,7 +406,7 @@ async function shouldBehaveLikeEquippableAssets( it('can reject all assets', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.addAssetToToken(tokenId, resId2, 0); @@ -420,7 +420,7 @@ async function shouldBehaveLikeEquippableAssets( it('can reject all assets and replacements are cleared', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.acceptAsset(tokenId, 0, resId); @@ -433,7 +433,7 @@ async function shouldBehaveLikeEquippableAssets( }); it('can reject all pending assets at max capacity', async function () { - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); const resArr = []; for (let i = 1; i < 128; i++) { @@ -452,10 +452,10 @@ async function shouldBehaveLikeEquippableAssets( it('can reject all assets if approved', async function () { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); const approvedAddress = addrs[1]; - await chunkyEquip.approveForAssets(approvedAddress.address, tokenId); + await chunkyEquip.approveForAssets(await approvedAddress.getAddress(), tokenId); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.addAssetToToken(tokenId, resId2, 0); @@ -471,7 +471,7 @@ async function shouldBehaveLikeEquippableAssets( it('cannot reject asset twice', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.rejectAsset(tokenId, 0, resId); @@ -484,7 +484,7 @@ async function shouldBehaveLikeEquippableAssets( it('cannot reject asset nor reject all if not owner', async function () { const resId = bn(1); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); @@ -497,7 +497,7 @@ async function shouldBehaveLikeEquippableAssets( }); it('cannot reject non existing asset', async function () { - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await expect(chunkyEquip.rejectAsset(tokenId, 0, 0)).to.be.revertedWithCustomError( chunkyEquip, 'RMRKIndexOutOfRange', @@ -520,7 +520,7 @@ async function shouldBehaveLikeEquippableAssets( const approvedAddress = addrs[1]; const tokenId = await addAssetsToToken(); - await chunkyEquip.approveForAssets(approvedAddress.address, tokenId); + await chunkyEquip.approveForAssets(await approvedAddress.getAddress(), tokenId); expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); await expect(chunkyEquip.connect(approvedAddress).setPriority(tokenId, [1, 0])) @@ -561,14 +561,16 @@ async function shouldBehaveLikeEquippableAssets( const tokenOwner = addrs[1]; const newOwner = addrs[2]; const approved = addrs[3]; - const tokenId = await mint(chunky, tokenOwner.address); - await chunky.connect(tokenOwner).approve(approved.address, tokenId); - await chunkyEquip.connect(tokenOwner).approveForAssets(approved.address, tokenId); + const tokenId = await mint(chunky, await tokenOwner.getAddress()); + await chunky.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await chunkyEquip.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await chunky.getApproved(tokenId)).to.eql(approved.address); - expect(await chunkyEquip.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await chunky.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await chunkyEquip.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); - await chunky.connect(tokenOwner).transferFrom(tokenOwner.address, newOwner.address, tokenId); + await chunky + .connect(tokenOwner) + .transferFrom(await tokenOwner.getAddress(), await newOwner.getAddress(), tokenId); expect(await chunky.getApproved(tokenId)).to.eql(ADDRESS_ZERO); expect(await chunkyEquip.getApprovedForAssets(tokenId)).to.eql(ADDRESS_ZERO); @@ -577,12 +579,12 @@ async function shouldBehaveLikeEquippableAssets( it('cleans token and assets approvals on burn', async function () { const tokenOwner = addrs[1]; const approved = addrs[3]; - const tokenId = await mint(chunky, tokenOwner.address); - await chunky.connect(tokenOwner).approve(approved.address, tokenId); - await chunkyEquip.connect(tokenOwner).approveForAssets(approved.address, tokenId); + const tokenId = await mint(chunky, await tokenOwner.getAddress()); + await chunky.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await chunkyEquip.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await chunky.getApproved(tokenId)).to.eql(approved.address); - expect(await chunkyEquip.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await chunky.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await chunkyEquip.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); await chunky.connect(tokenOwner)['burn(uint256)'](tokenId); @@ -597,7 +599,7 @@ async function shouldBehaveLikeEquippableAssets( }); }); - async function addAssets(ids: BigNumber[]): Promise { + async function addAssets(ids: bigint[]): Promise { for (let i = 0; i < ids.length; i++) { await chunkyEquip.addEquippableAssetEntry( ids[i], @@ -609,10 +611,10 @@ async function shouldBehaveLikeEquippableAssets( } } - async function addAssetsToToken(): Promise { + async function addAssetsToToken(): Promise { const resId = bn(1); const resId2 = bn(2); - const tokenId = await mint(chunky, owner.address); + const tokenId = await mint(chunky, await owner.getAddress()); await addAssets([resId, resId2]); await chunkyEquip.addAssetToToken(tokenId, resId, 0); await chunkyEquip.addAssetToToken(tokenId, resId2, 0); diff --git a/test/behavior/equippableParts.ts b/test/behavior/equippableParts.ts index f78a1c82..20a20bf2 100644 --- a/test/behavior/equippableParts.ts +++ b/test/behavior/equippableParts.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { Contract } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { partIdForHead1, partIdForBody1, @@ -56,26 +56,24 @@ async function shouldBehaveLikeEquippableWithParts() { neonResIds[0], partIdForMask, masks[0], - maskContract.address, + await maskContract.getAddress(), weaponResId, ); // All part slots are included on the response: const expectedSlots = [bn(partIdForMask)]; const expectedEquips = [ - [bn(neonResIds[0]), bn(weaponResId), bn(masks[0]), maskContract.address], + [bn(neonResIds[0]), bn(weaponResId), bn(masks[0]), await maskContract.getAddress()], ]; const expectedMetadata = ['ipfs:weapon/equip/5']; - expect(await viewContract.getEquipped(neonContract.address, neons[0], neonResIds[0])).to.eql([ - expectedSlots, - expectedEquips, - expectedMetadata, - ]); + expect( + await viewContract.getEquipped(await neonContract.getAddress(), neons[0], neonResIds[0]), + ).to.eql([expectedSlots, expectedEquips, expectedMetadata]); // Child is marked as equipped: - expect(await neonContract.isChildEquipped(neons[0], maskContract.address, masks[0])).to.eql( - true, - ); + expect( + await neonContract.isChildEquipped(neons[0], await maskContract.getAddress(), masks[0]), + ).to.eql(true); }); it('cannot equip non existing child in slot', async function () { @@ -101,17 +99,17 @@ async function shouldBehaveLikeEquippableWithParts() { const expectedFixedParts = [ [ bn(partIdForHead1), // partId - 1, // z + 1n, // z 'ipfs://head1.png', // metadataURI ], [ bn(partIdForBody1), // partId - 1, // z + 1n, // z 'ipfs://body1.png', // metadataURI ], [ bn(partIdForHair1), // partId - 2, // z + 2n, // z 'ipfs://hair1.png', // metadataURI ], ]; @@ -119,22 +117,22 @@ async function shouldBehaveLikeEquippableWithParts() { [ bn(partIdForMask), // partId bn(maskAssetsEquip[0]), // childAssetId - 2, // z - maskContract.address, // childAddress - bn(masks[0]), // childTokenId + 2n, // z + await maskContract.getAddress(), // childAddress + masks[0], // childTokenId 'ipfs:weapon/equip/5', // childAssetMetadata '', // partMetadata ], ]; const allAssets = await viewContract.composeEquippables( - neonContract.address, + await neonContract.getAddress(), neons[0], neonResIds[0], ); expect(allAssets).to.eql([ 'ipfs:neonRes/1', // metadataURI bn(0), // equippableGroupId - catalogContract.address, // catalogAddress, + await catalogContract.getAddress(), // catalogAddress, expectedFixedParts, expectedSlotParts, ]); @@ -144,29 +142,29 @@ async function shouldBehaveLikeEquippableWithParts() { const expectedFixedParts = [ [ bn(partIdForMaskCatalog1), // partId - 3, // z + 3n, // z 'ipfs://maskCatalog1.png', // metadataURI ], [ bn(partIdForHorns1), // partId - 5, // z + 5n, // z 'ipfs://horn1.png', // metadataURI ], [ bn(partIdForEars1), // partId - 4, // z + 4n, // z 'ipfs://ears1.png', // metadataURI ], ]; const allAssets = await viewContract.composeEquippables( - maskContract.address, + await maskContract.getAddress(), masks[0], maskAssetsEquip[0], ); expect(allAssets).to.eql([ `ipfs:weapon/equip/${maskAssetsEquip[0]}`, // metadataURI bn(maskEquippableGroupId), // equippableGroupId - catalogContract.address, // catalogAddress + await catalogContract.getAddress(), // catalogAddress expectedFixedParts, [], ]); @@ -175,7 +173,7 @@ async function shouldBehaveLikeEquippableWithParts() { it('cannot compose equippables for neon with not associated asset', async function () { const wrongResId = maskAssetsEquip[1]; await expect( - viewContract.composeEquippables(maskContract.address, masks[0], wrongResId), + viewContract.composeEquippables(await maskContract.getAddress(), masks[0], wrongResId), ).to.be.revertedWithCustomError(maskContract, 'RMRKTokenDoesNotHaveAsset'); }); @@ -184,14 +182,18 @@ async function shouldBehaveLikeEquippableWithParts() { await maskContract.addEquippableAssetEntry( noCatalogAssetId, 0, // Not meant to equip - ethers.constants.AddressZero, // Not meant to equip + ethers.ZeroAddress, // Not meant to equip `ipfs:weapon/full/customAsset.png`, [], ); await maskContract.addAssetToToken(masks[0], noCatalogAssetId, 0); await maskContract.connect(addrs[0]).acceptAsset(masks[0], 0, noCatalogAssetId); await expect( - viewContract.composeEquippables(maskContract.address, masks[0], noCatalogAssetId), + viewContract.composeEquippables( + await maskContract.getAddress(), + masks[0], + noCatalogAssetId, + ), ).to.be.revertedWithCustomError(viewContract, 'RMRKNotComposableAsset'); }); }); diff --git a/test/behavior/equippableSlots.ts b/test/behavior/equippableSlots.ts index 09f421a2..9c46b138 100644 --- a/test/behavior/equippableSlots.ts +++ b/test/behavior/equippableSlots.ts @@ -1,7 +1,6 @@ import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { Contract } from 'ethers'; import { partIdForBody, @@ -29,7 +28,7 @@ import { bn } from '../utils'; // Background will have a single asset for each, it can be used as full view and to equip // Weapon Gems will have 2 enumerated assets, one for full view, one for equipping. async function shouldBehaveLikeEquippableWithSlots( - nestMint: (token: Contract, to: string, parentId: BigNumber) => Promise, + nestMint: (token: Contract, to: string, parentId: bigint) => Promise, ) { let catalog: Contract; let soldier: Contract; @@ -57,7 +56,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is not equippable expect( await weapon.canTokenBeEquippedWithAssetIntoSlot( - soldier.address, + await soldier.getAddress(), weaponsIds[0], weaponAssetsFull[0], partIdForWeapon, @@ -67,7 +66,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is equippable into weapon part expect( await weapon.canTokenBeEquippedWithAssetIntoSlot( - soldier.address, + await soldier.getAddress(), weaponsIds[0], weaponAssetsEquip[0], partIdForWeapon, @@ -77,7 +76,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is NOT equippable into weapon gem part expect( await weapon.canTokenBeEquippedWithAssetIntoSlot( - soldier.address, + await soldier.getAddress(), weaponsIds[0], weaponAssetsEquip[0], partIdForWeaponGem, @@ -89,7 +88,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is not equippable expect( await weaponGem.canTokenBeEquippedWithAssetIntoSlot( - weapon.address, + await weapon.getAddress(), weaponGemsIds[0], weaponGemAssetFull, partIdForWeaponGem, @@ -99,7 +98,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is equippable into weapon gem slot expect( await weaponGem.canTokenBeEquippedWithAssetIntoSlot( - weapon.address, + await weapon.getAddress(), weaponGemsIds[0], weaponGemAssetEquip, partIdForWeaponGem, @@ -109,7 +108,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is NOT equippable into background slot expect( await weaponGem.canTokenBeEquippedWithAssetIntoSlot( - weapon.address, + await weapon.getAddress(), weaponGemsIds[0], weaponGemAssetEquip, partIdForBackground, @@ -121,7 +120,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is equippable into background slot expect( await background.canTokenBeEquippedWithAssetIntoSlot( - soldier.address, + await soldier.getAddress(), backgroundsIds[0], backgroundAssetId, partIdForBackground, @@ -131,7 +130,7 @@ async function shouldBehaveLikeEquippableWithSlots( // This asset is NOT equippable into weapon slot expect( await background.canTokenBeEquippedWithAssetIntoSlot( - soldier.address, + await soldier.getAddress(), backgroundsIds[0], backgroundAssetId, partIdForWeapon, @@ -155,7 +154,9 @@ async function shouldBehaveLikeEquippableWithSlots( const approved = addrs[1]; const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier.connect(soldierOwner).approveForAssets(approved.address, soldiersIds[0]); + await soldier + .connect(soldierOwner) + .approveForAssets(await approved.getAddress(), soldiersIds[0]); await equipWeaponAndCheckFromAddress(approved, childIndex, weaponResId); }); @@ -165,7 +166,9 @@ async function shouldBehaveLikeEquippableWithSlots( const approved = addrs[1]; const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier.connect(soldierOwner).setApprovalForAllForAssets(approved.address, true); + await soldier + .connect(soldierOwner) + .setApprovalForAllForAssets(await approved.getAddress(), true); await equipWeaponAndCheckFromAddress(approved, childIndex, weaponResId); }); @@ -189,22 +192,24 @@ async function shouldBehaveLikeEquippableWithSlots( const expectedSlots = [bn(partIdForWeapon), bn(partIdForBackground)]; const expectedEquips = [ - [bn(soldierResId), bn(weaponResId), weaponsIds[0], weapon.address], - [bn(soldierResId), bn(backgroundAssetId), backgroundsIds[0], background.address], + [bn(soldierResId), bn(weaponResId), weaponsIds[0], await weapon.getAddress()], + [bn(soldierResId), bn(backgroundAssetId), backgroundsIds[0], await background.getAddress()], ]; const expectedMetadata = ['ipfs:weapon/equip/5', 'ipfs:background/']; - expect(await view.getEquipped(soldier.address, soldiersIds[0], soldierResId)).to.eql([ - expectedSlots, - expectedEquips, - expectedMetadata, - ]); + expect( + await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId), + ).to.eql([expectedSlots, expectedEquips, expectedMetadata]); // Children are marked as equipped: - expect(await soldier.isChildEquipped(soldiersIds[0], weapon.address, weaponsIds[0])).to.eql( - true, - ); expect( - await soldier.isChildEquipped(soldiersIds[0], background.address, backgroundsIds[0]), + await soldier.isChildEquipped(soldiersIds[0], await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); + expect( + await soldier.isChildEquipped( + soldiersIds[0], + await background.getAddress(), + backgroundsIds[0], + ), ).to.eql(true); }); @@ -225,7 +230,7 @@ async function shouldBehaveLikeEquippableWithSlots( await expect( weaponGem.setValidParentForEquippableGroup( equippableGroupId, - soldier.address, + await soldier.getAddress(), partIdForWeaponGem, ), ).to.be.revertedWithCustomError(weaponGem, 'RMRKIdZeroForbidden'); @@ -236,7 +241,11 @@ async function shouldBehaveLikeEquippableWithSlots( const partId = 0; // The malicious child indicates it can be equipped into soldier: await expect( - weaponGem.setValidParentForEquippableGroup(equippableGroupId, soldier.address, partId), + weaponGem.setValidParentForEquippableGroup( + equippableGroupId, + await soldier.getAddress(), + partId, + ), ).to.be.revertedWithCustomError(weaponGem, 'RMRKIdZeroForbidden'); }); @@ -245,10 +254,10 @@ async function shouldBehaveLikeEquippableWithSlots( const soldierId = soldiersIds[0]; const childIndex = 2; - const newWeaponGemId = await nestMint(weaponGem, soldier.address, soldierId); + const newWeaponGemId = await nestMint(weaponGem, await soldier.getAddress(), soldierId); await soldier .connect(soldierOwner) - .acceptChild(soldierId, 0, weaponGem.address, newWeaponGemId); + .acceptChild(soldierId, 0, await weaponGem.getAddress(), newWeaponGemId); // Add assets to weapon await weaponGem.addAssetToToken(newWeaponGemId, weaponGemAssetFull, 0); @@ -259,7 +268,7 @@ async function shouldBehaveLikeEquippableWithSlots( // The malicious child indicates it can be equipped into soldier: await weaponGem.setValidParentForEquippableGroup( 1, // equippableGroupId for gems - soldier.address, + await soldier.getAddress(), partIdForWeaponGem, ); @@ -359,7 +368,7 @@ async function shouldBehaveLikeEquippableWithSlots( }); describe('With equipped children', async function () { - let soldierID: BigNumber; + let soldierID: bigint; let soldierOwner: SignerWithAddress; let weaponChildIndex = 0; let backgroundChildIndex = 1; @@ -389,7 +398,7 @@ async function shouldBehaveLikeEquippableWithSlots( await soldier.addEquippableAssetEntry( newSoldierResId, 0, - catalog.address, + await catalog.getAddress(), 'ipfs:soldier/', [partIdForBody, partIdForWeapon, partIdForBackground], ); @@ -397,20 +406,28 @@ async function shouldBehaveLikeEquippableWithSlots( await soldier.connect(soldierOwner).acceptAsset(soldierID, 0, newSoldierResId); // Children still marked as equipped, so the cannot be transferred - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql( - true, - ); expect( - await soldier.isChildEquipped(soldierID, background.address, backgroundsIds[0]), + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); + expect( + await soldier.isChildEquipped( + soldierID, + await background.getAddress(), + backgroundsIds[0], + ), ).to.eql(true); await soldier.connect(soldierOwner).unequip(soldierID, soldierResId, partIdForWeapon); await soldier.connect(soldierOwner).unequip(soldierID, soldierResId, partIdForBackground); - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql( - false, - ); expect( - await soldier.isChildEquipped(soldierID, background.address, backgroundsIds[0]), + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(false); + expect( + await soldier.isChildEquipped( + soldierID, + await background.getAddress(), + backgroundsIds[0], + ), ).to.eql(false); }); @@ -421,7 +438,7 @@ async function shouldBehaveLikeEquippableWithSlots( await weapon.addEquippableAssetEntry( newWeaponAssetId, 1, // equippableGroupId - catalog.address, + await catalog.getAddress(), 'ipfs:weapon/new', [], ); @@ -429,15 +446,15 @@ async function shouldBehaveLikeEquippableWithSlots( await weapon.connect(soldierOwner).acceptAsset(weaponId, 0, newWeaponAssetId); // Children still marked as equipped, so the cannot be transferred - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql( - true, - ); + expect( + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); await soldier.connect(soldierOwner).unequip(soldierID, soldierResId, partIdForWeapon); - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql( - false, - ); + expect( + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(false); }); it('can replace parent equipped asset and cannot not re-equip on top', async function () { @@ -446,7 +463,7 @@ async function shouldBehaveLikeEquippableWithSlots( await soldier.addEquippableAssetEntry( newSoldierResId, 0, - catalog.address, + await catalog.getAddress(), 'ipfs:soldier/', [partIdForBody, partIdForWeapon, partIdForBackground], ); @@ -487,7 +504,9 @@ async function shouldBehaveLikeEquippableWithSlots( .connect(soldierOwner) .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); - await soldier.connect(soldierOwner).approveForAssets(approved.address, soldiersIds[0]); + await soldier + .connect(soldierOwner) + .approveForAssets(await approved.getAddress(), soldiersIds[0]); await unequipWeaponAndCheckFromAddress(approved); }); @@ -502,7 +521,9 @@ async function shouldBehaveLikeEquippableWithSlots( .connect(soldierOwner) .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); - await soldier.connect(soldierOwner).setApprovalForAllForAssets(approved.address, true); + await soldier + .connect(soldierOwner) + .setApprovalForAllForAssets(await approved.getAddress(), true); await unequipWeaponAndCheckFromAddress(approved); }); @@ -542,10 +563,10 @@ async function shouldBehaveLikeEquippableWithSlots( .connect(soldierOwner) .transferChild( soldiersIds[0], - soldierOwner.address, + await soldierOwner.getAddress(), 0, childIndex, - weapon.address, + await weapon.getAddress(), weaponsIds[0], false, '0x', @@ -566,10 +587,10 @@ async function shouldBehaveLikeEquippableWithSlots( .connect(soldierOwner) .transferChild( soldiersIds[0], - soldierOwner.address, + await soldierOwner.getAddress(), 0, childIndex, - weapon.address, + await weapon.getAddress(), weaponsIds[0], false, '0x', @@ -598,7 +619,7 @@ async function shouldBehaveLikeEquippableWithSlots( bn(partIdForWeapon), // partId bn(weaponAssetsEquip[0]), // childAssetId 2, // z - weapon.address, // childAddress + await weapon.getAddress(), // childAddress weaponsIds[0], // childTokenId 'ipfs:weapon/equip/5', // childAssetMetadata '', // partMetadata @@ -608,21 +629,21 @@ async function shouldBehaveLikeEquippableWithSlots( bn(partIdForBackground), // partId bn(0), // childAssetId 0, // z - ethers.constants.AddressZero, // childAddress + ethers.ZeroAddress, // childAddress bn(0), // childTokenId '', // childAssetMetadata 'noBackground.png', // partMetadata ], ]; const allAssets = await view.composeEquippables( - soldier.address, + await soldier.getAddress(), soldiersIds[0], soldierResId, ); expect(allAssets).to.eql([ 'ipfs:soldier/', // metadataURI bn(0), // equippableGroupId - catalog.address, // catalogAddress + await catalog.getAddress(), // catalogAddress expectedFixedParts, expectedSlotParts, ]); @@ -630,14 +651,14 @@ async function shouldBehaveLikeEquippableWithSlots( it('can compose equippables for simple asset', async function () { const allAssets = await view.composeEquippables( - background.address, + await background.getAddress(), backgroundsIds[0], backgroundAssetId, ); expect(allAssets).to.eql([ 'ipfs:background/', // metadataURI bn(1), // equippableGroupId - catalog.address, // catalogAddress, + await catalog.getAddress(), // catalogAddress, [], [], ]); @@ -646,7 +667,7 @@ async function shouldBehaveLikeEquippableWithSlots( it('cannot compose equippables for soldier with not associated asset', async function () { const wrongResId = weaponAssetsEquip[1]; await expect( - view.composeEquippables(weapon.address, weaponsIds[0], wrongResId), + view.composeEquippables(await weapon.getAddress(), weaponsIds[0], wrongResId), ).to.be.revertedWithCustomError(weapon, 'RMRKTokenDoesNotHaveAsset'); }); }); @@ -658,14 +679,16 @@ async function shouldBehaveLikeEquippableWithSlots( ): Promise { // It's ok if nothing equipped const expectedSlots = [bn(partIdForWeapon), bn(partIdForBackground)]; - expect(await view.getEquipped(soldier.address, soldiersIds[0], soldierResId)).to.eql([ - expectedSlots, + expect(await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId)).to.eql( [ - [bn(0), bn(0), bn(0), ethers.constants.AddressZero], - [bn(0), bn(0), bn(0), ethers.constants.AddressZero], + expectedSlots, + [ + [bn(0), bn(0), bn(0), ethers.ZeroAddress], + [bn(0), bn(0), bn(0), ethers.ZeroAddress], + ], + ['', ''], ], - ['', ''], - ]); + ); await expect( soldier @@ -678,26 +701,24 @@ async function shouldBehaveLikeEquippableWithSlots( soldierResId, partIdForWeapon, weaponsIds[0], - weapon.address, + await weapon.getAddress(), weaponAssetsEquip[0], ); // All part slots are included on the response: // If a slot has nothing equipped, it returns an empty equip: const expectedEquips = [ - [bn(soldierResId), bn(weaponResId), weaponsIds[0], weapon.address], - [bn(0), bn(0), bn(0), ethers.constants.AddressZero], + [bn(soldierResId), bn(weaponResId), weaponsIds[0], await weapon.getAddress()], + [bn(0), bn(0), bn(0), ethers.ZeroAddress], ]; const expectedMetadata = ['ipfs:weapon/equip/5', '']; - expect(await view.getEquipped(soldier.address, soldiersIds[0], soldierResId)).to.eql([ - expectedSlots, - expectedEquips, - expectedMetadata, - ]); + expect(await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId)).to.eql( + [expectedSlots, expectedEquips, expectedMetadata], + ); // Child is marked as equipped: - expect(await soldier.isChildEquipped(soldiersIds[0], weapon.address, weaponsIds[0])).to.eql( - true, - ); + expect( + await soldier.isChildEquipped(soldiersIds[0], await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); } async function unequipWeaponAndCheckFromAddress(from: SignerWithAddress): Promise { @@ -708,37 +729,37 @@ async function shouldBehaveLikeEquippableWithSlots( soldierResId, partIdForWeapon, weaponsIds[0], - weapon.address, + await weapon.getAddress(), weaponAssetsEquip[0], ); const expectedSlots = [bn(partIdForWeapon), bn(partIdForBackground)]; // If a slot has nothing equipped, it returns an empty equip: const expectedEquips = [ - [bn(0), bn(0), bn(0), ethers.constants.AddressZero], - [bn(0), bn(0), bn(0), ethers.constants.AddressZero], + [bn(0), bn(0), bn(0), ethers.ZeroAddress], + [bn(0), bn(0), bn(0), ethers.ZeroAddress], ]; const expectedMetadata = ['', '']; - expect(await view.getEquipped(soldier.address, soldiersIds[0], soldierResId)).to.eql([ - expectedSlots, - expectedEquips, - expectedMetadata, - ]); + expect(await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId)).to.eql( + [expectedSlots, expectedEquips, expectedMetadata], + ); // Child is marked as not equipped: - expect(await soldier.isChildEquipped(soldiersIds[0], weapon.address, weaponsIds[0])).to.eql( - false, - ); + expect( + await soldier.isChildEquipped(soldiersIds[0], await weapon.getAddress(), weaponsIds[0]), + ).to.eql(false); } async function mintWeaponToSoldier( soldierOwner: SignerWithAddress, - soldierId: BigNumber, + soldierId: bigint, assetIndex: number, - ): Promise { + ): Promise { // Mint another weapon to the soldier and accept it - const newWeaponId = await nestMint(weapon, soldier.address, soldierId); - await soldier.connect(soldierOwner).acceptChild(soldierId, 0, weapon.address, newWeaponId); + const newWeaponId = await nestMint(weapon, await soldier.getAddress(), soldierId); + await soldier + .connect(soldierOwner) + .acceptChild(soldierId, 0, await weapon.getAddress(), newWeaponId); // Add assets to weapon await weapon.addAssetToToken(newWeaponId, weaponAssetsFull[assetIndex], 0); diff --git a/test/behavior/erc721.ts b/test/behavior/erc721.ts index 5792d179..e7f01000 100644 --- a/test/behavior/erc721.ts +++ b/test/behavior/erc721.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract, ContractTransaction } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract, ContractTransaction } from 'ethers'; import { bn } from '../utils'; // Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/test/token/ERC721/ERC721.behavior.js @@ -33,8 +33,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { beforeEach(async function () { [owner, approved, anotherApproved, operator, ...others] = await ethers.getSigners(); - await this.token['mint(address,uint256)'](owner.address, firstTokenId); - await this.token['mint(address,uint256)'](owner.address, secondTokenId); + await this.token['mint(address,uint256)'](await owner.getAddress(), firstTokenId); + await this.token['mint(address,uint256)'](await owner.getAddress(), secondTokenId); toWhom = others[0]; // default to other for toWhom in context-dependent tests }); @@ -52,7 +52,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('balanceOf', function () { context('when the given address owns some tokens', function () { it('returns the amount of tokens owned by the given address', async function () { - expect(await this.token.balanceOf(owner.address)).to.eql(bn(2)); + expect(await this.token.balanceOf(await owner.getAddress())).to.eql(bn(2)); }); }); @@ -64,9 +64,10 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when querying the zero address', function () { it('throws', async function () { - await expect( - this.token.balanceOf(ethers.constants.AddressZero), - ).to.be.revertedWithCustomError(this.token, 'ERC721AddressZeroIsNotaValidOwner'); + await expect(this.token.balanceOf(ethers.ZeroAddress)).to.be.revertedWithCustomError( + this.token, + 'ERC721AddressZeroIsNotaValidOwner', + ); }); }); }); @@ -76,7 +77,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { const tokenId = firstTokenId; it('returns the owner of the given token ID', async function () { - expect(await this.token.ownerOf(tokenId)).to.be.equal(owner.address); + expect(await this.token.ownerOf(tokenId)).to.be.equal(await owner.getAddress()); }); }); @@ -97,27 +98,27 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { const data = '0x42'; beforeEach(async function () { - await this.token.approve(approved.address, tokenId); - await this.token.setApprovalForAll(operator.address, true); + await this.token.approve(await approved.getAddress(), tokenId); + await this.token.setApprovalForAll(await operator.getAddress(), true); }); - const transferWasSuccessful = function (owner: SignerWithAddress, tokenId: BigNumber) { + const transferWasSuccessful = function (owner: SignerWithAddress, tokenId: bigint) { it('transfers the ownership of the given token ID to the given address', async function () { - expect(await this.token.ownerOf(tokenId)).to.be.equal(toWhom.address); + expect(await this.token.ownerOf(tokenId)).to.be.equal(await toWhom.getAddress()); }); it('emits a Transfer event', async function () { await expect(receipt) .to.emit(this.token, 'Transfer') - .withArgs(owner.address, toWhom.address, tokenId); + .withArgs(await owner.getAddress(), await toWhom.getAddress(), tokenId); }); it('clears the approval for the token ID', async function () { - expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.constants.AddressZero); + expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.ZeroAddress); }); it('adjusts owners balances', async function () { - expect(await this.token.balanceOf(owner.address)).to.eql(bn(1)); + expect(await this.token.balanceOf(await owner.getAddress())).to.eql(bn(1)); }); }; @@ -126,8 +127,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { beforeEach(async function () { receipt = await transferFunction( this.token, - owner.address, - toWhom.address, + await owner.getAddress(), + await toWhom.getAddress(), tokenId, owner, ); @@ -141,8 +142,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { beforeEach(async function () { receipt = await transferFunction( this.token, - owner.address, - toWhom.address, + await owner.getAddress(), + await toWhom.getAddress(), tokenId, approved, ); @@ -156,8 +157,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { beforeEach(async function () { receipt = await transferFunction( this.token, - owner.address, - toWhom.address, + await owner.getAddress(), + await toWhom.getAddress(), tokenId, operator, ); @@ -169,11 +170,11 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when called by the owner without an approved user', function () { beforeEach(async function () { - await this.token.approve(ethers.constants.AddressZero, tokenId); + await this.token.approve(ethers.ZeroAddress, tokenId); receipt = await transferFunction( this.token, - owner.address, - toWhom.address, + await owner.getAddress(), + await toWhom.getAddress(), tokenId, operator, ); @@ -187,29 +188,29 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { beforeEach(async function () { receipt = await transferFunction( this.token, - owner.address, - owner.address, + await owner.getAddress(), + await owner.getAddress(), tokenId, owner, ); }); it('keeps ownership of the token', async function () { - expect(await this.token.ownerOf(tokenId)).to.be.equal(owner.address); + expect(await this.token.ownerOf(tokenId)).to.be.equal(await owner.getAddress()); }); it('clears the approval for the token ID', async function () { - expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.constants.AddressZero); + expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.ZeroAddress); }); it('emits only a transfer event', async function () { await expect(receipt) .to.emit(this.token, 'Transfer') - .withArgs(owner.address, owner.address, tokenId); + .withArgs(await owner.getAddress(), await owner.getAddress(), tokenId); }); it('keeps the owner balance', async function () { - expect(await this.token.balanceOf(owner.address)).to.eql(bn(2)); + expect(await this.token.balanceOf(await owner.getAddress())).to.eql(bn(2)); }); }); @@ -228,7 +229,13 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { ? 'RMRKNotApprovedOrDirectOwner' : 'ERC721NotApprovedOrOwner'; await expect( - transferFunction(this.token, owner.address, others[0].address, tokenId, others[0]), + transferFunction( + this.token, + await owner.getAddress(), + others[0].address, + tokenId, + others[0], + ), ).to.be.revertedWithCustomError(this.token, error); }); }); @@ -238,7 +245,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { await expect( transferFunction( this.token, - owner.address, + await owner.getAddress(), others[0].address, nonExistentTokenId, owner, @@ -252,8 +259,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { await expect( transferFunction( this.token, - owner.address, - ethers.constants.AddressZero, + await owner.getAddress(), + ethers.ZeroAddress, tokenId, owner, ), @@ -267,7 +274,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { token: Contract, from: string, to: string, - tokenId: BigNumber, + tokenId: bigint, user: SignerWithAddress, ) { return token.connect(user)['transferFrom(address,address,uint256)'](from, to, tokenId); @@ -279,7 +286,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { token: Contract, from: string, to: string, - tokenId: BigNumber, + tokenId: bigint, user: SignerWithAddress, ) { return token @@ -291,7 +298,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { token: Contract, from: string, to: string, - tokenId: BigNumber, + tokenId: bigint, user: SignerWithAddress, ) { return token @@ -307,7 +314,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a valid receiver contract', function () { beforeEach(async function () { receiver = await this.ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); - await receiver.deployed(); + await receiver.waitForDeployment(); toWhom = receiver; }); @@ -316,28 +323,28 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('calls onERC721Received', async function () { receipt = await transferFun( this.token, - owner.address, - receiver.address, + await owner.getAddress(), + await receiver.getAddress(), tokenId, owner, ); await expect(receipt) .to.emit(receiver, 'Received') - .withArgs(owner.address, owner.address, tokenId, data); + .withArgs(await owner.getAddress(), await owner.getAddress(), tokenId, data); }); it('calls onERC721Received from approved', async function () { receipt = await transferFun( this.token, - owner.address, - receiver.address, + await owner.getAddress(), + await receiver.getAddress(), tokenId, approved, ); await expect(receipt) .to.emit(receiver, 'Received') - .withArgs(approved.address, owner.address, tokenId, data); + .withArgs(await approved.getAddress(), await owner.getAddress(), tokenId, data); }); describe('with an invalid token id', function () { @@ -345,8 +352,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { await expect( transferFun( this.token, - owner.address, - receiver.address, + await owner.getAddress(), + await receiver.getAddress(), nonExistentTokenId, owner, ), @@ -368,14 +375,14 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); const invalidReceiver = await ERC721Receiver.deploy( - ethers.utils.hexZeroPad('0x42', 4), + ethers.zeroPadValue('0x42', 4), Error.None, ); - await invalidReceiver.deployed(); + await invalidReceiver.waitForDeployment(); await expect( this.token['safeTransferFrom(address,address,uint256)']( - owner.address, - invalidReceiver.address, + await owner.getAddress(), + await invalidReceiver.getAddress(), tokenId, ), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); @@ -386,16 +393,16 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); const revertingReceiver = await ERC721Receiver.deploy( - ethers.utils.hexZeroPad('0x42', 4), + ethers.zeroPadValue('0x42', 4), Error.RevertWithMessage, ); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) ['safeTransferFrom(address,address,uint256)']( - owner.address, - revertingReceiver.address, + await owner.getAddress(), + await revertingReceiver.getAddress(), tokenId, ), ).to.be.revertedWith('ERC721ReceiverMock: reverting'); @@ -409,13 +416,13 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { RECEIVER_MAGIC_VALUE, Error.RevertWithoutMessage, ); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) ['safeTransferFrom(address,address,uint256)']( - owner.address, - revertingReceiver.address, + await owner.getAddress(), + await revertingReceiver.getAddress(), tokenId, ), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); @@ -429,13 +436,13 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { RECEIVER_MAGIC_VALUE, Error.Panic, ); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) ['safeTransferFrom(address,address,uint256)']( - owner.address, - revertingReceiver.address, + await owner.getAddress(), + await revertingReceiver.getAddress(), tokenId, ), ).to.be.reverted; @@ -447,8 +454,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { const nonReceiver = this.token; await expect( this.token['safeTransferFrom(address,address,uint256)']( - owner.address, - nonReceiver.address, + await owner.getAddress(), + await nonReceiver.getAddress(), tokenId, ), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); @@ -466,27 +473,30 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('calls onERC721Received — with data', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); receiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); - await receiver.deployed(); + await receiver.waitForDeployment(); const receipt = await this.token['safeMint(address,uint256,bytes)']( - receiver.address, + await receiver.getAddress(), tokenId, data, ); await expect(receipt) .to.emit(receiver, 'Received') - .withArgs(owner.address, ethers.constants.AddressZero, tokenId, data); + .withArgs(await owner.getAddress(), ethers.ZeroAddress, tokenId, data); }); it('calls onERC721Received — without data', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); receiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); - await receiver.deployed(); - const receipt = await this.token['safeMint(address,uint256)'](receiver.address, tokenId); + await receiver.waitForDeployment(); + const receipt = await this.token['safeMint(address,uint256)']( + await receiver.getAddress(), + tokenId, + ); await expect(receipt) .to.emit(receiver, 'Received') - .withArgs(owner.address, ethers.constants.AddressZero, tokenId, '0x'); + .withArgs(await owner.getAddress(), ethers.ZeroAddress, tokenId, '0x'); }); }); @@ -494,13 +504,13 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); const invalidReceiver = await ERC721Receiver.deploy( - ethers.utils.hexZeroPad('0x42', 4), + ethers.zeroPadValue('0x42', 4), Error.None, ); - await invalidReceiver.deployed(); + await invalidReceiver.waitForDeployment(); await expect( - this.token['safeMint(address,uint256)'](invalidReceiver.address, tokenId), + this.token['safeMint(address,uint256)'](await invalidReceiver.getAddress(), tokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); }); }); @@ -509,14 +519,14 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); const revertingReceiver = await ERC721Receiver.deploy( - ethers.utils.hexZeroPad('0x42', 4), + ethers.zeroPadValue('0x42', 4), Error.RevertWithMessage, ); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) - ['safeMint(address,uint256)'](revertingReceiver.address, tokenId), + ['safeMint(address,uint256)'](await revertingReceiver.getAddress(), tokenId), ).to.be.revertedWith('ERC721ReceiverMock: reverting'); }); }); @@ -528,11 +538,11 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { RECEIVER_MAGIC_VALUE, Error.RevertWithoutMessage, ); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) - ['safeMint(address,uint256)'](revertingReceiver.address, tokenId), + ['safeMint(address,uint256)'](await revertingReceiver.getAddress(), tokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); }); }); @@ -541,11 +551,11 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); const revertingReceiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.Panic); - await revertingReceiver.deployed(); + await revertingReceiver.waitForDeployment(); await expect( this.token .connect(owner) - ['safeMint(address,uint256)'](revertingReceiver.address, tokenId), + ['safeMint(address,uint256)'](await revertingReceiver.getAddress(), tokenId), ).to.be.reverted; }); }); @@ -554,7 +564,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts', async function () { const nonReceiver = this.token; await expect( - this.token['safeMint(address,uint256)'](nonReceiver.address, tokenId), + this.token['safeMint(address,uint256)'](await nonReceiver.getAddress(), tokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721TransferToNonReceiverImplementer'); }); }); @@ -566,7 +576,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { const itClearsApproval = function () { it('clears approval for the token', async function () { - expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.constants.AddressZero); + expect(await this.token.getApproved(tokenId)).to.be.equal(ethers.ZeroAddress); }); }; @@ -580,81 +590,80 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('emits an approval event', async function () { await expect(receipt) .to.emit(this.token, 'Approval') - .withArgs(owner.address, address, tokenId); + .withArgs(await owner.getAddress(), address, tokenId); }); }; context('when clearing approval', function () { context('when there was no prior approval', function () { beforeEach(async function () { - receipt = await this.token.approve(ethers.constants.AddressZero, tokenId); + receipt = await this.token.approve(ethers.ZeroAddress, tokenId); }); itClearsApproval(); - itEmitsApprovalEvent(ethers.constants.AddressZero); + itEmitsApprovalEvent(ethers.ZeroAddress); }); context('when there was a prior approval', function () { beforeEach(async function () { - await this.token.approve(approved.address, tokenId); - receipt = await this.token.approve(ethers.constants.AddressZero, tokenId); + await this.token.approve(await approved.getAddress(), tokenId); + receipt = await this.token.approve(ethers.ZeroAddress, tokenId); }); itClearsApproval(); - itEmitsApprovalEvent(ethers.constants.AddressZero); + itEmitsApprovalEvent(ethers.ZeroAddress); }); }); context('when approving a non-zero address', function () { context('when there was no prior approval', function () { beforeEach(async function () { - receipt = await this.token.approve(approved.address, tokenId); + receipt = await this.token.approve(await approved.getAddress(), tokenId); }); afterEach(async function () { - itApproves(approved.address); - itEmitsApprovalEvent(approved.address); + itApproves(await approved.getAddress()); + itEmitsApprovalEvent(await approved.getAddress()); }); }); context('when there was a prior approval to the same address', function () { beforeEach(async function () { - await this.token.approve(approved.address, tokenId); - receipt = await this.token.approve(approved.address, tokenId); + await this.token.approve(await approved.getAddress(), tokenId); + receipt = await this.token.approve(await approved.getAddress(), tokenId); }); afterEach(async function () { - itApproves(approved.address); - itEmitsApprovalEvent(approved.address); + itApproves(await approved.getAddress()); + itEmitsApprovalEvent(await approved.getAddress()); }); }); context('when there was a prior approval to a different address', function () { beforeEach(async function () { - await this.token.approve(anotherApproved.address, tokenId); - receipt = await this.token.approve(anotherApproved.address, tokenId); + await this.token.approve(await anotherApproved.getAddress(), tokenId); + receipt = await this.token.approve(await anotherApproved.getAddress(), tokenId); }); afterEach(async function () { - itApproves(anotherApproved.address); - itEmitsApprovalEvent(anotherApproved.address); + itApproves(await anotherApproved.getAddress()); + itEmitsApprovalEvent(await anotherApproved.getAddress()); }); }); }); context('when the address that receives the approval is the owner', function () { it('reverts', async function () { - await expect(this.token.approve(owner.address, tokenId)).to.be.revertedWithCustomError( - this.token, - 'ERC721ApprovalToCurrentOwner', - ); + await expect( + this.token.approve(await owner.getAddress(), tokenId), + ).to.be.revertedWithCustomError(this.token, 'ERC721ApprovalToCurrentOwner'); }); }); context('when the sender does not own the given token ID', function () { it('reverts', async function () { await expect( - this.token.connect(others[0]).approve(approved.address, tokenId), + this.token.connect(others[0]).approve(await approved.getAddress(), tokenId), ).to.be.revertedWithCustomError( this.token, 'ERC721ApproveCallerIsNotOwnerNorApprovedForAll', @@ -664,9 +673,9 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the sender is approved for the given token ID', function () { it('reverts', async function () { - await this.token.approve(approved.address, tokenId); + await this.token.approve(await approved.getAddress(), tokenId); await expect( - this.token.connect(approved).approve(anotherApproved.address, tokenId), + this.token.connect(approved).approve(await anotherApproved.getAddress(), tokenId), ).to.be.revertedWithCustomError( this.token, 'ERC721ApproveCallerIsNotOwnerNorApprovedForAll', @@ -676,20 +685,22 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the sender is an operator', function () { beforeEach(async function () { - await this.token.setApprovalForAll(operator.address, true); - receipt = await this.token.connect(operator).approve(approved.address, tokenId); + await this.token.setApprovalForAll(await operator.getAddress(), true); + receipt = await this.token + .connect(operator) + .approve(await approved.getAddress(), tokenId); }); afterEach(async function () { - itApproves(approved.address); - itEmitsApprovalEvent(approved.address); + itApproves(await approved.getAddress()); + itEmitsApprovalEvent(await approved.getAddress()); }); }); context('when the given token ID does not exist', function () { it('reverts', async function () { await expect( - this.token.connect(operator).approve(approved.address, nonExistentTokenId), + this.token.connect(operator).approve(await approved.getAddress(), nonExistentTokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721InvalidTokenId'); }); }); @@ -699,71 +710,83 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the operator willing to approve is not the owner', function () { context('when there is no operator approval set by the sender', function () { it('approves the operator', async function () { - await this.token.setApprovalForAll(operator.address, true); + await this.token.setApprovalForAll(await operator.getAddress(), true); - expect(await this.token.isApprovedForAll(owner.address, operator.address)).to.equal( - true, - ); + expect( + await this.token.isApprovedForAll( + await owner.getAddress(), + await operator.getAddress(), + ), + ).to.equal(true); }); it('emits an approval event', async function () { - const receipt = await this.token.setApprovalForAll(operator.address, true); + const receipt = await this.token.setApprovalForAll(await operator.getAddress(), true); await expect(receipt) .to.emit(this.token, 'ApprovalForAll') - .withArgs(owner.address, operator.address, true); + .withArgs(await owner.getAddress(), await operator.getAddress(), true); }); }); context('when the operator was set as not approved', function () { beforeEach(async function () { - await this.token.setApprovalForAll(operator.address, false); + await this.token.setApprovalForAll(await operator.getAddress(), false); }); it('approves the operator', async function () { - await this.token.setApprovalForAll(operator.address, true); + await this.token.setApprovalForAll(await operator.getAddress(), true); - expect(await this.token.isApprovedForAll(owner.address, operator.address)).to.equal( - true, - ); + expect( + await this.token.isApprovedForAll( + await owner.getAddress(), + await operator.getAddress(), + ), + ).to.equal(true); }); it('emits an approval event', async function () { - const receipt = await this.token.setApprovalForAll(operator.address, true); + const receipt = await this.token.setApprovalForAll(await operator.getAddress(), true); await expect(receipt) .to.emit(this.token, 'ApprovalForAll') - .withArgs(owner.address, operator.address, true); + .withArgs(await owner.getAddress(), await operator.getAddress(), true); }); it('can unset the operator approval', async function () { - await this.token.setApprovalForAll(operator.address, false); + await this.token.setApprovalForAll(await operator.getAddress(), false); - expect(await this.token.isApprovedForAll(owner.address, operator.address)).to.equal( - false, - ); + expect( + await this.token.isApprovedForAll( + await owner.getAddress(), + await operator.getAddress(), + ), + ).to.equal(false); }); }); context('when the operator was already approved', function () { beforeEach(async function () { - await this.token.setApprovalForAll(operator.address, true); + await this.token.setApprovalForAll(await operator.getAddress(), true); }); it('keeps the approval to the given address', async function () { - await this.token.setApprovalForAll(operator.address, true); + await this.token.setApprovalForAll(await operator.getAddress(), true); - expect(await this.token.isApprovedForAll(owner.address, operator.address)).to.equal( - true, - ); + expect( + await this.token.isApprovedForAll( + await owner.getAddress(), + await operator.getAddress(), + ), + ).to.equal(true); }); it('emits an approval event', async function () { - const receipt = await this.token.setApprovalForAll(operator.address, true); + const receipt = await this.token.setApprovalForAll(await operator.getAddress(), true); await expect(receipt) .to.emit(this.token, 'ApprovalForAll') - .withArgs(owner.address, operator.address, true); + .withArgs(await owner.getAddress(), await operator.getAddress(), true); }); }); }); @@ -771,7 +794,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the operator is the owner', function () { it('reverts', async function () { await expect( - this.token.setApprovalForAll(owner.address, true), + this.token.setApprovalForAll(await owner.getAddress(), true), ).to.be.revertedWithCustomError(this.token, 'ERC721ApproveToCaller'); }); }); @@ -789,18 +812,18 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when token has been minted ', async function () { it('should return the zero address', async function () { - expect(await this.token.getApproved(firstTokenId)).to.be.equal( - ethers.constants.AddressZero, - ); + expect(await this.token.getApproved(firstTokenId)).to.be.equal(ethers.ZeroAddress); }); context('when account has been approved', async function () { beforeEach(async function () { - await this.token.approve(approved.address, firstTokenId); + await this.token.approve(await approved.getAddress(), firstTokenId); }); it('returns approved account', async function () { - expect(await this.token.getApproved(firstTokenId)).to.be.equal(approved.address); + expect(await this.token.getApproved(firstTokenId)).to.be.equal( + await approved.getAddress(), + ); }); }); }); @@ -815,29 +838,29 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('reverts with a null destination address', async function () { await expect( - this.token['mint(address,uint256)'](ethers.constants.AddressZero, firstTokenId), + this.token['mint(address,uint256)'](ethers.ZeroAddress, firstTokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721MintToTheZeroAddress'); }); context('with minted token', async function () { beforeEach(async function () { - receipt = await this.token['mint(address,uint256)'](owner.address, firstTokenId); + receipt = await this.token['mint(address,uint256)'](await owner.getAddress(), firstTokenId); }); it('emits a Transfer event', async function () { await expect(receipt) .to.emit(this.token, 'Transfer') - .withArgs(ethers.constants.AddressZero, owner.address, firstTokenId); + .withArgs(ethers.ZeroAddress, await owner.getAddress(), firstTokenId); }); it('creates the token', async function () { - expect(await this.token.balanceOf(owner.address)).to.eql(bn(1)); - expect(await this.token.ownerOf(firstTokenId)).to.equal(owner.address); + expect(await this.token.balanceOf(await owner.getAddress())).to.eql(bn(1)); + expect(await this.token.ownerOf(firstTokenId)).to.equal(await owner.getAddress()); }); it('reverts when adding a token id that already exists', async function () { await expect( - this.token['mint(address,uint256)'](owner.address, firstTokenId), + this.token['mint(address,uint256)'](await owner.getAddress(), firstTokenId), ).to.be.revertedWithCustomError(this.token, 'ERC721TokenAlreadyMinted'); }); }); @@ -857,8 +880,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('with minted tokens', function () { beforeEach(async function () { - await this.token['mint(address,uint256)'](owner.address, firstTokenId); - await this.token['mint(address,uint256)'](owner.address, secondTokenId); + await this.token['mint(address,uint256)'](await owner.getAddress(), firstTokenId); + await this.token['mint(address,uint256)'](await owner.getAddress(), secondTokenId); }); context('with burnt token', function () { @@ -869,17 +892,17 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { it('emits a Transfer event', async function () { await expect(receipt) .to.emit(this.token, 'Transfer') - .withArgs(owner.address, ethers.constants.AddressZero, firstTokenId); + .withArgs(await owner.getAddress(), ethers.ZeroAddress, firstTokenId); }); it('emits an Approval event', async function () { await expect(receipt) .to.emit(this.token, 'Approval') - .withArgs(owner.address, ethers.constants.AddressZero, firstTokenId); + .withArgs(await owner.getAddress(), ethers.ZeroAddress, firstTokenId); }); it('deletes the token', async function () { - expect(await this.token.balanceOf(owner.address)).to.eql(bn(1)); + expect(await this.token.balanceOf(await owner.getAddress())).to.eql(bn(1)); await expect(this.token.ownerOf(firstTokenId)).to.be.revertedWithCustomError( this.token, 'ERC721InvalidTokenId', diff --git a/test/behavior/metadata.ts b/test/behavior/metadata.ts index 83680f1a..75cdf5f8 100644 --- a/test/behavior/metadata.ts +++ b/test/behavior/metadata.ts @@ -1,14 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; async function shouldHaveMetadata( - mint: (token: Contract, to: string) => Promise, + mint: (token: Contract, to: string) => Promise, isTokenUriEnumerated: boolean, ): Promise { it('can get tokenURI', async function () { const owner = (await ethers.getSigners())[0]; - const tokenId = await mint(this.token, owner.address); + const tokenId = await mint(this.token, await owner.getAddress()); if (isTokenUriEnumerated) { expect(await this.token.tokenURI(tokenId)).to.eql(`ipfs://tokenURI/${tokenId}`); } else { diff --git a/test/behavior/mintingImpl.ts b/test/behavior/mintingImpl.ts index a0388314..6803c515 100644 --- a/test/behavior/mintingImpl.ts +++ b/test/behavior/mintingImpl.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ONE_ETH } from '../utils'; async function shouldControlValidMinting(): Promise { @@ -12,7 +12,7 @@ async function shouldControlValidMinting(): Promise { }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.utils.parseEther('0.05'); + const HALF_ETH = ethers.parseEther('0.05'); await expect( this.token.mint(addrs[0].address, 1, { value: HALF_ETH }), ).to.be.revertedWithCustomError(this.token, 'RMRKWrongValueSent'); diff --git a/test/behavior/multiasset.ts b/test/behavior/multiasset.ts index 2469c35f..75f54824 100644 --- a/test/behavior/multiasset.ts +++ b/test/behavior/multiasset.ts @@ -1,21 +1,21 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract } from 'ethers'; import { bn } from '../utils'; import { IERC165, IOtherInterface, IERC5773 } from '../interfaces'; async function shouldBehaveLikeMultiAsset( - mint: (token: Contract, to: string) => Promise, - addAssetEntryFunc: (token: Contract, data?: string) => Promise, + mint: (token: Contract, to: string) => Promise, + addAssetEntryFunc: (token: Contract, data?: string) => Promise, addAssetToTokenFunc: ( token: Contract, - tokenId: BigNumber, - resId: BigNumber, - replaces: BigNumber | number, + tokenId: bigint, + resId: bigint, + replaces: bigint | number, ) => Promise, ) { - let tokenId: BigNumber; + let tokenId: bigint; let tokenOwner: SignerWithAddress; let approved: SignerWithAddress; let operator: SignerWithAddress; @@ -45,7 +45,7 @@ async function shouldBehaveLikeMultiAsset( describe('With minted token', async function () { beforeEach(async function () { - tokenId = await mint(this.token, tokenOwner.address); + tokenId = await mint(this.token, await tokenOwner.getAddress()); }); describe('Add asset', async function () { @@ -66,37 +66,49 @@ async function shouldBehaveLikeMultiAsset( describe('Approvals', async function () { it('can approve address for assets', async function () { - await this.token.connect(tokenOwner).approveForAssets(approved.address, tokenId); - expect(await this.token.getApprovedForAssets(tokenId)).to.eql(approved.address); + await this.token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); + expect(await this.token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); }); it('can approve address for all for assets', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); expect( - await this.token.isApprovedForAllForAssets(tokenOwner.address, operator.address), + await this.token.isApprovedForAllForAssets( + await tokenOwner.getAddress(), + await operator.getAddress(), + ), ).to.eql(true); - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, false); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), false); expect( - await this.token.isApprovedForAllForAssets(tokenOwner.address, operator.address), + await this.token.isApprovedForAllForAssets( + await tokenOwner.getAddress(), + await operator.getAddress(), + ), ).to.eql(false); }); it('cannot approve owner for assets', async function () { await expect( - this.token.connect(tokenOwner).approveForAssets(tokenOwner.address, tokenId), + this.token.connect(tokenOwner).approveForAssets(await tokenOwner.getAddress(), tokenId), ).to.be.revertedWithCustomError(this.token, 'RMRKApprovalForAssetsToCurrentOwner'); }); it('cannot approve owner for all assets', async function () { await expect( - this.token.connect(tokenOwner).setApprovalForAllForAssets(tokenOwner.address, true), + this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await tokenOwner.getAddress(), true), ).to.be.revertedWithCustomError(this.token, 'RMRKApprovalForAssetsToCurrentOwner'); }); it('cannot approve owner if not owner', async function () { await expect( - this.token.connect(notApproved).approveForAssets(approved.address, tokenId), + this.token.connect(notApproved).approveForAssets(await approved.getAddress(), tokenId), ).to.be.revertedWithCustomError( this.token, 'RMRKApproveForAssetsCallerIsNotOwnerNorApprovedForAll', @@ -104,9 +116,11 @@ async function shouldBehaveLikeMultiAsset( }); it('can approve address for assets if approved for all assets', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); - await this.token.connect(operator).approveForAssets(approved.address, tokenId); - expect(await this.token.getApprovedForAssets(tokenId)).to.eql(approved.address); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); + await this.token.connect(operator).approveForAssets(await approved.getAddress(), tokenId); + expect(await this.token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); }); }); @@ -176,12 +190,12 @@ async function shouldBehaveLikeMultiAsset( describe('With minted token and 2 pending assets', async function () { const resData1 = 'data1'; const resData2 = 'data2'; - let resId1: BigNumber; - let resId2: BigNumber; + let resId1: bigint; + let resId2: bigint; beforeEach(async function () { // Mint and add 2 assets to token - tokenId = await mint(this.token, tokenOwner.address); + tokenId = await mint(this.token, await tokenOwner.getAddress()); resId1 = await addAssetEntryFunc(this.token, resData1); resId2 = await addAssetEntryFunc(this.token, resData2); await addAssetToTokenFunc(this.token, tokenId, resId1, 0); @@ -190,7 +204,9 @@ async function shouldBehaveLikeMultiAsset( describe('Accepting assets', async function () { it('can accept asset', async function () { - expect(await this.renderUtils.getPendingAssets(this.token.address, tokenId)).to.eql([ + expect( + await this.renderUtils.getPendingAssets(await this.token.getAddress(), tokenId), + ).to.eql([ [resId1, bn(0), bn(0), resData1], [resId2, bn(1), bn(0), resData2], ]); @@ -199,9 +215,9 @@ async function shouldBehaveLikeMultiAsset( .to.emit(this.token, 'AssetAccepted') .withArgs(tokenId, resId1, 0); - expect(await this.renderUtils.getPendingAssets(this.token.address, tokenId)).to.eql([ - [resId2, bn(0), bn(0), resData2], - ]); + expect( + await this.renderUtils.getPendingAssets(await this.token.getAddress(), tokenId), + ).to.eql([[resId2, bn(0), bn(0), resData2]]); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId1]); expect(await this.token.getAssetMetadata(tokenId, resId1)).equal(resData1); }); @@ -219,14 +235,16 @@ async function shouldBehaveLikeMultiAsset( }); it('can accept asset if approved', async function () { - await this.token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await this.token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); await this.token.connect(approved).acceptAsset(tokenId, 0, resId1); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId1]); }); it('can accept asset if approved for all', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); await this.token.connect(operator).acceptAsset(tokenId, 0, resId1); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId1]); @@ -274,7 +292,7 @@ async function shouldBehaveLikeMultiAsset( }); it('can reject asset if approved', async function () { - await this.token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await this.token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); await this.token.connect(approved).rejectAsset(tokenId, 0, resId1); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([]); @@ -282,7 +300,9 @@ async function shouldBehaveLikeMultiAsset( }); it('can reject asset if approved for all', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); await this.token.connect(operator).rejectAsset(tokenId, 0, resId1); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([]); @@ -299,7 +319,7 @@ async function shouldBehaveLikeMultiAsset( }); it('can reject all assets if approved', async function () { - await this.token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await this.token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); await this.token.connect(approved).rejectAllAssets(tokenId, 2); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([]); @@ -307,7 +327,9 @@ async function shouldBehaveLikeMultiAsset( }); it('can reject all assets if approved for all', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); await this.token.connect(operator).rejectAllAssets(tokenId, 2); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([]); @@ -371,7 +393,9 @@ async function shouldBehaveLikeMultiAsset( }); it('can set and get priorities if approved', async function () { - await this.token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await this.token + .connect(tokenOwner) + .approveForAssets(await approved.getAddress(), tokenId); await expect(this.token.connect(approved).setPriority(tokenId, [1, 0])) .to.emit(this.token, 'AssetPrioritySet') @@ -380,7 +404,9 @@ async function shouldBehaveLikeMultiAsset( }); it('can set and get priorities if approved for all', async function () { - await this.token.connect(tokenOwner).setApprovalForAllForAssets(operator.address, true); + await this.token + .connect(tokenOwner) + .setApprovalForAllForAssets(await operator.getAddress(), true); expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); await expect(this.token.connect(operator).setPriority(tokenId, [1, 0])) diff --git a/test/behavior/nestable.ts b/test/behavior/nestable.ts index bcdad72f..7868f640 100644 --- a/test/behavior/nestable.ts +++ b/test/behavior/nestable.ts @@ -1,25 +1,25 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract } from 'ethers'; import { bn, ADDRESS_ZERO } from '../utils'; import { IERC165, IERC721, IERC7401, IOtherInterface } from '../interfaces'; async function shouldBehaveLikeNestable( - mint: (token: Contract, to: string) => Promise, - nestMint: (token: Contract, to: string, parentId: BigNumber) => Promise, + mint: (token: Contract, to: string) => Promise, + nestMint: (token: Contract, to: string, parentId: bigint) => Promise, transfer: ( token: Contract, caller: SignerWithAddress, to: string, - tokenId: BigNumber, + tokenId: bigint, ) => Promise, nestTransfer: ( token: Contract, caller: SignerWithAddress, to: string, - tokenId: BigNumber, - parentId: BigNumber, + tokenId: bigint, + parentId: bigint, ) => Promise, ) { let addrs: SignerWithAddress[]; @@ -38,23 +38,27 @@ async function shouldBehaveLikeNestable( describe('Minting', async function () { it('can mint with no destination', async function () { - const tokenId = await mint(child, tokenOwner.address); - expect(await child.ownerOf(tokenId)).to.equal(tokenOwner.address); - expect(await child.directOwnerOf(tokenId)).to.eql([tokenOwner.address, bn(0), false]); + const tokenId = await mint(child, await tokenOwner.getAddress()); + expect(await child.ownerOf(tokenId)).to.equal(await tokenOwner.getAddress()); + expect(await child.directOwnerOf(tokenId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); }); it('has right owners', async function () { const otherOwner = addrs[2]; - const tokenId = await mint(parent, tokenOwner.address); - const tokenId2 = await mint(parent, otherOwner.address); - const tokenId3 = await mint(parent, otherOwner.address); + const tokenId = await mint(parent, await tokenOwner.getAddress()); + const tokenId2 = await mint(parent, await otherOwner.getAddress()); + const tokenId3 = await mint(parent, await otherOwner.getAddress()); - expect(await parent.ownerOf(tokenId)).to.equal(tokenOwner.address); - expect(await parent.ownerOf(tokenId2)).to.equal(otherOwner.address); - expect(await parent.ownerOf(tokenId3)).to.equal(otherOwner.address); + expect(await parent.ownerOf(tokenId)).to.equal(await tokenOwner.getAddress()); + expect(await parent.ownerOf(tokenId2)).to.equal(await otherOwner.getAddress()); + expect(await parent.ownerOf(tokenId3)).to.equal(await otherOwner.getAddress()); - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); - expect(await parent.balanceOf(otherOwner.address)).to.equal(2); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); + expect(await parent.balanceOf(await otherOwner.getAddress())).to.equal(2); await expect(parent.ownerOf(9999)).to.be.revertedWithCustomError( parent, @@ -70,34 +74,32 @@ async function shouldBehaveLikeNestable( }); it('cannot nest mint to a non-contract destination', async function () { - await expect(nestMint(child, tokenOwner.address, bn(0))).to.be.revertedWithCustomError( - child, - 'RMRKIsNotContract', - ); + await expect( + nestMint(child, await tokenOwner.getAddress(), bn(0)), + ).to.be.revertedWithCustomError(child, 'RMRKIsNotContract'); }); it('cannot nest mint to non rmrk nestable receiver', async function () { const ERC721 = await ethers.getContractFactory('ERC721Mock'); const nonReceiver = await ERC721.deploy('Non receiver', 'NR'); - await nonReceiver.deployed(); + await nonReceiver.waitForDeployment(); const parentId = await mint(parent, addrs[1].address); - await expect(nestMint(child, nonReceiver.address, parentId)).to.be.revertedWithCustomError( - child, - 'RMRKNestableTransferToNonRMRKNestableImplementer', - ); + await expect( + nestMint(child, await nonReceiver.getAddress(), parentId), + ).to.be.revertedWithCustomError(child, 'RMRKNestableTransferToNonRMRKNestableImplementer'); }); it('cannot nest mint to a non-existent token', async function () { - await expect(nestMint(child, parent.address, bn(1))).to.be.revertedWithCustomError( + await expect(nestMint(child, await parent.getAddress(), bn(1))).to.be.revertedWithCustomError( child, 'ERC721InvalidTokenId', ); }); it('cannot nest mint to zero address', async function () { - const parentId = await mint(parent, tokenOwner.address); + const parentId = await mint(parent, await tokenOwner.getAddress()); await expect(nestMint(child, ADDRESS_ZERO, parentId)).to.be.revertedWithCustomError( child, 'RMRKIsNotContract', @@ -105,41 +107,49 @@ async function shouldBehaveLikeNestable( }); it('can mint to contract and owners are ok', async function () { - const parentId = await mint(parent, tokenOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await tokenOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); // owner is the same adress - expect(await parent.ownerOf(parentId)).to.equal(tokenOwner.address); - expect(await child.ownerOf(childId)).to.equal(tokenOwner.address); + expect(await parent.ownerOf(parentId)).to.equal(await tokenOwner.getAddress()); + expect(await child.ownerOf(childId)).to.equal(await tokenOwner.getAddress()); - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); - expect(await child.balanceOf(parent.address)).to.equal(1); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); }); it('can mint to contract and RMRK owners are ok', async function () { - const parentId = await mint(parent, tokenOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await tokenOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); // RMRK owner is an address for the parent - expect(await parent.directOwnerOf(parentId)).to.eql([tokenOwner.address, bn(0), false]); + expect(await parent.directOwnerOf(parentId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); // RMRK owner is a contract for the child - expect(await child.directOwnerOf(childId)).to.eql([parent.address, parentId, true]); + expect(await child.directOwnerOf(childId)).to.eql([ + await parent.getAddress(), + parentId, + true, + ]); }); it("can mint to contract and parent's children are ok", async function () { - const parentId = await mint(parent, tokenOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await tokenOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); const children = await parent.childrenOf(parentId); expect(children).to.eql([]); const pendingChildren = await parent.pendingChildrenOf(parentId); - expect(pendingChildren).to.eql([[childId, child.address]]); - expect(await parent.pendingChildOf(parentId, 0)).to.eql([childId, child.address]); + expect(pendingChildren).to.eql([[childId, await child.getAddress()]]); + expect(await parent.pendingChildOf(parentId, 0)).to.eql([childId, await child.getAddress()]); }); it('cannot get child out of index', async function () { - const parentId = await mint(parent, tokenOwner.address); + const parentId = await mint(parent, await tokenOwner.getAddress()); await expect(parent.childOf(parentId, 0)).to.be.revertedWithCustomError( parent, 'RMRKChildIndexOutOfRange', @@ -147,7 +157,7 @@ async function shouldBehaveLikeNestable( }); it('cannot get pending child out of index', async function () { - const parentId = await mint(parent, tokenOwner.address); + const parentId = await mint(parent, await tokenOwner.getAddress()); await expect(parent.pendingChildOf(parentId, 0)).to.be.revertedWithCustomError( parent, 'RMRKPendingChildIndexOutOfRange', @@ -155,55 +165,58 @@ async function shouldBehaveLikeNestable( }); it('can mint multiple children', async function () { - const parentId = await mint(parent, tokenOwner.address); - const childId1 = await nestMint(child, parent.address, parentId); - const childId2 = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await tokenOwner.getAddress()); + const childId1 = await nestMint(child, await parent.getAddress(), parentId); + const childId2 = await nestMint(child, await parent.getAddress(), parentId); - expect(await child.ownerOf(childId1)).to.equal(tokenOwner.address); - expect(await child.ownerOf(childId2)).to.equal(tokenOwner.address); + expect(await child.ownerOf(childId1)).to.equal(await tokenOwner.getAddress()); + expect(await child.ownerOf(childId2)).to.equal(await tokenOwner.getAddress()); - expect(await child.balanceOf(parent.address)).to.equal(2); + expect(await child.balanceOf(await parent.getAddress())).to.equal(2); const pendingChildren = await parent.pendingChildrenOf(parentId); expect(pendingChildren).to.eql([ - [childId1, child.address], - [childId2, child.address], + [childId1, await child.getAddress()], + [childId2, await child.getAddress()], ]); }); it('can mint child into child', async function () { - const parentId = await mint(parent, tokenOwner.address); - const childId = await nestMint(child, parent.address, parentId); - const granchildId = await nestMint(child, child.address, childId); + const parentId = await mint(parent, await tokenOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); + const granchildId = await nestMint(child, await child.getAddress(), childId); // Check balances -- yes, technically the counted balance indicates `child` owns an instance of itself // and this is a little counterintuitive, but the root owner is the EOA. - expect(await child.balanceOf(parent.address)).to.equal(1); - expect(await child.balanceOf(child.address)).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); + expect(await child.balanceOf(await child.getAddress())).to.equal(1); const pendingChildrenOfChunky10 = await parent.pendingChildrenOf(parentId); const pendingChildrenOfMonkey1 = await child.pendingChildrenOf(childId); - expect(pendingChildrenOfChunky10).to.eql([[childId, child.address]]); - expect(pendingChildrenOfMonkey1).to.eql([[granchildId, child.address]]); + expect(pendingChildrenOfChunky10).to.eql([[childId, await child.getAddress()]]); + expect(pendingChildrenOfMonkey1).to.eql([[granchildId, await child.getAddress()]]); - expect(await child.directOwnerOf(granchildId)).to.eql([child.address, childId, true]); + expect(await child.directOwnerOf(granchildId)).to.eql([ + await child.getAddress(), + childId, + true, + ]); - expect(await child.ownerOf(granchildId)).to.eql(tokenOwner.address); + expect(await child.ownerOf(granchildId)).to.eql(await tokenOwner.getAddress()); }); it('cannot have too many pending children', async () => { - const parentId = await mint(parent, tokenOwner.address); + const parentId = await mint(parent, await tokenOwner.getAddress()); // First 127 should be fine. for (let i = 0; i <= 127; i++) { - await nestMint(child, parent.address, parentId); + await nestMint(child, await parent.getAddress(), parentId); } - await expect(nestMint(child, parent.address, parentId)).to.be.revertedWithCustomError( - child, - 'RMRKMaxPendingChildrenReached', - ); + await expect( + nestMint(child, await parent.getAddress(), parentId), + ).to.be.revertedWithCustomError(child, 'RMRKMaxPendingChildrenReached'); }); }); @@ -229,8 +242,8 @@ async function shouldBehaveLikeNestable( it('cannot add child from user address', async function () { const tokenOwner1 = addrs[0]; const tokenOwner2 = addrs[1]; - const parentId = await mint(parent, tokenOwner1.address); - const childId = await mint(child, tokenOwner2.address); + const parentId = await mint(parent, await tokenOwner1.getAddress()); + const childId = await mint(child, await tokenOwner2.getAddress()); await expect(parent.addChild(parentId, childId, '0x')).to.be.revertedWithCustomError( parent, 'RMRKIsNotContract', @@ -239,39 +252,41 @@ async function shouldBehaveLikeNestable( }); describe('Accept child', async function () { - let parentId: BigNumber; - let childId: BigNumber; + let parentId: bigint; + let childId: bigint; beforeEach(async function () { - parentId = await mint(parent, tokenOwner.address); - childId = await nestMint(child, parent.address, parentId); + parentId = await mint(parent, await tokenOwner.getAddress()); + childId = await nestMint(child, await parent.getAddress(), parentId); }); it('can accept child', async function () { - await expect(parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, childId)) + await expect( + parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), childId), + ) .to.emit(parent, 'ChildAccepted') - .withArgs(parentId, 0, child.address, childId); + .withArgs(parentId, 0, await child.getAddress(), childId); await checkChildWasAccepted(); }); it('can accept child if approved', async function () { const approved = addrs[1]; - await parent.connect(tokenOwner).approve(approved.address, parentId); - await parent.connect(approved).acceptChild(parentId, 0, child.address, childId); + await parent.connect(tokenOwner).approve(await approved.getAddress(), parentId); + await parent.connect(approved).acceptChild(parentId, 0, await child.getAddress(), childId); await checkChildWasAccepted(); }); it('can accept child if approved for all', async function () { const operator = addrs[2]; - await parent.connect(tokenOwner).setApprovalForAll(operator.address, true); - await parent.connect(operator).acceptChild(parentId, 0, child.address, childId); + await parent.connect(tokenOwner).setApprovalForAll(await operator.getAddress(), true); + await parent.connect(operator).acceptChild(parentId, 0, await child.getAddress(), childId); await checkChildWasAccepted(); }); it('cannot accept not owned child', async function () { const notOwner = addrs[3]; await expect( - parent.connect(notOwner).acceptChild(parentId, 0, child.address, childId), + parent.connect(notOwner).acceptChild(parentId, 0, await child.getAddress(), childId), ).to.be.revertedWithCustomError(parent, 'ERC721NotApprovedOrOwner'); }); @@ -279,7 +294,7 @@ async function shouldBehaveLikeNestable( const otherAddress = addrs[1].address; const otherChildId = 9999; await expect( - parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, otherChildId), + parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), otherChildId), ).to.be.revertedWithCustomError(parent, 'RMRKUnexpectedChildId'); await expect( parent.connect(tokenOwner).acceptChild(parentId, 0, otherAddress, childId), @@ -288,28 +303,28 @@ async function shouldBehaveLikeNestable( it('cannot accept children for non existing index', async () => { await expect( - parent.connect(tokenOwner).acceptChild(parentId, 1, child.address, childId), + parent.connect(tokenOwner).acceptChild(parentId, 1, await child.getAddress(), childId), ).to.be.revertedWithCustomError(parent, 'RMRKPendingChildIndexOutOfRange'); }); async function checkChildWasAccepted() { expect(await parent.pendingChildrenOf(parentId)).to.eql([]); - expect(await parent.childrenOf(parentId)).to.eql([[childId, child.address]]); + expect(await parent.childrenOf(parentId)).to.eql([[childId, await child.getAddress()]]); } }); describe('Reject child', async function () { - let parentId: BigNumber; + let parentId: bigint; beforeEach(async function () { - parentId = await mint(parent, tokenOwner.address); - await nestMint(child, parent.address, parentId); + parentId = await mint(parent, await tokenOwner.getAddress()); + await nestMint(child, await parent.getAddress(), parentId); }); it('can reject all pending children', async function () { // Mint a couple of more children - await nestMint(child, parent.address, parentId); - await nestMint(child, parent.address, parentId); + await nestMint(child, await parent.getAddress(), parentId); + await nestMint(child, await parent.getAddress(), parentId); await expect(parent.connect(tokenOwner).rejectAllChildren(parentId, 3)) .to.emit(parent, 'AllChildrenRejected') @@ -317,13 +332,13 @@ async function shouldBehaveLikeNestable( await checkNoChildrenNorPending(parentId); // They are still on the child - expect(await child.balanceOf(parent.address)).to.equal(3); + expect(await child.balanceOf(await parent.getAddress())).to.equal(3); }); it('cannot reject all pending children if there are more than expected', async function () { // Mint a couple of more children - await nestMint(child, parent.address, parentId); - await nestMint(child, parent.address, parentId); + await nestMint(child, await parent.getAddress(), parentId); + await nestMint(child, await parent.getAddress(), parentId); await expect( parent.connect(tokenOwner).rejectAllChildren(parentId, 1), @@ -332,22 +347,22 @@ async function shouldBehaveLikeNestable( it('can reject all pending children if approved', async function () { // Mint a couple of more children - await nestMint(child, parent.address, parentId); - await nestMint(child, parent.address, parentId); + await nestMint(child, await parent.getAddress(), parentId); + await nestMint(child, await parent.getAddress(), parentId); const rejecter = addrs[1]; - await parent.connect(tokenOwner).approve(rejecter.address, parentId); + await parent.connect(tokenOwner).approve(await rejecter.getAddress(), parentId); await parent.connect(rejecter).rejectAllChildren(parentId, 3); await checkNoChildrenNorPending(parentId); }); it('can reject all pending children if approved for all', async function () { // Mint a couple of more children - await nestMint(child, parent.address, parentId); - await nestMint(child, parent.address, parentId); + await nestMint(child, await parent.getAddress(), parentId); + await nestMint(child, await parent.getAddress(), parentId); const operator = addrs[2]; - await parent.connect(tokenOwner).setApprovalForAll(operator.address, true); + await parent.connect(tokenOwner).setApprovalForAll(await operator.getAddress(), true); await parent.connect(operator).rejectAllChildren(parentId, 3); await checkNoChildrenNorPending(parentId); }); @@ -362,52 +377,58 @@ async function shouldBehaveLikeNestable( }); describe('Burning', async function () { - let parentId: BigNumber; + let parentId: bigint; beforeEach(async function () { - parentId = await mint(parent, tokenOwner.address); + parentId = await mint(parent, await tokenOwner.getAddress()); }); it('can burn token', async function () { - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); await parent.connect(tokenOwner)['burn(uint256)'](parentId); await checkBurntParent(); }); it('can burn token if approved', async function () { const approved = addrs[1]; - await parent.connect(tokenOwner).approve(approved.address, parentId); + await parent.connect(tokenOwner).approve(await approved.getAddress(), parentId); await parent.connect(approved)['burn(uint256)'](parentId); await checkBurntParent(); }); it('can burn token if approved for all', async function () { const operator = addrs[2]; - await parent.connect(tokenOwner).setApprovalForAll(operator.address, true); + await parent.connect(tokenOwner).setApprovalForAll(await operator.getAddress(), true); await parent.connect(operator)['burn(uint256)'](parentId); await checkBurntParent(); }); it('can recursively burn nested token', async function () { - const childId = await nestMint(child, parent.address, parentId); - const granchildId = await nestMint(child, child.address, childId); - await parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, childId); - await child.connect(tokenOwner).acceptChild(childId, 0, child.address, granchildId); - - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); - expect(await child.balanceOf(parent.address)).to.equal(1); - expect(await child.balanceOf(child.address)).to.equal(1); - - expect(await parent.childrenOf(parentId)).to.eql([[childId, child.address]]); - expect(await child.childrenOf(childId)).to.eql([[granchildId, child.address]]); - expect(await child.directOwnerOf(granchildId)).to.eql([child.address, childId, true]); + const childId = await nestMint(child, await parent.getAddress(), parentId); + const granchildId = await nestMint(child, await child.getAddress(), childId); + await parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), childId); + await child + .connect(tokenOwner) + .acceptChild(childId, 0, await child.getAddress(), granchildId); + + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); + expect(await child.balanceOf(await child.getAddress())).to.equal(1); + + expect(await parent.childrenOf(parentId)).to.eql([[childId, await child.getAddress()]]); + expect(await child.childrenOf(childId)).to.eql([[granchildId, await child.getAddress()]]); + expect(await child.directOwnerOf(granchildId)).to.eql([ + await child.getAddress(), + childId, + true, + ]); // Sets recursive burns to 2 await parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 2); - expect(await parent.balanceOf(tokenOwner.address)).to.equal(0); - expect(await child.balanceOf(parent.address)).to.equal(0); - expect(await child.balanceOf(child.address)).to.equal(0); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(0); + expect(await child.balanceOf(await parent.getAddress())).to.equal(0); + expect(await child.balanceOf(await child.getAddress())).to.equal(0); await expect(parent.ownerOf(parentId)).to.be.revertedWithCustomError( parent, @@ -445,37 +466,43 @@ async function shouldBehaveLikeNestable( // -> GreatGrandChild1 // -> Child2 // Total tree 5 (4 recursive burns) - const childId = await nestMint(child, parent.address, parentId); - const childId2 = await nestMint(child, parent.address, parentId); - const grandChild1 = await nestMint(child, child.address, childId); - const grandChild2 = await nestMint(child, child.address, childId); - const greatGrandChild1 = await nestMint(child, child.address, grandChild2); - await parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, childId); - await parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, childId2); - await child.connect(tokenOwner).acceptChild(childId, 0, child.address, grandChild1); - await child.connect(tokenOwner).acceptChild(childId, 0, child.address, grandChild2); - await child.connect(tokenOwner).acceptChild(grandChild2, 0, child.address, greatGrandChild1); + const childId = await nestMint(child, await parent.getAddress(), parentId); + const childId2 = await nestMint(child, await parent.getAddress(), parentId); + const grandChild1 = await nestMint(child, await child.getAddress(), childId); + const grandChild2 = await nestMint(child, await child.getAddress(), childId); + const greatGrandChild1 = await nestMint(child, await child.getAddress(), grandChild2); + await parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), childId); + await parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), childId2); + await child + .connect(tokenOwner) + .acceptChild(childId, 0, await child.getAddress(), grandChild1); + await child + .connect(tokenOwner) + .acceptChild(childId, 0, await child.getAddress(), grandChild2); + await child + .connect(tokenOwner) + .acceptChild(grandChild2, 0, await child.getAddress(), greatGrandChild1); // 0 is not enough await expect(parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 0)) .to.be.revertedWithCustomError(parent, 'RMRKMaxRecursiveBurnsReached') - .withArgs(child.address, childId); + .withArgs(await child.getAddress(), childId); // 1 is not enough await expect(parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 1)) .to.be.revertedWithCustomError(parent, 'RMRKMaxRecursiveBurnsReached') - .withArgs(child.address, grandChild1); + .withArgs(await child.getAddress(), grandChild1); // 2 is not enough await expect(parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 2)) .to.be.revertedWithCustomError(parent, 'RMRKMaxRecursiveBurnsReached') - .withArgs(child.address, grandChild2); + .withArgs(await child.getAddress(), grandChild2); // 3 is not enough await expect(parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 3)) .to.be.revertedWithCustomError(parent, 'RMRKMaxRecursiveBurnsReached') - .withArgs(child.address, greatGrandChild1); + .withArgs(await child.getAddress(), greatGrandChild1); // 4 is not enough await expect(parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 4)) .to.be.revertedWithCustomError(parent, 'RMRKMaxRecursiveBurnsReached') - .withArgs(child.address, childId2); + .withArgs(await child.getAddress(), childId2); // 5 is just enough await parent.connect(tokenOwner)['burn(uint256,uint256)'](parentId, 5); }); @@ -490,23 +517,32 @@ async function shouldBehaveLikeNestable( }); describe('Transferring Active Children', async function () { - let parentId: BigNumber; - let childId: BigNumber; + let parentId: bigint; + let childId: bigint; beforeEach(async function () { - parentId = await mint(parent, tokenOwner.address); - childId = await nestMint(child, parent.address, parentId); - await parent.connect(tokenOwner).acceptChild(parentId, 0, child.address, childId); + parentId = await mint(parent, await tokenOwner.getAddress()); + childId = await nestMint(child, await parent.getAddress(), parentId); + await parent.connect(tokenOwner).acceptChild(parentId, 0, await child.getAddress(), childId); }); it('can transfer child with to as root owner', async function () { await expect( parent .connect(tokenOwner) - .transferChild(parentId, tokenOwner.address, 0, 0, child.address, childId, false, '0x'), + .transferChild( + parentId, + await tokenOwner.getAddress(), + 0, + 0, + await child.getAddress(), + childId, + false, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, false, false); + .withArgs(parentId, 0, await child.getAddress(), childId, false, false); await checkChildMovedToRootOwner(); }); @@ -516,10 +552,19 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, toOwnerAddress, 0, 0, child.address, childId, false, '0x'), + .transferChild( + parentId, + toOwnerAddress, + 0, + 0, + await child.getAddress(), + childId, + false, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, false, false); + .withArgs(parentId, 0, await child.getAddress(), childId, false, false); await checkChildMovedToRootOwner(toOwnerAddress); }); @@ -530,10 +575,19 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, child.address, childId, false, '0x'), + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await child.getAddress(), + childId, + false, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, false, true); + .withArgs(parentId, 0, await child.getAddress(), childId, false, true); expect(await parent.childrenOf(parentId)).to.eql([]); }); @@ -545,21 +599,27 @@ async function shouldBehaveLikeNestable( .connect(tokenOwner) .transferChild( parentId, - parent.address, + await parent.getAddress(), newParentId, 0, - child.address, + await child.getAddress(), childId, false, '0x', ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, false, false); + .withArgs(parentId, 0, await child.getAddress(), childId, false, false); expect(await child.ownerOf(childId)).to.eql(newOwnerAddress); - expect(await child.directOwnerOf(childId)).to.eql([parent.address, newParentId, true]); - expect(await parent.pendingChildrenOf(newParentId)).to.eql([[childId, child.address]]); + expect(await child.directOwnerOf(childId)).to.eql([ + await parent.getAddress(), + newParentId, + true, + ]); + expect(await parent.pendingChildrenOf(newParentId)).to.eql([ + [childId, await child.getAddress()], + ]); }); it('cannot transfer child out of index', async function () { @@ -573,7 +633,7 @@ async function shouldBehaveLikeNestable( toOwnerAddress, 0, badIndex, - child.address, + await child.getAddress(), childId, false, '0x', @@ -593,100 +653,126 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, toOwnerAddress, 0, 0, child.address, otherChildId, false, '0x'), + .transferChild( + parentId, + toOwnerAddress, + 0, + 0, + await child.getAddress(), + otherChildId, + false, + '0x', + ), ).to.be.revertedWithCustomError(parent, 'RMRKUnexpectedChildId'); }); it('can transfer child if approved', async function () { const transferer = addrs[1]; - const toOwner = tokenOwner.address; - await parent.connect(tokenOwner).approve(transferer.address, parentId); + const toOwner = await tokenOwner.getAddress(); + await parent.connect(tokenOwner).approve(await transferer.getAddress(), parentId); await parent .connect(transferer) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, false, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, false, '0x'); await checkChildMovedToRootOwner(); }); it('can transfer child if approved for all', async function () { const operator = addrs[2]; - const toOwner = tokenOwner.address; - await parent.connect(tokenOwner).setApprovalForAll(operator.address, true); + const toOwner = await tokenOwner.getAddress(); + await parent.connect(tokenOwner).setApprovalForAll(await operator.getAddress(), true); await parent .connect(operator) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, false, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, false, '0x'); await checkChildMovedToRootOwner(); }); it('can transfer child with grandchild and children are ok', async function () { - const toOwner = tokenOwner.address; - const grandchildId = await nestMint(child, child.address, childId); + const toOwner = await tokenOwner.getAddress(); + const grandchildId = await nestMint(child, await child.getAddress(), childId); // Transfer child from parent. await parent .connect(tokenOwner) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, false, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, false, '0x'); // New owner of child - expect(await child.ownerOf(childId)).to.eql(tokenOwner.address); - expect(await child.directOwnerOf(childId)).to.eql([tokenOwner.address, bn(0), false]); + expect(await child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); + expect(await child.directOwnerOf(childId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); // Grandchild is still owned by child - expect(await child.ownerOf(grandchildId)).to.eql(tokenOwner.address); - expect(await child.directOwnerOf(grandchildId)).to.eql([child.address, childId, true]); + expect(await child.ownerOf(grandchildId)).to.eql(await tokenOwner.getAddress()); + expect(await child.directOwnerOf(grandchildId)).to.eql([ + await child.getAddress(), + childId, + true, + ]); }); it('cannot transfer child if not child root owner', async function () { - const toOwner = tokenOwner.address; + const toOwner = await tokenOwner.getAddress(); const notOwner = addrs[3]; await expect( parent .connect(notOwner) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, false, '0x'), + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, false, '0x'), ).to.be.revertedWithCustomError(child, 'ERC721NotApprovedOrOwner'); }); it('cannot transfer child from not existing parent', async function () { const badTokenId = 999; - const toOwner = tokenOwner.address; + const toOwner = await tokenOwner.getAddress(); await expect( parent .connect(tokenOwner) - .transferChild(badTokenId, toOwner, 0, 0, child.address, childId, false, '0x'), + .transferChild(badTokenId, toOwner, 0, 0, await child.getAddress(), childId, false, '0x'), ).to.be.revertedWithCustomError(child, 'ERC721InvalidTokenId'); }); async function checkChildMovedToRootOwner(rootOwnerAddress?: string) { if (rootOwnerAddress === undefined) { - rootOwnerAddress = tokenOwner.address; + rootOwnerAddress = await tokenOwner.getAddress(); } expect(await child.ownerOf(childId)).to.eql(rootOwnerAddress); expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, bn(0), false]); // Transferring updates balances downstream expect(await child.balanceOf(rootOwnerAddress)).to.equal(1); - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); } }); describe('Transferring Pending Children', async function () { - let parentId: BigNumber; - let childId: BigNumber; + let parentId: bigint; + let childId: bigint; beforeEach(async function () { - parentId = await mint(parent, tokenOwner.address); - childId = await nestMint(child, parent.address, parentId); + parentId = await mint(parent, await tokenOwner.getAddress()); + childId = await nestMint(child, await parent.getAddress(), parentId); }); it('can transfer child with to as root owner', async function () { await expect( parent .connect(tokenOwner) - .transferChild(parentId, tokenOwner.address, 0, 0, child.address, childId, true, '0x'), + .transferChild( + parentId, + await tokenOwner.getAddress(), + 0, + 0, + await child.getAddress(), + childId, + true, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, true, false); + .withArgs(parentId, 0, await child.getAddress(), childId, true, false); await checkChildMovedToRootOwner(); }); @@ -696,10 +782,19 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, toOwnerAddress, 0, 0, child.address, childId, true, '0x'), + .transferChild( + parentId, + toOwnerAddress, + 0, + 0, + await child.getAddress(), + childId, + true, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, true, false); + .withArgs(parentId, 0, await child.getAddress(), childId, true, false); await checkChildMovedToRootOwner(toOwnerAddress); }); @@ -708,10 +803,19 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, child.address, childId, true, '0x'), + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await child.getAddress(), + childId, + true, + '0x', + ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, true, true); + .withArgs(parentId, 0, await child.getAddress(), childId, true, true); expect(await parent.pendingChildrenOf(parentId)).to.eql([]); }); @@ -723,21 +827,27 @@ async function shouldBehaveLikeNestable( .connect(tokenOwner) .transferChild( parentId, - parent.address, + await parent.getAddress(), newParentId, 0, - child.address, + await child.getAddress(), childId, true, '0x', ), ) .to.emit(parent, 'ChildTransferred') - .withArgs(parentId, 0, child.address, childId, true, false); + .withArgs(parentId, 0, await child.getAddress(), childId, true, false); expect(await child.ownerOf(childId)).to.eql(newOwnerAddress); - expect(await child.directOwnerOf(childId)).to.eql([parent.address, newParentId, true]); - expect(await parent.pendingChildrenOf(newParentId)).to.eql([[childId, child.address]]); + expect(await child.directOwnerOf(childId)).to.eql([ + await parent.getAddress(), + newParentId, + true, + ]); + expect(await parent.pendingChildrenOf(newParentId)).to.eql([ + [childId, await child.getAddress()], + ]); }); it('cannot transfer child out of index', async function () { @@ -746,7 +856,16 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, toOwnerAddress, 0, badIndex, child.address, childId, true, '0x'), + .transferChild( + parentId, + toOwnerAddress, + 0, + badIndex, + await child.getAddress(), + childId, + true, + '0x', + ), ).to.be.revertedWithCustomError(parent, 'RMRKPendingChildIndexOutOfRange'); }); @@ -762,80 +881,97 @@ async function shouldBehaveLikeNestable( await expect( parent .connect(tokenOwner) - .transferChild(parentId, toOwnerAddress, 0, 0, child.address, otherChildId, true, '0x'), + .transferChild( + parentId, + toOwnerAddress, + 0, + 0, + await child.getAddress(), + otherChildId, + true, + '0x', + ), ).to.be.revertedWithCustomError(parent, 'RMRKUnexpectedChildId'); }); it('can transfer child if approved', async function () { const transferer = addrs[1]; - const toOwner = tokenOwner.address; - await parent.connect(tokenOwner).approve(transferer.address, parentId); + const toOwner = await tokenOwner.getAddress(); + await parent.connect(tokenOwner).approve(await transferer.getAddress(), parentId); await parent .connect(transferer) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, true, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, true, '0x'); await checkChildMovedToRootOwner(); }); it('can transfer child if approved for all', async function () { const operator = addrs[2]; - const toOwner = tokenOwner.address; - await parent.connect(tokenOwner).setApprovalForAll(operator.address, true); + const toOwner = await tokenOwner.getAddress(); + await parent.connect(tokenOwner).setApprovalForAll(await operator.getAddress(), true); await parent .connect(operator) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, true, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, true, '0x'); await checkChildMovedToRootOwner(); }); it('can transfer child with grandchild and children are ok', async function () { - const toOwner = tokenOwner.address; - const grandchildId = await nestMint(child, child.address, childId); + const toOwner = await tokenOwner.getAddress(); + const grandchildId = await nestMint(child, await child.getAddress(), childId); // Transfer child from parent. await parent .connect(tokenOwner) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, true, '0x'); + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, true, '0x'); // New owner of child - expect(await child.ownerOf(childId)).to.eql(tokenOwner.address); - expect(await child.directOwnerOf(childId)).to.eql([tokenOwner.address, bn(0), false]); + expect(await child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); + expect(await child.directOwnerOf(childId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); // Grandchild is still owned by child - expect(await child.ownerOf(grandchildId)).to.eql(tokenOwner.address); - expect(await child.directOwnerOf(grandchildId)).to.eql([child.address, childId, true]); + expect(await child.ownerOf(grandchildId)).to.eql(await tokenOwner.getAddress()); + expect(await child.directOwnerOf(grandchildId)).to.eql([ + await child.getAddress(), + childId, + true, + ]); }); it('cannot transfer child if not child root owner', async function () { - const toOwner = tokenOwner.address; + const toOwner = await tokenOwner.getAddress(); const notOwner = addrs[3]; await expect( parent .connect(notOwner) - .transferChild(parentId, toOwner, 0, 0, child.address, childId, true, '0x'), + .transferChild(parentId, toOwner, 0, 0, await child.getAddress(), childId, true, '0x'), ).to.be.revertedWithCustomError(child, 'ERC721NotApprovedOrOwner'); }); it('cannot transfer child from not existing parent', async function () { const badTokenId = 999; - const toOwner = tokenOwner.address; + const toOwner = await tokenOwner.getAddress(); await expect( parent .connect(tokenOwner) - .transferChild(badTokenId, toOwner, 0, 0, child.address, childId, true, '0x'), + .transferChild(badTokenId, toOwner, 0, 0, await child.getAddress(), childId, true, '0x'), ).to.be.revertedWithCustomError(child, 'ERC721InvalidTokenId'); }); async function checkChildMovedToRootOwner(rootOwnerAddress?: string) { if (rootOwnerAddress === undefined) { - rootOwnerAddress = tokenOwner.address; + rootOwnerAddress = await tokenOwner.getAddress(); } expect(await child.ownerOf(childId)).to.eql(rootOwnerAddress); expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, bn(0), false]); // transferring updates balances downstream expect(await child.balanceOf(rootOwnerAddress)).to.equal(1); - expect(await parent.balanceOf(tokenOwner.address)).to.equal(1); + expect(await parent.balanceOf(await tokenOwner.getAddress())).to.equal(1); } }); @@ -843,27 +979,27 @@ async function shouldBehaveLikeNestable( it('can transfer token', async function () { const firstOwner = addrs[1]; const newOwner = addrs[2]; - const tokenId = await mint(parent, firstOwner.address); - await transfer(parent, firstOwner, newOwner.address, tokenId); + const tokenId = await mint(parent, await firstOwner.getAddress()); + await transfer(parent, firstOwner, await newOwner.getAddress(), tokenId); // Balances and ownership are updated - expect(await parent.ownerOf(tokenId)).to.eql(newOwner.address); - expect(await parent.balanceOf(firstOwner.address)).to.equal(0); - expect(await parent.balanceOf(newOwner.address)).to.equal(1); + expect(await parent.ownerOf(tokenId)).to.eql(await newOwner.getAddress()); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(0); + expect(await parent.balanceOf(await newOwner.getAddress())).to.equal(1); }); it('cannot transfer not owned token', async function () { const firstOwner = addrs[1]; const newOwner = addrs[2]; - const tokenId = await mint(parent, firstOwner.address); + const tokenId = await mint(parent, await firstOwner.getAddress()); await expect( - transfer(parent, newOwner, newOwner.address, tokenId), + transfer(parent, newOwner, await newOwner.getAddress(), tokenId), ).to.be.revertedWithCustomError(child, 'RMRKNotApprovedOrDirectOwner'); }); it('cannot transfer to address zero', async function () { const firstOwner = addrs[1]; - const tokenId = await mint(parent, firstOwner.address); + const tokenId = await mint(parent, await firstOwner.getAddress()); await expect( transfer(parent, firstOwner, ADDRESS_ZERO, tokenId), ).to.be.revertedWithCustomError(child, 'ERC721TransferToTheZeroAddress'); @@ -873,164 +1009,174 @@ async function shouldBehaveLikeNestable( const firstOwner = addrs[1]; const approved = addrs[2]; const newOwner = addrs[3]; - const tokenId = await mint(parent, firstOwner.address); + const tokenId = await mint(parent, await firstOwner.getAddress()); - await parent.connect(firstOwner).approve(approved.address, tokenId); - await transfer(parent, firstOwner, newOwner.address, tokenId); + await parent.connect(firstOwner).approve(await approved.getAddress(), tokenId); + await transfer(parent, firstOwner, await newOwner.getAddress(), tokenId); - expect(await parent.ownerOf(tokenId)).to.eql(newOwner.address); + expect(await parent.ownerOf(tokenId)).to.eql(await newOwner.getAddress()); }); it('can transfer not nested token with child to address and owners/children are ok', async function () { const firstOwner = addrs[1]; const newOwner = addrs[2]; - const parentId = await mint(parent, firstOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await firstOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); - await transfer(parent, firstOwner, newOwner.address, parentId); + await transfer(parent, firstOwner, await newOwner.getAddress(), parentId); // Balances and ownership are updated - expect(await parent.balanceOf(firstOwner.address)).to.equal(0); - expect(await parent.balanceOf(newOwner.address)).to.equal(1); - - expect(await parent.ownerOf(parentId)).to.eql(newOwner.address); - expect(await parent.directOwnerOf(parentId)).to.eql([newOwner.address, bn(0), false]); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(0); + expect(await parent.balanceOf(await newOwner.getAddress())).to.equal(1); + + expect(await parent.ownerOf(parentId)).to.eql(await newOwner.getAddress()); + expect(await parent.directOwnerOf(parentId)).to.eql([ + await newOwner.getAddress(), + bn(0), + false, + ]); // New owner of child - expect(await child.ownerOf(childId)).to.eql(newOwner.address); - expect(await child.directOwnerOf(childId)).to.eql([parent.address, parentId, true]); + expect(await child.ownerOf(childId)).to.eql(await newOwner.getAddress()); + expect(await child.directOwnerOf(childId)).to.eql([ + await parent.getAddress(), + parentId, + true, + ]); // Parent still has its children - expect(await parent.pendingChildrenOf(parentId)).to.eql([[childId, child.address]]); + expect(await parent.pendingChildrenOf(parentId)).to.eql([ + [childId, await child.getAddress()], + ]); }); it('cannot directly transfer nested child', async function () { const firstOwner = addrs[1]; const newOwner = addrs[2]; - const parentId = await mint(parent, firstOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const parentId = await mint(parent, await firstOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); await expect( - transfer(child, firstOwner, newOwner.address, childId), + transfer(child, firstOwner, await newOwner.getAddress(), childId), ).to.be.revertedWithCustomError(child, 'RMRKNotApprovedOrDirectOwner'); }); it('can transfer parent token to token with same owner, family tree is ok', async function () { const firstOwner = addrs[1]; - const grandParentId = await mint(parent, firstOwner.address); - const parentId = await mint(parent, firstOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const grandParentId = await mint(parent, await firstOwner.getAddress()); + const parentId = await mint(parent, await firstOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); // Check balances - expect(await parent.balanceOf(firstOwner.address)).to.equal(2); - expect(await child.balanceOf(parent.address)).to.equal(1); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(2); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); - // Transfers token parentId to (parent.address, token grandParentId) - await nestTransfer(parent, firstOwner, parent.address, parentId, grandParentId); + // Transfers token parentId to (await parent.getAddress(), token grandParentId) + await nestTransfer(parent, firstOwner, await parent.getAddress(), parentId, grandParentId); // Balances unchanged since root owner is the same - expect(await parent.balanceOf(firstOwner.address)).to.equal(1); - expect(await child.balanceOf(parent.address)).to.equal(1); - expect(await parent.balanceOf(parent.address)).to.equal(1); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); + expect(await parent.balanceOf(await parent.getAddress())).to.equal(1); // Parent is still owner of child - let expected = [childId, child.address]; + let expected = [childId, await child.getAddress()]; checkAcceptedAndPendingChildren(parent, parentId, [expected], []); // Ownership: firstOwner > newGrandparent > parent > child - expected = [parentId, parent.address]; + expected = [parentId, await parent.getAddress()]; checkAcceptedAndPendingChildren(parent, grandParentId, [], [expected]); }); it('can transfer parent token to token with different owner, family tree is ok', async function () { const firstOwner = addrs[1]; const otherOwner = addrs[2]; - const grandParentId = await mint(parent, otherOwner.address); - const parentId = await mint(parent, firstOwner.address); - const childId = await nestMint(child, parent.address, parentId); + const grandParentId = await mint(parent, await otherOwner.getAddress()); + const parentId = await mint(parent, await firstOwner.getAddress()); + const childId = await nestMint(child, await parent.getAddress(), parentId); // Check balances - expect(await parent.balanceOf(otherOwner.address)).to.equal(1); - expect(await parent.balanceOf(firstOwner.address)).to.equal(1); - expect(await child.balanceOf(parent.address)).to.equal(1); + expect(await parent.balanceOf(await otherOwner.getAddress())).to.equal(1); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); // firstOwner calls parent to transfer parent token parent - await nestTransfer(parent, firstOwner, parent.address, parentId, grandParentId); + await nestTransfer(parent, firstOwner, await parent.getAddress(), parentId, grandParentId); // Balances update - expect(await parent.balanceOf(firstOwner.address)).to.equal(0); - expect(await parent.balanceOf(parent.address)).to.equal(1); - expect(await parent.balanceOf(otherOwner.address)).to.equal(1); - expect(await child.balanceOf(parent.address)).to.equal(1); + expect(await parent.balanceOf(await firstOwner.getAddress())).to.equal(0); + expect(await parent.balanceOf(await parent.getAddress())).to.equal(1); + expect(await parent.balanceOf(await otherOwner.getAddress())).to.equal(1); + expect(await child.balanceOf(await parent.getAddress())).to.equal(1); // Parent is still owner of child - let expected = [childId, child.address]; + let expected = [childId, await child.getAddress()]; checkAcceptedAndPendingChildren(parent, parentId, [expected], []); // Ownership: firstOwner > newGrandparent > parent > child - expected = [parentId, parent.address]; + expected = [parentId, await parent.getAddress()]; checkAcceptedAndPendingChildren(parent, grandParentId, [], [expected]); }); }); describe('Nest Transfer', async function () { let firstOwner: SignerWithAddress; - let parentId: BigNumber; - let childId: BigNumber; + let parentId: bigint; + let childId: bigint; beforeEach(async function () { firstOwner = addrs[1]; - parentId = await mint(parent, firstOwner.address); - childId = await mint(child, firstOwner.address); + parentId = await mint(parent, await firstOwner.getAddress()); + childId = await mint(child, await firstOwner.getAddress()); }); it('cannot nest tranfer from non immediate owner (owner of parent)', async function () { - const otherParentId = await mint(parent, firstOwner.address); + const otherParentId = await mint(parent, await firstOwner.getAddress()); // We send it to the parent first - await nestTransfer(child, firstOwner, parent.address, childId, parentId); + await nestTransfer(child, firstOwner, await parent.getAddress(), childId, parentId); // We can no longer nest transfer it, even if we are the root owner: await expect( - nestTransfer(child, firstOwner, parent.address, childId, otherParentId), + nestTransfer(child, firstOwner, await parent.getAddress(), childId, otherParentId), ).to.be.revertedWithCustomError(child, 'RMRKNotApprovedOrDirectOwner'); }); it('cannot nest tranfer to same NFT', async function () { // We can no longer nest transfer it, even if we are the root owner: await expect( - nestTransfer(child, firstOwner, child.address, childId, childId), + nestTransfer(child, firstOwner, await child.getAddress(), childId, childId), ).to.be.revertedWithCustomError(child, 'RMRKNestableTransferToSelf'); }); it('cannot nest tranfer a descendant same NFT', async function () { // We can no longer nest transfer it, even if we are the root owner: - await nestTransfer(child, firstOwner, parent.address, childId, parentId); - const grandChildId = await nestMint(child, child.address, childId); + await nestTransfer(child, firstOwner, await parent.getAddress(), childId, parentId); + const grandChildId = await nestMint(child, await child.getAddress(), childId); // Ownership is now parent->child->granChild // Cannot send parent to grandChild await expect( - nestTransfer(parent, firstOwner, child.address, parentId, grandChildId), + nestTransfer(parent, firstOwner, await child.getAddress(), parentId, grandChildId), ).to.be.revertedWithCustomError(child, 'RMRKNestableTransferToDescendant'); // Cannot send parent to child await expect( - nestTransfer(parent, firstOwner, child.address, parentId, childId), + nestTransfer(parent, firstOwner, await child.getAddress(), parentId, childId), ).to.be.revertedWithCustomError(child, 'RMRKNestableTransferToDescendant'); }); it('cannot nest tranfer if ancestors tree is too deep', async function () { let lastId = childId; for (let i = 0; i < 100; i++) { - const newChildId = await nestMint(child, child.address, lastId); + const newChildId = await nestMint(child, await child.getAddress(), lastId); lastId = newChildId; } // Ownership is now parent->child->child->child->child...->lastChild // Cannot send parent to lastChild await expect( - nestTransfer(parent, firstOwner, child.address, parentId, lastId), + nestTransfer(parent, firstOwner, await child.getAddress(), parentId, lastId), ).to.be.revertedWithCustomError(child, 'RMRKNestableTooDeep'); }); it('cannot nest tranfer if not owner', async function () { const notOwner = addrs[3]; await expect( - nestTransfer(child, notOwner, parent.address, childId, parentId), + nestTransfer(child, notOwner, await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'RMRKNotApprovedOrDirectOwner'); }); @@ -1043,41 +1189,45 @@ async function shouldBehaveLikeNestable( it('cannot nest tranfer to a non contract', async function () { const newOwner = addrs[2]; await expect( - nestTransfer(child, firstOwner, newOwner.address, childId, parentId), + nestTransfer(child, firstOwner, await newOwner.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'RMRKIsNotContract'); }); it('cannot nest tranfer to contract if it does implement IERC7401', async function () { const ERC721 = await ethers.getContractFactory('ERC721Mock'); const nonNestable = await ERC721.deploy('Non receiver', 'NR'); - await nonNestable.deployed(); + await nonNestable.waitForDeployment(); await expect( - nestTransfer(child, firstOwner, nonNestable.address, childId, parentId), + nestTransfer(child, firstOwner, await nonNestable.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'RMRKNestableTransferToNonRMRKNestableImplementer'); }); it('can nest tranfer to IERC7401 contract', async function () { - await nestTransfer(child, firstOwner, parent.address, childId, parentId); - expect(await child.ownerOf(childId)).to.eql(firstOwner.address); - expect(await child.directOwnerOf(childId)).to.eql([parent.address, parentId, true]); + await nestTransfer(child, firstOwner, await parent.getAddress(), childId, parentId); + expect(await child.ownerOf(childId)).to.eql(await firstOwner.getAddress()); + expect(await child.directOwnerOf(childId)).to.eql([ + await parent.getAddress(), + parentId, + true, + ]); }); it('cannot nest tranfer to non existing parent token', async function () { const notExistingParentId = bn(9999); await expect( - nestTransfer(child, firstOwner, parent.address, childId, notExistingParentId), + nestTransfer(child, firstOwner, await parent.getAddress(), childId, notExistingParentId), ).to.be.revertedWithCustomError(parent, 'ERC721InvalidTokenId'); }); }); - async function checkNoChildrenNorPending(parentId: BigNumber): Promise { + async function checkNoChildrenNorPending(parentId: bigint): Promise { expect(await parent.pendingChildrenOf(parentId)).to.eql([]); expect(await parent.childrenOf(parentId)).to.eql([]); } async function checkAcceptedAndPendingChildren( contract: Contract, - tokenId: BigNumber, + tokenId: bigint, expectedAccepted: any[], expectedPending: any[], ) { diff --git a/test/behavior/ownableLock.ts b/test/behavior/ownableLock.ts index e4b380b2..75b02999 100644 --- a/test/behavior/ownableLock.ts +++ b/test/behavior/ownableLock.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { Contract } from 'ethers'; async function shouldBehaveOwnableLock(ismock: boolean) { @@ -19,7 +19,7 @@ async function shouldBehaveOwnableLock(ismock: boolean) { describe('Init', async function () { it('can get owner', async function () { - expect(await ownableLock.owner()).to.equal(owner.address); + expect(await ownableLock.owner()).to.equal(await owner.getAddress()); }); it('emits LockSet event when the lock is set', async function () { diff --git a/test/behavior/royalties.ts b/test/behavior/royalties.ts index ee155718..6829a22d 100644 --- a/test/behavior/royalties.ts +++ b/test/behavior/royalties.ts @@ -1,14 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; import { ADDRESS_ZERO, bn, ONE_ETH } from '../utils'; async function shouldHaveRoyalties( - mint: (token: Contract, to: string) => Promise, + mint: (token: Contract, to: string) => Promise, ): Promise { it('can get royalty data', async function () { const owner = (await ethers.getSigners())[0]; - const tokenId = await mint(this.token, owner.address); + const tokenId = await mint(this.token, await owner.getAddress()); expect(await this.token.royaltyInfo(tokenId, ONE_ETH.mul(10))).to.eql([ADDRESS_ZERO, ONE_ETH]); }); @@ -20,14 +20,14 @@ async function shouldHaveRoyalties( it('can get and update royalty receipient', async function () { const newRecipient = (await ethers.getSigners())[5]; - await this.token.updateRoyaltyRecipient(newRecipient.address); - expect(await this.token.getRoyaltyRecipient()).to.eql(newRecipient.address); + await this.token.updateRoyaltyRecipient(await newRecipient.getAddress()); + expect(await this.token.getRoyaltyRecipient()).to.eql(await newRecipient.getAddress()); }); it('cannot update royalty receipient if not owner', async function () { const newRecipient = (await ethers.getSigners())[5]; await expect( - this.token.connect(newRecipient).updateRoyaltyRecipient(newRecipient.address), + this.token.connect(newRecipient).updateRoyaltyRecipient(await newRecipient.getAddress()), ).to.be.revertedWithCustomError(this.token, 'RMRKNotOwner'); }); } diff --git a/test/bulkWriter.ts b/test/bulkWriter.ts index 12c20e06..7ffd3a04 100644 --- a/test/bulkWriter.ts +++ b/test/bulkWriter.ts @@ -1,9 +1,8 @@ import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ADDRESS_ZERO, bn, mintFromMock, nestMintFromMock } from './utils'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogImpl, RMRKEquippableMock, @@ -41,32 +40,39 @@ async function bulkWriterFixture() { const catalog = await catalogFactory.deploy('ipfs://catalog.json', 'misc'); const kanaria = await equipFactory.deploy(); - kanaria.deployed(); + await kanaria.waitForDeployment(); const gem = await equipFactory.deploy(); - gem.deployed(); + await gem.waitForDeployment(); const bulkWriterPerCollection = ( - await bulkWriterPerCollectionFactory.deploy(kanaria.address) + await bulkWriterPerCollectionFactory.deploy(await kanaria.getAddress()) ); - await bulkWriterPerCollection.deployed(); + await bulkWriterPerCollection.waitForDeployment(); const bulkWriter = await bulkWriterFactory.deploy(); - await bulkWriter.deployed(); + await bulkWriter.waitForDeployment(); const [owner] = await ethers.getSigners(); - const kanariaId = await mintFromMock(kanaria, owner.address); - const gemId1 = await nestMintFromMock(gem, kanaria.address, kanariaId); - const gemId2 = await nestMintFromMock(gem, kanaria.address, kanariaId); - const gemId3 = await nestMintFromMock(gem, kanaria.address, kanariaId); - await kanaria.acceptChild(kanariaId, 0, gem.address, gemId1); - await kanaria.acceptChild(kanariaId, 1, gem.address, gemId2); - await kanaria.acceptChild(kanariaId, 0, gem.address, gemId3); - - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + const kanariaId = await mintFromMock(kanaria, await owner.getAddress()); + const gemId1 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + const gemId2 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + const gemId3 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + await kanaria.acceptChild(kanariaId, 0, await gem.getAddress(), gemId1); + await kanaria.acceptChild(kanariaId, 1, await gem.getAddress(), gemId2); + await kanaria.acceptChild(kanariaId, 0, await gem.getAddress(), gemId3); + + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); await kanaria.equip({ tokenId: kanariaId, @@ -97,10 +103,10 @@ describe('Advanced Equip Render Utils', async function () { let gem: RMRKEquippableMock; let bulkWriter: RMRKBulkWriter; let bulkWriterPerCollection: RMRKBulkWriterPerCollection; - let kanariaId: BigNumber; - let gemId1: BigNumber; - let gemId2: BigNumber; - let gemId3: BigNumber; + let kanariaId: bigint; + let gemId1: bigint; + let gemId2: bigint; + let gemId3: bigint; beforeEach(async function () { ({ @@ -119,11 +125,11 @@ describe('Advanced Equip Render Utils', async function () { describe('With General Bulk Writer', async function () { beforeEach(async function () { - await kanaria.setApprovalForAllForAssets(bulkWriter.address, true); + await kanaria.setApprovalForAllForAssets(await bulkWriter.getAddress(), true); }); it('can replace equip', async function () { - await bulkWriter.replaceEquip(kanaria.address, { + await bulkWriter.replaceEquip(await kanaria.getAddress(), { tokenId: kanariaId, childIndex: 1, assetId: assetForKanariaFull, @@ -131,18 +137,15 @@ describe('Advanced Equip Render Utils', async function () { childAssetId: assetForGemALeft, }); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemALeft), - gemId2, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemALeft), gemId2, await gem.getAddress()]); }); it('can unequip and equip in bulk', async function () { // On a single call we remove the gem from the first slot and add 2 gems on the other 2 slots await bulkWriter.bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [ { @@ -168,30 +171,21 @@ describe('Advanced Equip Render Utils', async function () { ], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(0), - bn(0), - bn(0), - ADDRESS_ZERO, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemMid)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemAMid), - gemId2, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemRight)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemBRight), - gemId3, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemRight), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemBRight), gemId3, await gem.getAddress()]); }); it('can use bulk with only unequip operations', async function () { // On a single call we remove the gem from the first slot and add 2 gems on the other 2 slots await bulkWriter.bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [ { @@ -202,18 +196,15 @@ describe('Advanced Equip Render Utils', async function () { [], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(0), - bn(0), - bn(0), - ADDRESS_ZERO, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); }); it('can use bulk with only equip operations', async function () { // On a single call we remove the gem from the first slot and add 2 gems on the other 2 slots await bulkWriter.bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [], [ @@ -234,33 +225,24 @@ describe('Advanced Equip Render Utils', async function () { ], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemALeft), - gemId1, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemMid)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemAMid), - gemId2, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemRight)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemBRight), - gemId3, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemALeft), gemId1, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemRight), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemBRight), gemId3, await gem.getAddress()]); }); it('cannot do operations if not writer is not approved', async function () { - await kanaria.setApprovalForAllForAssets(bulkWriter.address, false); + await kanaria.setApprovalForAllForAssets(await bulkWriter.getAddress(), false); // On a single call we remove the gem from the first slot and add 2 gems on the other 2 slots await expect( bulkWriter.bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [ { @@ -281,7 +263,7 @@ describe('Advanced Equip Render Utils', async function () { ).to.be.revertedWithCustomError(kanaria, 'RMRKNotApprovedForAssetsOrOwner'); await expect( - bulkWriter.replaceEquip(kanaria.address, { + bulkWriter.replaceEquip(await kanaria.getAddress(), { tokenId: kanariaId, childIndex: 1, assetId: assetForKanariaFull, @@ -296,7 +278,7 @@ describe('Advanced Equip Render Utils', async function () { await expect( bulkWriter.connect(notOwner).bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [ { @@ -317,7 +299,7 @@ describe('Advanced Equip Render Utils', async function () { ).to.be.revertedWithCustomError(bulkWriter, 'RMRKCanOnlyDoBulkOperationsOnOwnedTokens'); await expect( - bulkWriter.connect(notOwner).replaceEquip(kanaria.address, { + bulkWriter.connect(notOwner).replaceEquip(await kanaria.getAddress(), { tokenId: kanariaId, childIndex: 1, assetId: assetForKanariaFull, @@ -331,7 +313,7 @@ describe('Advanced Equip Render Utils', async function () { const otherId = 2; await expect( bulkWriter.bulkEquip( - kanaria.address, + await kanaria.getAddress(), kanariaId, [], [ @@ -350,11 +332,11 @@ describe('Advanced Equip Render Utils', async function () { describe('With Bulk Writer Per Collection', async function () { beforeEach(async function () { - await kanaria.setApprovalForAllForAssets(bulkWriterPerCollection.address, true); + await kanaria.setApprovalForAllForAssets(await bulkWriterPerCollection.getAddress(), true); }); it('can get managed collection', async function () { - expect(await bulkWriterPerCollection.getCollection()).to.equal(kanaria.address); + expect(await bulkWriterPerCollection.getCollection()).to.equal(await kanaria.getAddress()); }); it('can replace equip', async function () { @@ -366,12 +348,9 @@ describe('Advanced Equip Render Utils', async function () { childAssetId: assetForGemALeft, }); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemALeft), - gemId2, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemALeft), gemId2, await gem.getAddress()]); }); it('can unequip and equip in bulk', async function () { @@ -402,24 +381,15 @@ describe('Advanced Equip Render Utils', async function () { ], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(0), - bn(0), - bn(0), - ADDRESS_ZERO, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemMid)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemAMid), - gemId2, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemRight)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemBRight), - gemId3, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemRight), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemBRight), gemId3, await gem.getAddress()]); }); it('can use bulk with only unequip operations', async function () { @@ -435,12 +405,9 @@ describe('Advanced Equip Render Utils', async function () { [], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(0), - bn(0), - bn(0), - ADDRESS_ZERO, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); }); it('can use bulk with only equip operations', async function () { @@ -466,28 +433,19 @@ describe('Advanced Equip Render Utils', async function () { ], ); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemLeft)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemALeft), - gemId1, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemMid)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemAMid), - gemId2, - gem.address, - ]); - expect(await kanaria.getEquipment(kanariaId, catalog.address, slotIdGemRight)).to.eql([ - bn(assetForKanariaFull), - bn(assetForGemBRight), - gemId3, - gem.address, - ]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemALeft), gemId1, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); + expect( + await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemRight), + ).to.eql([bn(assetForKanariaFull), bn(assetForGemBRight), gemId3, await gem.getAddress()]); }); it('cannot do operations if not writer is not approved', async function () { - await kanaria.setApprovalForAllForAssets(bulkWriterPerCollection.address, false); + await kanaria.setApprovalForAllForAssets(await bulkWriterPerCollection.getAddress(), false); // On a single call we remove the gem from the first slot and add 2 gems on the other 2 slots await expect( diff --git a/test/catalogUtils.ts b/test/catalogUtils.ts index 83bb16cc..e1f678a8 100644 --- a/test/catalogUtils.ts +++ b/test/catalogUtils.ts @@ -2,7 +2,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ADDRESS_ZERO, bn, mintFromMock, nestMintFromMock } from './utils'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogUtils, RMRKCatalogImpl, @@ -10,7 +10,7 @@ import { RMRKEquippableMock, } from '../typechain-types'; import { setupContextForSlots } from './setup/equippableSlots'; -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; import { backgroundAssetId, backgroundsIds, @@ -31,7 +31,7 @@ async function catalogUtilsFixture() { const catalogUtilsFactory = await ethers.getContractFactory('RMRKCatalogUtils'); const catalog = await catalogFactory.deploy(CATALOG_METADATA, CATALOG_TYPE); - await catalog.deployed(); + await catalog.waitForDeployment(); const catalogUtils = await catalogUtilsFactory.deploy(); @@ -51,29 +51,29 @@ async function slotsFixture() { // View const view = await viewFactory.deploy(); - await view.deployed(); + await view.waitForDeployment(); // catalog const catalog = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalog.deployed(); + await catalog.waitForDeployment(); const catalogForWeapon = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalogForWeapon.deployed(); + await catalogForWeapon.waitForDeployment(); // Soldier token const soldier = await equipFactory.deploy(); - await soldier.deployed(); + await soldier.waitForDeployment(); // Weapon const weapon = await equipFactory.deploy(); - await weapon.deployed(); + await weapon.waitForDeployment(); // Weapon Gem const weaponGem = await equipFactory.deploy(); - await weaponGem.deployed(); + await weaponGem.waitForDeployment(); // Background const background = await equipFactory.deploy(); - await background.deployed(); + await background.waitForDeployment(); await setupContextForSlots( catalog, @@ -134,8 +134,8 @@ describe('Collection Utils', function () { }); it('can get catalog data', async function () { - expect(await catalogUtils.getCatalogData(catalog.address)).to.eql([ - deployer.address, + expect(await catalogUtils.getCatalogData(await catalog.getAddress())).to.eql([ + await deployer.getAddress(), CATALOG_TYPE, CATALOG_METADATA, ]); @@ -144,54 +144,56 @@ describe('Collection Utils', function () { it('can get catalog data if the catalog is not ownable', async function () { const catalogFactory = await ethers.getContractFactory('RMRKCatalog'); const notOwnableCatalog = await catalogFactory.deploy(CATALOG_METADATA, CATALOG_TYPE); - expect(await catalogUtils.getCatalogData(notOwnableCatalog.address)).to.eql([ + expect(await catalogUtils.getCatalogData(await notOwnableCatalog.getAddress())).to.eql([ ADDRESS_ZERO, CATALOG_TYPE, CATALOG_METADATA, ]); }); - it('can parts data', async function () { - expect(await catalogUtils.getExtendedParts(catalog.address, [partId, partId2, partId3])).to.eql( + it('can get parts data', async function () { + expect( + await catalogUtils.getExtendedParts(await catalog.getAddress(), [partId, partId2, partId3]), + ).to.eql([ [ - [ - bn(partId), // partId - partData1.itemType, // itemType - partData1.z, // z - partData1.equippable, // equippable - true, // equippableToAll (set on beforeEach) - partData1.metadataURI, // metadataURI - ], - [ - bn(partId2), // partId - partData2.itemType, // itemType - partData2.z, // z - [addrs[0].address, addrs[1].address], // equippable (set on beforeEach) - false, // equippableToAll - partData2.metadataURI, // metadataURI - ], - [ - bn(partId3), // partId - partData3.itemType, // itemType - partData3.z, // z - partData3.equippable, // equippable - false, // equippableToAll (set on beforeEach) - partData3.metadataURI, // metadataURI - ], + bn(partId), // partId + bn(partData1.itemType), // itemType + bn(partData1.z), // z + partData1.equippable, // equippable + true, // equippableToAll (set on beforeEach) + partData1.metadataURI, // metadataURI ], - ); + [ + bn(partId2), // partId + bn(partData2.itemType), // itemType + bn(partData2.z), // z + [addrs[0].address, addrs[1].address], // equippable (set on beforeEach) + false, // equippableToAll + partData2.metadataURI, // metadataURI + ], + [ + bn(partId3), // partId + bn(partData3.itemType), // itemType + bn(partData3.z), // z + partData3.equippable, // equippable + false, // equippableToAll (set on beforeEach) + partData3.metadataURI, // metadataURI + ], + ]); }); it('can get catalog and parts data', async function () { - expect(await catalogUtils.getCatalogDataAndExtendedParts(catalog.address, [partId])).to.eql([ - deployer.address, + expect( + await catalogUtils.getCatalogDataAndExtendedParts(await catalog.getAddress(), [partId]), + ).to.eql([ + await deployer.getAddress(), CATALOG_TYPE, CATALOG_METADATA, [ [ bn(partId), // partId - partData1.itemType, // itemType - partData1.z, // z + bn(partData1.itemType), // itemType + bn(partData1.z), // z partData1.equippable, // equippable true, // equippableToAll (set on beforeEach) partData1.metadataURI, // metadataURI @@ -202,15 +204,15 @@ describe('Collection Utils', function () { }); describe('Collection Utils For Orphans', function () { - let catalog: Contract; - let soldier: Contract; - let weapon: Contract; - let background: Contract; + let catalog: RMRKCatalogImpl; + let soldier: RMRKEquippableMock; + let weapon: RMRKEquippableMock; + let background: RMRKEquippableMock; let catalogUtils: RMRKCatalogUtils; let addrs: SignerWithAddress[]; - let soldierID: BigNumber; + let soldierID: bigint; let soldierOwner: SignerWithAddress; let weaponChildIndex = 0; let backgroundChildIndex = 1; @@ -244,24 +246,28 @@ describe('Collection Utils For Orphans', function () { it('can replace parent equipped asset and detect it as orphan', async function () { // Weapon is child on index 0, background on index 1 const newSoldierResId = soldierResId + 1; - await soldier.addEquippableAssetEntry(newSoldierResId, 0, catalog.address, 'ipfs:soldier/', [ - partIdForBody, - partIdForWeapon, - partIdForBackground, - ]); + await soldier.addEquippableAssetEntry( + newSoldierResId, + 0, + await catalog.getAddress(), + 'ipfs:soldier/', + [partIdForBody, partIdForWeapon, partIdForBackground], + ); await soldier.addAssetToToken(soldierID, newSoldierResId, soldierResId); await soldier.connect(soldierOwner).acceptAsset(soldierID, 0, newSoldierResId); // Children still marked as equipped, so the cannot be transferred - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql(true); - expect(await soldier.isChildEquipped(soldierID, background.address, backgroundsIds[0])).to.eql( - true, - ); + expect( + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); + expect( + await soldier.isChildEquipped(soldierID, await background.getAddress(), backgroundsIds[0]), + ).to.eql(true); const equipments = await catalogUtils.getOrphanEquipmentsFromParentAsset( - soldier.address, + await soldier.getAddress(), soldierID, - catalog.address, + await catalog.getAddress(), [partIdForBody, partIdForWeapon, partIdForBackground], ); @@ -269,14 +275,14 @@ describe('Collection Utils For Orphans', function () { [ bn(soldierResId), bn(partIdForWeapon), - weapon.address, + await weapon.getAddress(), weaponsIds[0], bn(weaponAssetsEquip[0]), ], [ bn(soldierResId), bn(partIdForBackground), - background.address, + await background.getAddress(), backgroundsIds[0], bn(backgroundAssetId), ], @@ -290,7 +296,7 @@ describe('Collection Utils For Orphans', function () { await weapon.addEquippableAssetEntry( newWeaponAssetId, 1, // equippableGroupId - catalog.address, + await catalog.getAddress(), 'ipfs:weapon/new', [], ); @@ -298,18 +304,20 @@ describe('Collection Utils For Orphans', function () { await weapon.connect(soldierOwner).acceptAsset(weaponId, 0, newWeaponAssetId); // Children still marked as equipped, so it cannot be transferred or equip something else into the slot - expect(await soldier.isChildEquipped(soldierID, weapon.address, weaponsIds[0])).to.eql(true); + expect( + await soldier.isChildEquipped(soldierID, await weapon.getAddress(), weaponsIds[0]), + ).to.eql(true); - expect(await catalogUtils.getOrphanEquipmentsFromChildAsset(soldier.address, soldierID)).to.eql( + expect( + await catalogUtils.getOrphanEquipmentsFromChildAsset(await soldier.getAddress(), soldierID), + ).to.eql([ [ - [ - bn(soldierResId), - bn(partIdForWeapon), - weapon.address, - weaponsIds[0], - bn(weaponAssetsEquip[0]), - ], + bn(soldierResId), + bn(partIdForWeapon), + await weapon.getAddress(), + weaponsIds[0], + bn(weaponAssetsEquip[0]), ], - ); + ]); }); }); diff --git a/test/collectionUtils.ts b/test/collectionUtils.ts index c3cb3a5e..17ccad1e 100644 --- a/test/collectionUtils.ts +++ b/test/collectionUtils.ts @@ -2,7 +2,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ADDRESS_ZERO, bn, mintFromMockPremint } from './utils'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCollectionUtils, RMRKEquippablePreMint, @@ -10,7 +10,6 @@ import { RMRKNestableMultiAssetPreMint, RMRKNestableMultiAssetPreMintSoulbound, } from '../typechain-types'; -import { BigNumber } from 'ethers'; const maxSupply = bn(10000); const royaltyBps = bn(500); @@ -34,11 +33,11 @@ async function collectionUtilsFixture() { 'MA', collectionMeta, maxSupply, - deployer.address, + await deployer.getAddress(), royaltyBps, ) ); - await multiAsset.deployed(); + await multiAsset.waitForDeployment(); const nestableMultiAssetSoulbound = ( await nestableMultiAssetSoulboundFactory.deploy( @@ -46,11 +45,11 @@ async function collectionUtilsFixture() { 'NMAS', collectionMeta, maxSupply, - deployer.address, + await deployer.getAddress(), royaltyBps, ) ); - await nestableMultiAssetSoulbound.deployed(); + await nestableMultiAssetSoulbound.waitForDeployment(); const nestableMultiAsset = ( await nestableMultiAssetFactory.deploy( @@ -58,11 +57,11 @@ async function collectionUtilsFixture() { 'NMA', collectionMeta, maxSupply, - deployer.address, + await deployer.getAddress(), royaltyBps, ) ); - await nestableMultiAsset.deployed(); + await nestableMultiAsset.waitForDeployment(); const equip = ( await equipFactory.deploy( @@ -70,14 +69,14 @@ async function collectionUtilsFixture() { 'EQ', collectionMeta, maxSupply, - deployer.address, + await deployer.getAddress(), royaltyBps, ) ); - await equip.deployed(); + await equip.waitForDeployment(); const collectionUtils = await collectionUtilsFactory.deploy(); - await collectionUtils.deployed(); + await collectionUtils.waitForDeployment(); return { multiAsset, @@ -105,61 +104,63 @@ describe('Collection Utils', function () { }); it('can get collection data', async function () { - await mintFromMockPremint(multiAsset, holder.address); - await mintFromMockPremint(nestableMultiAsset, holder.address); - await mintFromMockPremint(nestableMultiAssetSoulbound, holder.address); - await mintFromMockPremint(equip, holder.address); + await mintFromMockPremint(multiAsset, await holder.getAddress()); + await mintFromMockPremint(nestableMultiAsset, await holder.getAddress()); + await mintFromMockPremint(nestableMultiAssetSoulbound, await holder.getAddress()); + await mintFromMockPremint(equip, await holder.getAddress()); - expect(await collectionUtils.getCollectionData(multiAsset.address)).to.eql([ - BigNumber.from(1), + expect(await collectionUtils.getCollectionData(await multiAsset.getAddress())).to.eql([ + 1n, maxSupply, royaltyBps, - issuer.address, - issuer.address, + await issuer.getAddress(), + await issuer.getAddress(), 'MultiAsset', 'MA', collectionMeta, ]); - expect(await collectionUtils.getCollectionData(multiAsset.address)).to.eql([ - BigNumber.from(1), + expect(await collectionUtils.getCollectionData(await multiAsset.getAddress())).to.eql([ + 1n, maxSupply, royaltyBps, - issuer.address, - issuer.address, + await issuer.getAddress(), + await issuer.getAddress(), 'MultiAsset', 'MA', collectionMeta, ]); - expect(await collectionUtils.getCollectionData(nestableMultiAsset.address)).to.eql([ - BigNumber.from(1), + expect(await collectionUtils.getCollectionData(await nestableMultiAsset.getAddress())).to.eql([ + 1n, maxSupply, royaltyBps, - issuer.address, - issuer.address, + await issuer.getAddress(), + await issuer.getAddress(), 'NestableMultiAsset', 'NMA', collectionMeta, ]); - expect(await collectionUtils.getCollectionData(nestableMultiAssetSoulbound.address)).to.eql([ - BigNumber.from(1), + expect( + await collectionUtils.getCollectionData(await nestableMultiAssetSoulbound.getAddress()), + ).to.eql([ + 1n, maxSupply, royaltyBps, - issuer.address, - issuer.address, + await issuer.getAddress(), + await issuer.getAddress(), 'NestableMultiAssetSoulbound', 'NMAS', collectionMeta, ]); - expect(await collectionUtils.getCollectionData(equip.address)).to.eql([ - BigNumber.from(1), + expect(await collectionUtils.getCollectionData(await equip.getAddress())).to.eql([ + 1n, maxSupply, royaltyBps, - issuer.address, - issuer.address, + await issuer.getAddress(), + await issuer.getAddress(), 'Equippable', 'EQ', collectionMeta, @@ -167,7 +168,7 @@ describe('Collection Utils', function () { }); it('can get different interface supports for collection', async function () { - expect(await collectionUtils.getInterfaceSupport(multiAsset.address)).to.eql([ + expect(await collectionUtils.getInterfaceSupport(await multiAsset.getAddress())).to.eql([ true, true, false, @@ -175,23 +176,13 @@ describe('Collection Utils', function () { false, true, ]); - expect(await collectionUtils.getInterfaceSupport(nestableMultiAsset.address)).to.eql([ - true, - true, - true, - false, - false, - true, - ]); - expect(await collectionUtils.getInterfaceSupport(nestableMultiAssetSoulbound.address)).to.eql([ - true, - true, - true, - false, - true, - true, - ]); - expect(await collectionUtils.getInterfaceSupport(equip.address)).to.eql([ + expect(await collectionUtils.getInterfaceSupport(await nestableMultiAsset.getAddress())).to.eql( + [true, true, true, false, false, true], + ); + expect( + await collectionUtils.getInterfaceSupport(await nestableMultiAssetSoulbound.getAddress()), + ).to.eql([true, true, true, false, true, true]); + expect(await collectionUtils.getInterfaceSupport(await equip.getAddress())).to.eql([ true, true, true, @@ -202,35 +193,34 @@ describe('Collection Utils', function () { }); it('can get pages of available ids', async function () { - await multiAsset.mint(holder.address, 9, ''); + await multiAsset.mint(await holder.getAddress(), 9, ''); await multiAsset.connect(holder).burn(3); await multiAsset.connect(holder).burn(8); - expect(await collectionUtils.getPaginatedMintedIds(multiAsset.address, 1, 5)).to.eql([ - bn(1), - bn(2), - bn(4), - bn(5), - ]); - expect(await collectionUtils.getPaginatedMintedIds(multiAsset.address, 6, 10)).to.eql([ - bn(6), - bn(7), - bn(9), - ]); + expect(await collectionUtils.getPaginatedMintedIds(await multiAsset.getAddress(), 1, 5)).to.eql( + [bn(1), bn(2), bn(4), bn(5)], + ); + expect( + await collectionUtils.getPaginatedMintedIds(await multiAsset.getAddress(), 6, 10), + ).to.eql([bn(6), bn(7), bn(9)]); }); it('can trigger collection metadata update', async function () { await expect( - collectionUtils.connect(issuer).refreshCollectionTokensMetadata(multiAsset.address, 1, 100), + collectionUtils + .connect(issuer) + .refreshCollectionTokensMetadata(await multiAsset.getAddress(), 1, 100), ) .to.emit(collectionUtils, 'BatchMetadataUpdate') - .withArgs(multiAsset.address, 1, 100); + .withArgs(await multiAsset.getAddress(), 1, 100); }); it('can trigger token metadata update', async function () { - await expect(collectionUtils.connect(issuer).refreshTokenMetadata(multiAsset.address, 1)) + await expect( + collectionUtils.connect(issuer).refreshTokenMetadata(await multiAsset.getAddress(), 1), + ) .to.emit(collectionUtils, 'MetadataUpdate') - .withArgs(multiAsset.address, 1); + .withArgs(await multiAsset.getAddress(), 1); }); it('does not emit event if contract address is not a contract', async function () { diff --git a/test/emotableRepository.ts b/test/emotableRepository.ts index e5c633f0..780a64d9 100644 --- a/test/emotableRepository.ts +++ b/test/emotableRepository.ts @@ -1,19 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { BigNumber, Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ERC721Mock, RMRKEmotesRepository } from '../typechain-types'; import { IERC7409, IERC165, IOtherInterface } from './interfaces'; -function bn(x: number): BigNumber { - return BigNumber.from(x); -} - async function tokenFixture() { const factory = await ethers.getContractFactory('ERC721Mock'); const token = await factory.deploy('Chunky', 'CHNK'); - await token.deployed(); + await token.waitForDeployment(); return token; } @@ -21,7 +16,7 @@ async function tokenFixture() { async function RMRKEmotesRepositoryFixture() { const factory = await ethers.getContractFactory('RMRKEmotesRepository'); const repository = await factory.deploy(); - await repository.deployed(); + await repository.waitForDeployment(); return repository; } @@ -31,7 +26,7 @@ describe('RMRKEmotesRepository', async function () { let repository: RMRKEmotesRepository; let owner: SignerWithAddress; let addrs: SignerWithAddress[]; - const tokenId = bn(1); + const tokenId = 1n; const emoji1 = '👨‍👩‍👧'; const emoji2 = '😁'; @@ -55,77 +50,84 @@ describe('RMRKEmotesRepository', async function () { describe('With minted tokens', async function () { beforeEach(async function () { - await token.mint(owner.address, tokenId); + await token.mint(await owner.getAddress(), tokenId); }); it('can emote', async function () { - await expect(repository.connect(addrs[0]).emote(token.address, tokenId, emoji1, true)) + await expect( + repository.connect(addrs[0]).emote(await token.getAddress(), tokenId, emoji1, true), + ) .to.emit(repository, 'Emoted') - .withArgs(addrs[0].address, token.address, tokenId.toNumber(), emoji1, true); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(1)); + .withArgs(addrs[0].address, await token.getAddress(), tokenId, emoji1, true); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(1n); expect( - await repository.hasEmoterUsedEmote(addrs[0].address, token.address, tokenId, emoji1), + await repository.hasEmoterUsedEmote( + addrs[0].address, + await token.getAddress(), + tokenId, + emoji1, + ), ).to.equal(true); }); it('can undo emote', async function () { - await repository.emote(token.address, tokenId, emoji1, true); + await repository.emote(await token.getAddress(), tokenId, emoji1, true); - await expect(repository.emote(token.address, tokenId, emoji1, false)) + await expect(repository.emote(await token.getAddress(), tokenId, emoji1, false)) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, false); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(0)); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, false); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(0n); }); it('can be emoted from different accounts', async function () { - await repository.connect(addrs[0]).emote(token.address, tokenId, emoji1, true); - await repository.connect(addrs[1]).emote(token.address, tokenId, emoji1, true); - await repository.connect(addrs[2]).emote(token.address, tokenId, emoji2, true); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(2)); - expect(await repository.emoteCountOf(token.address, tokenId, emoji2)).to.equal(bn(1)); + await repository.connect(addrs[0]).emote(await token.getAddress(), tokenId, emoji1, true); + await repository.connect(addrs[1]).emote(await token.getAddress(), tokenId, emoji1, true); + await repository.connect(addrs[2]).emote(await token.getAddress(), tokenId, emoji2, true); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(2n); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji2)).to.equal(1n); }); it('can add multiple emojis to same NFT', async function () { - await repository.emote(token.address, tokenId, emoji1, true); - await repository.emote(token.address, tokenId, emoji2, true); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(1)); - expect(await repository.emoteCountOf(token.address, tokenId, emoji2)).to.equal(bn(1)); + await repository.emote(await token.getAddress(), tokenId, emoji1, true); + await repository.emote(await token.getAddress(), tokenId, emoji2, true); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(1n); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji2)).to.equal(1n); }); it('does nothing if new state is the same as old state', async function () { - await repository.emote(token.address, tokenId, emoji1, true); - await repository.emote(token.address, tokenId, emoji1, true); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(1)); + await repository.emote(await token.getAddress(), tokenId, emoji1, true); + await repository.emote(await token.getAddress(), tokenId, emoji1, true); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(1n); - await repository.emote(token.address, tokenId, emoji2, false); - expect(await repository.emoteCountOf(token.address, tokenId, emoji2)).to.equal(bn(0)); + await repository.emote(await token.getAddress(), tokenId, emoji2, false); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji2)).to.equal(0n); }); it('does nothing if new state is the same as old state on bulk emote', async function () { - await repository.emote(token.address, tokenId, emoji1, true); + await repository.emote(await token.getAddress(), tokenId, emoji1, true); await repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, false], ); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(1)); - expect(await repository.emoteCountOf(token.address, tokenId, emoji2)).to.equal(bn(0)); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(1n); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji2)).to.equal(0n); }); it('can bulk emote', async function () { expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(0), bn(0)]); + ).to.eql([0n, 0n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -133,29 +135,29 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, true) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, true) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, true); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, true); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(1), bn(1)]); + ).to.eql([1n, 1n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -165,29 +167,29 @@ describe('RMRKEmotesRepository', async function () { it('can bulk undo emote', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, true) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, true) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, true); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, true); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(1), bn(1)]); + ).to.eql([1n, 1n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -195,29 +197,29 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [false, false], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, false) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, false) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, false); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, false); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(0), bn(0)]); + ).to.eql([0n, 0n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -225,20 +227,20 @@ describe('RMRKEmotesRepository', async function () { }); it('can bulk emote and unemote at the same time', async function () { - await repository.emote(token.address, tokenId, emoji2, true); + await repository.emote(await token.getAddress(), tokenId, emoji2, true); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(0), bn(1)]); + ).to.eql([0n, 1n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -246,29 +248,29 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, false], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, true) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, true) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, false); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, false); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(1), bn(0)]); + ).to.eql([1n, 0n]); expect( await repository.haveEmotersUsedEmotes( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -278,7 +280,7 @@ describe('RMRKEmotesRepository', async function () { it('can not bulk emote if passing arrays of different length', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true], @@ -286,12 +288,17 @@ describe('RMRKEmotesRepository', async function () { ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( - repository.bulkEmote([token.address], [tokenId, tokenId], [emoji1, emoji2], [true, true]), + repository.bulkEmote( + [await token.getAddress()], + [tokenId, tokenId], + [emoji1, emoji2], + [true, true], + ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId], [emoji1, emoji2], [true, true], @@ -300,7 +307,7 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.bulkEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1], [true, true], @@ -311,66 +318,78 @@ describe('RMRKEmotesRepository', async function () { it('can not bulk presign if passing arrays of different length', async function () { await expect( repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( repository.bulkPrepareMessagesToPresignEmote( - [token.address], + [await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999)], + [9999999999n], ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); }); it('can not bulk get emote count if passing arrays of different length', async function () { await expect( - repository.bulkEmoteCountOf([token.address], [tokenId, tokenId], [emoji1, emoji2]), + repository.bulkEmoteCountOf( + [await token.getAddress()], + [tokenId, tokenId], + [emoji1, emoji2], + ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( - repository.bulkEmoteCountOf([token.address, token.address], [tokenId], [emoji1, emoji2]), + repository.bulkEmoteCountOf( + [await token.getAddress(), await token.getAddress()], + [tokenId], + [emoji1, emoji2], + ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); await expect( - repository.bulkEmoteCountOf([token.address, token.address], [tokenId, tokenId], [emoji1]), + repository.bulkEmoteCountOf( + [await token.getAddress(), await token.getAddress()], + [tokenId, tokenId], + [emoji1], + ), ).to.be.revertedWithCustomError(repository, 'BulkParametersOfUnequalLength'); }); @@ -378,7 +397,7 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.haveEmotersUsedEmotes( [addrs[0].address], - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -387,7 +406,7 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.haveEmotersUsedEmotes( [addrs[0].address, addrs[1].address], - [token.address], + [await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), @@ -396,7 +415,7 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.haveEmotersUsedEmotes( [addrs[0].address, addrs[1].address], - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId], [emoji1, emoji2], ), @@ -405,7 +424,7 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.haveEmotersUsedEmotes( [addrs[0].address, addrs[1].address], - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1], ), @@ -414,14 +433,14 @@ describe('RMRKEmotesRepository', async function () { it('can use presigned emote to react to token', async function () { const message = await repository.prepareMessageToPresignEmote( - token.address, + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, ); - const signature = await owner.signMessage(ethers.utils.arrayify(message)); + const signature = await owner.signMessage(ethers.getBytes(message)); const r: string = signature.substring(0, 66); const s: string = '0x' + signature.substring(66, 130); @@ -431,32 +450,32 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, v, r, s, ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, true); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, true); }); it('does nothing if new state is the same as old state on presigned emote', async function () { - repository.connect(owner).emote(token.address, tokenId, emoji1, true); + repository.connect(owner).emote(await token.getAddress(), tokenId, emoji1, true); const message = await repository.prepareMessageToPresignEmote( - token.address, + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, ); - const signature = await owner.signMessage(ethers.utils.arrayify(message)); + const signature = await owner.signMessage(ethers.getBytes(message)); const r: string = signature.substring(0, 66); const s: string = '0x' + signature.substring(66, 130); @@ -465,30 +484,30 @@ describe('RMRKEmotesRepository', async function () { await repository .connect(addrs[0]) .presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, v, r, s, ); - expect(await repository.emoteCountOf(token.address, tokenId, emoji1)).to.equal(bn(1)); + expect(await repository.emoteCountOf(await token.getAddress(), tokenId, emoji1)).to.equal(1n); }); it('can use presigned emote to undo reaction to token', async function () { - repository.connect(owner).emote(token.address, tokenId, emoji1, true); + repository.connect(owner).emote(await token.getAddress(), tokenId, emoji1, true); const message = await repository.prepareMessageToPresignEmote( - token.address, + await token.getAddress(), tokenId, emoji1, false, - bn(9999999999), + 9999999999n, ); - const signature = await owner.signMessage(ethers.utils.arrayify(message)); + const signature = await owner.signMessage(ethers.getBytes(message)); const r: string = signature.substring(0, 66); const s: string = '0x' + signature.substring(66, 130); @@ -498,33 +517,33 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, false, - bn(9999999999), + 9999999999n, v, r, s, ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, false); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, false); }); it('cannot use expired presigned to emote', async function () { const block = await ethers.provider.getBlock('latest'); const previousBlockTime = block.timestamp; const message = await repository.prepareMessageToPresignEmote( - token.address, + await token.getAddress(), tokenId, emoji1, true, previousBlockTime, ); - const signature = await owner.signMessage(ethers.utils.arrayify(message)); + const signature = await owner.signMessage(ethers.getBytes(message)); const r: string = signature.substring(0, 66); const s: string = '0x' + signature.substring(66, 130); @@ -534,8 +553,8 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, true, @@ -549,14 +568,14 @@ describe('RMRKEmotesRepository', async function () { it('cannot use presigned emote for a different signer, collection, token, emoji, state or deadline', async function () { const message = await repository.prepareMessageToPresignEmote( - token.address, + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, ); - const signature = await owner.signMessage(ethers.utils.arrayify(message)); + const signature = await owner.signMessage(ethers.getBytes(message)); const r: string = signature.substring(0, 66); const s: string = '0x' + signature.substring(66, 130); @@ -565,11 +584,11 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( addrs[2].address, // different signer - token.address, + await token.getAddress(), tokenId, emoji1, true, - bn(9999999999), + 9999999999n, v, r, s, @@ -578,12 +597,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( - owner.address, + await owner.getAddress(), addrs[2].address, // different collection tokenId, emoji1, true, - bn(9999999999), + 9999999999n, v, r, s, @@ -592,12 +611,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( - owner.address, - token.address, - tokenId.add(1), // different token + await owner.getAddress(), + await token.getAddress(), + tokenId + 1n, // different token emoji1, true, - bn(9999999999), + 9999999999n, v, r, s, @@ -606,12 +625,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji2, // different emoji true, - bn(9999999999), + 9999999999n, v, r, s, @@ -620,12 +639,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, false, // different state - bn(9999999999), + 9999999999n, v, r, s, @@ -634,12 +653,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).presignedEmote( - owner.address, - token.address, + await owner.getAddress(), + await token.getAddress(), tokenId, emoji1, true, - bn(10000000000), // different deadline + 10000000000n, // different deadline v, r, s, @@ -649,15 +668,15 @@ describe('RMRKEmotesRepository', async function () { it('can use presigned emotes to bulk react to token', async function () { const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -670,37 +689,37 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, true) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, true) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, true); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, true); }); it('can use presigned emotes to undo reaction to token', async function () { - repository.connect(owner).emote(token.address, tokenId, emoji1, true); - repository.connect(owner).emote(token.address, tokenId, emoji2, true); + repository.connect(owner).emote(await token.getAddress(), tokenId, emoji1, true); + repository.connect(owner).emote(await token.getAddress(), tokenId, emoji2, true); const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [false, false], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -713,36 +732,36 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [false, false], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], ), ) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji1, false) + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji1, false) .to.emit(repository, 'Emoted') - .withArgs(owner.address, token.address, tokenId.toNumber(), emoji2, false); + .withArgs(await owner.getAddress(), await token.getAddress(), tokenId, emoji2, false); }); it('does nothing if new state is the same as old state on bulk presigned emote', async function () { - repository.connect(owner).emote(token.address, tokenId, emoji1, true); + repository.connect(owner).emote(await token.getAddress(), tokenId, emoji1, true); const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, false], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -754,36 +773,36 @@ describe('RMRKEmotesRepository', async function () { await repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, false], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], ); expect( await repository.bulkEmoteCountOf( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], ), - ).to.eql([bn(1), bn(0)]); + ).to.eql([1n, 0n]); }); it('can use bulk presigned emotes if passing arrays of different length', async function () { const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -796,12 +815,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address], - [token.address, token.address], + [await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -812,12 +831,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -828,12 +847,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -844,12 +863,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -860,12 +879,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -876,12 +895,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999)], + [9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -892,12 +911,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1], [r1, r2], [s1, s2], @@ -908,12 +927,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1], [s1, s2], @@ -924,12 +943,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1], @@ -942,15 +961,15 @@ describe('RMRKEmotesRepository', async function () { const previousBlockTime = block.timestamp; const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), previousBlockTime], + [9999999999n, previousBlockTime], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -963,12 +982,12 @@ describe('RMRKEmotesRepository', async function () { repository .connect(addrs[0]) .bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), previousBlockTime], + [9999999999n, previousBlockTime], [v1, v2], [r1, r2], [s1, s2], @@ -981,15 +1000,15 @@ describe('RMRKEmotesRepository', async function () { const previousBlockTime = block.timestamp; const messages = await repository.bulkPrepareMessagesToPresignEmote( - [token.address, token.address], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], ); - const signature1 = await owner.signMessage(ethers.utils.arrayify(messages[0])); - const signature2 = await owner.signMessage(ethers.utils.arrayify(messages[1])); + const signature1 = await owner.signMessage(ethers.getBytes(messages[0])); + const signature2 = await owner.signMessage(ethers.getBytes(messages[1])); const r1: string = signature1.substring(0, 66); const s1: string = '0x' + signature1.substring(66, 130); @@ -1000,12 +1019,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, addrs[1].address], // different signer - [token.address, token.address], + [await owner.getAddress(), addrs[1].address], // different signer + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -1014,12 +1033,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, owner.address], - [token.address, addrs[2].address], // different collection + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), addrs[2].address], // different collection [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -1028,12 +1047,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], - [tokenId, tokenId.add(1)], // different token + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], + [tokenId, tokenId + 1n], // different token [emoji1, emoji2], [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -1042,12 +1061,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, '😎'], // different emoji [true, true], - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -1056,12 +1075,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, false], // different state - [bn(9999999999), bn(9999999999)], + [9999999999n, 9999999999n], [v1, v2], [r1, r2], [s1, s2], @@ -1070,12 +1089,12 @@ describe('RMRKEmotesRepository', async function () { await expect( repository.connect(addrs[0]).bulkPresignedEmote( - [owner.address, owner.address], - [token.address, token.address], + [await owner.getAddress(), await owner.getAddress()], + [await token.getAddress(), await token.getAddress()], [tokenId, tokenId], [emoji1, emoji2], [true, true], - [bn(9999999999), bn(99999999999999)], // different deadline + [9999999999n, 99999999999999n], // different deadline [v1, v2], [r1, r2], [s1, s2], diff --git a/test/equippable.ts b/test/equippable.ts index 977fafba..feeb49b4 100644 --- a/test/equippable.ts +++ b/test/equippable.ts @@ -1,6 +1,5 @@ import { Contract } from 'ethers'; import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { addAssetToToken, @@ -32,19 +31,19 @@ async function partsFixture() { // Catalog const catalog = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalog.deployed(); + await catalog.waitForDeployment(); // Neon token const neon = await equipFactory.deploy(); - await neon.deployed(); + await neon.waitForDeployment(); // Weapon const mask = await equipFactory.deploy(); - await mask.deployed(); + await mask.waitForDeployment(); // View const view = await viewFactory.deploy(); - await view.deployed(); + await view.waitForDeployment(); await setupContextForParts(catalog, neon, mask, mintFromMock, nestMintFromMock); return { catalog, neon, mask, view }; @@ -60,29 +59,29 @@ async function slotsFixture() { // View const view = await viewFactory.deploy(); - await view.deployed(); + await view.waitForDeployment(); // catalog const catalog = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalog.deployed(); + await catalog.waitForDeployment(); const catalogForWeapon = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalogForWeapon.deployed(); + await catalogForWeapon.waitForDeployment(); // Soldier token const soldier = await equipFactory.deploy(); - await soldier.deployed(); + await soldier.waitForDeployment(); // Weapon const weapon = await equipFactory.deploy(); - await weapon.deployed(); + await weapon.waitForDeployment(); // Weapon Gem const weaponGem = await equipFactory.deploy(); - await weaponGem.deployed(); + await weaponGem.waitForDeployment(); // Background const background = await equipFactory.deploy(); - await background.deployed(); + await background.waitForDeployment(); await setupContextForSlots( catalog, @@ -103,10 +102,10 @@ async function equippableFixture() { const renderUtilsFactory = await ethers.getContractFactory('RMRKMultiAssetRenderUtils'); const equip = await equipFactory.deploy(); - await equip.deployed(); + await equip.waitForDeployment(); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); return { equip, renderUtils }; } @@ -171,11 +170,11 @@ describe('MinifiedEquippableMock MA behavior', async () => { this.renderUtils = renderUtils; }); - async function mintToNestable(token: Contract, to: string): Promise { + async function mintToNestable(token: Contract, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; await equip.mint(to, tokenId); - return BigNumber.from(tokenId); + return BigInt(tokenId); } shouldBehaveLikeMultiAsset(mintToNestable, addAssetEntryEquippablesFromMock, addAssetToToken); diff --git a/test/extensions/multiAssetAutoIndex.ts b/test/extensions/multiAssetAutoIndex.ts index a4ecbe77..9262ae4f 100644 --- a/test/extensions/multiAssetAutoIndex.ts +++ b/test/extensions/multiAssetAutoIndex.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { bn } from '../utils'; import { IERC165, IERC5773, IRMRKMultiAssetAutoIndex, IOtherInterface } from '../interfaces'; import { RMRKMultiAssetAutoIndexMock } from '../../typechain-types'; @@ -11,7 +11,7 @@ import { RMRKMultiAssetAutoIndexMock } from '../../typechain-types'; async function multiAssetAutoIndexFixture() { const factory = await ethers.getContractFactory('RMRKMultiAssetAutoIndexMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return token; } @@ -47,7 +47,7 @@ describe('RMRKMultiAssetAutoIndexMock', async function () { const assetId = bn(1); beforeEach(async function () { - await token.mint(user.address, tokenId); + await token.mint(await user.getAddress(), tokenId); await token.addAssetEntry(assetId, 'ipfs/something.json'); await token.addAssetToToken(tokenId, assetId, 0); }); diff --git a/test/extensions/nestableAutoIndex.ts b/test/extensions/nestableAutoIndex.ts index 49cba1a2..48e86719 100644 --- a/test/extensions/nestableAutoIndex.ts +++ b/test/extensions/nestableAutoIndex.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { bn } from '../utils'; import { IERC165, IERC7401, IRMRKNestableAutoIndex, IOtherInterface } from '../interfaces'; import { RMRKNestableAutoIndexMock } from '../../typechain-types'; @@ -11,7 +11,7 @@ import { RMRKNestableAutoIndexMock } from '../../typechain-types'; async function nestableAutoIndexFixture() { const factory = await ethers.getContractFactory('RMRKNestableAutoIndexMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return token; } @@ -47,43 +47,59 @@ describe('RMRKNestableAutoIndexMock', async function () { describe('With minted tokens', async function () { beforeEach(async function () { - await token.mint(owner.address, parentId); - await token.nestMint(token.address, childId1, parentId); - await token.nestMint(token.address, childId2, parentId); - await token.nestMint(token.address, childId3, parentId); + await token.mint(await owner.getAddress(), parentId); + await token.nestMint(await token.getAddress(), childId1, parentId); + await token.nestMint(await token.getAddress(), childId2, parentId); + await token.nestMint(await token.getAddress(), childId3, parentId); }); it('can accept child in first position and result is ok', async function () { - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId1); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId1, + ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId3, token.address], - [childId2, token.address], + [childId3, await token.getAddress()], + [childId2, await token.getAddress()], ]); - expect(await token.childrenOf(parentId)).to.eql([[childId1, token.address]]); + expect(await token.childrenOf(parentId)).to.eql([[childId1, await token.getAddress()]]); }); it('can accept child in middle position and result is ok', async function () { - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId2); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId2, + ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId3, token.address], + [childId1, await token.getAddress()], + [childId3, await token.getAddress()], ]); - expect(await token.childrenOf(parentId)).to.eql([[childId2, token.address]]); + expect(await token.childrenOf(parentId)).to.eql([[childId2, await token.getAddress()]]); }); it('can accept child in last position and result is ok', async function () { - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId3); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId3, + ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId2, token.address], + [childId1, await token.getAddress()], + [childId2, await token.getAddress()], ]); - expect(await token.childrenOf(parentId)).to.eql([[childId3, token.address]]); + expect(await token.childrenOf(parentId)).to.eql([[childId3, await token.getAddress()]]); }); it('cannot accept not existing pending child', async function () { const otherChildId = bn(4); await expect( - token['acceptChild(uint256,address,uint256)'](parentId, token.address, otherChildId), + token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + otherChildId, + ), ).to.be.revertedWithCustomError(token, 'RMRKUnexpectedChildId'); }); @@ -91,75 +107,75 @@ describe('RMRKNestableAutoIndexMock', async function () { it('can transfer pending child in first position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId1, true, '0x', ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId3, token.address], - [childId2, token.address], + [childId3, await token.getAddress()], + [childId2, await token.getAddress()], ]); }); it('can transfer pending child in middle position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId2, true, '0x', ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId3, token.address], + [childId1, await token.getAddress()], + [childId3, await token.getAddress()], ]); }); it('can transfer pending child in last position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId3, true, '0x', ); expect(await token.pendingChildrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId2, token.address], + [childId1, await token.getAddress()], + [childId2, await token.getAddress()], ]); }); it('can transfer all pending children result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId1, true, '0x', ); await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId2, true, '0x', ); await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId3, true, '0x', @@ -173,9 +189,9 @@ describe('RMRKNestableAutoIndexMock', async function () { await expect( token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), otherChildId, true, '0x', @@ -186,83 +202,95 @@ describe('RMRKNestableAutoIndexMock', async function () { describe('With accepted tokens', async function () { beforeEach(async function () { - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId1); - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId2); - await token['acceptChild(uint256,address,uint256)'](parentId, token.address, childId3); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId1, + ); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId2, + ); + await token['acceptChild(uint256,address,uint256)']( + parentId, + await token.getAddress(), + childId3, + ); }); it('can transfer active child in first position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId1, false, '0x', ); expect(await token.childrenOf(parentId)).to.eql([ - [childId3, token.address], - [childId2, token.address], + [childId3, await token.getAddress()], + [childId2, await token.getAddress()], ]); }); it('can transfer active child in middle position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId2, false, '0x', ); expect(await token.childrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId3, token.address], + [childId1, await token.getAddress()], + [childId3, await token.getAddress()], ]); }); it('can transfer active child in last position and result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId3, false, '0x', ); expect(await token.childrenOf(parentId)).to.eql([ - [childId1, token.address], - [childId2, token.address], + [childId1, await token.getAddress()], + [childId2, await token.getAddress()], ]); }); it('can transfer all active children result is ok', async function () { await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId1, false, '0x', ); await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId2, false, '0x', ); await token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), childId3, false, '0x', @@ -276,9 +304,9 @@ describe('RMRKNestableAutoIndexMock', async function () { await expect( token['transferChild(uint256,address,uint256,address,uint256,bool,bytes)']( parentId, - owner.address, + await owner.getAddress(), 0, - token.address, + await token.getAddress(), otherChildId, false, '0x', diff --git a/test/extensions/reclaimableChild.ts b/test/extensions/reclaimableChild.ts index 71d4ef1c..a35aa01a 100644 --- a/test/extensions/reclaimableChild.ts +++ b/test/extensions/reclaimableChild.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ADDRESS_ZERO, bn, mintFromMock, nestMintFromMock } from '../utils'; import { IERC165, IOtherInterface, IERC7401, IRMRKReclaimableChild } from '../interfaces'; import { RMRKNestableClaimableChildMock } from '../../typechain-types'; @@ -12,8 +12,8 @@ async function reclaimableChildNestableFixture() { const factory = await ethers.getContractFactory('RMRKNestableClaimableChildMock'); const child = await factory.deploy(); const parent = await factory.deploy(); - await parent.deployed(); - await child.deployed(); + await parent.waitForDeployment(); + await child.waitForDeployment(); return { parent, child }; } @@ -38,8 +38,8 @@ async function shouldBehaveLikeReclaimableChild() { addrs = await ethers.getSigners(); tokenOwner = addrs[1]; - parentId = await mintFromMock(this.parent, tokenOwner.address); - childId = await nestMintFromMock(this.child, this.parent.address, parentId); + parentId = await mintFromMock(this.parent, await tokenOwner.getAddress()); + childId = await nestMintFromMock(this.child, await this.parent.getAddress(), parentId); }); it('can support IERC165', async function () { @@ -60,43 +60,84 @@ async function shouldBehaveLikeReclaimableChild() { describe('With active child', async function () { beforeEach(async function () { - await this.parent.connect(tokenOwner).acceptChild(parentId, 0, this.child.address, childId); + await this.parent + .connect(tokenOwner) + .acceptChild(parentId, 0, await this.child.getAddress(), childId); }); it('can reclaim transferred child if transferred to address zero', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, false, '0x'); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + false, + '0x', + ); - await this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId); - expect(await this.child.ownerOf(childId)).to.eql(tokenOwner.address); - expect(await this.child.directOwnerOf(childId)).to.eql([tokenOwner.address, bn(0), false]); + await this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId); + expect(await this.child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); + expect(await this.child.directOwnerOf(childId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); }); it('cannot reclaim active child', async function () { await expect( - this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); it('cannot reclaim transferred child if transferred to a non zero address', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, addrs[2].address, 0, 0, this.child.address, childId, false, '0x'); + .transferChild( + parentId, + addrs[2].address, + 0, + 0, + await this.child.getAddress(), + childId, + false, + '0x', + ); await expect( - this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); it('cannot reclaim transferred child from different parent token', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, false, '0x'); - const otherParentId = await mintFromMock(this.parent, tokenOwner.address); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + false, + '0x', + ); + const otherParentId = await mintFromMock(this.parent, await tokenOwner.getAddress()); await expect( - this.parent.connect(tokenOwner).reclaimChild(otherParentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(otherParentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); @@ -104,10 +145,21 @@ async function shouldBehaveLikeReclaimableChild() { const notParent = addrs[2]; await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, false, '0x'); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + false, + '0x', + ); await expect( - this.parent.connect(notParent).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(notParent) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'ERC721NotApprovedOrOwner'); }); }); @@ -116,37 +168,76 @@ async function shouldBehaveLikeReclaimableChild() { it('can reclaim transferred child if transferred to address zero', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, true, '0x'); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + true, + '0x', + ); - await this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId); - expect(await this.child.ownerOf(childId)).to.eql(tokenOwner.address); - expect(await this.child.directOwnerOf(childId)).to.eql([tokenOwner.address, bn(0), false]); + await this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId); + expect(await this.child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); + expect(await this.child.directOwnerOf(childId)).to.eql([ + await tokenOwner.getAddress(), + bn(0), + false, + ]); }); it('cannot reclaim pending child', async function () { await expect( - this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); it('cannot reclaim transferred child if transferred to a non zero address', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, addrs[2].address, 0, 0, this.child.address, childId, true, '0x'); + .transferChild( + parentId, + addrs[2].address, + 0, + 0, + await this.child.getAddress(), + childId, + true, + '0x', + ); await expect( - this.parent.connect(tokenOwner).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); it('cannot reclaim transferred child from different parent token', async function () { await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, true, '0x'); - const otherParentId = await mintFromMock(this.parent, tokenOwner.address); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + true, + '0x', + ); + const otherParentId = await mintFromMock(this.parent, await tokenOwner.getAddress()); await expect( - this.parent.connect(tokenOwner).reclaimChild(otherParentId, this.child.address, childId), + this.parent + .connect(tokenOwner) + .reclaimChild(otherParentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'RMRKInvalidChildReclaim'); }); @@ -154,10 +245,21 @@ async function shouldBehaveLikeReclaimableChild() { const notParent = addrs[2]; await this.parent .connect(tokenOwner) - .transferChild(parentId, ADDRESS_ZERO, 0, 0, this.child.address, childId, true, '0x'); + .transferChild( + parentId, + ADDRESS_ZERO, + 0, + 0, + await this.child.getAddress(), + childId, + true, + '0x', + ); await expect( - this.parent.connect(notParent).reclaimChild(parentId, this.child.address, childId), + this.parent + .connect(notParent) + .reclaimChild(parentId, await this.child.getAddress(), childId), ).to.be.revertedWithCustomError(this.parent, 'ERC721NotApprovedOrOwner'); }); }); diff --git a/test/extensions/revealable.ts b/test/extensions/revealable.ts index 31cf051b..74c2f3ea 100644 --- a/test/extensions/revealable.ts +++ b/test/extensions/revealable.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { IOtherInterface, IRMRKRevealable, IRMRKRevealer, IERC5773 } from '../interfaces'; import { RMRKMultiAssetRevealableMock, RMRKRevealerMock } from '../../typechain-types'; import { bn } from '../utils'; @@ -20,16 +20,16 @@ async function revealableFixture(): Promise<{ const revealableFactory = await ethers.getContractFactory('RMRKMultiAssetRevealableMock'); const revealerFactory = await ethers.getContractFactory('RMRKRevealerMock'); const revealable = await revealableFactory.deploy(); - await revealable.deployed(); + await revealable.waitForDeployment(); - const revealer = await revealerFactory.deploy(REVEALED_ASSET_ID, revealable.address); - await revealer.deployed(); + const revealer = await revealerFactory.deploy(REVEALED_ASSET_ID, await revealable.getAddress()); + await revealer.waitForDeployment(); - await revealable.setRevealer(revealer.address); + await revealable.setRevealer(await revealer.getAddress()); - await revealable.mint(user1.address, 1); - await revealable.mint(user1.address, 2); - await revealable.mint(user2.address, 3); + await revealable.mint(await user1.getAddress(), 1); + await revealable.mint(await user1.getAddress(), 2); + await revealable.mint(await user2.getAddress(), 3); await revealable.addAssetEntry(UNREVEALED_ASSET_ID, 'ipfs://unrevealed'); await revealable.addAssetEntry(REVEALED_ASSET_ID, 'ipfs://revealed'); @@ -88,7 +88,7 @@ describe('RMRKRevealables', async function () { }); it('can get revealer address', async function () { - expect(await revealable.getRevealer()).to.eql(revealer.address); + expect(await revealable.getRevealer()).to.eql(await revealer.getAddress()); }); it('supports revealable interface', async function () { diff --git a/test/extensions/soulbound.ts b/test/extensions/soulbound.ts index d52fa3b2..eac88504 100644 --- a/test/extensions/soulbound.ts +++ b/test/extensions/soulbound.ts @@ -1,8 +1,8 @@ -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { bn, mintFromMock, nestMintFromMock } from '../utils'; import { IERC165, IERC6454, IOtherInterface } from '../interfaces'; import { @@ -16,7 +16,7 @@ import { async function soulboundMultiAssetFixture() { const factory = await ethers.getContractFactory('RMRKSoulboundMultiAssetMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return { token }; } @@ -24,7 +24,7 @@ async function soulboundMultiAssetFixture() { async function soulboundNestableFixture() { const factory = await ethers.getContractFactory('RMRKSoulboundNestableMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return { token }; } @@ -32,7 +32,7 @@ async function soulboundNestableFixture() { async function soulboundNestableMultiAssetFixture() { const factory = await ethers.getContractFactory('RMRKSoulboundNestableMultiAssetMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return { token }; } @@ -40,7 +40,7 @@ async function soulboundNestableMultiAssetFixture() { async function soulboundEquippableFixture() { const factory = await ethers.getContractFactory('RMRKSoulboundEquippableMock'); const token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); return { token }; } @@ -101,7 +101,7 @@ describe('RMRKSoulbound variants', async function () { const factory = await ethers.getContractFactory('RMRKSoulboundAfterBlockNumberMock'); initBlock = (await ethers.provider.getBlock('latest')).number; token = await factory.deploy(initBlock + blocksToTransfer); - await token.deployed(); + await token.waitForDeployment(); }); it('can support IERC6454', async function () { @@ -113,16 +113,16 @@ describe('RMRKSoulbound variants', async function () { }); it('can transfer before max block', async function () { - await token.mint(owner.address, 1); - await token.transferFrom(owner.address, otherOwner.address, 1); - expect(await token.ownerOf(1)).to.equal(otherOwner.address); + await token.mint(await owner.getAddress(), 1); + await token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1); + expect(await token.ownerOf(1)).to.equal(await otherOwner.getAddress()); }); it('cannot transfer after max block', async function () { - await token.mint(owner.address, 1); + await token.mint(await owner.getAddress(), 1); await mine(blocksToTransfer + 1); await expect( - token.transferFrom(owner.address, otherOwner.address, 1), + token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1), ).to.be.revertedWithCustomError(token, 'RMRKCannotTransferSoulbound'); }); }); @@ -134,7 +134,7 @@ describe('RMRKSoulbound variants', async function () { beforeEach(async function () { const factory = await ethers.getContractFactory('RMRKSoulboundAfterTransactionsMock'); token = await factory.deploy(maxTransactions); - await token.deployed(); + await token.waitForDeployment(); }); it('can support IERC6454', async function () { @@ -146,16 +146,20 @@ describe('RMRKSoulbound variants', async function () { }); it('can transfer token only 2 times', async function () { - await token.mint(owner.address, 1); - await token.transferFrom(owner.address, otherOwner.address, 1); - await expect(token.connect(otherOwner).transferFrom(otherOwner.address, owner.address, 1)) + await token.mint(await owner.getAddress(), 1); + await token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1); + await expect( + token + .connect(otherOwner) + .transferFrom(await otherOwner.getAddress(), await owner.getAddress(), 1), + ) .to.emit(token, 'Soulbound') .withArgs(1); expect(await token.getTransfersPerToken(1)).to.equal(bn(2)); expect(await token.getMaxNumberOfTransfers()).to.equal(bn(2)); await expect( - token.transferFrom(owner.address, otherOwner.address, 1), + token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1), ).to.be.revertedWithCustomError(token, 'RMRKCannotTransferSoulbound'); }); }); @@ -166,7 +170,7 @@ describe('RMRKSoulbound variants', async function () { beforeEach(async function () { const factory = await ethers.getContractFactory('RMRKSoulboundPerTokenMock'); token = await factory.deploy(); - await token.deployed(); + await token.waitForDeployment(); }); it('can support IERC6454', async function () { @@ -179,16 +183,16 @@ describe('RMRKSoulbound variants', async function () { it('can transfer token if not soulbound', async function () { await expect(token.setSoulbound(1, false)).to.emit(token, 'Soulbound').withArgs(1, false); - await token.mint(owner.address, 1); - await token.transferFrom(owner.address, otherOwner.address, 1); - expect(await token.ownerOf(1)).to.equal(otherOwner.address); + await token.mint(await owner.getAddress(), 1); + await token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1); + expect(await token.ownerOf(1)).to.equal(await otherOwner.getAddress()); }); it('cannot transfer token if soulbound', async function () { await expect(token.setSoulbound(1, true)).to.emit(token, 'Soulbound').withArgs(1, true); - await token.mint(owner.address, 1); + await token.mint(await owner.getAddress(), 1); await expect( - token.transferFrom(owner.address, otherOwner.address, 1), + token.transferFrom(await owner.getAddress(), await otherOwner.getAddress(), 1), ).to.be.revertedWithCustomError(token, 'RMRKCannotTransferSoulbound'); }); @@ -205,7 +209,7 @@ async function shouldBehaveLikeSoulboundBasic() { let soulbound: Contract; let owner: SignerWithAddress; let otherOwner: SignerWithAddress; - let tokenId: BigNumber; + let tokenId: bigint; beforeEach(async function () { const signers = await ethers.getSigners(); @@ -213,7 +217,7 @@ async function shouldBehaveLikeSoulboundBasic() { otherOwner = signers[1]; soulbound = this.token; - tokenId = await mintFromMock(soulbound, owner.address); + tokenId = await mintFromMock(soulbound, await owner.getAddress()); }); it('can support IERC165', async function () { @@ -230,7 +234,7 @@ async function shouldBehaveLikeSoulboundBasic() { it('cannot transfer', async function () { expect( - soulbound.connect(owner).transfer(otherOwner.address, tokenId), + soulbound.connect(owner).transfer(await otherOwner.getAddress(), tokenId), ).to.be.revertedWithCustomError(soulbound, 'RMRKCannotTransferSoulbound'); }); @@ -246,30 +250,39 @@ async function shouldBehaveLikeSoulboundBasic() { async function shouldBehaveLikeSoulboundNestable() { let soulbound: Contract; let owner: SignerWithAddress; - let tokenId: BigNumber; + let tokenId: bigint; beforeEach(async function () { const signers = await ethers.getSigners(); owner = signers[0]; soulbound = this.token; - tokenId = await mintFromMock(soulbound, owner.address); + tokenId = await mintFromMock(soulbound, await owner.getAddress()); }); it('cannot nest transfer', async function () { - const otherTokenId = await mintFromMock(soulbound, owner.address); + const otherTokenId = await mintFromMock(soulbound, await owner.getAddress()); expect( - soulbound.connect(owner).nestTransfer(soulbound.address, tokenId, otherTokenId), + soulbound.connect(owner).nestTransfer(await soulbound.getAddress(), tokenId, otherTokenId), ).to.be.revertedWithCustomError(soulbound, 'RMRKCannotTransferSoulbound'); }); it('cannot transfer child', async function () { - const childId = await nestMintFromMock(soulbound, soulbound.address, tokenId); - await soulbound.connect(owner).acceptChild(tokenId, 0, soulbound.address, childId); + const childId = await nestMintFromMock(soulbound, await soulbound.getAddress(), tokenId); + await soulbound.connect(owner).acceptChild(tokenId, 0, await soulbound.getAddress(), childId); expect( soulbound .connect(owner) - .transferChild(tokenId, owner.address, 0, 0, soulbound.address, childId, false, '0x'), + .transferChild( + tokenId, + await owner.getAddress(), + 0, + 0, + await soulbound.getAddress(), + childId, + false, + '0x', + ), ).to.be.revertedWithCustomError(soulbound, 'RMRKCannotTransferSoulbound'); }); } diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 61dccc31..098b9763 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -1,1646 +1,1947 @@ -import { ethers } from 'hardhat'; -import { expect } from 'chai'; -import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { IERC165, IERC7508 } from '../interfaces'; -import { OwnableMintableERC721Mock, RMRKTokenAttributesRepository } from '../../typechain-types'; -import { bn } from '../utils'; -import { smock, FakeContract } from '@defi-wonderland/smock'; - -// --------------- FIXTURES ----------------------- - -async function tokenAttributesFixture() { - const factory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); - const tokenAttributes = await factory.deploy(); - await tokenAttributes.deployed(); - - return { tokenAttributes }; -} - -async function ownedCollectionFixture() { - const ownedCollection = await smock.fake('OwnableMintableERC721Mock'); - - return { ownedCollection }; -} - -// --------------- TESTS ----------------------- - -describe('RMRKTokenAttributesRepository', async function () { - let tokenAttributes: RMRKTokenAttributesRepository; - let ownedCollection: FakeContract; - - beforeEach(async function () { - ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); - ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - - this.tokenAttributes = tokenAttributes; - this.ownedCollection = ownedCollection; - }); - - shouldBehaveLikeTokenAttributesRepositoryInterface(); - - describe('RMRKTokenAttributesRepository', async function () { - let issuer: SignerWithAddress; - let owner: SignerWithAddress; - const tokenId = 1; - const tokenId2 = 2; - - beforeEach(async function () { - ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); - ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - - const signers = await ethers.getSigners(); - issuer = signers[0]; - owner = signers[1]; - - ownedCollection.owner.returns(issuer.address); - - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - }); - - it('can set and get token attributes', async function () { - expect( - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId, - 'description', - 'test description', - ), - ) - .to.emit(tokenAttributes, 'StringAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'description', 'test description'); - expect( - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId, - 'description1', - 'test description', - ), - ) - .to.emit(tokenAttributes, 'StringAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'description1', 'test description'); - expect(await tokenAttributes.setBoolAttribute(ownedCollection.address, tokenId, 'rare', true)) - .to.emit(tokenAttributes, 'BoolAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'rare', true); - expect( - await tokenAttributes.setAddressAttribute( - ownedCollection.address, - tokenId, - 'owner', - owner.address, - ), - ) - .to.emit(tokenAttributes, 'AddressAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'owner', owner.address); - expect( - await tokenAttributes.setUintAttribute(ownedCollection.address, tokenId, 'atk', bn(100)), - ) - .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'atk', bn(100)); - expect( - await tokenAttributes.setUintAttribute(ownedCollection.address, tokenId, 'health', bn(100)), - ) - .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'health', bn(100)); - expect( - await tokenAttributes.setUintAttribute(ownedCollection.address, tokenId, 'health', bn(95)), - ) - .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'health', bn(95)); - expect( - await tokenAttributes.setUintAttribute(ownedCollection.address, tokenId, 'health', bn(80)), - ) - .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'health', bn(80)); - expect( - await tokenAttributes.setBytesAttribute(ownedCollection.address, tokenId, 'data', '0x1234'), - ) - .to.emit(tokenAttributes, 'BytesAttributeSet') - .withArgs(ownedCollection.address, tokenId, 'data', '0x1234'); - - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'description'), - ).to.eql('test description'); - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'description1'), - ).to.eql('test description'); - expect( - await tokenAttributes.getBoolAttribute(ownedCollection.address, tokenId, 'rare'), - ).to.eql(true); - expect( - await tokenAttributes.getAddressAttribute(ownedCollection.address, tokenId, 'owner'), - ).to.eql(owner.address); - expect( - await tokenAttributes.getUintAttribute(ownedCollection.address, tokenId, 'atk'), - ).to.eql(bn(100)); - expect( - await tokenAttributes.getUintAttribute(ownedCollection.address, tokenId, 'health'), - ).to.eql(bn(80)); - expect( - await tokenAttributes.getBytesAttribute(ownedCollection.address, tokenId, 'data'), - ).to.eql('0x1234'); - - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId, - 'description', - 'test description update', - ); - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'description'), - ).to.eql('test description update'); - }); - - it('can set multiple attributes of multiple types at the same time', async function () { - await expect( - tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string2', 'value2') - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint1', bn(1)) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint2', bn(2)) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address1', owner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address2', issuer.address) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes2', '0x5678'); - }); - - it('can update multiple attributes of multiple types at the same time', async function () { - await tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [ - { key: 'string1', value: 'value0' }, - { key: 'string2', value: 'value1' }, - ], - [ - { key: 'uint1', value: bn(0) }, - { key: 'uint2', value: bn(1) }, - ], - [ - { key: 'bool1', value: false }, - { key: 'bool2', value: true }, - ], - [ - { key: 'address1', value: issuer.address }, - { key: 'address2', value: owner.address }, - ], - [ - { key: 'bytes1', value: '0x5678' }, - { key: 'bytes2', value: '0x1234' }, - ], - ); - - await expect( - tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string2', 'value2') - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint1', bn(1)) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint2', bn(2)) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address1', owner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address2', issuer.address) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes2', '0x5678'); - }); - - it('can set and update multiple attributes of multiple types at the same time even if not all types are updated at the same time', async function () { - await tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [{ key: 'string1', value: 'value0' }], - [ - { key: 'uint1', value: bn(0) }, - { key: 'uint2', value: bn(1) }, - ], - [ - { key: 'bool1', value: false }, - { key: 'bool2', value: true }, - ], - [ - { key: 'address1', value: issuer.address }, - { key: 'address2', value: owner.address }, - ], - [], - ); - - await expect( - tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [], - [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint1', bn(1)) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint2', bn(2)) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address1', owner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address2', issuer.address) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes2', '0x5678'); - - await expect( - tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [], - [], - [ - { key: 'bool1', value: false }, - { key: 'bool2', value: true }, - ], - [], - [], - ), - ) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', false) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', true); - }); - - it('can set and update multiple attributes of multiple types at the same time', async function () { - await expect( - tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string2', 'value2') - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint1', bn(1)) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint2', bn(2)) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address1', owner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address2', issuer.address) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes2', '0x5678'); - }); - - it('should allow to retrieve multiple attributes at once', async function () { - await tokenAttributes.setAttributes( - ownedCollection.address, - tokenId, - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - ['string1', 'string2'], - ['uint1', 'uint2'], - ['bool1', 'bool2'], - ['address1', 'address2'], - ['bytes1', 'bytes2'], - ), - ).to.eql([ - [ - ['string1', 'value1'], - ['string2', 'value2'], - ], - [ - ['uint1', bn(1)], - ['uint2', bn(2)], - ], - [ - ['bool1', true], - ['bool2', false], - ], - [ - ['address1', owner.address], - ['address2', issuer.address], - ], - [ - ['bytes1', '0x1234'], - ['bytes2', '0x5678'], - ], - ]); - }); - - it('can set multiple string attributes at the same time', async function () { - await expect( - tokenAttributes.setStringAttributes(ownedCollection.address, tokenId, [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ]), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'string2', 'value2'); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - ['string1', 'string2'], - [], - [], - [], - [], - ), - ).to.eql([ - [ - ['string1', 'value1'], - ['string2', 'value2'], - ], - [], - [], - [], - [], - ]); - }); - - it('can set multiple uint attributes at the same time', async function () { - await expect( - tokenAttributes.setUintAttributes(ownedCollection.address, tokenId, [ - { key: 'uint1', value: bn(1) }, - { key: 'uint2', value: bn(2) }, - ]), - ) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint1', bn(1)) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'uint2', bn(2)); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - [], - ['uint1', 'uint2'], - [], - [], - [], - ), - ).to.eql([ - [], - [ - ['uint1', bn(1)], - ['uint2', bn(2)], - ], - [], - [], - [], - ]); - }); - - it('can set multiple bool attributes at the same time', async function () { - await expect( - tokenAttributes.setBoolAttributes(ownedCollection.address, tokenId, [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ]), - ) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bool2', false); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - [], - [], - ['bool1', 'bool2'], - [], - [], - ), - ).to.eql([ - [], - [], - [ - ['bool1', true], - ['bool2', false], - ], - [], - [], - ]); - }); - - it('can set multiple address attributes at the same time', async function () { - await expect( - tokenAttributes.setAddressAttributes(ownedCollection.address, tokenId, [ - { key: 'address1', value: owner.address }, - { key: 'address2', value: issuer.address }, - ]), - ) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address1', owner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'address2', issuer.address); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - [], - [], - [], - ['address1', 'address2'], - [], - ), - ).to.eql([ - [], - [], - [], - [ - ['address1', owner.address], - ['address2', issuer.address], - ], - [], - ]); - }); - - it('can set multiple bytes attributes at the same time', async function () { - await expect( - tokenAttributes.setBytesAttributes(ownedCollection.address, tokenId, [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ]), - ) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, tokenId, 'bytes2', '0x5678'); - - expect( - await tokenAttributes.getAttributes( - ownedCollection.address, - tokenId, - [], - [], - [], - [], - ['bytes1', 'bytes2'], - ), - ).to.eql([ - [], - [], - [], - [], - [ - ['bytes1', '0x1234'], - ['bytes2', '0x5678'], - ], - ]); - }); - - it('can reuse keys and values are fine', async function () { - await tokenAttributes.setStringAttribute(ownedCollection.address, tokenId, 'X', 'X1'); - await tokenAttributes.setStringAttribute(ownedCollection.address, tokenId2, 'X', 'X2'); - - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'X'), - ).to.eql('X1'); - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId2, 'X'), - ).to.eql('X2'); - }); - - it('can reuse keys among different attributes and values are fine', async function () { - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId, - 'X', - 'test description', - ); - await tokenAttributes.setBoolAttribute(ownedCollection.address, tokenId, 'X', true); - await tokenAttributes.setAddressAttribute( - ownedCollection.address, - tokenId, - 'X', - owner.address, - ); - await tokenAttributes.setUintAttribute(ownedCollection.address, tokenId, 'X', bn(100)); - await tokenAttributes.setBytesAttribute(ownedCollection.address, tokenId, 'X', '0x1234'); - - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'X'), - ).to.eql('test description'); - expect(await tokenAttributes.getBoolAttribute(ownedCollection.address, tokenId, 'X')).to.eql( - true, - ); - expect( - await tokenAttributes.getAddressAttribute(ownedCollection.address, tokenId, 'X'), - ).to.eql(owner.address); - expect(await tokenAttributes.getUintAttribute(ownedCollection.address, tokenId, 'X')).to.eql( - bn(100), - ); - expect(await tokenAttributes.getBytesAttribute(ownedCollection.address, tokenId, 'X')).to.eql( - '0x1234', - ); - }); - - it('can reuse string values and values are fine', async function () { - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId, - 'X', - 'common string', - ); - await tokenAttributes.setStringAttribute( - ownedCollection.address, - tokenId2, - 'X', - 'common string', - ); - - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId, 'X'), - ).to.eql('common string'); - expect( - await tokenAttributes.getStringAttribute(ownedCollection.address, tokenId2, 'X'), - ).to.eql('common string'); - }); - - it('should not allow to set string values to unauthorized caller', async function () { - await expect( - tokenAttributes - .connect(owner) - .setStringAttribute(ownedCollection.address, tokenId, 'X', 'test description'), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to set uint values to unauthorized caller', async function () { - await expect( - tokenAttributes - .connect(owner) - .setUintAttribute(ownedCollection.address, tokenId, 'X', bn(42)), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to set boolean values to unauthorized caller', async function () { - await expect( - tokenAttributes - .connect(owner) - .setBoolAttribute(ownedCollection.address, tokenId, 'X', true), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to set address values to unauthorized caller', async function () { - await expect( - tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, tokenId, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to set bytes values to unauthorized caller', async function () { - await expect( - tokenAttributes - .connect(owner) - .setBytesAttribute(ownedCollection.address, tokenId, 'X', '0x1234'), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - }); - - describe('Token attributes access control', async function () { - let issuer: SignerWithAddress; - let owner: SignerWithAddress; - const tokenId = 1; - const tokenId2 = 2; - - beforeEach(async function () { - ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); - ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - - const signers = await ethers.getSigners(); - issuer = signers[0]; - owner = signers[1]; - - ownedCollection.owner.returns(issuer.address); - }); - - it('should not allow registering an already registered collection', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - await expect( - tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false), - ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionAlreadyRegistered'); - }); - - it('should not allow to register a collection if caller is not the owner of the collection', async function () { - await expect( - tokenAttributes - .connect(owner) - .registerAccessControl(ownedCollection.address, issuer.address, true), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to register a collection without Ownable implemented', async function () { - ownedCollection.owner.reset(); - - await expect( - tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false), - ).to.be.revertedWithCustomError(tokenAttributes, 'OwnableNotImplemented'); - }); - - it('should allow to manage access control for registered collections', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - expect( - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 2, owner.address), - ) - .to.emit(tokenAttributes, 'AccessControlUpdate') - .withArgs(ownedCollection.address, 'X', 2, owner); - }); - - it('should allow issuer to manage collaborators', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - expect( - await tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address], [true]), - ) - .to.emit(tokenAttributes, 'CollaboratorUpdate') - .withArgs(ownedCollection.address, [owner.address], [true]); - }); - - it('should not allow to manage collaborators of an unregistered collection', async function () { - await expect( - tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address], [true]), - ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); - }); - - it('should not allow to manage collaborators if the caller is not the issuer', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - await expect( - tokenAttributes - .connect(owner) - .manageCollaborators(ownedCollection.address, [owner.address], [true]), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - await expect( - tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address, issuer.address], [true]), - ).to.be.revertedWithCustomError(tokenAttributes, 'CollaboratorArraysNotEqualLength'); - }); - - it('should not allow to manage access control for unregistered collections', async function () { - await expect( - tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 2, owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); - }); - - it('should not allow to manage access control if the caller is not issuer', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - await expect( - tokenAttributes - .connect(owner) - .manageAccessControl(ownedCollection.address, 'X', 2, owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, true); - - await expect( - tokenAttributes - .connect(owner) - .manageAccessControl(ownedCollection.address, 'X', 2, owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should return the expected value when checking for collaborators', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - expect(await tokenAttributes.isCollaborator(owner.address, ownedCollection.address)).to.be - .false; - - await tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address], [true]); - - expect(await tokenAttributes.isCollaborator(owner.address, ownedCollection.address)).to.be - .true; - }); - - it('should return the expected value when checking for specific addresses', async function () { - await tokenAttributes.registerAccessControl(ownedCollection.address, issuer.address, false); - - expect(await tokenAttributes.isSpecificAddress(owner.address, ownedCollection.address, 'X')) - .to.be.false; - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 2, owner.address); - - expect(await tokenAttributes.isSpecificAddress(owner.address, ownedCollection.address, 'X')) - .to.be.true; - }); - - it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, true); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 0, ethers.constants.AddressZero); - - await expect( - tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - - ownedCollection.owner.returns(owner.address); - - await expect( - tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - - it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 1, ethers.constants.AddressZero); - - await tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address], [true]); - - await tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - - await expect( - tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); - }); - - it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 2, ethers.constants.AddressZero); - - await tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - - await expect( - tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); - - await tokenAttributes - .connect(issuer) - .manageCollaborators(ownedCollection.address, [owner.address], [true]); - - await tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - }); - - it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, true); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 2, ethers.constants.AddressZero); - - ownedCollection.owner.returns(owner.address); - - await tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - - await expect( - tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); - - await tokenAttributes - .connect(owner) - .manageCollaborators(ownedCollection.address, [issuer.address], [true]); - - await tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - }); - - it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 3, ethers.constants.AddressZero); - - await expect( - tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); - - ownedCollection.ownerOf.returns(owner.address); - - await tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - - await expect( - tokenAttributes - .connect(issuer) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); - }); - - it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 4, ethers.constants.AddressZero); - - await expect( - tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotSpecificAddress'); - - await tokenAttributes - .connect(issuer) - .manageAccessControl(ownedCollection.address, 'X', 4, owner.address); - - await tokenAttributes - .connect(owner) - .setAddressAttribute(ownedCollection.address, 1, 'X', owner.address); - }); - - it('should allow to use presigned message to modify the parameters', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - ); - const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - ); - const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - ); - const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - ); - const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - ); - - const uintSignature = await issuer.signMessage(ethers.utils.arrayify(uintMessage)); - const stringSignature = await issuer.signMessage(ethers.utils.arrayify(stringMessage)); - const boolSignature = await issuer.signMessage(ethers.utils.arrayify(boolMessage)); - const bytesSignature = await issuer.signMessage(ethers.utils.arrayify(bytesMessage)); - const addressSignature = await issuer.signMessage(ethers.utils.arrayify(addressMessage)); - - const uintR: string = uintSignature.substring(0, 66); - const uintS: string = '0x' + uintSignature.substring(66, 130); - const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - - const stringR: string = stringSignature.substring(0, 66); - const stringS: string = '0x' + stringSignature.substring(66, 130); - const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - - const boolR: string = boolSignature.substring(0, 66); - const boolS: string = '0x' + boolSignature.substring(66, 130); - const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - - const bytesR: string = bytesSignature.substring(0, 66); - const bytesS: string = '0x' + bytesSignature.substring(66, 130); - const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - - const addressR: string = addressSignature.substring(0, 66); - const addressS: string = '0x' + addressSignature.substring(66, 130); - const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - - await expect( - tokenAttributes - .connect(owner) - .presignedSetUintAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - uintV, - uintR, - uintS, - ), - ) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(ownedCollection.address, 1, 'X', 1); - await expect( - tokenAttributes - .connect(owner) - .presignedSetStringAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - stringV, - stringR, - stringS, - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(ownedCollection.address, 1, 'X', 'test'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBoolAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - boolV, - boolR, - boolS, - ), - ) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(ownedCollection.address, 1, 'X', true); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBytesAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - bytesV, - bytesR, - bytesS, - ), - ) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(ownedCollection.address, 1, 'X', '0x1234'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetAddressAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - addressV, - addressR, - addressS, - ), - ) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(ownedCollection.address, 1, 'X', owner.address); - }); - - it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - await mine(1000, { interval: 15 }); - - const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - ownedCollection.address, - 1, - 'X', - 1, - bn(10), - ); - const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - ownedCollection.address, - 1, - 'X', - 'test', - bn(10), - ); - const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - ownedCollection.address, - 1, - 'X', - true, - bn(10), - ); - const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(10), - ); - const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - ownedCollection.address, - 1, - 'X', - owner.address, - bn(10), - ); - - const uintSignature = await issuer.signMessage(ethers.utils.arrayify(uintMessage)); - const stringSignature = await issuer.signMessage(ethers.utils.arrayify(stringMessage)); - const boolSignature = await issuer.signMessage(ethers.utils.arrayify(boolMessage)); - const bytesSignature = await issuer.signMessage(ethers.utils.arrayify(bytesMessage)); - const addressSignature = await issuer.signMessage(ethers.utils.arrayify(addressMessage)); - - const uintR: string = uintSignature.substring(0, 66); - const uintS: string = '0x' + uintSignature.substring(66, 130); - const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - - const stringR: string = stringSignature.substring(0, 66); - const stringS: string = '0x' + stringSignature.substring(66, 130); - const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - - const boolR: string = boolSignature.substring(0, 66); - const boolS: string = '0x' + boolSignature.substring(66, 130); - const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - - const bytesR: string = bytesSignature.substring(0, 66); - const bytesS: string = '0x' + bytesSignature.substring(66, 130); - const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - - const addressR: string = addressSignature.substring(0, 66); - const addressS: string = '0x' + addressSignature.substring(66, 130); - const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - - await expect( - tokenAttributes - .connect(owner) - .presignedSetUintAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 1, - bn(10), - uintV, - uintR, - uintS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetStringAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 'test', - bn(10), - stringV, - stringR, - stringS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBoolAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - true, - bn(10), - boolV, - boolR, - boolS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBytesAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(10), - bytesV, - bytesR, - bytesS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetAddressAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - owner.address, - bn(10), - addressV, - addressR, - addressS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); - }); - - it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { - await tokenAttributes - .connect(issuer) - .registerAccessControl(ownedCollection.address, issuer.address, false); - - const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - ); - const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - ); - const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - ); - const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - ); - const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - ); - - const uintSignature = await owner.signMessage(ethers.utils.arrayify(uintMessage)); - const stringSignature = await owner.signMessage(ethers.utils.arrayify(stringMessage)); - const boolSignature = await owner.signMessage(ethers.utils.arrayify(boolMessage)); - const bytesSignature = await owner.signMessage(ethers.utils.arrayify(bytesMessage)); - const addressSignature = await owner.signMessage(ethers.utils.arrayify(addressMessage)); - - const uintR: string = uintSignature.substring(0, 66); - const uintS: string = '0x' + uintSignature.substring(66, 130); - const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - - const stringR: string = stringSignature.substring(0, 66); - const stringS: string = '0x' + stringSignature.substring(66, 130); - const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - - const boolR: string = boolSignature.substring(0, 66); - const boolS: string = '0x' + boolSignature.substring(66, 130); - const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - - const bytesR: string = bytesSignature.substring(0, 66); - const bytesS: string = '0x' + bytesSignature.substring(66, 130); - const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - - const addressR: string = addressSignature.substring(0, 66); - const addressS: string = '0x' + addressSignature.substring(66, 130); - const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - - await expect( - tokenAttributes - .connect(owner) - .presignedSetUintAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - uintV, - uintR, - uintS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetStringAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - stringV, - stringR, - stringS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBoolAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - boolV, - boolR, - boolS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBytesAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - bytesV, - bytesR, - bytesS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetAddressAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - addressV, - addressR, - addressS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); - }); - - it('should not allow to use presigned message to modify the parameters if the signer is not authorized to modify them', async function () { - const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - ); - const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - ); - const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - ); - const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - ); - const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - ); - - const uintSignature = await issuer.signMessage(ethers.utils.arrayify(uintMessage)); - const stringSignature = await issuer.signMessage(ethers.utils.arrayify(stringMessage)); - const boolSignature = await issuer.signMessage(ethers.utils.arrayify(boolMessage)); - const bytesSignature = await issuer.signMessage(ethers.utils.arrayify(bytesMessage)); - const addressSignature = await issuer.signMessage(ethers.utils.arrayify(addressMessage)); - - const uintR: string = uintSignature.substring(0, 66); - const uintS: string = '0x' + uintSignature.substring(66, 130); - const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - - const stringR: string = stringSignature.substring(0, 66); - const stringS: string = '0x' + stringSignature.substring(66, 130); - const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - - const boolR: string = boolSignature.substring(0, 66); - const boolS: string = '0x' + boolSignature.substring(66, 130); - const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - - const bytesR: string = bytesSignature.substring(0, 66); - const bytesS: string = '0x' + bytesSignature.substring(66, 130); - const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - - const addressR: string = addressSignature.substring(0, 66); - const addressS: string = '0x' + addressSignature.substring(66, 130); - const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - - await expect( - tokenAttributes - .connect(owner) - .presignedSetUintAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 1, - bn(9999999999), - uintV, - uintR, - uintS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetStringAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - 'test', - bn(9999999999), - stringV, - stringR, - stringS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBoolAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - true, - bn(9999999999), - boolV, - boolR, - boolS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetBytesAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - '0x1234', - bn(9999999999), - bytesV, - bytesR, - bytesS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - await expect( - tokenAttributes - .connect(owner) - .presignedSetAddressAttribute( - issuer.address, - ownedCollection.address, - 1, - 'X', - owner.address, - bn(9999999999), - addressV, - addressR, - addressS, - ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - }); - }); -}); - -async function shouldBehaveLikeTokenAttributesRepositoryInterface() { - it('can support IERC165', async function () { - expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); - }); - - it('can support IERC7508', async function () { - expect(await this.tokenAttributes.supportsInterface(IERC7508)).to.equal(true); - }); -} +// import { ethers } from 'hardhat'; +// import { expect } from 'chai'; +// import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; +// import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +// import { IERC165, IERC7508 } from '../interfaces'; +// import { OwnableMintableERC721Mock, RMRKTokenAttributesRepository } from '../../typechain-types'; +// import { bn } from '../utils'; +// import { smock, FakeContract } from '@defi-wonderland/smock'; + +// // --------------- FIXTURES ----------------------- + +// async function tokenAttributesFixture() { +// const factory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); +// const tokenAttributes = await factory.deploy(); +// await tokenAttributes.waitForDeployment(); + +// return { tokenAttributes }; +// } + +// async function ownedCollectionFixture() { +// const ownedCollection = await smock.fake('OwnableMintableERC721Mock'); + +// return { ownedCollection }; +// } + +// // --------------- TESTS ----------------------- + +// describe('RMRKTokenAttributesRepository', async function () { +// let tokenAttributes: RMRKTokenAttributesRepository; +// let ownedCollection: FakeContract; + +// beforeEach(async function () { +// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); +// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); + +// this.tokenAttributes = tokenAttributes; +// this.ownedCollection = ownedCollection; +// }); + +// shouldBehaveLikeTokenAttributesRepositoryInterface(); + +// describe('RMRKTokenAttributesRepository', async function () { +// let issuer: SignerWithAddress; +// let owner: SignerWithAddress; +// const tokenId = 1; +// const tokenId2 = 2; + +// beforeEach(async function () { +// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); +// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); + +// const signers = await ethers.getSigners(); +// issuer = signers[0]; +// owner = signers[1]; + +// ownedCollection.owner.returns(await issuer.getAddress()); + +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); +// }); + +// it('can set and get token attributes', async function () { +// expect( +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description', +// 'test description', +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'description', 'test description'); +// expect( +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description1', +// 'test description', +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'description1', 'test description'); +// expect( +// await tokenAttributes.setBoolAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'rare', +// true, +// ), +// ) +// .to.emit(tokenAttributes, 'BoolAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'rare', true); +// expect( +// await tokenAttributes.setAddressAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'owner', +// await owner.getAddress(), +// ), +// ) +// .to.emit(tokenAttributes, 'AddressAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'owner', await owner.getAddress()); +// expect( +// await tokenAttributes.setUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'atk', +// bn(100), +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'atk', bn(100)); +// expect( +// await tokenAttributes.setUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'health', +// bn(100), +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(100)); +// expect( +// await tokenAttributes.setUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'health', +// bn(95), +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(95)); +// expect( +// await tokenAttributes.setUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'health', +// bn(80), +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(80)); +// expect( +// await tokenAttributes.setBytesAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'data', +// '0x1234', +// ), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeSet') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'data', '0x1234'); + +// expect( +// await tokenAttributes.getStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description', +// ), +// ).to.eql('test description'); +// expect( +// await tokenAttributes.getStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description1', +// ), +// ).to.eql('test description'); +// expect( +// await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'rare'), +// ).to.eql(true); +// expect( +// await tokenAttributes.getAddressAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'owner', +// ), +// ).to.eql(await owner.getAddress()); +// expect( +// await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'atk'), +// ).to.eql(bn(100)); +// expect( +// await tokenAttributes.getUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'health', +// ), +// ).to.eql(bn(80)); +// expect( +// await tokenAttributes.getBytesAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'data', +// ), +// ).to.eql('0x1234'); + +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description', +// 'test description update', +// ); +// expect( +// await tokenAttributes.getStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'description', +// ), +// ).to.eql('test description update'); +// }); + +// it('can set multiple attributes of multiple types at the same time', async function () { +// await expect( +// tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [ +// { key: 'string1', value: 'value1' }, +// { key: 'string2', value: 'value2' }, +// ], +// [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ], +// [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ], +// [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ], +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs( +// await ownedCollection.getAddress(), +// tokenId, +// 'address2', +// await issuer.getAddress(), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); +// }); + +// it('can update multiple attributes of multiple types at the same time', async function () { +// await tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [ +// { key: 'string1', value: 'value0' }, +// { key: 'string2', value: 'value1' }, +// ], +// [ +// { key: 'uint1', value: bn(0) }, +// { key: 'uint2', value: bn(1) }, +// ], +// [ +// { key: 'bool1', value: false }, +// { key: 'bool2', value: true }, +// ], +// [ +// { key: 'address1', value: await issuer.getAddress() }, +// { key: 'address2', value: await owner.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x5678' }, +// { key: 'bytes2', value: '0x1234' }, +// ], +// ); + +// await expect( +// tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [ +// { key: 'string1', value: 'value1' }, +// { key: 'string2', value: 'value2' }, +// ], +// [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ], +// [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ], +// [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ], +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs( +// await ownedCollection.getAddress(), +// tokenId, +// 'address2', +// await issuer.getAddress(), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); +// }); + +// it('can set and update multiple attributes of multiple types at the same time even if not all types are updated at the same time', async function () { +// await tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [{ key: 'string1', value: 'value0' }], +// [ +// { key: 'uint1', value: bn(0) }, +// { key: 'uint2', value: bn(1) }, +// ], +// [ +// { key: 'bool1', value: false }, +// { key: 'bool2', value: true }, +// ], +// [ +// { key: 'address1', value: await issuer.getAddress() }, +// { key: 'address2', value: await owner.getAddress() }, +// ], +// [], +// ); + +// await expect( +// tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ], +// [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ], +// [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ], +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs( +// await ownedCollection.getAddress(), +// tokenId, +// 'address2', +// await issuer.getAddress(), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + +// await expect( +// tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// [], +// [ +// { key: 'bool1', value: false }, +// { key: 'bool2', value: true }, +// ], +// [], +// [], +// ), +// ) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', false) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', true); +// }); + +// it('can set and update multiple attributes of multiple types at the same time', async function () { +// await expect( +// tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [ +// { key: 'string1', value: 'value1' }, +// { key: 'string2', value: 'value2' }, +// ], +// [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ], +// [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ], +// [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ], +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs( +// await ownedCollection.getAddress(), +// tokenId, +// 'address2', +// await issuer.getAddress(), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); +// }); + +// it('should allow to retrieve multiple attributes at once', async function () { +// await tokenAttributes.setAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [ +// { key: 'string1', value: 'value1' }, +// { key: 'string2', value: 'value2' }, +// ], +// [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ], +// [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ], +// [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ], +// [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ], +// ); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// ['string1', 'string2'], +// ['uint1', 'uint2'], +// ['bool1', 'bool2'], +// ['address1', 'address2'], +// ['bytes1', 'bytes2'], +// ), +// ).to.eql([ +// [ +// ['string1', 'value1'], +// ['string2', 'value2'], +// ], +// [ +// ['uint1', bn(1)], +// ['uint2', bn(2)], +// ], +// [ +// ['bool1', true], +// ['bool2', false], +// ], +// [ +// ['address1', await owner.getAddress()], +// ['address2', await issuer.getAddress()], +// ], +// [ +// ['bytes1', '0x1234'], +// ['bytes2', '0x5678'], +// ], +// ]); +// }); + +// it('can set multiple string attributes at the same time', async function () { +// await expect( +// tokenAttributes.setStringAttributes(await ownedCollection.getAddress(), tokenId, [ +// { key: 'string1', value: 'value1' }, +// { key: 'string2', value: 'value2' }, +// ]), +// ) +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2'); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// ['string1', 'string2'], +// [], +// [], +// [], +// [], +// ), +// ).to.eql([ +// [ +// ['string1', 'value1'], +// ['string2', 'value2'], +// ], +// [], +// [], +// [], +// [], +// ]); +// }); + +// it('can set multiple uint attributes at the same time', async function () { +// await expect( +// tokenAttributes.setUintAttributes(await ownedCollection.getAddress(), tokenId, [ +// { key: 'uint1', value: bn(1) }, +// { key: 'uint2', value: bn(2) }, +// ]), +// ) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// ['uint1', 'uint2'], +// [], +// [], +// [], +// ), +// ).to.eql([ +// [], +// [ +// ['uint1', bn(1)], +// ['uint2', bn(2)], +// ], +// [], +// [], +// [], +// ]); +// }); + +// it('can set multiple bool attributes at the same time', async function () { +// await expect( +// tokenAttributes.setBoolAttributes(await ownedCollection.getAddress(), tokenId, [ +// { key: 'bool1', value: true }, +// { key: 'bool2', value: false }, +// ]), +// ) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// [], +// ['bool1', 'bool2'], +// [], +// [], +// ), +// ).to.eql([ +// [], +// [], +// [ +// ['bool1', true], +// ['bool2', false], +// ], +// [], +// [], +// ]); +// }); + +// it('can set multiple address attributes at the same time', async function () { +// await expect( +// tokenAttributes.setAddressAttributes(await ownedCollection.getAddress(), tokenId, [ +// { key: 'address1', value: await owner.getAddress() }, +// { key: 'address2', value: await issuer.getAddress() }, +// ]), +// ) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs( +// await ownedCollection.getAddress(), +// tokenId, +// 'address2', +// await issuer.getAddress(), +// ); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// [], +// [], +// ['address1', 'address2'], +// [], +// ), +// ).to.eql([ +// [], +// [], +// [], +// [ +// ['address1', await owner.getAddress()], +// ['address2', await issuer.getAddress()], +// ], +// [], +// ]); +// }); + +// it('can set multiple bytes attributes at the same time', async function () { +// await expect( +// tokenAttributes.setBytesAttributes(await ownedCollection.getAddress(), tokenId, [ +// { key: 'bytes1', value: '0x1234' }, +// { key: 'bytes2', value: '0x5678' }, +// ]), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + +// expect( +// await tokenAttributes.getAttributes( +// await ownedCollection.getAddress(), +// tokenId, +// [], +// [], +// [], +// [], +// ['bytes1', 'bytes2'], +// ), +// ).to.eql([ +// [], +// [], +// [], +// [], +// [ +// ['bytes1', '0x1234'], +// ['bytes2', '0x5678'], +// ], +// ]); +// }); + +// it('can reuse keys and values are fine', async function () { +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// 'X1', +// ); +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId2, +// 'X', +// 'X2', +// ); + +// expect( +// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql('X1'); +// expect( +// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), +// ).to.eql('X2'); +// }); + +// it('can reuse keys among different attributes and values are fine', async function () { +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// 'test description', +// ); +// await tokenAttributes.setBoolAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// true, +// ); +// await tokenAttributes.setAddressAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// await owner.getAddress(), +// ); +// await tokenAttributes.setUintAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// bn(100), +// ); +// await tokenAttributes.setBytesAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// '0x1234', +// ); + +// expect( +// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql('test description'); +// expect( +// await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql(true); +// expect( +// await tokenAttributes.getAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql(await owner.getAddress()); +// expect( +// await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql(bn(100)); +// expect( +// await tokenAttributes.getBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql('0x1234'); +// }); + +// it('can reuse string values and values are fine', async function () { +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// 'common string', +// ); +// await tokenAttributes.setStringAttribute( +// await ownedCollection.getAddress(), +// tokenId2, +// 'X', +// 'common string', +// ); + +// expect( +// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), +// ).to.eql('common string'); +// expect( +// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), +// ).to.eql('common string'); +// }); + +// it('should not allow to set string values to unauthorized caller', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .setStringAttribute(await ownedCollection.getAddress(), tokenId, 'X', 'test description'), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to set uint values to unauthorized caller', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .setUintAttribute(await ownedCollection.getAddress(), tokenId, 'X', bn(42)), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to set boolean values to unauthorized caller', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .setBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X', true), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to set address values to unauthorized caller', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// tokenId, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to set bytes values to unauthorized caller', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .setBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X', '0x1234'), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); +// }); + +// describe('Token attributes access control', async function () { +// let issuer: SignerWithAddress; +// let owner: SignerWithAddress; +// const tokenId = 1; +// const tokenId2 = 2; + +// beforeEach(async function () { +// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); +// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); + +// const signers = await ethers.getSigners(); +// issuer = signers[0]; +// owner = signers[1]; + +// ownedCollection.owner.returns(await issuer.getAddress()); +// }); + +// it('should not allow registering an already registered collection', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await expect( +// tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionAlreadyRegistered'); +// }); + +// it('should not allow to register a collection if caller is not the owner of the collection', async function () { +// await expect( +// tokenAttributes +// .connect(owner) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// true, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to register a collection without Ownable implemented', async function () { +// ownedCollection.owner.reset(); + +// await expect( +// tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'OwnableNotImplemented'); +// }); + +// it('should allow to manage access control for registered collections', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// expect( +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl( +// await ownedCollection.getAddress(), +// 'X', +// 2, +// await owner.getAddress(), +// ), +// ) +// .to.emit(tokenAttributes, 'AccessControlUpdate') +// .withArgs(await ownedCollection.getAddress(), 'X', 2, owner); +// }); + +// it('should allow issuer to manage collaborators', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// expect( +// await tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ), +// ) +// .to.emit(tokenAttributes, 'CollaboratorUpdate') +// .withArgs(await ownedCollection.getAddress(), [await owner.getAddress()], [true]); +// }); + +// it('should not allow to manage collaborators of an unregistered collection', async function () { +// await expect( +// tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); +// }); + +// it('should not allow to manage collaborators if the caller is not the issuer', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await expect( +// tokenAttributes +// .connect(owner) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await expect( +// tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress(), await issuer.getAddress()], +// [true], +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'CollaboratorArraysNotEqualLength'); +// }); + +// it('should not allow to manage access control for unregistered collections', async function () { +// await expect( +// tokenAttributes +// .connect(issuer) +// .manageAccessControl( +// await ownedCollection.getAddress(), +// 'X', +// 2, +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); +// }); + +// it('should not allow to manage access control if the caller is not issuer', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await expect( +// tokenAttributes +// .connect(owner) +// .manageAccessControl( +// await ownedCollection.getAddress(), +// 'X', +// 2, +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// true, +// ); + +// await expect( +// tokenAttributes +// .connect(owner) +// .manageAccessControl( +// await ownedCollection.getAddress(), +// 'X', +// 2, +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should return the expected value when checking for collaborators', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// expect( +// await tokenAttributes.isCollaborator( +// await owner.getAddress(), +// await ownedCollection.getAddress(), +// ), +// ).to.be.false; + +// await tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ); + +// expect( +// await tokenAttributes.isCollaborator( +// await owner.getAddress(), +// await ownedCollection.getAddress(), +// ), +// ).to.be.true; +// }); + +// it('should return the expected value when checking for specific addresses', async function () { +// await tokenAttributes.registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// expect( +// await tokenAttributes.isSpecificAddress( +// await owner.getAddress(), +// await ownedCollection.getAddress(), +// 'X', +// ), +// ).to.be.false; + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, await owner.getAddress()); + +// expect( +// await tokenAttributes.isSpecificAddress( +// await owner.getAddress(), +// await ownedCollection.getAddress(), +// 'X', +// ), +// ).to.be.true; +// }); + +// it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl(await ownedCollection.getAddress(), await issuer.getAddress(), true); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 0, ethers.ZeroAddress); + +// await expect( +// tokenAttributes +// .connect(owner) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + +// ownedCollection.owner.returns(await owner.getAddress()); + +// await expect( +// tokenAttributes +// .connect(issuer) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); + +// it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 1, ethers.ZeroAddress); + +// await tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ); + +// await tokenAttributes +// .connect(owner) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); + +// await expect( +// tokenAttributes +// .connect(issuer) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); +// }); + +// it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, ethers.ZeroAddress); + +// await tokenAttributes +// .connect(issuer) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); + +// await expect( +// tokenAttributes +// .connect(owner) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + +// await tokenAttributes +// .connect(issuer) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await owner.getAddress()], +// [true], +// ); + +// await tokenAttributes +// .connect(owner) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); +// }); + +// it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl(await ownedCollection.getAddress(), await issuer.getAddress(), true); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, ethers.ZeroAddress); + +// ownedCollection.owner.returns(await owner.getAddress()); + +// await tokenAttributes +// .connect(owner) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); + +// await expect( +// tokenAttributes +// .connect(issuer) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + +// await tokenAttributes +// .connect(owner) +// .manageCollaborators( +// await ownedCollection.getAddress(), +// [await issuer.getAddress()], +// [true], +// ); + +// await tokenAttributes +// .connect(issuer) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); +// }); + +// it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 3, ethers.ZeroAddress); + +// await expect( +// tokenAttributes +// .connect(owner) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); + +// ownedCollection.ownerOf.returns(await owner.getAddress()); + +// await tokenAttributes +// .connect(owner) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); + +// await expect( +// tokenAttributes +// .connect(issuer) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); +// }); + +// it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 4, ethers.ZeroAddress); + +// await expect( +// tokenAttributes +// .connect(owner) +// .setAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotSpecificAddress'); + +// await tokenAttributes +// .connect(issuer) +// .manageAccessControl(await ownedCollection.getAddress(), 'X', 4, await owner.getAddress()); + +// await tokenAttributes +// .connect(owner) +// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); +// }); + +// it('should allow to use presigned message to modify the parameters', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// ); +// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// ); +// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// ); +// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// ); +// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// ); + +// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); +// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); +// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); +// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); +// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); + +// const uintR: string = uintSignature.substring(0, 66); +// const uintS: string = '0x' + uintSignature.substring(66, 130); +// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); + +// const stringR: string = stringSignature.substring(0, 66); +// const stringS: string = '0x' + stringSignature.substring(66, 130); +// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); + +// const boolR: string = boolSignature.substring(0, 66); +// const boolS: string = '0x' + boolSignature.substring(66, 130); +// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); + +// const bytesR: string = bytesSignature.substring(0, 66); +// const bytesS: string = '0x' + bytesSignature.substring(66, 130); +// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); + +// const addressR: string = addressSignature.substring(0, 66); +// const addressS: string = '0x' + addressSignature.substring(66, 130); +// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); + +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetUintAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// uintV, +// uintR, +// uintS, +// ), +// ) +// .to.emit(tokenAttributes, 'UintAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), 1, 'X', 1); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetStringAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// stringV, +// stringR, +// stringS, +// ), +// ) +// .to.emit(tokenAttributes, 'StringAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), 1, 'X', 'test'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBoolAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// boolV, +// boolR, +// boolS, +// ), +// ) +// .to.emit(tokenAttributes, 'BoolAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), 1, 'X', true); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBytesAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// bytesV, +// bytesR, +// bytesS, +// ), +// ) +// .to.emit(tokenAttributes, 'BytesAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), 1, 'X', '0x1234'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetAddressAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// addressV, +// addressR, +// addressS, +// ), +// ) +// .to.emit(tokenAttributes, 'AddressAttributeUpdated') +// .withArgs(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); +// }); + +// it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// await mine(1000, { interval: 15 }); + +// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(10), +// ); +// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(10), +// ); +// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(10), +// ); +// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(10), +// ); +// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(10), +// ); + +// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); +// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); +// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); +// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); +// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); + +// const uintR: string = uintSignature.substring(0, 66); +// const uintS: string = '0x' + uintSignature.substring(66, 130); +// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); + +// const stringR: string = stringSignature.substring(0, 66); +// const stringS: string = '0x' + stringSignature.substring(66, 130); +// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); + +// const boolR: string = boolSignature.substring(0, 66); +// const boolS: string = '0x' + boolSignature.substring(66, 130); +// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); + +// const bytesR: string = bytesSignature.substring(0, 66); +// const bytesS: string = '0x' + bytesSignature.substring(66, 130); +// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); + +// const addressR: string = addressSignature.substring(0, 66); +// const addressS: string = '0x' + addressSignature.substring(66, 130); +// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); + +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetUintAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(10), +// uintV, +// uintR, +// uintS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetStringAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(10), +// stringV, +// stringR, +// stringS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBoolAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(10), +// boolV, +// boolR, +// boolS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBytesAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(10), +// bytesV, +// bytesR, +// bytesS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetAddressAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(10), +// addressV, +// addressR, +// addressS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); +// }); + +// it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { +// await tokenAttributes +// .connect(issuer) +// .registerAccessControl( +// await ownedCollection.getAddress(), +// await issuer.getAddress(), +// false, +// ); + +// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// ); +// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// ); +// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// ); +// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// ); +// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// ); + +// const uintSignature = await owner.signMessage(ethers.getBytes(uintMessage)); +// const stringSignature = await owner.signMessage(ethers.getBytes(stringMessage)); +// const boolSignature = await owner.signMessage(ethers.getBytes(boolMessage)); +// const bytesSignature = await owner.signMessage(ethers.getBytes(bytesMessage)); +// const addressSignature = await owner.signMessage(ethers.getBytes(addressMessage)); + +// const uintR: string = uintSignature.substring(0, 66); +// const uintS: string = '0x' + uintSignature.substring(66, 130); +// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); + +// const stringR: string = stringSignature.substring(0, 66); +// const stringS: string = '0x' + stringSignature.substring(66, 130); +// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); + +// const boolR: string = boolSignature.substring(0, 66); +// const boolS: string = '0x' + boolSignature.substring(66, 130); +// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); + +// const bytesR: string = bytesSignature.substring(0, 66); +// const bytesS: string = '0x' + bytesSignature.substring(66, 130); +// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); + +// const addressR: string = addressSignature.substring(0, 66); +// const addressS: string = '0x' + addressSignature.substring(66, 130); +// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); + +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetUintAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// uintV, +// uintR, +// uintS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetStringAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// stringV, +// stringR, +// stringS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBoolAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// boolV, +// boolR, +// boolS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBytesAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// bytesV, +// bytesR, +// bytesS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetAddressAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// addressV, +// addressR, +// addressS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); +// }); + +// it('should not allow to use presigned message to modify the parameters if the signer is not authorized to modify them', async function () { +// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// ); +// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// ); +// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// ); +// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// ); +// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// ); + +// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); +// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); +// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); +// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); +// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); + +// const uintR: string = uintSignature.substring(0, 66); +// const uintS: string = '0x' + uintSignature.substring(66, 130); +// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); + +// const stringR: string = stringSignature.substring(0, 66); +// const stringS: string = '0x' + stringSignature.substring(66, 130); +// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); + +// const boolR: string = boolSignature.substring(0, 66); +// const boolS: string = '0x' + boolSignature.substring(66, 130); +// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); + +// const bytesR: string = bytesSignature.substring(0, 66); +// const bytesS: string = '0x' + bytesSignature.substring(66, 130); +// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); + +// const addressR: string = addressSignature.substring(0, 66); +// const addressS: string = '0x' + addressSignature.substring(66, 130); +// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); + +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetUintAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 1, +// bn(9999999999), +// uintV, +// uintR, +// uintS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetStringAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// 'test', +// bn(9999999999), +// stringV, +// stringR, +// stringS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBoolAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// true, +// bn(9999999999), +// boolV, +// boolR, +// boolS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetBytesAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// '0x1234', +// bn(9999999999), +// bytesV, +// bytesR, +// bytesS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// await expect( +// tokenAttributes +// .connect(owner) +// .presignedSetAddressAttribute( +// await issuer.getAddress(), +// await ownedCollection.getAddress(), +// 1, +// 'X', +// await owner.getAddress(), +// bn(9999999999), +// addressV, +// addressR, +// addressS, +// ), +// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); +// }); +// }); +// }); + +// async function shouldBehaveLikeTokenAttributesRepositoryInterface() { +// it('can support IERC165', async function () { +// expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); +// }); + +// it('can support IERC7508', async function () { +// expect(await this.tokenAttributes.supportsInterface(IERC7508)).to.equal(true); +// }); +// } diff --git a/test/extensions/tokenHolder.ts b/test/extensions/tokenHolder.ts index b754ab0d..e74fc833 100644 --- a/test/extensions/tokenHolder.ts +++ b/test/extensions/tokenHolder.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { bn } from '../utils'; import { IERC165, IERC7590, IOtherInterface } from '../interfaces'; import { RMRKTokenHolderMock, ERC20Mock } from '../../typechain-types'; @@ -11,14 +11,14 @@ import { RMRKTokenHolderMock, ERC20Mock } from '../../typechain-types'; async function tokenHolderFixture() { const tokenHolderFactory = await ethers.getContractFactory('RMRKTokenHolderMock'); const tokenHolder = await tokenHolderFactory.deploy('Secure Token Transfer Protocol', 'STTP'); - await tokenHolder.deployed(); + await tokenHolder.waitForDeployment(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20A = await erc20Factory.deploy(); - await erc20A.deployed(); + await erc20A.waitForDeployment(); const erc20B = await erc20Factory.deploy(); - await erc20B.deployed(); + await erc20B.waitForDeployment(); return { tokenHolder, @@ -37,7 +37,7 @@ describe('RMRKTokenHolder', async function () { const tokenHolderId = bn(1); const otherTokenHolderId = bn(2); const tokenId = bn(1); - const mockValue = ethers.utils.parseEther('10'); + const mockValue = ethers.parseEther('10'); beforeEach(async function () { [holder, otherHolder, ...addrs] = await ethers.getSigners(); @@ -58,56 +58,77 @@ describe('RMRKTokenHolder', async function () { describe('With minted tokens', async function () { beforeEach(async function () { - await tokenHolder.mint(holder.address, tokenHolderId); - await tokenHolder.mint(otherHolder.address, otherTokenHolderId); - await erc20A.mint(holder.address, mockValue); - await erc20A.mint(otherHolder.address, mockValue); + await tokenHolder.mint(await holder.getAddress(), tokenHolderId); + await tokenHolder.mint(await otherHolder.getAddress(), otherTokenHolderId); + await erc20A.mint(await holder.getAddress(), mockValue); + await erc20A.mint(await otherHolder.getAddress(), mockValue); }); it('can receive ERC-20 tokens', async function () { - await erc20A.approve(tokenHolder.address, mockValue); + await erc20A.approve(await tokenHolder.getAddress(), mockValue); await expect( - tokenHolder.transferERC20ToToken(erc20A.address, tokenHolderId, mockValue, '0x00'), + tokenHolder.transferERC20ToToken( + await erc20A.getAddress(), + tokenHolderId, + mockValue, + '0x00', + ), ) .to.emit(tokenHolder, 'ReceivedERC20') - .withArgs(erc20A.address, tokenHolderId, holder.address, mockValue); - expect(await erc20A.balanceOf(tokenHolder.address)).to.equal(mockValue); + .withArgs(await erc20A.getAddress(), tokenHolderId, await holder.getAddress(), mockValue); + expect(await erc20A.balanceOf(await tokenHolder.getAddress())).to.equal(mockValue); }); it('can transfer ERC-20 tokens', async function () { - await erc20A.approve(tokenHolder.address, mockValue); - await tokenHolder.transferERC20ToToken(erc20A.address, tokenHolderId, mockValue, '0x00'); + await erc20A.approve(await tokenHolder.getAddress(), mockValue); + await tokenHolder.transferERC20ToToken( + await erc20A.getAddress(), + tokenHolderId, + mockValue, + '0x00', + ); await expect( tokenHolder.transferHeldERC20FromToken( - erc20A.address, + await erc20A.getAddress(), tokenHolderId, - holder.address, - mockValue.div(2), + await holder.getAddress(), + mockValue / 2n, '0x00', ), ) .to.emit(tokenHolder, 'TransferredERC20') - .withArgs(erc20A.address, tokenHolderId, holder.address, mockValue.div(2)); - expect(await erc20A.balanceOf(tokenHolder.address)).to.equal(mockValue.div(2)); + .withArgs( + await erc20A.getAddress(), + tokenHolderId, + await holder.getAddress(), + mockValue / 2n, + ); + expect(await erc20A.balanceOf(await tokenHolder.getAddress())).to.equal(mockValue / 2n); expect(await tokenHolder.erc20TransferOutNonce(tokenHolderId)).to.equal(1); }); it('cannot transfer 0 value', async function () { await expect( - tokenHolder.transferERC20ToToken(erc20A.address, tokenId, 0, '0x00'), + tokenHolder.transferERC20ToToken(await erc20A.getAddress(), tokenId, 0, '0x00'), ).to.be.revertedWithCustomError(tokenHolder, 'InvalidValue'); await expect( - tokenHolder.transferHeldERC20FromToken(erc20A.address, tokenId, holder.address, 0, '0x00'), + tokenHolder.transferHeldERC20FromToken( + await erc20A.getAddress(), + tokenId, + await holder.getAddress(), + 0, + '0x00', + ), ).to.be.revertedWithCustomError(tokenHolder, 'InvalidValue'); }); it('cannot transfer to address 0', async function () { await expect( tokenHolder.transferHeldERC20FromToken( - erc20A.address, + await erc20A.getAddress(), tokenId, - ethers.constants.AddressZero, + ethers.ZeroAddress, 1, '0x00', ), @@ -117,34 +138,39 @@ describe('RMRKTokenHolder', async function () { it('cannot transfer a token at address 0', async function () { await expect( tokenHolder.transferHeldERC20FromToken( - ethers.constants.AddressZero, + ethers.ZeroAddress, tokenId, - holder.address, + await holder.getAddress(), 1, '0x00', ), ).to.be.revertedWithCustomError(tokenHolder, 'InvalidAddress'); await expect( - tokenHolder.transferERC20ToToken(ethers.constants.AddressZero, tokenId, 1, '0x00'), + tokenHolder.transferERC20ToToken(ethers.ZeroAddress, tokenId, 1, '0x00'), ).to.be.revertedWithCustomError(tokenHolder, 'InvalidAddress'); }); it('cannot transfer more balance than the token has', async function () { - await erc20A.approve(tokenHolder.address, mockValue); + await erc20A.approve(await tokenHolder.getAddress(), mockValue); - await tokenHolder.transferERC20ToToken(erc20A.address, tokenId, mockValue.div(2), '0x00'); await tokenHolder.transferERC20ToToken( - erc20A.address, + await erc20A.getAddress(), + tokenId, + mockValue / 2n, + '0x00', + ); + await tokenHolder.transferERC20ToToken( + await erc20A.getAddress(), otherTokenHolderId, - mockValue.div(2), + mockValue / 2n, '0x00', ); await expect( tokenHolder.transferHeldERC20FromToken( - erc20A.address, + await erc20A.getAddress(), tokenId, - holder.address, + await holder.getAddress(), mockValue, // The token only owns half of this value '0x00', ), @@ -152,16 +178,21 @@ describe('RMRKTokenHolder', async function () { }); it('cannot transfer balance from not owned token', async function () { - await erc20A.approve(tokenHolder.address, mockValue); - await tokenHolder.transferERC20ToToken(erc20A.address, tokenHolderId, mockValue, '0x00'); + await erc20A.approve(await tokenHolder.getAddress(), mockValue); + await tokenHolder.transferERC20ToToken( + await erc20A.getAddress(), + tokenHolderId, + mockValue, + '0x00', + ); // Other holder is not the owner of tokenId await expect( tokenHolder .connect(otherHolder) .transferHeldERC20FromToken( - erc20A.address, + await erc20A.getAddress(), tokenHolderId, - otherHolder.address, + await otherHolder.getAddress(), mockValue, '0x00', ), @@ -169,28 +200,28 @@ describe('RMRKTokenHolder', async function () { }); it('can manage multiple ERC20s', async function () { - await erc20B.mint(holder.address, mockValue); - await erc20A.approve(tokenHolder.address, mockValue); - await erc20B.approve(tokenHolder.address, mockValue); + await erc20B.mint(await holder.getAddress(), mockValue); + await erc20A.approve(await tokenHolder.getAddress(), mockValue); + await erc20B.approve(await tokenHolder.getAddress(), mockValue); await tokenHolder.transferERC20ToToken( - erc20A.address, + await erc20A.getAddress(), tokenHolderId, - ethers.utils.parseEther('3'), + ethers.parseEther('3'), '0x00', ); await tokenHolder.transferERC20ToToken( - erc20B.address, + await erc20B.getAddress(), tokenHolderId, - ethers.utils.parseEther('5'), + ethers.parseEther('5'), '0x00', ); - expect(await tokenHolder.balanceOfERC20(erc20A.address, tokenHolderId)).to.equal( - ethers.utils.parseEther('3'), + expect(await tokenHolder.balanceOfERC20(await erc20A.getAddress(), tokenHolderId)).to.equal( + ethers.parseEther('3'), ); - expect(await tokenHolder.balanceOfERC20(erc20B.address, tokenHolderId)).to.equal( - ethers.utils.parseEther('5'), + expect(await tokenHolder.balanceOfERC20(await erc20B.getAddress(), tokenHolderId)).to.equal( + ethers.parseEther('5'), ); }); }); diff --git a/test/extensions/typedMultiasset.ts b/test/extensions/typedMultiasset.ts index 3e70465c..4bd405a2 100644 --- a/test/extensions/typedMultiasset.ts +++ b/test/extensions/typedMultiasset.ts @@ -2,7 +2,7 @@ import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { bn, mintFromMock } from '../utils'; import { IERC165, @@ -18,7 +18,7 @@ import { async function typeMultiAssetFixture() { const factory = await ethers.getContractFactory('RMRKTypedMultiAssetMock'); const typedMultiAsset = await factory.deploy(); - await typedMultiAsset.deployed(); + await typedMultiAsset.waitForDeployment(); return { typedMultiAsset }; } @@ -26,7 +26,7 @@ async function typeMultiAssetFixture() { async function nestableTypedMultiAssetFixture() { const factory = await ethers.getContractFactory('RMRKNestableTypedMultiAssetMock'); const typedNestableMultiAsset = await factory.deploy(); - await typedNestableMultiAsset.deployed(); + await typedNestableMultiAsset.waitForDeployment(); return { typedNestableMultiAsset }; } @@ -34,7 +34,7 @@ async function nestableTypedMultiAssetFixture() { async function typedEquippableFixture() { const factory = await ethers.getContractFactory('RMRKTypedEquippableMock'); const typedEquippable = await factory.deploy(); - await typedEquippable.deployed(); + await typedEquippable.waitForDeployment(); return { typedEquippable }; } @@ -65,7 +65,7 @@ describe('RMRKTypedMultiAssetMock', async function () { const signers = await ethers.getSigners(); owner = signers[0]; - tokenId = await mintFromMock(typedMultiAsset, owner.address); + tokenId = await mintFromMock(typedMultiAsset, await owner.getAddress()); }); it('can get top asset by priority and type', async function () { @@ -160,7 +160,7 @@ async function shouldBehaveLikeTypedMultiAsset( const signers = await ethers.getSigners(); owner = signers[0]; - tokenId = await mint(this.assets, owner.address); + tokenId = await mint(this.assets, await owner.getAddress()); }); it('can add typed assets', async function () { @@ -188,7 +188,7 @@ async function shouldBehaveLikeTypedEquippable( const signers = await ethers.getSigners(); owner = signers[0]; - tokenId = await mint(this.nestable, owner.address); + tokenId = await mint(this.nestable, await owner.getAddress()); }); it('can add typed assets', async function () { @@ -196,7 +196,7 @@ async function shouldBehaveLikeTypedEquippable( await this.assets.addTypedAssetEntry( resId, 0, - ethers.constants.AddressZero, + ethers.ZeroAddress, 'fallback.json', [], 'image/jpeg', @@ -209,7 +209,7 @@ async function shouldBehaveLikeTypedEquippable( await this.assets.addTypedAssetEntry( resId, 0, - ethers.constants.AddressZero, + ethers.ZeroAddress, 'fallback.json', [], 'image/jpeg', diff --git a/test/implementations/base.ts b/test/implementations/base.ts index 2b11dc22..04c8d1ea 100644 --- a/test/implementations/base.ts +++ b/test/implementations/base.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { RMRKImplementationBaseMock } from '../../typechain-types'; @@ -15,7 +15,7 @@ describe('Implementation Base', async () => { const mintingUtilsContract = ( await MINT.deploy('Name', 'SBL', 'ipfs://collection-meta', 10) ); - await mintingUtilsContract.deployed(); + await mintingUtilsContract.waitForDeployment(); return { mintingUtilsContract, signersOwner, signersAddrs }; } @@ -37,58 +37,68 @@ describe('Implementation Base', async () => { it('can transfer ownership', async function () { const newOwner = addrs[1]; - await implementation_base.connect(owner).transferOwnership(newOwner.address); - expect(await implementation_base.owner()).to.eql(newOwner.address); + await implementation_base.connect(owner).transferOwnership(await newOwner.getAddress()); + expect(await implementation_base.owner()).to.eql(await newOwner.getAddress()); }); it('emits OwnershipTransferred event when transferring ownership', async function () { const newOwner = addrs[1]; - await expect(implementation_base.connect(owner).transferOwnership(newOwner.address)) + await expect(implementation_base.connect(owner).transferOwnership(await newOwner.getAddress())) .to.emit(implementation_base, 'OwnershipTransferred') - .withArgs(owner.address, newOwner.address); + .withArgs(await owner.getAddress(), await newOwner.getAddress()); }); it('cannot transfer ownership to address 0', async function () { await expect( - implementation_base.connect(owner).transferOwnership(ethers.constants.AddressZero), + implementation_base.connect(owner).transferOwnership(ethers.ZeroAddress), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNewOwnerIsZeroAddress'); }); it('can renounce ownership', async function () { await implementation_base.connect(owner).renounceOwnership(); - expect(await implementation_base.owner()).to.eql(ethers.constants.AddressZero); + expect(await implementation_base.owner()).to.eql(ethers.ZeroAddress); }); it('can add and revoke contributor', async function () { const contributor = addrs[1]; - await implementation_base.connect(owner).manageContributor(contributor.address, true); - expect(await implementation_base.connect(owner).isContributor(contributor.address)).to.eql( - true, - ); - await implementation_base.connect(owner).manageContributor(contributor.address, false); - expect(await implementation_base.connect(owner).isContributor(contributor.address)).to.eql( - false, - ); + await implementation_base + .connect(owner) + .manageContributor(await contributor.getAddress(), true); + expect( + await implementation_base.connect(owner).isContributor(await contributor.getAddress()), + ).to.eql(true); + await implementation_base + .connect(owner) + .manageContributor(await contributor.getAddress(), false); + expect( + await implementation_base.connect(owner).isContributor(await contributor.getAddress()), + ).to.eql(false); }); it('emits ContributorUpdate when adding a contributor', async function () { const contributor = addrs[1]; - await expect(implementation_base.connect(owner).manageContributor(contributor.address, true)) + await expect( + implementation_base.connect(owner).manageContributor(await contributor.getAddress(), true), + ) .to.emit(implementation_base, 'ContributorUpdate') - .withArgs(contributor.address, true); + .withArgs(await contributor.getAddress(), true); }); it('emits ContributorUpdate when removing a contributor', async function () { const contributor = addrs[1]; - await implementation_base.connect(owner).manageContributor(contributor.address, true); - await expect(implementation_base.connect(owner).manageContributor(contributor.address, false)) + await implementation_base + .connect(owner) + .manageContributor(await contributor.getAddress(), true); + await expect( + implementation_base.connect(owner).manageContributor(await contributor.getAddress(), false), + ) .to.emit(implementation_base, 'ContributorUpdate') - .withArgs(contributor.address, false); + .withArgs(await contributor.getAddress(), false); }); it('cannot add zero address as contributor', async function () { await expect( - implementation_base.connect(owner).manageContributor(ethers.constants.AddressZero, true), + implementation_base.connect(owner).manageContributor(ethers.ZeroAddress, true), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNewContributorIsZeroAddress'); }); @@ -96,16 +106,16 @@ describe('Implementation Base', async () => { const notOwner = addrs[1]; const otherUser = addrs[2]; await expect( - implementation_base.connect(notOwner).transferOwnership(otherUser.address), + implementation_base.connect(notOwner).transferOwnership(await otherUser.getAddress()), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNotOwner'); await expect( implementation_base.connect(notOwner).renounceOwnership(), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNotOwner'); await expect( - implementation_base.connect(notOwner).manageContributor(otherUser.address, true), + implementation_base.connect(notOwner).manageContributor(await otherUser.getAddress(), true), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNotOwner'); await expect( - implementation_base.connect(notOwner).manageContributor(otherUser.address, false), + implementation_base.connect(notOwner).manageContributor(await otherUser.getAddress(), false), ).to.be.revertedWithCustomError(implementation_base, 'RMRKNotOwner'); }); }); diff --git a/test/implementations/catalog.ts b/test/implementations/catalog.ts index e4154cb1..7d5b626e 100644 --- a/test/implementations/catalog.ts +++ b/test/implementations/catalog.ts @@ -1,14 +1,14 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogImpl } from '../../typechain-types'; import shouldBehaveLikeCatalog from '../behavior/catalog'; async function catalogFixture(): Promise { const factory = await ethers.getContractFactory('RMRKCatalogImpl'); const catalog = await factory.deploy('ipfs://catalogMetadata', 'img/jpeg'); - await catalog.deployed(); + await catalog.waitForDeployment(); return catalog; } @@ -21,11 +21,11 @@ describe('CatalogImpl', async () => { let owner: SignerWithAddress; let contributor: SignerWithAddress; let other: SignerWithAddress; - const fixedType = 2; - const partId = 1; + const fixedType = 2n; + const partId = 1n; const partData = { itemType: fixedType, - z: 0, + z: 0n, equippable: [], metadataURI: 'ipfs://metadata', }; @@ -45,11 +45,11 @@ describe('CatalogImpl', async () => { ).to.be.revertedWithCustomError(catalog, 'RMRKNotOwnerOrContributor'); await expect( - catalog.connect(other).addEquippableAddresses(partId, [other.address]), + catalog.connect(other).addEquippableAddresses(partId, [await other.getAddress()]), ).to.be.revertedWithCustomError(catalog, 'RMRKNotOwnerOrContributor'); await expect( - catalog.connect(other).setEquippableAddresses(partId, [other.address]), + catalog.connect(other).setEquippableAddresses(partId, [await other.getAddress()]), ).to.be.revertedWithCustomError(catalog, 'RMRKNotOwnerOrContributor'); await expect(catalog.connect(other).setEquippableToAll(partId)).to.be.revertedWithCustomError( @@ -75,13 +75,13 @@ describe('CatalogImpl', async () => { it('can add part if owner', async function () { await catalog.connect(owner).addPart({ partId: partId, part: partData }); - expect(await catalog.getPart(partId)).to.eql([fixedType, 0, [], 'ipfs://metadata']); + expect(await catalog.getPart(partId)).to.eql([fixedType, 0n, [], 'ipfs://metadata']); }); it('can add part if contributor', async function () { - await catalog.connect(owner).manageContributor(contributor.address, true); + await catalog.connect(owner).manageContributor(await contributor.getAddress(), true); await catalog.connect(contributor).addPart({ partId: partId, part: partData }); - expect(await catalog.getPart(partId)).to.eql([fixedType, 0, [], 'ipfs://metadata']); + expect(await catalog.getPart(partId)).to.eql([fixedType, 0n, [], 'ipfs://metadata']); }); }); }); diff --git a/test/implementations/generalBehavior.ts b/test/implementations/generalBehavior.ts index 07275554..299a46bf 100644 --- a/test/implementations/generalBehavior.ts +++ b/test/implementations/generalBehavior.ts @@ -28,8 +28,8 @@ import { RMRKNestablePreMint, RMRKNestablePreMintSoulbound, } from '../../typechain-types'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract } from 'ethers'; import { IRMRKImplementation, IERC165, @@ -60,7 +60,7 @@ export enum MintingType { Custom, } -const pricePerMint = ethers.utils.parseEther('0.1'); +const pricePerMint = ethers.parseEther('0.1'); describe('RMRKImplementations', async () => { const name = 'RmrkTest'; @@ -103,7 +103,7 @@ describe('RMRKImplementations', async () => { const ERC20Factory = await ethers.getContractFactory('contracts/mocks/ERC20Mock.sol:ERC20Mock'); const rmrkERC20 = await ERC20Factory.deploy(); - await rmrkERC20.mint(owner.address, ethers.utils.parseEther('1000000')); + await rmrkERC20.mint(await owner.getAddress(), ethers.parseEther('1000000')); // Pre Mint const multiAssetPreMintImplFactory = await ethers.getContractFactory('RMRKMultiAssetPreMint'); @@ -182,7 +182,7 @@ describe('RMRKImplementations', async () => { symbol, collectionMetadataUri, maxSupply, - royaltyRecipient.address, + await royaltyRecipient.getAddress(), 500, ] as const; @@ -195,8 +195,8 @@ describe('RMRKImplementations', async () => { maxSupply, pricePerMint, royaltyPercentageBps: 500, - royaltyRecipient: royaltyRecipient.address, - erc20TokenAddress: ethers.constants.AddressZero, + royaltyRecipient: await royaltyRecipient.getAddress(), + erc20TokenAddress: ethers.ZeroAddress, }, ] as const; @@ -209,7 +209,7 @@ describe('RMRKImplementations', async () => { maxSupply, pricePerMint, royaltyPercentageBps: 500, - royaltyRecipient: royaltyRecipient.address, + royaltyRecipient: await royaltyRecipient.getAddress(), }, ] as const; @@ -266,7 +266,7 @@ describe('RMRKImplementations', async () => { ); // @ts-ignore - deployArgsLazyMintERC20Pay[4].erc20TokenAddress = rmrkERC20.address; + deployArgsLazyMintERC20Pay[4].erc20TokenAddress = await rmrkERC20.getAddress(); const multiAssetLazyMintErc20Impl = ( await multiAssetLazyMintErc20ImplFactory.deploy(...deployArgsLazyMintERC20Pay) @@ -686,7 +686,7 @@ async function testMultiAssetBehavior(mintingType: MintingType) { }); it('cannot add asset to token if not owner or contributor', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); await contract.connect(owner).addAssetEntry('metadata'); const assetId = await contract.totalAssets(); const tokenId = await contract.totalSupply(); @@ -698,33 +698,30 @@ async function testMultiAssetBehavior(mintingType: MintingType) { describe('Auto Accept Behavior', async function () { it('auto accepts the first asset', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); await contract.addAssetEntry('metadata'); await contract.connect(owner).addAssetToToken(1, 1, 0); - expect(await contract.getActiveAssets(1)).to.eql([ethers.BigNumber.from(1)]); + expect(await contract.getActiveAssets(1)).to.eql([1n]); }); it('auto accepts the other assets if sender is the holder', async function () { - await mint(owner.address, contract, owner, rmrkERC20, mintingType); + await mint(await owner.getAddress(), contract, owner, rmrkERC20, mintingType); await contract.addAssetEntry('metadata'); await contract.addAssetEntry('metadata2'); await contract.connect(owner).addAssetToToken(1, 1, 0); await contract.connect(owner).addAssetToToken(1, 2, 0); - expect(await contract.getActiveAssets(1)).to.eql([ - ethers.BigNumber.from(1), - ethers.BigNumber.from(2), - ]); + expect(await contract.getActiveAssets(1)).to.eql([1n, 2n]); }); it('does not auto accept the second asset', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); await contract.addAssetEntry('metadata'); await contract.addAssetEntry('metadata'); await contract.connect(owner).addAssetToToken(1, 1, 0); await contract.connect(owner).addAssetToToken(1, 2, 0); - expect(await contract.getActiveAssets(1)).to.eql([ethers.BigNumber.from(1)]); + expect(await contract.getActiveAssets(1)).to.eql([1n]); }); }); } @@ -744,9 +741,9 @@ async function testEquippableBehavior(mintingType: MintingType) { describe('Equippable Behavior', async function () { it('can add equippable assets', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); const equippableGroupId = 1; - const catalogAddress = rmrkERC20.address; // Could be any address + const catalogAddress = await rmrkERC20.getAddress(); // Could be any address const metadataURI = 'ipfs://asset-metadata'; const partIds = [1, 2, 3]; await contract.addEquippableAssetEntry( @@ -761,9 +758,9 @@ async function testEquippableBehavior(mintingType: MintingType) { await contract.connect(owner).addAssetToToken(tokenId, assetId, 0); expect(await contract.getAssetAndEquippableData(tokenId, assetId)).to.eql([ metadataURI, - BigNumber.from(equippableGroupId), + equippableGroupId, catalogAddress, - partIds.map(BigNumber.from), + partIds.map(BigInt), ]); }); @@ -771,17 +768,26 @@ async function testEquippableBehavior(mintingType: MintingType) { const equippableGroupId = 1; const partId = 10; await expect( - contract.setValidParentForEquippableGroup(equippableGroupId, contract.address, partId), + contract.setValidParentForEquippableGroup( + equippableGroupId, + await contract.getAddress(), + partId, + ), ) .to.emit(contract, 'ValidParentEquippableGroupIdSet') - .withArgs(equippableGroupId, partId, contract.address); + .withArgs(equippableGroupId, partId, await contract.getAddress()); }); it('cannot add equippable assets if not owner or contributor', async function () { await expect( contract .connect(holder) - .addEquippableAssetEntry(1, rmrkERC20.address, 'ipfs://asset-metadata', [1, 2, 3]), + .addEquippableAssetEntry( + 1, + await rmrkERC20.getAddress(), + 'ipfs://asset-metadata', + [1, 2, 3], + ), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwnerOrContributor'); }); @@ -791,7 +797,7 @@ async function testEquippableBehavior(mintingType: MintingType) { await expect( contract .connect(holder) - .setValidParentForEquippableGroup(equippableGroupId, contract.address, partId), + .setValidParentForEquippableGroup(equippableGroupId, await contract.getAddress(), partId), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwnerOrContributor'); }); }); @@ -814,27 +820,27 @@ async function testGeneralBehavior(mintingType: MintingType) { describe('General Behavior', async function () { it('can update royalties recepient if owner or owner', async function () { - await contract.connect(owner).updateRoyaltyRecipient(holder.address); - expect(await contract.getRoyaltyRecipient()).to.eql(holder.address); + await contract.connect(owner).updateRoyaltyRecipient(await holder.getAddress()); + expect(await contract.getRoyaltyRecipient()).to.eql(await holder.getAddress()); }); it('cannot update royalties recepient if owner or owner', async function () { await expect( - contract.connect(holder).updateRoyaltyRecipient(holder.address), + contract.connect(holder).updateRoyaltyRecipient(await holder.getAddress()), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwner'); }); it('reduces total supply on burn and id not reduced', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); await contract.connect(holder)['burn(uint256)'](1); - expect(await contract.totalSupply()).to.eql(BigNumber.from(0)); + expect(await contract.totalSupply()).to.eql(0n); - await mint(holder.address, contract, owner, rmrkERC20, mintingType); - expect(await contract.ownerOf(2)).to.eql(holder.address); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); + expect(await contract.ownerOf(2)).to.eql(await holder.getAddress()); }); it('cannot burn if not token owner', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); const expectedError = (await contract.supportsInterface(IERC7401)) ? 'RMRKNotApprovedOrDirectOwner' : 'ERC721NotApprovedOrOwner'; @@ -847,23 +853,22 @@ async function testGeneralBehavior(mintingType: MintingType) { it('cannot mint 0 tokens', async function () { if (mintingType == MintingType.RMRKPreMint) { await expect( - contract.connect(owner).mint(holder.address, 0, 'ipfs://tokenURI'), + contract.connect(owner).mint(await holder.getAddress(), 0, 'ipfs://tokenURI'), ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } else if (mintingType == MintingType.RMRKLazyMintNativeToken) { await expect( - contract.connect(owner).mint(holder.address, 0, { value: pricePerMint }), + contract.connect(owner).mint(await holder.getAddress(), 0, { value: pricePerMint }), ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } else if (mintingType == MintingType.RMRKLazyMintERC20) { - await rmrkERC20.connect(owner).approve(contract.address, pricePerMint); - await expect(contract.connect(owner).mint(holder.address, 0)).to.be.revertedWithCustomError( - contract, - 'RMRKMintZero', - ); + await rmrkERC20.connect(owner).approve(await contract.getAddress(), pricePerMint); + await expect( + contract.connect(owner).mint(await holder.getAddress(), 0), + ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } }); it('has expected tokenURI', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKPreMint) { expect(await contract.tokenURI(1)).to.eql('ipfs://tokenURI'); } else { @@ -881,36 +886,44 @@ async function testGeneralBehavior(mintingType: MintingType) { }); it('can withdraw raised', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKLazyMintNativeToken) { - const balanceBefore = await holder.getBalance(); - await contract.connect(owner).withdraw(holder.address, pricePerMint.mul(2)); - const balanceAfter = await holder.getBalance(); - expect(balanceAfter).to.eql(balanceBefore.add(pricePerMint.mul(2))); + const balanceBefore = await ethers.provider.getBalance(holder.address); + await contract.connect(owner).withdraw(await holder.getAddress(), pricePerMint * 2n); + const balanceAfter = await ethers.provider.getBalance(holder.address); + expect(balanceAfter).to.eql(balanceBefore + pricePerMint * 2n); } else if (mintingType == MintingType.RMRKLazyMintERC20) { - const balanceBefore = await rmrkERC20.balanceOf(holder.address); + const balanceBefore = await rmrkERC20.balanceOf(await holder.getAddress()); await contract .connect(owner) - .withdrawRaisedERC20(rmrkERC20.address, holder.address, pricePerMint.mul(2)); - const balanceAfter = await rmrkERC20.balanceOf(holder.address); - expect(balanceAfter).to.eql(balanceBefore.add(pricePerMint.mul(2))); + .withdrawRaisedERC20( + await rmrkERC20.getAddress(), + await holder.getAddress(), + pricePerMint * 2n, + ); + const balanceAfter = await rmrkERC20.balanceOf(await holder.getAddress()); + expect(balanceAfter).to.eql(balanceBefore + pricePerMint * 2n); } else { // premint collects nothing } }); it('cannot withdraw raised if not owner', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKLazyMintNativeToken) { await expect( - contract.connect(holder).withdraw(holder.address, pricePerMint), + contract.connect(holder).withdraw(await holder.getAddress(), pricePerMint), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwner'); } else if (mintingType == MintingType.RMRKLazyMintERC20) { await expect( contract .connect(holder) - .withdrawRaisedERC20(rmrkERC20.address, holder.address, pricePerMint), + .withdrawRaisedERC20( + await rmrkERC20.getAddress(), + await holder.getAddress(), + pricePerMint, + ), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwner'); } else { // premint collects nothing @@ -920,16 +933,13 @@ async function testGeneralBehavior(mintingType: MintingType) { describe('Royalties', async function () { it('can get royalty recipient and percentage', async function () { - expect(await contract.getRoyaltyRecipient()).to.eql(royaltyRecipient.address); - expect(await contract.getRoyaltyPercentage()).to.eql(BigNumber.from(500)); + expect(await contract.getRoyaltyRecipient()).to.eql(await royaltyRecipient.getAddress()); + expect(await contract.getRoyaltyPercentage()).to.eql(500n); }); it('can get royalty info for token', async function () { - await mint(holder.address, contract, owner, rmrkERC20, mintingType); - expect(await contract.royaltyInfo(1, BigNumber.from(100))).to.eql([ - royaltyRecipient.address, - BigNumber.from(5), - ]); + await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); + expect(await contract.royaltyInfo(1, 100n)).to.eql([await royaltyRecipient.getAddress(), 5n]); }); }); } @@ -946,7 +956,7 @@ async function mint( } else if (mintingType == MintingType.RMRKLazyMintNativeToken) { await contract.connect(owner).mint(to, 1, { value: pricePerMint }); } else if (mintingType == MintingType.RMRKLazyMintERC20) { - await rmrkERC20.connect(owner).approve(contract.address, pricePerMint); + await rmrkERC20.connect(owner).approve(await contract.getAddress(), pricePerMint); await contract.connect(owner).mint(to, 1); } } diff --git a/test/implementations/lazyMintErc20Pay.ts b/test/implementations/lazyMintErc20Pay.ts index 7e2acc21..7923b096 100644 --- a/test/implementations/lazyMintErc20Pay.ts +++ b/test/implementations/lazyMintErc20Pay.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ADDRESS_ZERO, mintFromErc20Pay, @@ -8,63 +8,63 @@ import { ONE_ETH, singleFixtureWithArgs, } from '../utils'; -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ERC20Mock } from '../../typechain-types'; async function multiAssetFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); - await erc20.deployed(); + await erc20.waitForDeployment(); return await singleFixtureWithArgs('RMRKMultiAssetLazyMintErc20', [ 'MultiAsset', 'MA', 'ipfs://collection-meta', 'ipfs://tokenURI', - [erc20.address, ADDRESS_ZERO, 0, 10000, ONE_ETH], + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], ]); } async function nestableFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); - await erc20.deployed(); + await erc20.waitForDeployment(); return await singleFixtureWithArgs('RMRKNestableLazyMintErc20', [ 'Nestable', 'N', 'ipfs://collection-meta', 'ipfs://tokenURI', - [erc20.address, ADDRESS_ZERO, 0, 10000, ONE_ETH], + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], ]); } async function nestableMultiAssetFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); - await erc20.deployed(); + await erc20.waitForDeployment(); return await singleFixtureWithArgs('RMRKNestableMultiAssetLazyMintErc20', [ 'MultiAsset', 'MA', 'ipfs://collection-meta', 'ipfs://tokenURI', - [erc20.address, ADDRESS_ZERO, 0, 10000, ONE_ETH], + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], ]); } async function equippableFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); - await erc20.deployed(); + await erc20.waitForDeployment(); return await singleFixtureWithArgs('RMRKEquippableLazyMintErc20', [ 'MultiAsset', 'MA', 'ipfs://collection-meta', 'ipfs://tokenURI', - [erc20.address, ADDRESS_ZERO, 0, 10000, ONE_ETH], + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], ]); } @@ -107,16 +107,16 @@ async function shouldControlValidMintingErc20Pay(): Promise { beforeEach(async function () { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; - const erc20Address = this.token.erc20TokenAddress(); + const erc20Address = await this.token.getAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); erc20 = erc20Factory.attach(erc20Address); }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.utils.parseEther('0.05'); + const HALF_ETH = ethers.parseEther('0.05'); await erc20.mint(addrs[0].address, ONE_ETH); - await erc20.approve(this.token.address, HALF_ETH); + await erc20.approve(await this.token.getAddress(), HALF_ETH); await expect(this.token.mint(addrs[0].address, 1)).to.be.revertedWithCustomError( erc20, 'ERC20InsufficientAllowance', @@ -146,14 +146,16 @@ async function shouldControlValidMintingErc20Pay(): Promise { it('can withdraw raised funds', async function () { await mintFromErc20Pay(this.token, addrs[0].address); - const contractBalance = await erc20.balanceOf(this.token.address); + const contractBalance = await erc20.balanceOf(await this.token.getAddress()); const initAddressBalance = await erc20.balanceOf(addrs[0].address); expect(contractBalance).to.equal(ONE_ETH); - await this.token.withdrawRaisedERC20(erc20.address, addrs[0].address, contractBalance); - expect(await erc20.balanceOf(this.token.address)).to.equal(0); - expect(await erc20.balanceOf(addrs[0].address)).to.equal( - initAddressBalance.add(contractBalance), + await this.token.withdrawRaisedERC20( + await erc20.getAddress(), + addrs[0].address, + contractBalance, ); + expect(await erc20.balanceOf(await this.token.getAddress())).to.equal(0); + expect(await erc20.balanceOf(addrs[0].address)).to.equal(initAddressBalance + contractBalance); }); it('reduces total supply on burn', async function () { @@ -168,13 +170,13 @@ async function shouldControlValidMintingErc20Pay(): Promise { await this.token.connect(addrs[0])['burn(uint256)'](tokenId); const newTokenId = await mintFromErc20Pay(this.token, addrs[0].address); - expect(newTokenId).to.equal(tokenId.add(1)); + expect(newTokenId).to.equal(tokenId + 1n); expect(await this.token.totalSupply()).to.equal(1); }); it('can mint multiple tokens through sale logic', async function () { - await erc20.mint(addrs[0].address, ONE_ETH.mul(10)); - await erc20.connect(addrs[0]).approve(this.token.address, ONE_ETH.mul(10)); + await erc20.mint(addrs[0].address, ONE_ETH * 10n); + await erc20.connect(addrs[0]).approve(await this.token.getAddress(), ONE_ETH * 10n); await this.token.connect(addrs[0]).mint(addrs[0].address, 10); expect(await this.token.totalSupply()).to.equal(10); @@ -186,7 +188,7 @@ async function shouldControlValidMintingErc20Pay(): Promise { }); describe('Nest minting', async () => { - let parentId: BigNumber; + let parentId: bigint; beforeEach(async function () { if (this.token.nestMint === undefined) { @@ -196,16 +198,19 @@ async function shouldControlValidMintingErc20Pay(): Promise { }); it('can nest mint tokens through sale logic', async function () { - const childId = await nestMintFromErc20Pay(this.token, this.token.address, parentId); + const childId = await nestMintFromErc20Pay( + this.token, + await this.token.getAddress(), + parentId, + ); expect(await this.token.ownerOf(childId)).to.equal(addrs[0].address); expect(await this.token.totalSupply()).to.equal(2); }); it('cannot nest mint over max supply', async function () { - await expect(this.token.nestMint(this.token.address, 99999, 1)).to.be.revertedWithCustomError( - this.token, - 'RMRKMintOverMax', - ); + await expect( + this.token.nestMint(await this.token.getAddress(), 99999, 1), + ).to.be.revertedWithCustomError(this.token, 'RMRKMintOverMax'); }); }); } diff --git a/test/implementations/lazyMintNativeTokenPay.ts b/test/implementations/lazyMintNativeTokenPay.ts index 62efdd1e..ffaff01c 100644 --- a/test/implementations/lazyMintNativeTokenPay.ts +++ b/test/implementations/lazyMintNativeTokenPay.ts @@ -1,7 +1,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { expect } from 'chai'; -import { BigNumber, Contract } from 'ethers'; +import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { ADDRESS_ZERO, @@ -91,7 +91,7 @@ async function shouldControlValidMintingNativeTokenPay(): Promise { }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.utils.parseEther('0.05'); + const HALF_ETH = ethers.parseEther('0.05'); await expect( this.token.mint(addrs[0].address, 1, { value: HALF_ETH }), ).to.be.revertedWithCustomError(this.token, 'RMRKWrongValueSent'); @@ -121,27 +121,27 @@ async function shouldControlValidMintingNativeTokenPay(): Promise { it('reduces total supply on burn', async function () { const tokenId = await mintFromNativeToken(this.token, addrs[0].address); expect(await this.token.totalSupply()).to.equal(1); - await this.token.connect(addrs[0])['burn(uint256)'](tokenId); + await this.token.connect(addrs[0]).burn(tokenId); expect(await this.token.totalSupply()).to.equal(0); }); it('reduces total supply on burn and does not reuse ID', async function () { const tokenId = await mintFromNativeToken(this.token, addrs[0].address); - await this.token.connect(addrs[0])['burn(uint256)'](tokenId); + await this.token.connect(addrs[0]).burn(tokenId); const newTokenId = await mintFromNativeToken(this.token, addrs[0].address); - expect(newTokenId).to.equal(tokenId.add(1)); + expect(newTokenId).to.equal(tokenId + 1n); expect(await this.token.totalSupply()).to.equal(1); }); it('can mint multiple tokens through sale logic', async function () { - await this.token.connect(addrs[0]).mint(addrs[0].address, 10, { value: ONE_ETH.mul(10) }); + await this.token.connect(addrs[0]).mint(addrs[0].address, 10, { value: ONE_ETH * 10n }); expect(await this.token.totalSupply()).to.equal(10); expect(await this.token.balanceOf(addrs[0].address)).to.equal(10); }); describe('Nest minting', async () => { - let parentId: BigNumber; + let parentId: bigint; beforeEach(async function () { if (this.token.nestMint === undefined) { @@ -151,16 +151,19 @@ async function shouldControlValidMintingNativeTokenPay(): Promise { }); it('can nest mint tokens through sale logic', async function () { - const childId = await nestMintFromNativeToken(this.token, this.token.address, parentId); + const childId = await nestMintFromNativeToken( + this.token, + await this.token.getAddress(), + parentId, + ); expect(await this.token.ownerOf(childId)).to.equal(addrs[0].address); expect(await this.token.totalSupply()).to.equal(2); }); it('cannot nest mint over max supply', async function () { - await expect(this.token.nestMint(this.token.address, 99999, 1)).to.be.revertedWithCustomError( - this.token, - 'RMRKMintOverMax', - ); + await expect( + this.token.nestMint(await this.token.getAddress(), 99999, 1), + ).to.be.revertedWithCustomError(this.token, 'RMRKMintOverMax'); }); }); } diff --git a/test/implementations/premint.ts b/test/implementations/premint.ts index e52c8f93..d2d4e972 100644 --- a/test/implementations/premint.ts +++ b/test/implementations/premint.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ADDRESS_ZERO, singleFixtureWithArgs } from '../utils'; import { Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; @@ -92,7 +92,7 @@ async function shouldControlValidPreMinting(): Promise { it('cannot mint if not owner', async function () { const notOwner = addrs[0]; await expect( - this.token.connect(notOwner).mint(notOwner.address, 1, 'ipfs://tokenURI'), + this.token.connect(notOwner).mint(await notOwner.getAddress(), 1, 'ipfs://tokenURI'), ).to.be.revertedWithCustomError(this.token, 'RMRKNotOwnerOrContributor'); }); @@ -116,7 +116,7 @@ async function shouldControlValidPreMinting(): Promise { }); it('reduces total supply on burn', async function () { - await this.token.connect(owner).mint(owner.address, 1, 'ipfs://tokenURI'); + await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); const tokenId = this.token.totalSupply(); expect(await tokenId).to.equal(1); await this.token.connect(owner)['burn(uint256)'](tokenId); @@ -124,16 +124,16 @@ async function shouldControlValidPreMinting(): Promise { }); it('reduces total supply on burn and does not reuse ID', async function () { - let tx = await this.token.connect(owner).mint(owner.address, 1, 'ipfs://tokenURI'); + let tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); let event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); const tokenId = event?.args?.tokenId; await this.token.connect(owner)['burn(uint256)'](tokenId); - tx = await this.token.connect(owner).mint(owner.address, 1, 'ipfs://tokenURI'); + tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); const newTokenId = event?.args?.tokenId; - expect(newTokenId).to.equal(tokenId.add(1)); + expect(newTokenId).to.equal(tokenId + 1n); expect(await this.token.totalSupply()).to.equal(1); }); @@ -148,18 +148,24 @@ async function shouldControlValidPreMinting(): Promise { it('cannot nest mint if not owner', async function () { const notOwner = addrs[0]; await expect( - this.token.connect(notOwner).nestMint(this.token.address, 1, 1, 'ipfs://tokenURI'), + this.token + .connect(notOwner) + .nestMint(await this.token.getAddress(), 1, 1, 'ipfs://tokenURI'), ).to.be.revertedWithCustomError(this.token, 'RMRKNotOwnerOrContributor'); }); it('can nest mint if owner', async function () { this.token.connect(owner).mint(addrs[0].address, 1, 'ipfs://tokenURI'); - await this.token.connect(owner).nestMint(this.token.address, 1, 1, 'ipfs://tokenURI'); + await this.token + .connect(owner) + .nestMint(await this.token.getAddress(), 1, 1, 'ipfs://tokenURI'); }); it('cannot nest mint over max supply', async function () { await expect( - this.token.connect(owner).nestMint(this.token.address, 99999, 1, 'ipfs://tokenURI'), + this.token + .connect(owner) + .nestMint(await this.token.getAddress(), 99999, 1, 'ipfs://tokenURI'), ).to.be.revertedWithCustomError(this.token, 'RMRKMintOverMax'); }); }); diff --git a/test/kanariaUtils.ts b/test/kanariaUtils.ts index bc8018e2..da054233 100644 --- a/test/kanariaUtils.ts +++ b/test/kanariaUtils.ts @@ -1,5 +1,4 @@ import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { RMRKCatalogImpl, RMRKEquippableMock } from '../typechain-types'; // These refIds are used from the child's perspective, to group assets that can be equipped into a parent @@ -60,7 +59,7 @@ async function setUpCatalog(catalog: RMRKCatalogImpl, gemAddress: string): Promi async function setUpKanariaAsset( kanaria: RMRKEquippableMock, - kanariaId: BigNumber, + kanariaId: bigint, catalogAddress: string, ): Promise { await kanaria.addEquippableAssetEntry( @@ -76,9 +75,9 @@ async function setUpKanariaAsset( async function setUpGemAssets( gem: RMRKEquippableMock, - gemId1: BigNumber, - gemId2: BigNumber, - gemId3: BigNumber, + gemId1: bigint, + gemId2: bigint, + gemId3: bigint, kanariaAddress: string, catalogAddress: string, ): Promise { diff --git a/test/minifiedEquippable.ts b/test/minifiedEquippable.ts index e715f959..72e9d0bc 100644 --- a/test/minifiedEquippable.ts +++ b/test/minifiedEquippable.ts @@ -3,7 +3,6 @@ import { Contract } from 'ethers'; import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { addAssetEntryEquippablesFromMock, @@ -46,19 +45,19 @@ async function partsFixture() { // Catalog const catalog = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalog.deployed(); + await catalog.waitForDeployment(); // Neon token const neon = await equipFactory.deploy(); - await neon.deployed(); + await neon.waitForDeployment(); // Weapon const mask = await equipFactory.deploy(); - await mask.deployed(); + await mask.waitForDeployment(); // View const view = await viewFactory.deploy(); - await view.deployed(); + await view.waitForDeployment(); await setupContextForParts(catalog, neon, mask, mintFromMock, nestMintFromMock); return { catalog, neon, mask, view }; @@ -74,29 +73,29 @@ async function slotsFixture() { // View const view = await viewFactory.deploy(); - await view.deployed(); + await view.waitForDeployment(); // catalog const catalog = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalog.deployed(); + await catalog.waitForDeployment(); const catalogForWeapon = await catalogFactory.deploy(catalogSymbol, catalogType); - await catalogForWeapon.deployed(); + await catalogForWeapon.waitForDeployment(); // Soldier token const soldier = await equipFactory.deploy(); - await soldier.deployed(); + await soldier.waitForDeployment(); // Weapon const weapon = await equipFactory.deploy(); - await weapon.deployed(); + await weapon.waitForDeployment(); // Weapon Gem const weaponGem = await equipFactory.deploy(); - await weaponGem.deployed(); + await weaponGem.waitForDeployment(); // Background const background = await equipFactory.deploy(); - await background.deployed(); + await background.waitForDeployment(); await setupContextForSlots( catalog, @@ -117,10 +116,10 @@ async function equippableFixture() { const renderUtilsFactory = await ethers.getContractFactory('RMRKMultiAssetRenderUtils'); const equip = await equipFactory.deploy(); - await equip.deployed(); + await equip.waitForDeployment(); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); return { equip, renderUtils }; } @@ -185,11 +184,11 @@ describe('MinifiedEquippableMock MA behavior', async () => { this.renderUtils = renderUtils; }); - async function mintToNestable(token: Contract, to: string): Promise { + async function mintToNestable(token: Contract, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; await equip.mint(to, tokenId); - return BigNumber.from(tokenId); + return BigInt(tokenId); } shouldBehaveLikeMultiAsset(mintToNestable, addAssetEntryEquippablesFromMock, addAssetToToken); diff --git a/test/multiasset.ts b/test/multiasset.ts index f7e9ce0e..0cc39418 100644 --- a/test/multiasset.ts +++ b/test/multiasset.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { addAssetEntryFromMock, addAssetToToken, @@ -20,7 +20,7 @@ async function singleFixture(): Promise<{ }> { const renderUtilsFactory = await ethers.getContractFactory('RMRKMultiAssetRenderUtils'); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); const token = await singleFixtureWithArgs('RMRKMultiAssetMock', []); return { token, renderUtils }; @@ -65,14 +65,14 @@ describe('MultiAssetMock Other Behavior', async function () { }); it('cannot get metadata for non existing asset or non existing token', async function () { - const tokenId = await mintFromMock(token, tokenOwner.address); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); const resId = await addAssetEntryFromMock(token, 'metadata'); await token.addAssetToToken(tokenId, resId, 0); - await expect(token.getAssetMetadata(tokenId, resId.add(bn(1)))).to.be.revertedWithCustomError( + await expect(token.getAssetMetadata(tokenId, resId + 1n)).to.be.revertedWithCustomError( token, 'RMRKTokenDoesNotHaveAsset', ); - await expect(token.getAssetMetadata(tokenId.add(1), resId)).to.be.revertedWithCustomError( + await expect(token.getAssetMetadata(tokenId + 1n, resId)).to.be.revertedWithCustomError( token, 'RMRKTokenDoesNotHaveAsset', ); @@ -113,12 +113,12 @@ describe('MultiAssetMock Other Behavior', async function () { it('can add asset to token', async function () { const resId = await addAssetEntryFromMock(token, 'data1'); const resId2 = await addAssetEntryFromMock(token, 'data2'); - const tokenId = await mintFromMock(token, tokenOwner.address); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); await expect(token.addAssetToToken(tokenId, resId, 0)).to.emit(token, 'AssetAddedToTokens'); await expect(token.addAssetToToken(tokenId, resId2, 0)).to.emit(token, 'AssetAddedToTokens'); - expect(await renderUtils.getPendingAssets(token.address, tokenId)).to.eql([ + expect(await renderUtils.getPendingAssets(await token.getAddress(), tokenId)).to.eql([ [resId, bn(0), bn(0), 'data1'], [resId2, bn(1), bn(0), 'data2'], ]); @@ -126,7 +126,7 @@ describe('MultiAssetMock Other Behavior', async function () { it('cannot add non existing asset to token', async function () { const resId = bn(9999); - const tokenId = await mintFromMock(token, tokenOwner.address); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); await expect(token.addAssetToToken(tokenId, resId, 0)).to.be.revertedWithCustomError( token, @@ -136,17 +136,17 @@ describe('MultiAssetMock Other Behavior', async function () { it('can add asset to non existing token and it is pending when minted', async function () { const resId = await addAssetEntryFromMock(token); - const lastTokenId = await mintFromMock(token, tokenOwner.address); - const nextTokenId = lastTokenId.add(1); // not existing yet + const lastTokenId = await mintFromMock(token, await tokenOwner.getAddress()); + const nextTokenId = lastTokenId + 1n; // not existing yet await token.addAssetToToken(nextTokenId, resId, 0); - await mintFromMock(token, tokenOwner.address); + await mintFromMock(token, await tokenOwner.getAddress()); expect(await token.getPendingAssets(nextTokenId)).to.eql([resId]); }); it('cannot add asset twice to the same token', async function () { const resId = await addAssetEntryFromMock(token); - const tokenId = await mintFromMock(token, tokenOwner.address); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); await token.addAssetToToken(tokenId, resId, 0); await expect(token.addAssetToToken(tokenId, resId, 0)).to.be.revertedWithCustomError( @@ -156,7 +156,7 @@ describe('MultiAssetMock Other Behavior', async function () { }); it('cannot add too many assets to the same token', async function () { - const tokenId = await mintFromMock(token, tokenOwner.address); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); for (let i = 1; i <= 128; i++) { const resId = await addAssetEntryFromMock(token); @@ -173,8 +173,8 @@ describe('MultiAssetMock Other Behavior', async function () { it('can add same asset to 2 different tokens', async function () { const resId = await addAssetEntryFromMock(token); - const tokenId1 = await mintFromMock(token, tokenOwner.address); - const tokenId2 = await mintFromMock(token, tokenOwner.address); + const tokenId1 = await mintFromMock(token, await tokenOwner.getAddress()); + const tokenId2 = await mintFromMock(token, await tokenOwner.getAddress()); await token.addAssetToToken(tokenId1, resId, 0); await token.addAssetToToken(tokenId2, resId, 0); @@ -199,28 +199,30 @@ describe('MultiAssetMock Other Behavior', async function () { const tokenOwner = addrs[1]; const newOwner = addrs[2]; const approved = addrs[3]; - const tokenId = await mintFromMock(token, tokenOwner.address); - await token.connect(tokenOwner).approve(approved.address, tokenId); - await token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); + await token.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(approved.address); - expect(await token.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await token.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); - await token.connect(tokenOwner).transferFrom(tokenOwner.address, newOwner.address, tokenId); + await token + .connect(tokenOwner) + .transferFrom(await tokenOwner.getAddress(), await newOwner.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(ethers.constants.AddressZero); - expect(await token.getApprovedForAssets(tokenId)).to.eql(ethers.constants.AddressZero); + expect(await token.getApproved(tokenId)).to.eql(ethers.ZeroAddress); + expect(await token.getApprovedForAssets(tokenId)).to.eql(ethers.ZeroAddress); }); it('cleans token and assets approvals on burn', async function () { const tokenOwner = addrs[1]; const approved = addrs[3]; - const tokenId = await mintFromMock(token, tokenOwner.address); - await token.connect(tokenOwner).approve(approved.address, tokenId); - await token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + const tokenId = await mintFromMock(token, await tokenOwner.getAddress()); + await token.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(approved.address); - expect(await token.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await token.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); await token.connect(tokenOwner).burn(tokenId); diff --git a/test/nestable.ts b/test/nestable.ts index 016665f1..826c6388 100644 --- a/test/nestable.ts +++ b/test/nestable.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { Contract } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { bn, @@ -41,40 +41,40 @@ describe('NestableMock', function () { it('cannot mint id 0', async function () { const tokenId = 0; await expect( - child['mint(address,uint256)'](owner.address, tokenId), + child['mint(address,uint256)'](await owner.getAddress(), tokenId), ).to.be.revertedWithCustomError(child, 'RMRKIdZeroForbidden'); }); it('cannot nest mint id 0', async function () { - const parentId = await mintFromMock(child, owner.address); + const parentId = await mintFromMock(child, await owner.getAddress()); const childId = 0; await expect( - child['nestMint(address,uint256,uint256)'](parent.address, childId, parentId), + child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'RMRKIdZeroForbidden'); }); it('cannot mint already minted token', async function () { - const tokenId = await mintFromMock(child, owner.address); + const tokenId = await mintFromMock(child, await owner.getAddress()); await expect( - child['mint(address,uint256)'](owner.address, tokenId), + child['mint(address,uint256)'](await owner.getAddress(), tokenId), ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); }); it('cannot nest mint already minted token', async function () { - const parentId = await mintFromMock(parent, owner.address); - const childId = await nestMintFromMock(child, parent.address, parentId); + const parentId = await mintFromMock(parent, await owner.getAddress()); + const childId = await nestMintFromMock(child, await parent.getAddress(), parentId); await expect( - child['nestMint(address,uint256,uint256)'](parent.address, childId, parentId), + child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); }); it('cannot nest mint already minted token', async function () { - const parentId = await mintFromMock(parent, owner.address); - const childId = await nestMintFromMock(child, parent.address, parentId); + const parentId = await mintFromMock(parent, await owner.getAddress()); + const childId = await nestMintFromMock(child, await parent.getAddress(), parentId); await expect( - child['nestMint(address,uint256,uint256)'](parent.address, childId, parentId), + child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); }); }); @@ -108,38 +108,44 @@ describe('NestableMock transfer hooks', function () { }); it('keeps track of balances per NFTs', async function () { - const parentId = await mintFromMock(parent, owner.address); - const childId = await nestMintFromMock(child, parent.address, parentId); + const parentId = await mintFromMock(parent, await owner.getAddress()); + const childId = await nestMintFromMock(child, await parent.getAddress(), parentId); - expect(await parent.balancePerNftOf(owner.address, 0)).to.eql(bn(1)); - expect(await child.balancePerNftOf(parent.address, parentId)).to.eql(bn(1)); + expect(await parent.balancePerNftOf(await owner.getAddress(), 0)).to.eql(bn(1)); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(1)); await parent.transferChild( parentId, - otherOwner.address, + await otherOwner.getAddress(), 0, 0, - child.address, + await child.getAddress(), childId, true, '0x', ); - expect(await child.balancePerNftOf(parent.address, parentId)).to.eql(bn(0)); - expect(await child.balancePerNftOf(otherOwner.address, 0)).to.eql(bn(1)); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(1)); // Nest again await child .connect(otherOwner) - .nestTransferFrom(otherOwner.address, parent.address, childId, parentId, '0x'); + .nestTransferFrom( + await otherOwner.getAddress(), + await parent.getAddress(), + childId, + parentId, + '0x', + ); - expect(await child.balancePerNftOf(parent.address, parentId)).to.eql(bn(1)); - expect(await child.balancePerNftOf(otherOwner.address, 0)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(1)); + expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(0)); - await parent.acceptChild(parentId, 0, child.address, childId); + await parent.acceptChild(parentId, 0, await child.getAddress(), childId); await parent['burn(uint256,uint256)'](parentId, 1); - expect(await parent.balancePerNftOf(owner.address, 0)).to.eql(bn(0)); - expect(await child.balancePerNftOf(parent.address, parentId)).to.eql(bn(0)); - expect(await child.balancePerNftOf(otherOwner.address, 0)).to.eql(bn(0)); + expect(await parent.balancePerNftOf(await owner.getAddress(), 0)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(0)); }); }); diff --git a/test/nestableMultiasset.ts b/test/nestableMultiasset.ts index 5eec69e2..5d631cfb 100644 --- a/test/nestableMultiasset.ts +++ b/test/nestableMultiasset.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { addAssetEntryFromMock, addAssetToToken, @@ -24,7 +24,7 @@ async function singleFixture(): Promise<{ }> { const renderUtilsFactory = await ethers.getContractFactory('RMRKMultiAssetRenderUtils'); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); const token = ( await singleFixtureWithArgs('RMRKNestableMultiAssetMock', []) @@ -86,29 +86,31 @@ describe('NestableMultiAssetMock Other Behavior', function () { const tokenOwner = addrs[1]; const newOwner = addrs[2]; const approved = addrs[3]; - await token.mint(tokenOwner.address, tokenId); - await token.connect(tokenOwner).approve(approved.address, tokenId); - await token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await token.mint(await tokenOwner.getAddress(), tokenId); + await token.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(approved.address); - expect(await token.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await token.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); - await token.connect(tokenOwner).transferFrom(tokenOwner.address, newOwner.address, tokenId); + await token + .connect(tokenOwner) + .transferFrom(await tokenOwner.getAddress(), await newOwner.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(ethers.constants.AddressZero); - expect(await token.getApprovedForAssets(tokenId)).to.eql(ethers.constants.AddressZero); + expect(await token.getApproved(tokenId)).to.eql(ethers.ZeroAddress); + expect(await token.getApprovedForAssets(tokenId)).to.eql(ethers.ZeroAddress); }); it('cleans token and assets approvals on burn', async function () { const tokenId = 1; const tokenOwner = addrs[1]; const approved = addrs[3]; - await token.mint(tokenOwner.address, tokenId); - await token.connect(tokenOwner).approve(approved.address, tokenId); - await token.connect(tokenOwner).approveForAssets(approved.address, tokenId); + await token.mint(await tokenOwner.getAddress(), tokenId); + await token.connect(tokenOwner).approve(await approved.getAddress(), tokenId); + await token.connect(tokenOwner).approveForAssets(await approved.getAddress(), tokenId); - expect(await token.getApproved(tokenId)).to.eql(approved.address); - expect(await token.getApprovedForAssets(tokenId)).to.eql(approved.address); + expect(await token.getApproved(tokenId)).to.eql(await approved.getAddress()); + expect(await token.getApprovedForAssets(tokenId)).to.eql(await approved.getAddress()); await token.connect(tokenOwner)['burn(uint256)'](tokenId); diff --git a/test/nestableSecTests.ts b/test/nestableSecTests.ts index b6456895..cd32f8c6 100644 --- a/test/nestableSecTests.ts +++ b/test/nestableSecTests.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { RMRKNestableMock, ChildAdder } from '../typechain-types'; async function nestableFixture() { const NestableFactory = await ethers.getContractFactory('RMRKNestableMock'); const parent = await NestableFactory.deploy(); - await parent.deployed(); + await parent.waitForDeployment(); return parent; } @@ -22,18 +22,18 @@ describe('Nestable with ChildAdder', function () { parent = await loadFixture(nestableFixture); const Childadder = await ethers.getContractFactory('ChildAdder'); adder = await Childadder.deploy(); - await adder.deployed(); + await adder.waitForDeployment(); }); describe('add children', async function () { it('cannot add multiple children', async function () { - await parent.connect(owner).mint(owner.address, 1); + await parent.connect(owner).mint(await owner.getAddress(), 1); // Propose 10 children with the same params to the parent token - await adder.addChild(parent.address, 1, 1, 10); + await adder.addChild(await parent.getAddress(), 1, 1, 10); - await parent.connect(owner).acceptChild(1, 0, adder.address, 1); + await parent.connect(owner).acceptChild(1, 0, await adder.getAddress(), 1); await expect( - parent.connect(owner).acceptChild(1, 0, adder.address, 1), + parent.connect(owner).acceptChild(1, 0, await adder.getAddress(), 1), ).to.be.revertedWithCustomError(parent, 'RMRKChildAlreadyExists'); }); }); diff --git a/test/ownableLock.ts b/test/ownableLock.ts index 21a5452b..1f1d7aa1 100644 --- a/test/ownableLock.ts +++ b/test/ownableLock.ts @@ -11,7 +11,7 @@ describe('Ownable Lock', async () => { beforeEach(async function () { const OLOCK = await ethers.getContractFactory('OwnableLockMock'); token = await OLOCK.deploy(); - await token.deployed(); + await token.waitForDeployment(); this.token = token; }); diff --git a/test/renderUtils.ts b/test/renderUtils.ts index 59ed8f60..9a3cb052 100644 --- a/test/renderUtils.ts +++ b/test/renderUtils.ts @@ -9,7 +9,7 @@ import { nestMintFromMock, nestMintFromMockPreMint, } from './utils'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogImpl, RMRKEquippablePreMint, @@ -37,7 +37,6 @@ import { setUpKanariaAsset, setUpGemAssets, } from './kanariaUtils'; -import { BigNumber } from 'ethers'; // --------------- FIXTURES ----------------------- @@ -49,19 +48,19 @@ async function multiAsetNestableAndEquipRenderUtilsFixture() { const renderUtilsEquipFactory = await ethers.getContractFactory('RMRKEquipRenderUtils'); const catalog = await catalogFactory.deploy('ipfs://catalog.json', 'misc'); - await catalog.deployed(); + await catalog.waitForDeployment(); const equip = await equipFactory.deploy(); - await equip.deployed(); + await equip.waitForDeployment(); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); const renderUtilsNestable = await renderUtilsNestableFactory.deploy(); - await renderUtilsNestable.deployed(); + await renderUtilsNestable.waitForDeployment(); const renderUtilsEquip = await renderUtilsEquipFactory.deploy(); - await renderUtilsEquip.deployed(); + await renderUtilsEquip.waitForDeployment(); return { catalog, equip, renderUtils, renderUtilsNestable, renderUtilsEquip }; } @@ -74,13 +73,13 @@ async function advancedEquipRenderUtilsFixture() { const catalog = await catalogFactory.deploy('ipfs://catalog.json', 'misc'); const kanaria = await equipFactory.deploy(); - kanaria.deployed(); + kanaria.waitForDeployment(); const gem = await equipFactory.deploy(); - gem.deployed(); + gem.waitForDeployment(); const renderUtilsEquip = await renderUtilsEquipFactory.deploy(); - await renderUtilsEquip.deployed(); + await renderUtilsEquip.waitForDeployment(); return { catalog, kanaria, gem, renderUtilsEquip }; } @@ -103,11 +102,11 @@ async function extendedNftRenderUtilsFixture() { 'MA', 'ipfs://collection-meta', 10000, - deployer.address, + await deployer.getAddress(), 500, ) ); - await multiAsset.deployed(); + await multiAsset.waitForDeployment(); const nestableMultiAssetSoulbound = ( await nestableMultiAssetSoulboundFactory.deploy( @@ -115,11 +114,11 @@ async function extendedNftRenderUtilsFixture() { 'NMAS', 'ipfs://collection-meta', 10000, - deployer.address, + await deployer.getAddress(), 500, ) ); - await nestableMultiAssetSoulbound.deployed(); + await nestableMultiAssetSoulbound.waitForDeployment(); const nestableMultiAsset = ( await nestableMultiAssetFactory.deploy( @@ -127,14 +126,14 @@ async function extendedNftRenderUtilsFixture() { 'NMA', 'ipfs://collection-meta', 10000, - deployer.address, + await deployer.getAddress(), 500, ) ); - await nestableMultiAsset.deployed(); + await nestableMultiAsset.waitForDeployment(); const catalog = await catalogFactory.deploy('ipfs://catalog.json', 'misc'); - await catalog.deployed(); + await catalog.waitForDeployment(); const equip = ( await equipFactory.deploy( @@ -142,14 +141,14 @@ async function extendedNftRenderUtilsFixture() { 'EQ', 'ipfs://collection-meta', 10000, - deployer.address, + await deployer.getAddress(), 500, ) ); - await equip.deployed(); + await equip.waitForDeployment(); const renderUtils = await renderUtilsFactory.deploy(); - await renderUtils.deployed(); + await renderUtils.waitForDeployment(); return { multiAsset, @@ -168,7 +167,7 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { let renderUtils: RMRKMultiAssetRenderUtils; let renderUtilsNestable: RMRKNestableRenderUtils; let renderUtilsEquip: RMRKEquipRenderUtils; - let tokenId: BigNumber; + let tokenId: bigint; const resId = bn(1); const resId2 = bn(2); @@ -183,11 +182,19 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { const signers = await ethers.getSigners(); owner = signers[0]; - tokenId = await mintFromMock(equip, owner.address); + tokenId = await mintFromMock(equip, await owner.getAddress()); await equip.addEquippableAssetEntry(resId, 0, ADDRESS_ZERO, 'ipfs://res1.jpg', []); - await equip.addEquippableAssetEntry(resId2, 1, catalog.address, 'ipfs://res2.jpg', [1, 3, 4]); + await equip.addEquippableAssetEntry( + resId2, + 1, + await catalog.getAddress(), + 'ipfs://res2.jpg', + [1, 3, 4], + ); await equip.addEquippableAssetEntry(resId3, 0, ADDRESS_ZERO, 'ipfs://res3.jpg', []); - await equip.addEquippableAssetEntry(resId4, 2, catalog.address, 'ipfs://res4.jpg', [4]); + await equip.addEquippableAssetEntry(resId4, 2, await catalog.getAddress(), 'ipfs://res4.jpg', [ + 4, + ]); await equip.addAssetToToken(tokenId, resId, 0); await equip.addAssetToToken(tokenId, resId2, 0); await equip.addAssetToToken(tokenId, resId3, resId); @@ -200,39 +207,38 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { describe('Render Utils MultiAsset', async function () { it('can get active assets', async function () { - expect(await renderUtils.getExtendedActiveAssets(equip.address, tokenId)).to.eql([ + expect(await renderUtils.getExtendedActiveAssets(await equip.getAddress(), tokenId)).to.eql([ [resId, bn(10), 'ipfs://res1.jpg'], [resId2, bn(5), 'ipfs://res2.jpg'], ]); }); it('can get assets by id', async function () { - expect(await renderUtils.getAssetsById(equip.address, tokenId, [resId, resId2])).to.eql([ - 'ipfs://res1.jpg', - 'ipfs://res2.jpg', - ]); + expect( + await renderUtils.getAssetsById(await equip.getAddress(), tokenId, [resId, resId2]), + ).to.eql(['ipfs://res1.jpg', 'ipfs://res2.jpg']); }); it('can get pending assets', async function () { - expect(await renderUtils.getPendingAssets(equip.address, tokenId)).to.eql([ + expect(await renderUtils.getPendingAssets(await equip.getAddress(), tokenId)).to.eql([ [resId4, bn(0), bn(0), 'ipfs://res4.jpg'], [resId3, bn(1), resId, 'ipfs://res3.jpg'], ]); }); it('can get top asset by priority', async function () { - expect(await renderUtils.getTopAssetMetaForToken(equip.address, tokenId)).to.eql( + expect(await renderUtils.getTopAssetMetaForToken(await equip.getAddress(), tokenId)).to.eql( 'ipfs://res2.jpg', ); await equip.setPriority(tokenId, [0, 1]); - expect(await renderUtils.getTopAssetMetaForToken(equip.address, tokenId)).to.eql( + expect(await renderUtils.getTopAssetMetaForToken(await equip.getAddress(), tokenId)).to.eql( 'ipfs://res1.jpg', ); }); it('can get full top asset data', async function () { - expect(await renderUtils.getTopAsset(equip.address, tokenId)).to.eql([ + expect(await renderUtils.getTopAsset(await equip.getAddress(), tokenId)).to.eql([ resId2, bn(5), 'ipfs://res2.jpg', @@ -240,71 +246,69 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { }); it('cannot get active assets if token has no assets', async function () { - const otherTokenId = await mintFromMock(equip, owner.address); + const otherTokenId = await mintFromMock(equip, await owner.getAddress()); await expect( - renderUtils.getExtendedActiveAssets(equip.address, otherTokenId), + renderUtils.getExtendedActiveAssets(await equip.getAddress(), otherTokenId), ).to.be.revertedWithCustomError(renderUtils, 'RMRKTokenHasNoAssets'); await expect( - renderUtilsEquip.getExtendedEquippableActiveAssets(equip.address, otherTokenId), + renderUtilsEquip.getExtendedEquippableActiveAssets(await equip.getAddress(), otherTokenId), ).to.be.revertedWithCustomError(renderUtils, 'RMRKTokenHasNoAssets'); }); it('cannot get pending assets if token has no assets', async function () { - const otherTokenId = await mintFromMock(equip, owner.address); + const otherTokenId = await mintFromMock(equip, await owner.getAddress()); await expect( - renderUtils.getPendingAssets(equip.address, otherTokenId), + renderUtils.getPendingAssets(await equip.getAddress(), otherTokenId), ).to.be.revertedWithCustomError(renderUtils, 'RMRKTokenHasNoAssets'); await expect( - renderUtilsEquip.getExtendedPendingAssets(equip.address, otherTokenId), + renderUtilsEquip.getExtendedPendingAssets(await equip.getAddress(), otherTokenId), ).to.be.revertedWithCustomError(renderUtils, 'RMRKTokenHasNoAssets'); }); it('cannot get top asset if token has no assets', async function () { - const otherTokenId = await mintFromMock(equip, owner.address); + const otherTokenId = await mintFromMock(equip, await owner.getAddress()); await expect( - renderUtils.getTopAssetMetaForToken(equip.address, otherTokenId), + renderUtils.getTopAssetMetaForToken(await equip.getAddress(), otherTokenId), ).to.be.revertedWithCustomError(renderUtils, 'RMRKTokenHasNoAssets'); }); }); describe('Render Utils Nestable', async function () { - let parentId: BigNumber; - let childId1: BigNumber; - let childId2: BigNumber; + let parentId: bigint; + let childId1: bigint; + let childId2: bigint; beforeEach(async function () { - parentId = await mintFromMock(equip, owner.address); - childId1 = await nestMintFromMock(equip, equip.address, parentId); - childId2 = await nestMintFromMock(equip, equip.address, parentId); - await equip.acceptChild(parentId, 0, equip.address, childId1); - await equip.acceptChild(parentId, 0, equip.address, childId2); + parentId = await mintFromMock(equip, await owner.getAddress()); + childId1 = await nestMintFromMock(equip, await equip.getAddress(), parentId); + childId2 = await nestMintFromMock(equip, await equip.getAddress(), parentId); + await equip.acceptChild(parentId, 0, await equip.getAddress(), childId1); + await equip.acceptChild(parentId, 0, await equip.getAddress(), childId2); }); it('can get total descendants', async function () { - expect(await renderUtilsNestable.getTotalDescendants(equip.address, parentId)).to.eql([ - bn(2), - false, - ]); + expect( + await renderUtilsNestable.getTotalDescendants(await equip.getAddress(), parentId), + ).to.eql([bn(2), false]); - const grandChildId = await nestMintFromMock(equip, equip.address, childId1); - await equip.acceptChild(childId1, 0, equip.address, grandChildId); + const grandChildId = await nestMintFromMock(equip, await equip.getAddress(), childId1); + await equip.acceptChild(childId1, 0, await equip.getAddress(), grandChildId); - expect(await renderUtilsNestable.getTotalDescendants(equip.address, parentId)).to.eql([ - bn(3), - true, - ]); + expect( + await renderUtilsNestable.getTotalDescendants(await equip.getAddress(), parentId), + ).to.eql([bn(3), true]); }); it('can tell if a token has multiple levels of nesting', async function () { expect( - await renderUtilsNestable.hasMoreThanOneLevelOfNesting(equip.address, parentId), + await renderUtilsNestable.hasMoreThanOneLevelOfNesting(await equip.getAddress(), parentId), ).to.eql(false); - const grandChildId = await nestMintFromMock(equip, equip.address, childId1); - await equip.acceptChild(childId1, 0, equip.address, grandChildId); + const grandChildId = await nestMintFromMock(equip, await equip.getAddress(), childId1); + await equip.acceptChild(childId1, 0, await equip.getAddress(), grandChildId); expect( - await renderUtilsNestable.hasMoreThanOneLevelOfNesting(equip.address, parentId), + await renderUtilsNestable.hasMoreThanOneLevelOfNesting(await equip.getAddress(), parentId), ).to.eql(true); }); }); @@ -312,29 +316,48 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { describe('Render Utils Equip', async function () { it('can get active assets', async function () { expect( - await renderUtilsEquip.getExtendedEquippableActiveAssets(equip.address, tokenId), + await renderUtilsEquip.getExtendedEquippableActiveAssets(await equip.getAddress(), tokenId), ).to.eql([ [resId, bn(0), bn(10), ADDRESS_ZERO, 'ipfs://res1.jpg', []], - [resId2, bn(1), bn(5), catalog.address, 'ipfs://res2.jpg', [bn(1), bn(3), bn(4)]], + [ + resId2, + bn(1), + bn(5), + await catalog.getAddress(), + 'ipfs://res2.jpg', + [bn(1), bn(3), bn(4)], + ], ]); }); it('can get pending assets', async function () { - expect(await renderUtilsEquip.getExtendedPendingAssets(equip.address, tokenId)).to.eql([ - [resId4, bn(2), bn(0), bn(0), catalog.address, 'ipfs://res4.jpg', [bn(4)]], + expect( + await renderUtilsEquip.getExtendedPendingAssets(await equip.getAddress(), tokenId), + ).to.eql([ + [resId4, bn(2), bn(0), bn(0), await catalog.getAddress(), 'ipfs://res4.jpg', [bn(4)]], [resId3, bn(0), bn(1), resId, ADDRESS_ZERO, 'ipfs://res3.jpg', []], ]); }); it('can get top equippable data for asset by priority', async function () { expect( - await renderUtilsEquip.getTopAssetAndEquippableDataForToken(equip.address, tokenId), - ).to.eql([resId2, bn(1), bn(5), catalog.address, 'ipfs://res2.jpg', [bn(1), bn(3), bn(4)]]); + await renderUtilsEquip.getTopAssetAndEquippableDataForToken( + await equip.getAddress(), + tokenId, + ), + ).to.eql([ + resId2, + bn(1), + bn(5), + await catalog.getAddress(), + 'ipfs://res2.jpg', + [bn(1), bn(3), bn(4)], + ]); }); it('cannot get equippable slots from parent if parent is not an NFT', async function () { await expect( - renderUtilsEquip.getEquippableSlotsFromParent(equip.address, tokenId, 1), + renderUtilsEquip.getEquippableSlotsFromParent(await equip.getAddress(), tokenId, 1), ).to.be.revertedWithCustomError(renderUtilsEquip, 'RMRKParentIsNotNFT'); }); }); @@ -346,10 +369,10 @@ describe('Advanced Equip Render Utils', async function () { let kanaria: RMRKEquippableMock; let gem: RMRKEquippableMock; let renderUtilsEquip: RMRKEquipRenderUtils; - let kanariaId: BigNumber; - let gemId1: BigNumber; - let gemId2: BigNumber; - let gemId3: BigNumber; + let kanariaId: bigint; + let gemId1: bigint; + let gemId2: bigint; + let gemId3: bigint; beforeEach(async function () { ({ catalog, kanaria, gem, renderUtilsEquip } = await loadFixture( @@ -357,19 +380,26 @@ describe('Advanced Equip Render Utils', async function () { )); [owner] = await ethers.getSigners(); - kanariaId = await mintFromMock(kanaria, owner.address); - gemId1 = await nestMintFromMock(gem, kanaria.address, kanariaId); - gemId2 = await nestMintFromMock(gem, kanaria.address, kanariaId); - gemId3 = await nestMintFromMock(gem, kanaria.address, kanariaId); - await kanaria.acceptChild(kanariaId, 0, gem.address, gemId1); - await kanaria.acceptChild(kanariaId, 1, gem.address, gemId2); - await kanaria.acceptChild(kanariaId, 0, gem.address, gemId3); + kanariaId = await mintFromMock(kanaria, await owner.getAddress()); + gemId1 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + gemId2 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + gemId3 = await nestMintFromMock(gem, await kanaria.getAddress(), kanariaId); + await kanaria.acceptChild(kanariaId, 0, await gem.getAddress(), gemId1); + await kanaria.acceptChild(kanariaId, 1, await gem.getAddress(), gemId2); + await kanaria.acceptChild(kanariaId, 0, await gem.getAddress(), gemId3); }); it('can get equipped children from parent', async function () { - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); await kanaria.equip({ tokenId: kanariaId, @@ -386,17 +416,28 @@ describe('Advanced Equip Render Utils', async function () { childAssetId: assetForGemAMid, }); expect( - await renderUtilsEquip.equippedChildrenOf(kanaria.address, kanariaId, assetForKanariaFull), + await renderUtilsEquip.equippedChildrenOf( + await kanaria.getAddress(), + kanariaId, + assetForKanariaFull, + ), ).to.eql([ - [bn(assetForKanariaFull), bn(assetForGemALeft), gemId1, gem.address], - [bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, gem.address], + [bn(assetForKanariaFull), bn(assetForGemALeft), gemId1, await gem.getAddress()], + [bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()], ]); }); it('can get equippable slots from parent', async function () { - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); await kanaria.equip({ tokenId: kanariaId, @@ -421,7 +462,11 @@ describe('Advanced Equip Render Utils', async function () { }); expect( - await renderUtilsEquip.getEquippableSlotsFromParent(gem.address, gemId1, assetForKanariaFull), + await renderUtilsEquip.getEquippableSlotsFromParent( + await gem.getAddress(), + gemId1, + assetForKanariaFull, + ), ).to.eql([ bn(0), // child Index [ @@ -431,7 +476,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemARight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeA/right.svg', @@ -442,7 +487,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemAMid), bn(assetForKanariaFull), bn(1), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemMid', 'ipfs://gems/typeA/mid.svg', @@ -453,7 +498,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemALeft), bn(assetForKanariaFull), bn(2), - catalog.address, + await catalog.getAddress(), true, 'ipfs://metadataSlotGemLeft', 'ipfs://gems/typeA/left.svg', @@ -462,7 +507,11 @@ describe('Advanced Equip Render Utils', async function () { ], ]); expect( - await renderUtilsEquip.getEquippableSlotsFromParent(gem.address, gemId2, assetForKanariaFull), + await renderUtilsEquip.getEquippableSlotsFromParent( + await gem.getAddress(), + gemId2, + assetForKanariaFull, + ), ).to.eql([ bn(1), // child Index [ @@ -472,7 +521,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemARight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeA/right.svg', @@ -483,7 +532,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemAMid), bn(assetForKanariaFull), bn(1), - catalog.address, + await catalog.getAddress(), true, 'ipfs://metadataSlotGemMid', 'ipfs://gems/typeA/mid.svg', @@ -494,7 +543,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemALeft), bn(assetForKanariaFull), bn(2), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemLeft', 'ipfs://gems/typeA/left.svg', @@ -504,7 +553,7 @@ describe('Advanced Equip Render Utils', async function () { ]); // Here we test with the more generic function which checks for all parent's assets expect( - await renderUtilsEquip.getAllEquippableSlotsFromParent(gem.address, gemId3, false), + await renderUtilsEquip.getAllEquippableSlotsFromParent(await gem.getAddress(), gemId3, false), ).to.eql([ bn(2), // child Index [ @@ -514,7 +563,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBRight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), true, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeB/right.svg', @@ -525,7 +574,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBMid), bn(assetForKanariaFull), bn(1), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemMid', 'ipfs://gems/typeB/mid.svg', @@ -536,7 +585,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBLeft), bn(assetForKanariaFull), bn(2), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemLeft', 'ipfs://gems/typeB/left.svg', @@ -547,7 +596,7 @@ describe('Advanced Equip Render Utils', async function () { // Again the more generic function which checks for all parent's assets, but this time filtering for only equipped results expect( - await renderUtilsEquip.getAllEquippableSlotsFromParent(gem.address, gemId3, true), + await renderUtilsEquip.getAllEquippableSlotsFromParent(await gem.getAddress(), gemId3, true), ).to.eql([ bn(2), // child Index [ @@ -557,7 +606,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBRight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), true, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeB/right.svg', @@ -568,23 +617,36 @@ describe('Advanced Equip Render Utils', async function () { }); it('can get children with top metadata', async function () { - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); // Gem assets are accepted in this order: right, mid, left, full await gem.setPriority(gemId1, [3, 2, 0, 1]); // Make left await gem.setPriority(gemId2, [3, 2, 1, 0]); // Make full the highest priority // We leave gemId3 as is, so it will be right - expect(await renderUtilsEquip.getChildrenWithTopMetadata(kanaria.address, kanariaId)).to.eql([ - [gem.address, BigNumber.from(gemId1), 'ipfs://gems/typeA/left.svg'], - [gem.address, BigNumber.from(gemId2), 'ipfs://gems/typeA/full.svg'], - [gem.address, BigNumber.from(gemId3), 'ipfs://gems/typeB/right.svg'], + expect( + await renderUtilsEquip.getChildrenWithTopMetadata(await kanaria.getAddress(), kanariaId), + ).to.eql([ + [await gem.getAddress(), BigInt(gemId1), 'ipfs://gems/typeA/left.svg'], + [await gem.getAddress(), BigInt(gemId2), 'ipfs://gems/typeA/full.svg'], + [await gem.getAddress(), BigInt(gemId3), 'ipfs://gems/typeB/right.svg'], ]); expect( - await renderUtilsEquip.getTopAssetMetadataForTokens(gem.address, [gemId1, gemId2, gemId3]), + await renderUtilsEquip.getTopAssetMetadataForTokens(await gem.getAddress(), [ + gemId1, + gemId2, + gemId3, + ]), ).to.eql([ 'ipfs://gems/typeA/left.svg', 'ipfs://gems/typeA/full.svg', @@ -593,21 +655,48 @@ describe('Advanced Equip Render Utils', async function () { }); it('can get equippable slots from parent for pending child', async function () { - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); // Transfer a gem out and then back so it becomes pending - await kanaria.transferChild(kanariaId, owner.address, 0, 2, gem.address, gemId3, false, '0x'); - await gem.nestTransferFrom(owner.address, kanaria.address, gemId3, kanariaId, '0x'); + await kanaria.transferChild( + kanariaId, + await owner.getAddress(), + 0, + 2, + await gem.getAddress(), + gemId3, + false, + '0x', + ); + await gem.nestTransferFrom( + await owner.getAddress(), + await kanaria.getAddress(), + gemId3, + kanariaId, + '0x', + ); expect( - await renderUtilsEquip.getPendingChildIndex(kanaria.address, kanariaId, gem.address, gemId3), - ).to.eql(BigNumber.from(0)); + await renderUtilsEquip.getPendingChildIndex( + await kanaria.getAddress(), + kanariaId, + await gem.getAddress(), + gemId3, + ), + ).to.eql(0n); expect( await renderUtilsEquip.getEquippableSlotsFromParentForPendingChild( - gem.address, + await gem.getAddress(), gemId3, assetForKanariaFull, ), @@ -620,7 +709,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBRight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeB/right.svg', @@ -631,7 +720,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBMid), bn(assetForKanariaFull), bn(1), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemMid', 'ipfs://gems/typeB/mid.svg', @@ -642,7 +731,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBLeft), bn(assetForKanariaFull), bn(2), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemLeft', 'ipfs://gems/typeB/left.svg', @@ -653,21 +742,28 @@ describe('Advanced Equip Render Utils', async function () { }); it('can get equippable slots from parent asset even if catalog does not match', async function () { - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); const catalogFactory = await ethers.getContractFactory('RMRKCatalogImpl'); const otherCatalog = ( await catalogFactory.deploy('ipfs://catalog.json', 'misc') ); - await otherCatalog.deployed(); + await otherCatalog.waitForDeployment(); const newResourceId = bn(99); await gem.addEquippableAssetEntry( newResourceId, 1, - otherCatalog.address, + await otherCatalog.getAddress(), 'ipfs://assetFromOtherCatalog.jpg', [], ); @@ -675,7 +771,11 @@ describe('Advanced Equip Render Utils', async function () { await gem.acceptAsset(gemId3, 0, newResourceId); expect( - await renderUtilsEquip.getEquippableSlotsFromParent(gem.address, gemId3, assetForKanariaFull), + await renderUtilsEquip.getEquippableSlotsFromParent( + await gem.getAddress(), + gemId3, + assetForKanariaFull, + ), ).to.eql([ bn(2), // child Index [ @@ -685,7 +785,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBRight), bn(assetForKanariaFull), bn(0), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', 'ipfs://gems/typeB/right.svg', @@ -696,7 +796,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBMid), bn(assetForKanariaFull), bn(1), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemMid', 'ipfs://gems/typeB/mid.svg', @@ -707,7 +807,7 @@ describe('Advanced Equip Render Utils', async function () { bn(assetForGemBLeft), bn(assetForKanariaFull), bn(2), - catalog.address, + await catalog.getAddress(), false, 'ipfs://metadataSlotGemLeft', 'ipfs://gems/typeB/left.svg', @@ -718,7 +818,7 @@ describe('Advanced Equip Render Utils', async function () { newResourceId, bn(assetForKanariaFull), bn(4), - catalog.address, // This is the catalog address of the parent, not the child + await catalog.getAddress(), // This is the catalog address of the parent, not the child false, 'ipfs://metadataSlotGemLeft', 'ipfs://assetFromOtherCatalog.jpg', @@ -730,9 +830,16 @@ describe('Advanced Equip Render Utils', async function () { it('cannot get equippable slots from parent if the asset id is not composable', async function () { const assetForKanariaNotEquippable = 10; - await setUpCatalog(catalog, gem.address); - await setUpKanariaAsset(kanaria, kanariaId, catalog.address); - await setUpGemAssets(gem, gemId1, gemId2, gemId3, kanaria.address, catalog.address); + await setUpCatalog(catalog, await gem.getAddress()); + await setUpKanariaAsset(kanaria, kanariaId, await catalog.getAddress()); + await setUpGemAssets( + gem, + gemId1, + gemId2, + gemId3, + await kanaria.getAddress(), + await catalog.getAddress(), + ); await kanaria.addEquippableAssetEntry( assetForKanariaNotEquippable, @@ -745,7 +852,7 @@ describe('Advanced Equip Render Utils', async function () { await kanaria.acceptAsset(kanariaId, 0, assetForKanariaNotEquippable); await expect( renderUtilsEquip.getEquippableSlotsFromParent( - gem.address, + await gem.getAddress(), gemId1, assetForKanariaNotEquippable, ), @@ -755,17 +862,17 @@ describe('Advanced Equip Render Utils', async function () { it('fails checking expected parent if parent is not the expected one', async function () { await expect( renderUtilsEquip.checkExpectedParent( - gem.address, + await gem.getAddress(), gemId1, - gem.address, // Wrong parent address + await gem.getAddress(), // Wrong parent address kanariaId, ), ).to.be.revertedWithCustomError(renderUtilsEquip, 'RMRKUnexpectedParent'); await expect( renderUtilsEquip.checkExpectedParent( - gem.address, + await gem.getAddress(), gemId1, - kanaria.address, + await kanaria.getAddress(), 2, // Wrong parent id ), ).to.be.revertedWithCustomError(renderUtilsEquip, 'RMRKUnexpectedParent'); @@ -773,7 +880,12 @@ describe('Advanced Equip Render Utils', async function () { it('succeeds checking expected parent if parent is the expected one', async function () { await expect( - renderUtilsEquip.checkExpectedParent(gem.address, gemId1, kanaria.address, kanariaId), + renderUtilsEquip.checkExpectedParent( + await gem.getAddress(), + gemId1, + await kanaria.getAddress(), + kanariaId, + ), ).to.not.be.reverted; }); }); @@ -799,7 +911,7 @@ describe('Extended NFT render utils', function () { }); it('renders correct data for MultiAsset', async function () { - const tokenId = await mintFromMockPremint(multiAsset, rootOwner.address); + const tokenId = await mintFromMockPremint(multiAsset, await rootOwner.getAddress()); await multiAsset.addAssetEntry(metaURI); await multiAsset.addAssetEntry(metaURI); await multiAsset.addAssetEntry(metaURI); @@ -811,17 +923,17 @@ describe('Extended NFT render utils', function () { await multiAsset.connect(rootOwner).acceptAsset(tokenId, 0, 2); await multiAsset.connect(rootOwner).setPriority(tokenId, [10, 42]); - const data = await renderUtils.getExtendedNft(tokenId, multiAsset.address); + const data = await renderUtils.getExtendedNft(tokenId, await multiAsset.getAddress()); expect(data.tokenMetadataUri).to.eql('ipfs://tokenURI'); - expect(data.directOwner).to.eql(rootOwner.address); - expect(data.rootOwner).to.eql(rootOwner.address); + expect(data.directOwner).to.eql(await rootOwner.getAddress()); + expect(data.rootOwner).to.eql(await rootOwner.getAddress()); expect(data.activeAssetCount).to.eql(bn(2)); expect(data.pendingAssetCount).to.eql(bn(2)); expect(data.priorities).to.eql([bn(10), bn(42)]); expect(data.maxSupply).to.eql(bn(10000)); expect(data.totalSupply).to.eql(bn(1)); - expect(data.issuer).to.eql(issuer.address); + expect(data.issuer).to.eql(await issuer.getAddress()); expect(data.name).to.eql('MultiAsset'); expect(data.symbol).to.eql('MA'); expect(data.activeChildrenNumber).to.eql(bn(0)); @@ -833,40 +945,46 @@ describe('Extended NFT render utils', function () { }); it('renders correct data for soulbound Nestable', async function () { - const tokenId = await mintFromMockPremint(nestableMultiAssetSoulbound, rootOwner.address); + const tokenId = await mintFromMockPremint( + nestableMultiAssetSoulbound, + await rootOwner.getAddress(), + ); const child1 = await nestMintFromMockPreMint( nestableMultiAssetSoulbound, - nestableMultiAssetSoulbound.address, + await nestableMultiAssetSoulbound.getAddress(), tokenId, ); await nestMintFromMockPreMint( nestableMultiAssetSoulbound, - nestableMultiAssetSoulbound.address, + await nestableMultiAssetSoulbound.getAddress(), tokenId, ); const child3 = await nestMintFromMockPreMint( nestableMultiAssetSoulbound, - nestableMultiAssetSoulbound.address, + await nestableMultiAssetSoulbound.getAddress(), tokenId, ); await nestableMultiAssetSoulbound .connect(rootOwner) - .acceptChild(tokenId, 0, nestableMultiAssetSoulbound.address, child1); + .acceptChild(tokenId, 0, await nestableMultiAssetSoulbound.getAddress(), child1); await nestableMultiAssetSoulbound .connect(rootOwner) - .acceptChild(tokenId, 0, nestableMultiAssetSoulbound.address, child3); + .acceptChild(tokenId, 0, await nestableMultiAssetSoulbound.getAddress(), child3); - const data = await renderUtils.getExtendedNft(tokenId, nestableMultiAssetSoulbound.address); + const data = await renderUtils.getExtendedNft( + tokenId, + await nestableMultiAssetSoulbound.getAddress(), + ); expect(data.tokenMetadataUri).to.eql('ipfs://tokenURI'); - expect(data.directOwner).to.eql(rootOwner.address); - expect(data.rootOwner).to.eql(rootOwner.address); + expect(data.directOwner).to.eql(await rootOwner.getAddress()); + expect(data.rootOwner).to.eql(await rootOwner.getAddress()); expect(data.activeAssetCount).to.eql(bn(0)); expect(data.pendingAssetCount).to.eql(bn(0)); expect(data.priorities).to.eql([]); expect(data.maxSupply).to.eql(bn(10000)); expect(data.totalSupply).to.eql(bn(4)); - expect(data.issuer).to.eql(issuer.address); + expect(data.issuer).to.eql(await issuer.getAddress()); expect(data.name).to.eql('NestableMultiAssetSoulbound'); expect(data.symbol).to.eql('NMAS'); expect(data.activeChildrenNumber).to.eql(bn(2)); @@ -878,8 +996,8 @@ describe('Extended NFT render utils', function () { }); it('renders correct data for Nestable with MultiAsset', async function () { - const parentId = await mintFromMockPremint(nestableMultiAsset, rootOwner.address); - const tokenId = await mintFromMockPremint(nestableMultiAsset, rootOwner.address); + const parentId = await mintFromMockPremint(nestableMultiAsset, await rootOwner.getAddress()); + const tokenId = await mintFromMockPremint(nestableMultiAsset, await rootOwner.getAddress()); await nestableMultiAsset.addAssetEntry(metaURI); await nestableMultiAsset.addAssetEntry(metaURI); await nestableMultiAsset.addAssetEntry(metaURI); @@ -892,39 +1010,49 @@ describe('Extended NFT render utils', function () { await nestableMultiAsset.connect(rootOwner).setPriority(tokenId, [10, 42]); const child1 = await nestMintFromMockPreMint( nestableMultiAsset, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), + tokenId, + ); + await nestMintFromMockPreMint( + nestableMultiAsset, + await nestableMultiAsset.getAddress(), tokenId, ); - await nestMintFromMockPreMint(nestableMultiAsset, nestableMultiAsset.address, tokenId); const child3 = await nestMintFromMockPreMint( nestableMultiAsset, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), tokenId, ); await nestableMultiAsset .connect(rootOwner) - .acceptChild(tokenId, 0, nestableMultiAsset.address, child1); + .acceptChild(tokenId, 0, await nestableMultiAsset.getAddress(), child1); await nestableMultiAsset .connect(rootOwner) - .acceptChild(tokenId, 0, nestableMultiAsset.address, child3); + .acceptChild(tokenId, 0, await nestableMultiAsset.getAddress(), child3); await nestableMultiAsset .connect(rootOwner) - .nestTransferFrom(rootOwner.address, nestableMultiAsset.address, tokenId, parentId, '0x'); + .nestTransferFrom( + await rootOwner.getAddress(), + await nestableMultiAsset.getAddress(), + tokenId, + parentId, + '0x', + ); await nestableMultiAsset .connect(rootOwner) - .acceptChild(parentId, 0, nestableMultiAsset.address, tokenId); + .acceptChild(parentId, 0, await nestableMultiAsset.getAddress(), tokenId); - const data = await renderUtils.getExtendedNft(tokenId, nestableMultiAsset.address); + const data = await renderUtils.getExtendedNft(tokenId, await nestableMultiAsset.getAddress()); expect(data.tokenMetadataUri).to.eql('ipfs://tokenURI'); - expect(data.directOwner).to.eql(nestableMultiAsset.address); - expect(data.rootOwner).to.eql(rootOwner.address); + expect(data.directOwner).to.eql(await nestableMultiAsset.getAddress()); + expect(data.rootOwner).to.eql(await rootOwner.getAddress()); expect(data.activeAssetCount).to.eql(bn(2)); expect(data.pendingAssetCount).to.eql(bn(2)); expect(data.priorities).to.eql([bn(10), bn(42)]); expect(data.maxSupply).to.eql(bn(10000)); expect(data.totalSupply).to.eql(bn(5)); - expect(data.issuer).to.eql(issuer.address); + expect(data.issuer).to.eql(await issuer.getAddress()); expect(data.name).to.eql('NestableMultiAsset'); expect(data.symbol).to.eql('NMA'); expect(data.activeChildrenNumber).to.eql(bn(2)); @@ -936,39 +1064,50 @@ describe('Extended NFT render utils', function () { }); it('renders correct data for Equippable', async function () { - const parentId = await mintFromMockPremint(equip, rootOwner.address); - const tokenId = await mintFromMockPremint(equip, rootOwner.address); + const parentId = await mintFromMockPremint(equip, await rootOwner.getAddress()); + const tokenId = await mintFromMockPremint(equip, await rootOwner.getAddress()); await equip.addEquippableAssetEntry(0, ADDRESS_ZERO, 'ipfs://res1.jpg', []); - await equip.addEquippableAssetEntry(1, catalog.address, 'ipfs://res2.jpg', [1, 3, 4]); + await equip.addEquippableAssetEntry( + 1, + await catalog.getAddress(), + 'ipfs://res2.jpg', + [1, 3, 4], + ); await equip.addEquippableAssetEntry(0, ADDRESS_ZERO, 'ipfs://res3.jpg', []); - await equip.addEquippableAssetEntry(2, catalog.address, 'ipfs://res4.jpg', [4]); + await equip.addEquippableAssetEntry(2, await catalog.getAddress(), 'ipfs://res4.jpg', [4]); await equip.addAssetToToken(tokenId, 1, 0); // Auto accepted await equip.addAssetToToken(tokenId, 2, 0); await equip.addAssetToToken(tokenId, 3, 1); await equip.addAssetToToken(tokenId, 4, 0); await equip.connect(rootOwner).acceptAsset(tokenId, 0, 2); await equip.connect(rootOwner).setPriority(tokenId, [10, 42]); - const child1 = await nestMintFromMockPreMint(equip, equip.address, tokenId); - await nestMintFromMockPreMint(equip, equip.address, tokenId); - const child3 = await nestMintFromMockPreMint(equip, equip.address, tokenId); - await equip.connect(rootOwner).acceptChild(tokenId, 0, equip.address, child1); - await equip.connect(rootOwner).acceptChild(tokenId, 0, equip.address, child3); + const child1 = await nestMintFromMockPreMint(equip, await equip.getAddress(), tokenId); + await nestMintFromMockPreMint(equip, await equip.getAddress(), tokenId); + const child3 = await nestMintFromMockPreMint(equip, await equip.getAddress(), tokenId); + await equip.connect(rootOwner).acceptChild(tokenId, 0, await equip.getAddress(), child1); + await equip.connect(rootOwner).acceptChild(tokenId, 0, await equip.getAddress(), child3); await equip .connect(rootOwner) - .nestTransferFrom(rootOwner.address, equip.address, tokenId, parentId, '0x'); - await equip.connect(rootOwner).acceptChild(parentId, 0, equip.address, tokenId); + .nestTransferFrom( + await rootOwner.getAddress(), + await equip.getAddress(), + tokenId, + parentId, + '0x', + ); + await equip.connect(rootOwner).acceptChild(parentId, 0, await equip.getAddress(), tokenId); - const data = await renderUtils.getExtendedNft(tokenId, equip.address); + const data = await renderUtils.getExtendedNft(tokenId, await equip.getAddress()); expect(data.tokenMetadataUri).to.eql('ipfs://tokenURI'); - expect(data.directOwner).to.eql(equip.address); - expect(data.rootOwner).to.eql(rootOwner.address); + expect(data.directOwner).to.eql(await equip.getAddress()); + expect(data.rootOwner).to.eql(await rootOwner.getAddress()); expect(data.activeAssetCount).to.eql(bn(2)); expect(data.pendingAssetCount).to.eql(bn(2)); expect(data.priorities).to.eql([bn(10), bn(42)]); expect(data.maxSupply).to.eql(bn(10000)); expect(data.totalSupply).to.eql(bn(5)); - expect(data.issuer).to.eql(issuer.address); + expect(data.issuer).to.eql(await issuer.getAddress()); expect(data.name).to.eql('Equippable'); expect(data.symbol).to.eql('EQ'); expect(data.activeChildrenNumber).to.eql(bn(2)); @@ -980,28 +1119,28 @@ describe('Extended NFT render utils', function () { }); describe('Nesting validation', function () { - let parentTokenOne: BigNumber; - let parentTokenTwo: BigNumber; - let childTokenOne: BigNumber; - let childTokenTwo: BigNumber; - let childTokenThree: BigNumber; + let parentTokenOne: bigint; + let parentTokenTwo: bigint; + let childTokenOne: bigint; + let childTokenTwo: bigint; + let childTokenThree: bigint; beforeEach(async function () { - parentTokenOne = await mintFromMockPremint(nestableMultiAsset, rootOwner.address); - parentTokenTwo = await mintFromMockPremint(nestableMultiAsset, rootOwner.address); + parentTokenOne = await mintFromMockPremint(nestableMultiAsset, await rootOwner.getAddress()); + parentTokenTwo = await mintFromMockPremint(nestableMultiAsset, await rootOwner.getAddress()); childTokenOne = await nestMintFromMockPreMint( nestableMultiAsset, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), parentTokenOne, ); childTokenTwo = await nestMintFromMockPreMint( nestableMultiAsset, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), parentTokenTwo, ); childTokenThree = await nestMintFromMockPreMint( nestableMultiAsset, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), parentTokenOne, ); }); @@ -1009,8 +1148,8 @@ describe('Extended NFT render utils', function () { it('returns true if the specified token is nested into the given parent', async function () { expect( await renderUtils.validateChildOf( - nestableMultiAsset.address, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), + await nestableMultiAsset.getAddress(), parentTokenOne, childTokenOne, ), @@ -1020,8 +1159,8 @@ describe('Extended NFT render utils', function () { it('returns false if the child does not implement IERC7401', async function () { expect( await renderUtils.validateChildOf( - nestableMultiAsset.address, - multiAsset.address, + await nestableMultiAsset.getAddress(), + await multiAsset.getAddress(), parentTokenOne, childTokenOne, ), @@ -1031,8 +1170,8 @@ describe('Extended NFT render utils', function () { it('returns false if the specified child token is not the child token of the parent token', async function () { expect( await renderUtils.validateChildOf( - nestableMultiAsset.address, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), + await nestableMultiAsset.getAddress(), parentTokenOne, childTokenTwo, ), @@ -1042,8 +1181,8 @@ describe('Extended NFT render utils', function () { it('returns true if the specified children are the child tokens of the given parent token', async function () { expect( await renderUtils.validateChildrenOf( - nestableMultiAsset.address, - [nestableMultiAsset.address, nestableMultiAsset.address], + await nestableMultiAsset.getAddress(), + [await nestableMultiAsset.getAddress(), await nestableMultiAsset.getAddress()], parentTokenOne, [childTokenOne, childTokenThree], ), @@ -1053,8 +1192,8 @@ describe('Extended NFT render utils', function () { it('does not allow to pass different length child token address and token ID arrays', async function () { await expect( renderUtils.validateChildrenOf( - nestableMultiAsset.address, - [nestableMultiAsset.address, nestableMultiAsset.address], + await nestableMultiAsset.getAddress(), + [await nestableMultiAsset.getAddress(), await nestableMultiAsset.getAddress()], parentTokenOne, [childTokenOne], ), @@ -1064,8 +1203,8 @@ describe('Extended NFT render utils', function () { it('returns false if one of the child tokens does not implement IERC7401', async function () { expect( await renderUtils.validateChildrenOf( - nestableMultiAsset.address, - [nestableMultiAsset.address, multiAsset.address], + await nestableMultiAsset.getAddress(), + [await nestableMultiAsset.getAddress(), await multiAsset.getAddress()], parentTokenOne, [childTokenOne, childTokenTwo], ), @@ -1075,8 +1214,12 @@ describe('Extended NFT render utils', function () { it('returns false if any of the given tokens is not owned by the specified parent token', async function () { expect( await renderUtils.validateChildrenOf( - nestableMultiAsset.address, - [nestableMultiAsset.address, nestableMultiAsset.address, nestableMultiAsset.address], + await nestableMultiAsset.getAddress(), + [ + await nestableMultiAsset.getAddress(), + await nestableMultiAsset.getAddress(), + await nestableMultiAsset.getAddress(), + ], parentTokenOne, [childTokenOne, childTokenTwo, childTokenThree], ), @@ -1086,55 +1229,67 @@ describe('Extended NFT render utils', function () { it('can get directOwnerOf with parents perspective', async function () { expect( await renderUtils.directOwnerOfWithParentsPerspective( - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), parentTokenOne, ), - ).to.eql([rootOwner.address, ethers.BigNumber.from(0), false, false, false]); + ).to.eql([await rootOwner.getAddress(), ethers.BigInt(0), false, false, false]); }); it('can identify rejected children', async function () { expect( - await renderUtils.isTokenRejectedOrAbandoned(nestableMultiAsset.address, childTokenOne), + await renderUtils.isTokenRejectedOrAbandoned( + await nestableMultiAsset.getAddress(), + childTokenOne, + ), ).to.be.false; await nestableMultiAsset .connect(rootOwner) .transferChild( parentTokenOne, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, 0, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), childTokenOne, true, '0x', ); expect( - await renderUtils.isTokenRejectedOrAbandoned(nestableMultiAsset.address, childTokenOne), + await renderUtils.isTokenRejectedOrAbandoned( + await nestableMultiAsset.getAddress(), + childTokenOne, + ), ).to.be.true; }); it('can identify abandoned children', async function () { await nestableMultiAsset .connect(rootOwner) - .acceptChild(parentTokenOne, 0, nestableMultiAsset.address, childTokenOne); + .acceptChild(parentTokenOne, 0, await nestableMultiAsset.getAddress(), childTokenOne); expect( - await renderUtils.isTokenRejectedOrAbandoned(nestableMultiAsset.address, childTokenOne), + await renderUtils.isTokenRejectedOrAbandoned( + await nestableMultiAsset.getAddress(), + childTokenOne, + ), ).to.be.false; await nestableMultiAsset .connect(rootOwner) .transferChild( parentTokenOne, - ethers.constants.AddressZero, + ethers.ZeroAddress, 0, 0, - nestableMultiAsset.address, + await nestableMultiAsset.getAddress(), childTokenOne, false, '0x', ); expect( - await renderUtils.isTokenRejectedOrAbandoned(nestableMultiAsset.address, childTokenOne), + await renderUtils.isTokenRejectedOrAbandoned( + await nestableMultiAsset.getAddress(), + childTokenOne, + ), ).to.be.true; }); }); diff --git a/test/royaltiesSplitter.ts b/test/royaltiesSplitter.ts index 73b92d49..f59c3b72 100644 --- a/test/royaltiesSplitter.ts +++ b/test/royaltiesSplitter.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKRoyaltiesSplitter } from '../typechain-types'; describe('RMRKRoyaltiesSplitter', () => { @@ -20,59 +20,69 @@ describe('RMRKRoyaltiesSplitter', () => { const royaltiesSplitterFactory = await ethers.getContractFactory('RMRKRoyaltiesSplitter'); royaltiesSplitter = await royaltiesSplitterFactory.deploy( - beneficiaries.map((b) => b.address), + beneficiaries.map(async (b) => await b.getAddress()), SHARES_BPS, ); - await royaltiesSplitter.deployed(); + await royaltiesSplitter.waitForDeployment(); }); it('can get beneficiaries and shares', async () => { expect(await royaltiesSplitter.getBenefiariesAndShares()).to.deep.equal([ - beneficiaries.map((b) => b.address), + beneficiaries.map(async (b) => await b.getAddress()), SHARES_BPS, ]); }); it('should distribute native payment correctly', async () => { - const amount = ethers.utils.parseEther('1'); - await expect(() => sender.sendTransaction({ to: royaltiesSplitter.address, value: amount })) + const amount = ethers.parseEther('1'); + await expect(async () => + sender.sendTransaction({ to: await royaltiesSplitter.getAddress(), value: amount }), + ) + .to.changeEtherBalance(beneficiary1, (amount * 2500n) / 10000n) + .and.changeEtherBalance(beneficiary2, (amount * 2500n) / 10000n) + .and.changeEtherBalance(beneficiary3, (amount * 5000n) / 10000n) .to.emit(royaltiesSplitter, 'NativePaymentDistributed') - .withArgs(sender.address, amount) - .to.changeEtherBalance(beneficiary1, amount.mul(2500).div(10000)) - .and.changeEtherBalance(beneficiary2, amount.mul(2500).div(10000)) - .and.changeEtherBalance(beneficiary3, amount.mul(5000).div(10000)); + .withArgs(await sender.getAddress(), amount); }); it('should distribute ERC20 payment correctly', async () => { const erc20MockFactory = await ethers.getContractFactory('ERC20Mock'); const erc20Token = await erc20MockFactory.deploy(); - await erc20Token.deployed(); + await erc20Token.waitForDeployment(); - const amount = ethers.utils.parseUnits('100', 18); - await erc20Token.mint(sender.address, amount); - await erc20Token.connect(sender).transfer(royaltiesSplitter.address, amount); + const amount = ethers.parseUnits('100', 18); + await erc20Token.mint(await sender.getAddress(), amount); + await erc20Token.connect(sender).transfer(await royaltiesSplitter.getAddress(), amount); expect( - await royaltiesSplitter.connect(beneficiary2).distributeERC20(erc20Token.address, amount), + await royaltiesSplitter + .connect(beneficiary2) + .distributeERC20(await erc20Token.getAddress(), amount), ) .to.emit(royaltiesSplitter, 'ERCPaymentDistributed') - .withArgs(sender.address, erc20Token.address, amount); - expect(await erc20Token.balanceOf(beneficiary1.address)).to.equal(amount.mul(2500).div(10000)); - expect(await erc20Token.balanceOf(beneficiary2.address)).to.equal(amount.mul(2500).div(10000)); - expect(await erc20Token.balanceOf(beneficiary3.address)).to.equal(amount.mul(5000).div(10000)); + .withArgs(await sender.getAddress(), await erc20Token.getAddress(), amount); + expect(await erc20Token.balanceOf(await beneficiary1.getAddress())).to.equal( + (amount * 2500n) / 10000n, + ); + expect(await erc20Token.balanceOf(await beneficiary2.getAddress())).to.equal( + (amount * 2500n) / 10000n, + ); + expect(await erc20Token.balanceOf(await beneficiary3.getAddress())).to.equal( + (amount * 5000n) / 10000n, + ); }); it('cannot distribute ERC20 if not beneficary', async () => { const erc20MockFactory = await ethers.getContractFactory('ERC20Mock'); const erc20Token = await erc20MockFactory.deploy(); - await erc20Token.deployed(); + await erc20Token.waitForDeployment(); - const amount = ethers.utils.parseUnits('100', 18); - await erc20Token.mint(sender.address, amount); - await erc20Token.connect(sender).transfer(royaltiesSplitter.address, amount); + const amount = ethers.parseUnits('100', 18); + await erc20Token.mint(await sender.getAddress(), amount); + await erc20Token.connect(sender).transfer(await royaltiesSplitter.getAddress(), amount); await expect( - royaltiesSplitter.connect(sender).distributeERC20(erc20Token.address, amount), + royaltiesSplitter.connect(sender).distributeERC20(await erc20Token.getAddress(), amount), ).to.be.revertedWithCustomError(royaltiesSplitter, 'OnlyBeneficiary'); }); @@ -81,28 +91,28 @@ describe('RMRKRoyaltiesSplitter', () => { // Missmatch in length await expect( royaltiesSplitterFactory.deploy( - beneficiaries.map((b) => b.address), + beneficiaries.map(async (b) => await b.getAddress()), SHARES_BPS.slice(0, 2), ), ).to.be.reverted; // Missmatch in length await expect( royaltiesSplitterFactory.deploy( - beneficiaries.slice(0, 2).map((b) => b.address), + beneficiaries.slice(0, 2).map(async (b) => await b.getAddress()), SHARES_BPS, ), ).to.be.reverted; // Shares below 10000 await expect( royaltiesSplitterFactory.deploy( - beneficiaries.map((b) => b.address), + beneficiaries.map(async (b) => await b.getAddress()), [2500, 2500, 2500], ), ).to.be.reverted; // Shares over 10000 await expect( royaltiesSplitterFactory.deploy( - beneficiaries.map((b) => b.address), + beneficiaries.map(async (b) => await b.getAddress()), [2500, 2500, 5001], ), ).to.be.reverted; diff --git a/test/setup/equippableParts.ts b/test/setup/equippableParts.ts index f8b00567..0d927be1 100644 --- a/test/setup/equippableParts.ts +++ b/test/setup/equippableParts.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat'; -import { BigNumber, Contract } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; let addrs: SignerWithAddress[]; @@ -33,8 +33,8 @@ const partIdForMask = 25; const uniqueNeons = 10; const uniqueMasks = 4; // Ids could be the same since they are different collections, but to avoid log problems we have them unique -const neons: BigNumber[] = []; -const masks: BigNumber[] = []; +const neons: bigint[] = []; +const masks: bigint[] = []; const neonResIds = [100, 101, 102, 103, 104]; const maskAssetsFull = [1, 2, 3, 4]; // Must match the total of uniqueAssets @@ -51,8 +51,8 @@ async function setupContextForParts( catalog: Contract, neon: Contract, mask: Contract, - mint: (token: Contract, to: string) => Promise, - nestMint: (token: Contract, to: string, parentId: BigNumber) => Promise, + mint: (token: Contract, to: string) => Promise, + nestMint: (token: Contract, to: string, parentId: bigint) => Promise, ) { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; @@ -213,7 +213,7 @@ async function setupContextForParts( const partForMask = { itemType: ItemType.Slot, z: 2, - equippable: [mask.address], + equippable: [await mask.getAddress()], metadataURI: '', }; @@ -261,43 +261,48 @@ async function setupContextForParts( masks.length = 0; // Mint one weapon to neon for (let i = 0; i < uniqueNeons; i++) { - const newId = await nestMint(mask, neon.address, neons[i]); + const newId = await nestMint(mask, await neon.getAddress(), neons[i]); masks.push(newId); - await neon.connect(addrs[i % 3]).acceptChild(neons[i], 0, mask.address, newId); + await neon.connect(addrs[i % 3]).acceptChild(neons[i], 0, await mask.getAddress(), newId); } } async function addAssetsToNeon(): Promise { - await neon.addEquippableAssetEntry(neonResIds[0], 0, catalog.address, 'ipfs:neonRes/1', [ - partIdForHead1, - partIdForBody1, - partIdForHair1, - partIdForMask, - ]); - await neon.addEquippableAssetEntry(neonResIds[1], 0, catalog.address, 'ipfs:neonRes/2', [ - partIdForHead2, - partIdForBody2, - partIdForHair2, - partIdForMask, - ]); - await neon.addEquippableAssetEntry(neonResIds[2], 0, catalog.address, 'ipfs:neonRes/3', [ - partIdForHead3, - partIdForBody1, - partIdForHair3, - partIdForMask, - ]); - await neon.addEquippableAssetEntry(neonResIds[3], 0, catalog.address, 'ipfs:neonRes/4', [ - partIdForHead1, - partIdForBody2, - partIdForHair2, - partIdForMask, - ]); - await neon.addEquippableAssetEntry(neonResIds[4], 0, catalog.address, 'ipfs:neonRes/1', [ - partIdForHead2, - partIdForBody1, - partIdForHair1, - partIdForMask, - ]); + await neon.addEquippableAssetEntry( + neonResIds[0], + 0, + await catalog.getAddress(), + 'ipfs:neonRes/1', + [partIdForHead1, partIdForBody1, partIdForHair1, partIdForMask], + ); + await neon.addEquippableAssetEntry( + neonResIds[1], + 0, + await catalog.getAddress(), + 'ipfs:neonRes/2', + [partIdForHead2, partIdForBody2, partIdForHair2, partIdForMask], + ); + await neon.addEquippableAssetEntry( + neonResIds[2], + 0, + await catalog.getAddress(), + 'ipfs:neonRes/3', + [partIdForHead3, partIdForBody1, partIdForHair3, partIdForMask], + ); + await neon.addEquippableAssetEntry( + neonResIds[3], + 0, + await catalog.getAddress(), + 'ipfs:neonRes/4', + [partIdForHead1, partIdForBody2, partIdForHair2, partIdForMask], + ); + await neon.addEquippableAssetEntry( + neonResIds[4], + 0, + await catalog.getAddress(), + 'ipfs:neonRes/1', + [partIdForHead2, partIdForBody1, partIdForHair1, partIdForMask], + ); for (let i = 0; i < uniqueNeons; i++) { await neon.addAssetToToken(neons[i], neonResIds[i % neonResIds.length], 0); @@ -310,28 +315,28 @@ async function setupContextForParts( await mask.addEquippableAssetEntry( maskAssetsFull[0], 0, // Not meant to equip - catalog.address, // Not meant to equip, but catalog needed for parts + await catalog.getAddress(), // Not meant to equip, but catalog needed for parts `ipfs:weapon/full/${maskAssetsFull[0]}`, [partIdForMaskCatalog1, partIdForHorns1, partIdForEars1], ); await mask.addEquippableAssetEntry( maskAssetsFull[1], 0, // Not meant to equip - catalog.address, // Not meant to equip, but catalog needed for parts + await catalog.getAddress(), // Not meant to equip, but catalog needed for parts `ipfs:weapon/full/${maskAssetsFull[1]}`, [partIdForMaskCatalog2, partIdForHorns2, partIdForEars2], ); await mask.addEquippableAssetEntry( maskAssetsFull[2], 0, // Not meant to equip - catalog.address, // Not meant to equip, but catalog needed for parts + await catalog.getAddress(), // Not meant to equip, but catalog needed for parts `ipfs:weapon/full/${maskAssetsFull[2]}`, [partIdForMaskCatalog3, partIdForHorns1, partIdForEars2], ); await mask.addEquippableAssetEntry( maskAssetsFull[3], 0, // Not meant to equip - catalog.address, // Not meant to equip, but catalog needed for parts + await catalog.getAddress(), // Not meant to equip, but catalog needed for parts `ipfs:weapon/full/${maskAssetsFull[3]}`, [partIdForMaskCatalog2, partIdForHorns2, partIdForEars1], ); @@ -340,7 +345,7 @@ async function setupContextForParts( await mask.addEquippableAssetEntry( maskAssetsEquip[0], maskEquippableGroupId, - catalog.address, + await catalog.getAddress(), `ipfs:weapon/equip/${maskAssetsEquip[0]}`, [partIdForMaskCatalog1, partIdForHorns1, partIdForEars1], ); @@ -349,7 +354,7 @@ async function setupContextForParts( await mask.addEquippableAssetEntry( maskAssetsEquip[1], maskEquippableGroupId, - catalog.address, + await catalog.getAddress(), `ipfs:weapon/equip/${maskAssetsEquip[1]}`, [partIdForMaskCatalog2, partIdForHorns2, partIdForEars2], ); @@ -358,7 +363,7 @@ async function setupContextForParts( await mask.addEquippableAssetEntry( maskAssetsEquip[2], maskEquippableGroupId, - catalog.address, + await catalog.getAddress(), `ipfs:weapon/equip/${maskAssetsEquip[2]}`, [partIdForMaskCatalog3, partIdForHorns1, partIdForEars2], ); @@ -367,13 +372,17 @@ async function setupContextForParts( await mask.addEquippableAssetEntry( maskAssetsEquip[3], maskEquippableGroupId, - catalog.address, + await catalog.getAddress(), `ipfs:weapon/equip/${maskAssetsEquip[3]}`, [partIdForMaskCatalog2, partIdForHorns2, partIdForEars1], ); // Can be equipped into neons - await mask.setValidParentForEquippableGroup(maskEquippableGroupId, neon.address, partIdForMask); + await mask.setValidParentForEquippableGroup( + maskEquippableGroupId, + await neon.getAddress(), + partIdForMask, + ); // Add 2 assets to each weapon, one full, one for equip // There are 10 weapon tokens for 4 unique assets so we use % diff --git a/test/setup/equippableSlots.ts b/test/setup/equippableSlots.ts index dc800438..3af947d7 100644 --- a/test/setup/equippableSlots.ts +++ b/test/setup/equippableSlots.ts @@ -1,7 +1,6 @@ import { ethers } from 'hardhat'; -import { BigNumber } from 'ethers'; -import { Contract } from 'ethers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { RMRKCatalogImpl, RMRKEquippableMock } from '../../typechain-types'; const partIdForBody = 1; const partIdForWeapon = 2; @@ -13,10 +12,10 @@ const uniqueWeapons = 4; // const uniqueWeaponGems = 2; // const uniqueBackgrounds = 3; -const soldiersIds: BigNumber[] = []; -const weaponsIds: BigNumber[] = []; -const weaponGemsIds: BigNumber[] = []; -const backgroundsIds: BigNumber[] = []; +const soldiersIds: bigint[] = []; +const weaponsIds: bigint[] = []; +const weaponGemsIds: bigint[] = []; +const backgroundsIds: bigint[] = []; const soldierResId = 100; const weaponAssetsFull = [1, 2, 3, 4]; // Must match the total of uniqueAssets @@ -34,14 +33,14 @@ enum ItemType { let addrs: SignerWithAddress[]; async function setupContextForSlots( - catalog: Contract, - catalogForWeapon: Contract, - soldier: Contract, - weapon: Contract, - weaponGem: Contract, - background: Contract, - mint: (token: Contract, to: string) => Promise, - nestMint: (token: Contract, to: string, parentId: BigNumber) => Promise, + catalog: RMRKCatalogImpl, + catalogForWeapon: RMRKCatalogImpl, + soldier: RMRKEquippableMock, + weapon: RMRKEquippableMock, + weaponGem: RMRKEquippableMock, + background: RMRKEquippableMock, + mint: (token: RMRKEquippableMock, to: string) => Promise, + nestMint: (token: RMRKEquippableMock, to: string, parentId: bigint) => Promise, ) { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; @@ -80,19 +79,19 @@ async function setupContextForSlots( const partForWeapon = { itemType: ItemType.Slot, z: 2, - equippable: [weapon.address], + equippable: [await weapon.getAddress()], metadataURI: '', }; const partForWeaponGem = { itemType: ItemType.Slot, z: 3, - equippable: [weaponGem.address], + equippable: [await weaponGem.getAddress()], metadataURI: 'noGem.png', }; const partForBackground = { itemType: ItemType.Slot, z: 0, - equippable: [background.address], + equippable: [await background.getAddress()], metadataURI: 'noBackground.png', }; @@ -120,9 +119,11 @@ async function setupContextForSlots( weaponsIds.length = 0; // Mint one weapon to soldier for (let i = 0; i < uniqueSoldiers; i++) { - const newId = await nestMint(weapon, soldier.address, soldiersIds[i]); + const newId = await nestMint(weapon, await soldier.getAddress(), soldiersIds[i]); weaponsIds.push(newId); - await soldier.connect(addrs[i % 3]).acceptChild(soldiersIds[i], 0, weapon.address, newId); + await soldier + .connect(addrs[i % 3]) + .acceptChild(soldiersIds[i], 0, await weapon.getAddress(), newId); } } @@ -131,9 +132,11 @@ async function setupContextForSlots( weaponGemsIds.length = 0; // Mint one weapon gem for each weapon on each soldier for (let i = 0; i < uniqueSoldiers; i++) { - const newId = await nestMint(weaponGem, weapon.address, weaponsIds[i]); + const newId = await nestMint(weaponGem, await weapon.getAddress(), weaponsIds[i]); weaponGemsIds.push(newId); - await weapon.connect(addrs[i % 3]).acceptChild(weaponsIds[i], 0, weaponGem.address, newId); + await weapon + .connect(addrs[i % 3]) + .acceptChild(weaponsIds[i], 0, await weaponGem.getAddress(), newId); } } @@ -142,18 +145,22 @@ async function setupContextForSlots( backgroundsIds.length = 0; // Mint one background to soldier for (let i = 0; i < uniqueSoldiers; i++) { - const newId = await nestMint(background, soldier.address, soldiersIds[i]); + const newId = await nestMint(background, await soldier.getAddress(), soldiersIds[i]); backgroundsIds.push(newId); - await soldier.connect(addrs[i % 3]).acceptChild(soldiersIds[i], 0, background.address, newId); + await soldier + .connect(addrs[i % 3]) + .acceptChild(soldiersIds[i], 0, await background.getAddress(), newId); } } async function addAssetsToSoldier(): Promise { - await soldier.addEquippableAssetEntry(soldierResId, 0, catalog.address, 'ipfs:soldier/', [ - partIdForBody, - partIdForWeapon, - partIdForBackground, - ]); + await soldier.addEquippableAssetEntry( + soldierResId, + 0, + await catalog.getAddress(), + 'ipfs:soldier/', + [partIdForBody, partIdForWeapon, partIdForBackground], + ); for (let i = 0; i < uniqueSoldiers; i++) { await soldier.addAssetToToken(soldiersIds[i], soldierResId, 0); await soldier.connect(addrs[i % 3]).acceptAsset(soldiersIds[i], 0, soldierResId); @@ -167,7 +174,7 @@ async function setupContextForSlots( await weapon.addEquippableAssetEntry( weaponAssetsFull[i], 0, // Not meant to equip - ethers.constants.AddressZero, // Not meant to equip + ethers.ZeroAddress, // Not meant to equip `ipfs:weapon/full/${weaponAssetsFull[i]}`, [], ); @@ -176,7 +183,7 @@ async function setupContextForSlots( await weapon.addEquippableAssetEntry( weaponAssetsEquip[i], equippableGroupId, - catalogForWeapon.address, + await catalogForWeapon.getAddress(), `ipfs:weapon/equip/${weaponAssetsEquip[i]}`, [partIdForWeaponGem], ); @@ -185,7 +192,7 @@ async function setupContextForSlots( // Can be equipped into soldiers await weapon.setValidParentForEquippableGroup( equippableGroupId, - soldier.address, + await soldier.getAddress(), partIdForWeapon, ); @@ -208,21 +215,21 @@ async function setupContextForSlots( await weaponGem.addEquippableAssetEntry( weaponGemAssetFull, 0, // Not meant to equip - ethers.constants.AddressZero, // Not meant to equip + ethers.ZeroAddress, // Not meant to equip 'ipfs:weagponGem/full/', [], ); await weaponGem.addEquippableAssetEntry( weaponGemAssetEquip, equippableGroupId, - catalog.address, + await catalog.getAddress(), 'ipfs:weagponGem/equip/', [], ); // Can be equipped into weapons await weaponGem.setValidParentForEquippableGroup( equippableGroupId, - weapon.address, + await weapon.getAddress(), partIdForWeaponGem, ); @@ -239,14 +246,14 @@ async function setupContextForSlots( await background.addEquippableAssetEntry( backgroundAssetId, equippableGroupId, - catalog.address, + await catalog.getAddress(), 'ipfs:background/', [], ); // Can be equipped into soldiers await background.setValidParentForEquippableGroup( equippableGroupId, - soldier.address, + await soldier.getAddress(), partIdForBackground, ); diff --git a/test/utils.ts b/test/utils.ts index c3966bf9..145af45b 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,26 +1,40 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { Contract } from 'ethers'; import { ethers } from 'hardhat'; +import { + RMRKEquippableMock, + RMRKEquippablePreMint, + RMRKMultiAssetPreMint, + RMRKNestableMultiAssetPreMint, + RMRKNestableMultiAssetPreMintSoulbound, +} from '../typechain-types'; let nextTokenId = 1; let nextChildTokenId = 100; -const ONE_ETH = ethers.utils.parseEther('1.0'); -const ADDRESS_ZERO = ethers.constants.AddressZero; +const ONE_ETH = ethers.parseEther('1.0'); +const ADDRESS_ZERO = ethers.ZeroAddress; -function bn(x: number): BigNumber { - return BigNumber.from(x); +function bn(x: number): bigint { + return BigInt(x); } -async function mintFromMock(token: Contract, to: string): Promise { +async function mintFromMock(token: RMRKEquippableMock, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; - await token['mint(address,uint256)'](to, tokenId); + await token.mint(to, tokenId); return bn(tokenId); } -async function mintFromMockPremint(token: Contract, to: string): Promise { - const tx = await token['mint(address,uint256,string)'](to, 1, `ipfs://tokenURI`); +async function mintFromMockPremint( + token: + | RMRKMultiAssetPreMint + | RMRKNestableMultiAssetPreMintSoulbound + | RMRKNestableMultiAssetPreMint + | RMRKEquippablePreMint, + to: string, +): Promise { + const tx = await token.mint(to, 1, `ipfs://tokenURI`); // Get the event from the tx const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); // Get the tokenId from the event @@ -28,21 +42,21 @@ async function mintFromMockPremint(token: Contract, to: string): Promise { + parentId: bigint, +): Promise { const childTokenId = nextChildTokenId; nextChildTokenId++; - await token['nestMint(address,uint256,uint256)'](to, childTokenId, parentId); + await token.nestMint(to, childTokenId, parentId); return bn(childTokenId); } async function nestMintFromMockPreMint( token: Contract, to: string, - parentId: BigNumber, -): Promise { + parentId: bigint, +): Promise { const tx = await token['nestMint(address,uint256,uint256,string)']( to, 1, @@ -55,14 +69,14 @@ async function nestMintFromMockPreMint( return bn(event?.args?.tokenId); } -async function mintFromErc20Pay(token: Contract, to: string): Promise { - const erc20Address = token.erc20TokenAddress(); +async function mintFromErc20Pay(token: Contract, to: string): Promise { + const erc20Address = await token.erc20TokenAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = erc20Factory.attach(erc20Address); const owner = (await ethers.getSigners())[0]; - await erc20.mint(owner.address, ONE_ETH); - await erc20.approve(token.address, ONE_ETH); + await erc20.mint(await owner.getAddress(), ONE_ETH); + await erc20.approve(await token.getAddress(), ONE_ETH); const tx = await token.mint(to, 1); // Get the event from the tx @@ -71,7 +85,7 @@ async function mintFromErc20Pay(token: Contract, to: string): Promise return event?.args?.tokenId; } -async function mintFromNativeToken(token: Contract, to: string): Promise { +async function mintFromNativeToken(token: Contract, to: string): Promise { const tx = await token.mint(to, 1, { value: ONE_ETH }); // Get the event from the tx const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); @@ -82,15 +96,15 @@ async function mintFromNativeToken(token: Contract, to: string): Promise { - const erc20Address = token.erc20TokenAddress(); + destinationId: bigint, +): Promise { + const erc20Address = await token.erc20TokenAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = erc20Factory.attach(erc20Address); const owner = (await ethers.getSigners())[0]; - await erc20.mint(owner.address, ONE_ETH); - await erc20.approve(token.address, ONE_ETH); + await erc20.mint(await owner.getAddress(), ONE_ETH); + await erc20.approve(await token.getAddress(), ONE_ETH); const tx = await token.nestMint(to, 1, destinationId); // Get the event from the tx @@ -102,8 +116,8 @@ async function nestMintFromErc20Pay( async function nestMintFromNativeToken( token: Contract, to: string, - destinationId: BigNumber, -): Promise { + destinationId: bigint, +): Promise { const tx = await token.nestMint(to, 1, destinationId, { value: ONE_ETH }); // Get the event from the tx const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); @@ -115,48 +129,49 @@ async function transfer( token: Contract, caller: SignerWithAddress, to: string, - tokenId: BigNumber, + tokenId: bigint, ): Promise { - await token.connect(caller)['transferFrom(address,address,uint256)'](caller.address, to, tokenId); + await token + .connect(caller) + ['transferFrom(address,address,uint256)'](await caller.getAddress(), to, tokenId); } async function nestTransfer( token: Contract, caller: SignerWithAddress, to: string, - tokenId: BigNumber, - parentId: BigNumber, + tokenId: bigint, + parentId: bigint, ): Promise { - await token.connect(caller).nestTransferFrom(caller.address, to, tokenId, parentId, '0x'); + await token + .connect(caller) + .nestTransferFrom(await caller.getAddress(), to, tokenId, parentId, '0x'); } async function addAssetToToken( token: Contract, - tokenId: BigNumber, - resId: BigNumber, - replaces: BigNumber | number, + tokenId: bigint, + resId: bigint, + replaces: bigint | number, ): Promise { return await token.addAssetToToken(tokenId, resId, replaces); } let nextAssetId = 1; -async function addAssetEntryFromMock(token: Contract, data?: string): Promise { +async function addAssetEntryFromMock(token: Contract, data?: string): Promise { const assetId = bn(nextAssetId); nextAssetId++; await token.addAssetEntry(assetId, data !== undefined ? data : 'metaURI'); return assetId; } -async function addAssetEntryFromImpl(token: Contract, data?: string): Promise { +async function addAssetEntryFromImpl(token: Contract, data?: string): Promise { await token.addAssetEntry(data !== undefined ? data : 'metaURI'); return await token.totalAssets(); } -async function addAssetEntryEquippablesFromMock( - token: Contract, - data?: string, -): Promise { +async function addAssetEntryEquippablesFromMock(token: Contract, data?: string): Promise { const assetId = bn(nextAssetId); const equippableGroupId = bn(1); nextAssetId++; @@ -171,10 +186,7 @@ async function addAssetEntryEquippablesFromMock( return assetId; } -async function addAssetEntryEquippablesFromImpl( - token: Contract, - data?: string, -): Promise { +async function addAssetEntryEquippablesFromImpl(token: Contract, data?: string): Promise { const equippableGroupId = bn(1); await token.addEquippableAssetEntry( equippableGroupId, @@ -189,7 +201,7 @@ async function addAssetEntryEquippablesFromImpl( async function singleFixtureWithArgs(contractName: string, args: any[]): Promise { const factory = await ethers.getContractFactory(contractName); const token = await factory.deploy(...args); - await token.deployed(); + await token.waitForDeployment(); return token; } @@ -201,9 +213,9 @@ async function parentChildFixtureWithArgs( const factory = await ethers.getContractFactory(contractName); const parent = await factory.deploy(...parentArgs); - await parent.deployed(); + await parent.waitForDeployment(); const child = await factory.deploy(...childArgs); - await child.deployed(); + await child.waitForDeployment(); return { parent, child }; } diff --git a/yarn.lock b/yarn.lock index a7507c6c..f7ab5e07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,33 +2,10 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.4.4": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== - dependencies: - regenerator-runtime "^0.13.11" +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== "@chainsafe/as-sha256@^0.3.1": version "0.3.1" @@ -78,111 +55,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@defi-wonderland/smock@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@defi-wonderland/smock/-/smock-2.3.4.tgz#2bfe7e19052140634b25db344d77de9b0ac7a96b" - integrity sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew== - dependencies: - "@nomicfoundation/ethereumjs-evm" "^1.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "^8.0.0-rc.3" - "@nomicfoundation/ethereumjs-vm" "^6.0.0-rc.3" - diff "^5.0.0" - lodash.isequal "^4.5.0" - lodash.isequalwith "^4.4.0" - rxjs "^7.2.0" - semver "^7.3.5" - -"@ensdomains/address-encoder@^0.1.7": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" - integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== - dependencies: - bech32 "^1.1.3" - blakejs "^1.1.0" - bn.js "^4.11.8" - bs58 "^4.0.1" - crypto-addr-codec "^0.1.7" - nano-base32 "^1.0.1" - ripemd160 "^2.0.2" - -"@ensdomains/ens@0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/ensjs@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" - integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== - dependencies: - "@babel/runtime" "^7.4.4" - "@ensdomains/address-encoder" "^0.1.7" - "@ensdomains/ens" "0.4.5" - "@ensdomains/resolver" "0.2.4" - content-hash "^2.5.2" - eth-ens-namehash "^2.0.8" - ethers "^5.0.13" - js-sha3 "^0.8.0" - -"@ensdomains/resolver@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@ethereumjs/common@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" - integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.1" - -"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/tx@3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" - integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== - dependencies: - "@ethereumjs/common" "^2.5.0" - ethereumjs-util "^7.1.2" - -"@ethereumjs/tx@^3.3.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -457,7 +330,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -524,34 +397,15 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -572,11 +426,23 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + "@noble/hashes@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/hashes@~1.1.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" @@ -600,7 +466,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -608,61 +474,31 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz#f317078c810a54381c682d0c12e1e81acfc11599" - integrity sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-tx" "4.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-block@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz#6f89664f55febbd723195b6d0974773d29ee133d" - integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" ethereum-cryptography "0.1.3" ethers "^5.7.1" -"@nomicfoundation/ethereumjs-blockchain@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz#9f79dd2b3dc73f5d5a220f7d8a734330c4c26320" - integrity sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-ethash" "2.0.5" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-util" "8.0.6" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-blockchain@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz#80e0bd3535bfeb9baa29836b6f25123dab06a726" - integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-ethash" "3.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" abstract-level "^1.0.3" debug "^4.3.3" ethereum-cryptography "0.1.3" @@ -670,229 +506,153 @@ lru-cache "^5.1.1" memory-level "^1.0.0" -"@nomicfoundation/ethereumjs-common@3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz#041086da66ed40f2bf2a2116a1f2f0fcf33fb80d" - integrity sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA== - dependencies: - "@nomicfoundation/ethereumjs-util" "8.0.6" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-common@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" - integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.2" crc-32 "^1.2.0" -"@nomicfoundation/ethereumjs-ethash@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz#0c605812f6f4589a9f6d597db537bbf3b86469db" - integrity sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-ethash@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz#65ca494d53e71e8415c9a49ef48bc921c538fc41" - integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" abstract-level "^1.0.3" bigint-crypto-utils "^3.0.23" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-evm@1.3.2", "@nomicfoundation/ethereumjs-evm@^1.0.0-rc.3": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz#f9d6bafd5c23d07ab75b8649d589af1a43b60bfc" - integrity sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-evm@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz#f35681e203363f69ce2b3d3bf9f44d4e883ca1f1" - integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== dependencies: "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/ethereumjs-rlp@4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz#8d9147fbd0d49e8f4c5ce729d226694a8fe03eb8" - integrity sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA== - -"@nomicfoundation/ethereumjs-rlp@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz#0b30c1cf77d125d390408e391c4bb5291ef43c28" - integrity sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ== - -"@nomicfoundation/ethereumjs-statemanager@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz#951cc9ff2c421d40233d2e9d0fe033db2391ee44" - integrity sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-util" "8.0.6" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== -"@nomicfoundation/ethereumjs-statemanager@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz#8824a97938db4471911e2d2f140f79195def5935" - integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" ethers "^5.7.1" js-sdsl "^4.1.4" -"@nomicfoundation/ethereumjs-trie@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz#bf31c9306dcbba2007fad668e96109ddb147040c" - integrity sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-trie@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz#662c55f6b50659fd4b22ea9f806a7401cafb7717" - integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" "@types/readable-stream" "^2.3.13" ethereum-cryptography "0.1.3" readable-stream "^3.6.0" -"@nomicfoundation/ethereumjs-tx@4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz#8659fad7f9094b7eb82aa6cc3c8097cb1c42ff31" - integrity sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-tx@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz#7629dc2036b4a33c34e9f0a592b43227ef4f0c7d" - integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== dependencies: "@chainsafe/ssz" "^0.9.2" "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@8.0.6", "@nomicfoundation/ethereumjs-util@^8.0.0-rc.3": - version "8.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz#dbce5d258b017b37aa58b3a7c330ad59d10ccf0b" - integrity sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz#530cda8bae33f8b5020a8f199ed1d0a2ce48ec89" - integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== dependencies: "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz#7d035e0993bcad10716c8b36e61dfb87fa3ca05f" - integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-blockchain" "7.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-evm" "2.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-statemanager" "2.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - debug "^4.3.3" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" -"@nomicfoundation/ethereumjs-vm@^6.0.0-rc.3": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz#af1cf62e6c0054bc2b7febc8556d032433d1b18c" - integrity sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-blockchain" "6.2.2" - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-evm" "1.3.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-statemanager" "1.0.5" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-tx" "4.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/hardhat-chai-matchers@^1.0.1": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.5.tgz#75d08bd9bd84a3cb7950be6bd27171a294516b01" - integrity sha512-+W5C/+5FHI2xBajUN9THSNc1UP6FUsA7LeLmfnaC9VMi/50/DEjjxd8OmizEXgV1Bjck7my4NVQLL1Ti39FkpA== +"@nomicfoundation/hardhat-chai-matchers@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.3.tgz#f4c074d39b74bd283c99e2c2bf143e3cef51ae18" + integrity sha512-A40s7EAK4Acr8UP1Yudgi9GGD9Cca/K3LHt3DzmRIje14lBfHtg9atGQ7qK56vdPcTwKmeaGn30FzxMUfPGEMw== dependencies: - "@ethersproject/abi" "^5.1.2" "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" - chalk "^2.4.2" deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/hardhat-network-helpers@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz#9103be2b359899a8b7996f54df12a1b7977367e3" - integrity sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw== +"@nomicfoundation/hardhat-ethers@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz#0422c2123dec7c42e7fb2be8e1691f1d9708db56" + integrity sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-network-helpers@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz#c61042ceb104fdd6c10017859fdef6529c1d6585" + integrity sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ== dependencies: ethereumjs-util "^7.1.4" +"@nomicfoundation/hardhat-toolbox@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz#eb1f619218dd1414fa161dfec92d3e5e53a2f407" + integrity sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA== + +"@nomicfoundation/hardhat-verify@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.3.tgz#173557f8cfa53c8c9da23a326f54d24fe459ae68" + integrity sha512-ESbRu9by53wu6VvgwtMtm108RSmuNsVqXtzg061D+/4R7jaWh/Wl/8ve+p6SdDX7vA1Z3L02hDO1Q3BY4luLXQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" @@ -959,15 +719,10 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" -"@nomiclabs/hardhat-ethers@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" - integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== - -"@nomiclabs/hardhat-etherscan@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.3.tgz#c9dbaa4174edfa075a464a0e9142bc8710a2c4e2" - integrity sha512-UeNO97j0lwOHqX7mrH6SfQQBdXq1Ng6eFr7uJKuQOrq2UVTWGD70lE5QO4fAFVPz9ao+xlNpMyIqSR7+OaDR+Q== +"@nomiclabs/hardhat-etherscan@^3.1.8": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" + integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -978,37 +733,13 @@ lodash "^4.17.11" semver "^6.3.0" table "^6.8.0" - undici "^5.4.0" - -"@openzeppelin/contract-loader@^0.6.2": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz#61a7b44de327e40b7d53f39e0fb59bbf847335c3" - integrity sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg== - dependencies: - find-up "^4.1.0" - fs-extra "^8.1.0" + undici "^5.14.0" "@openzeppelin/contracts@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.0.tgz#ee0e4b4564f101a5c4ee398cd4d73c0bd92b289c" integrity sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw== -"@openzeppelin/test-helpers@^0.5.16": - version "0.5.16" - resolved "https://registry.yarnpkg.com/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz#2c9054f85069dfbfb5e8cef3ed781e8caf241fb3" - integrity sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg== - dependencies: - "@openzeppelin/contract-loader" "^0.6.2" - "@truffle/contract" "^4.0.35" - ansi-colors "^3.2.3" - chai "^4.2.0" - chai-bn "^0.2.1" - ethjs-abi "^0.2.1" - lodash.flatten "^4.4.0" - semver "^5.6.0" - web3 "^1.2.5" - web3-utils "^1.2.5" - "@primitivefi/hardhat-dodoc@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@primitivefi/hardhat-dodoc/-/hardhat-dodoc-0.2.3.tgz#76aebbfa70de2d6454af29e166b1430583b54c5c" @@ -1106,190 +837,55 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@solidity-parser/parser@0.16.0", "@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.0.tgz#1fb418c816ca1fc3a1e94b08bcfe623ec4e1add4" - integrity sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q== +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@truffle/abi-utils@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.5.tgz#0b5afb2cbfd492bee156d253d264923f52ac119e" - integrity sha512-nGIMNDjl1NhTxI5lSecOWoLFH8A+aDRPrMejke6Cb2ok8FWyTPCaHmlC8S0Kdi/Egp9m3CNI1TYsy9w9Y3E3jA== - dependencies: - change-case "3.0.2" - fast-check "3.1.1" - web3-utils "1.7.4" - -"@truffle/blockchain-utils@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.5.tgz#da6af046d9ecf73b4d0a460896274dbfb6e1d3bd" - integrity sha512-WwvKafKYbU0H3ewk3Y3ZZrWxPEYDEtqNkn1BZFPP8GkbDLNLbgZSW6cA0fGhe8veqvkK3q+CmGufr1/tBDW+OQ== - -"@truffle/codec@^0.14.10": - version "0.14.10" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.10.tgz#6d793f32e1816086e9ce0ea00f6291cca7815597" - integrity sha512-+uPnImtjNUzRhWOp5GG9AeSEuG1o9iVRpCsodQ04podKqYagtjNOKSe7jqNLJCbZ1Vpbvztmb9KzbwOJTLZS9A== - dependencies: - "@truffle/abi-utils" "^0.3.5" - "@truffle/compile-common" "^0.9.1" - big.js "^6.0.3" - bn.js "^5.1.3" - cbor "^5.2.0" - debug "^4.3.1" - lodash "^4.17.21" - semver "7.3.7" - utf8 "^3.0.0" - web3-utils "1.7.4" - -"@truffle/compile-common@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.1.tgz#4b36ac57d3e7dfbde0697621c8e6dc613820ef1a" - integrity sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw== +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== dependencies: - "@truffle/error" "^0.1.1" - colors "1.4.0" - -"@truffle/contract-schema@^3.4.11": - version "3.4.11" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.11.tgz#ac5fc8be656b786c2bd5d3a2ca6faeb2949e7ff3" - integrity sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ== - dependencies: - ajv "^6.10.0" - debug "^4.3.1" - -"@truffle/contract@^4.0.35": - version "4.6.8" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.6.8.tgz#2616a16e58a417a29436b1b9f430df42b15377cf" - integrity sha512-cndUs/3WaF1RUz3whQHvFQS/9uTyadR5iiyNdOdvF4OYLN3agM3lLY8YIEGRgz6F9CELBoUnD15daXLEj6RGuw== - dependencies: - "@ensdomains/ensjs" "^2.1.0" - "@truffle/blockchain-utils" "^0.1.5" - "@truffle/contract-schema" "^3.4.11" - "@truffle/debug-utils" "^6.0.41" - "@truffle/error" "^0.1.1" - "@truffle/interface-adapter" "^0.5.25" - bignumber.js "^7.2.1" - debug "^4.3.1" - ethers "^4.0.32" - web3 "1.7.4" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-eth-abi "1.7.4" - web3-utils "1.7.4" - -"@truffle/debug-utils@^6.0.41": - version "6.0.41" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.41.tgz#c6d0a59d044d4c0862fc4b4c931a1db6d88fe40c" - integrity sha512-8sk0fmcN3s11cvAJyODoDPWK9W730c6UAreyeHNj03PWg04D+YUqHpRlV2evdqAx2om1p+Xp03eQag15mg//jQ== - dependencies: - "@truffle/codec" "^0.14.10" - "@trufflesuite/chromafi" "^3.0.0" - bn.js "^5.1.3" - chalk "^2.4.2" - debug "^4.3.1" - highlightjs-solidity "^2.0.5" - -"@truffle/error@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" - integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== - -"@truffle/interface-adapter@^0.5.25": - version "0.5.25" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.25.tgz#8a62740a48de1a5fa6ecf354b5b7fc73179cce30" - integrity sha512-7EpA9Tyq9It2z7GaLPHljEdmCtVFAkYko6vxXbN+H5PdL6zjEOw66bzMbKisKkh3px5dUd1OlRwPljjs34dpAQ== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.7.4" - -"@trufflesuite/chromafi@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" - integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== - dependencies: - camelcase "^4.1.0" - chalk "^2.3.2" - cheerio "^1.0.0-rc.2" - detect-indent "^5.0.0" - highlight.js "^10.4.1" - lodash.merge "^4.6.2" - strip-ansi "^4.0.0" - strip-indent "^2.0.0" + antlr4ts "^0.5.0-alpha.4" -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== +"@tsconfig/node14@*": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-14.1.0.tgz#1f8611430002b2a08c68ec1b1e7aa40c03b8fcd2" + integrity sha512-VmsCG04YR58ciHBeJKBDNMWWfYbyP8FekWVuTlpstaUPlat1D0x/tXzkWP7yCMU0eSz9V4OZU0LBWTFJ3xZf6w== -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== +"@tsconfig/node16@*": + version "16.1.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-16.1.1.tgz#b9322bcacf7b7a487ab4e078f88455bde47f3780" + integrity sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA== -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== +"@tsconfig/node18@*": + version "18.2.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-18.2.2.tgz#81fb16ecff0d400b1cbadbf76713b50f331029ce" + integrity sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw== -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@tsconfig/node20@*": + version "20.1.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.2.tgz#b93128c411d38e9507035255195bc8a6718541e3" + integrity sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ== -"@typechain/ethers-v5@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz#fdb527d8854129cea5f139d76c6c6e1c9bb040ec" - integrity sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw== +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" -"@typechain/hardhat@^6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.4.tgz#da930bf17bdae5e0996b86d37992c6c58b8a49c8" - integrity sha512-S8k5d1Rjc+plwKpkorlifmh72M7Ki0XNUOVVLtdbcA/vLaEkuqZSJFdddpBgS5QxiJP+6CbRa/yO6EVTE2+fMQ== +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== dependencies: fs-extra "^9.1.0" -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -1304,27 +900,17 @@ dependencies: "@types/node" "*" -"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - "@types/chai-as-promised@^7.1.3": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" - integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^4.3.4": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== +"@types/chai@*", "@types/chai@^4.3.11": + version "4.3.11" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.11.tgz#e95050bf79a932cb7305dd130254ccdf9bde671c" + integrity sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1340,14 +926,6 @@ dependencies: "@types/node" "*" -"@types/glob@*": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.0.tgz#321607e9cbaec54f687a0792b2d1d370739455d2" - integrity sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -1356,28 +934,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -1388,30 +944,32 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/minimatch@^3.0.3", "@types/minimatch@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/mocha@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" - integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== +"@types/mocha@^10.0.6": + version "10.0.6" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" + integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/node@*", "@types/node@^18.11.10": +"@types/node@*": version "18.11.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.6": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^20.10.8": + version "20.10.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.8.tgz#f1e223cbde9e25696661d167a5b93a9b2a5d57c7" + integrity sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA== + dependencies: + undici-types "~5.26.4" "@types/node@^8.0.0": version "8.10.66" @@ -1426,14 +984,14 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== "@types/readable-stream@^2.3.13": version "2.3.15" @@ -1443,21 +1001,6 @@ "@types/node" "*" safe-buffer "~5.1.1" -"@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/rimraf@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8" - integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ== - dependencies: - "@types/glob" "*" - "@types/node" "*" - "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -1465,94 +1008,6 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@typescript-eslint/eslint-plugin@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" - integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== - dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/type-utils" "5.45.0" - "@typescript-eslint/utils" "5.45.0" - debug "^4.3.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" - integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== - dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" - integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== - dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" - -"@typescript-eslint/type-utils@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" - integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== - dependencies: - "@typescript-eslint/typescript-estree" "5.45.0" - "@typescript-eslint/utils" "5.45.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" - integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== - -"@typescript-eslint/typescript-estree@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" - integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== - dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" - integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" - integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== - dependencies: - "@typescript-eslint/types" "5.45.0" - eslint-visitor-keys "^3.3.0" - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1563,18 +1018,6 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abortcontroller-polyfill@^1.7.3: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -1588,38 +1031,20 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: module-error "^1.0.1" queue-microtask "^1.2.3" -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^8.4.1, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.4.1: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== address@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" - integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" @@ -1631,6 +1056,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1646,20 +1076,10 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^8.0.1: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1671,31 +1091,16 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -1703,27 +1108,17 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1737,17 +1132,12 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== - antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -anymatch@~3.1.1, anymatch@~3.1.2: +anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1782,22 +1172,6 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1808,98 +1182,26 @@ array-uniq@1.0.3: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.flat@^1.2.5: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -ast-parents@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1910,27 +1212,21 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^1.5.1: + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: +base-x@^3.0.2: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -1942,28 +1238,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4, bech32@^1.1.3: +bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -big-integer@1.6.36: - version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -big.js@^6.0.3: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - bigint-crypto-utils@^3.0.23: version "3.1.7" resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" @@ -1976,16 +1255,6 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== -bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1996,49 +1265,16 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.0, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.1, body-parser@^1.16.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2061,7 +1297,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: +brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -2081,7 +1317,7 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -2093,49 +1329,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.4" - inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" - -bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== @@ -2156,17 +1350,12 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@6.0.3, buffer@^6.0.3: +buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -2174,28 +1363,6 @@ buffer@6.0.3, buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== - dependencies: - node-gyp-build "^4.3.0" - -builtins@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -2208,96 +1375,14 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" - integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== +call-bind@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" camelcase@^6.0.0: version "6.3.0" @@ -2319,14 +1404,6 @@ catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -cbor@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - cbor@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" @@ -2341,25 +1418,20 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai-bn@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.2.tgz#4dcf30dbc79db2378a00781693bc749c972bf34f" - integrity sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg== - -chai@^4.2.0, chai@^4.3.6: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== +chai@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.0.tgz#f9ac79f26726a867ac9d90a9b382120479d5f55b" + integrity sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2376,84 +1448,17 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-case@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" - integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== - dependencies: - camel-case "^3.0.0" - constant-case "^2.0.0" - dot-case "^2.1.0" - header-case "^1.0.0" - is-lower-case "^1.1.0" - is-upper-case "^1.1.0" - lower-case "^1.1.1" - lower-case-first "^1.0.0" - no-case "^2.3.2" - param-case "^2.1.0" - pascal-case "^2.0.0" - path-case "^2.1.0" - sentence-case "^2.1.0" - snake-case "^2.1.0" - swap-case "^1.1.0" - title-case "^2.1.0" - upper-case "^1.1.1" - upper-case-first "^1.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" @@ -2470,27 +1475,11 @@ chokidar@3.5.3, chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2499,11 +1488,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - classic-level@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" @@ -2520,13 +1504,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2546,29 +1523,6 @@ cli-table3@^0.6.0: optionalDependencies: "@colors/colors" "1.5.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2578,18 +1532,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2619,7 +1561,7 @@ colors@1.4.0, colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2651,21 +1593,11 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2681,96 +1613,21 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -constant-case@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" - integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== - dependencies: - snake-case "^2.1.0" - upper-case "^1.1.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookiejar@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -2782,7 +1639,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -2794,170 +1651,32 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -crypto-addr-codec@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" - integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== - dependencies: - base-x "^3.0.8" - big-integer "1.6.36" - blakejs "^1.1.0" - bs58 "^4.0.1" - ripemd160-min "0.0.6" - safe-buffer "^5.2.0" - sha3 "^2.1.1" - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decode-uri-component@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.1.tgz#e9d7afd716fc1a7ec6ae7cc0aa3e540a1eac2e9d" - integrity sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-eql@^4.0.1, deep-eql@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" - integrity sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w== +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" @@ -2966,28 +1685,19 @@ deep-extend@~0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" has-property-descriptors "^1.0.0" - object-keys "^1.1.1" delayed-stream@~1.0.0: version "1.0.0" @@ -2999,24 +1709,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== - detect-port@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" @@ -3025,11 +1717,6 @@ detect-port@^1.3.0: address "^1.0.1" debug "4" -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -3040,20 +1727,6 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - difflib@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" @@ -3068,86 +1741,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dot-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" - integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== - dependencies: - no-case "^2.2.0" - -dotenv@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -3160,28 +1759,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enquirer@^2.3.0: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -3189,130 +1771,26 @@ enquirer@^2.3.0: dependencies: ansi-colors "^4.1.1" -ensure-posix-path@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" - integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== - -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" @@ -3325,249 +1803,6 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-config-standard@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf" - integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" - integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-n@^15.5.1: - version "15.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.5.1.tgz#b3991857d1edaa47e0108ead825470ce63f391c1" - integrity sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw== - dependencies: - builtins "^5.0.1" - eslint-plugin-es "^4.1.0" - eslint-utils "^3.0.0" - ignore "^5.1.1" - is-core-module "^2.11.0" - minimatch "^3.1.2" - resolve "^1.22.1" - semver "^7.3.8" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-promise@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -eslint@^8.28.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== - dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -3578,102 +1813,35 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - eth-gas-reporter@^0.2.25: - version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" - integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== + version "0.2.27" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" + integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== dependencies: - "@ethersproject/abi" "^5.0.0-beta.146" "@solidity-parser/parser" "^0.14.0" + axios "^1.5.1" cli-table3 "^0.5.0" colors "1.4.0" ethereum-cryptography "^1.0.3" - ethers "^4.0.40" + ethers "^5.7.2" fs-readdir-recursive "^1.1.0" lodash "^4.17.14" markdown-table "^1.1.3" - mocha "^7.1.1" + mocha "^10.2.0" req-cwd "^2.0.0" - request "^2.88.0" - request-promise-native "^1.0.5" sha1 "^1.1.1" sync-request "^6.0.0" -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -3726,7 +1894,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.1.4: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== @@ -3737,22 +1905,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^4.0.32, ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^5.0.13, ethers@^5.7.1, ethers@^5.7.2: +ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -3788,22 +1941,18 @@ ethers@^5.0.13, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethjs-abi@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" - integrity sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA== +ethers@^6.9.2: + version "6.9.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.2.tgz#6f4632f62e2350fa8354ff28624027a175ef85a4" + integrity sha512-YpkrtILnMQz5jSEsJQRTpduaGT/CXuLnUIuOYzHA0v/7c8IX91m2J48wSKjzGL5L9J/Us3tLoUdb+OwE3U+FFQ== dependencies: - bn.js "4.11.6" - js-sha3 "0.5.5" - number-to-bn "1.7.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" @@ -3813,17 +1962,7 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -3831,95 +1970,15 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -express@^4.14.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-check@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" - integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== - dependencies: - pure-rand "^5.0.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.0.3: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3927,44 +1986,18 @@ fast-glob@^3.0.3, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== dependencies: reusify "^1.0.4" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3972,19 +2005,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -3992,14 +2012,7 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@5.0.0, find-up@^5.0.0: +find-up@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -4007,14 +2020,6 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -4022,74 +2027,20 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - follow-redirects@^1.12.1: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data-encoder@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" - integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== +follow-redirects@^1.15.4: + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== form-data@^2.2.0: version "2.5.1" @@ -4100,20 +2051,15 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -4124,11 +2070,6 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -4140,15 +2081,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -4177,13 +2109,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -4194,104 +2119,46 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: +get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" + has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -4300,32 +2167,13 @@ ghost-testrpc@^0.0.2: chalk "^2.4.2" node-emoji "^1.10.0" -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -4361,7 +2209,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.0, glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4389,26 +2237,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== - dependencies: - type-fest "^0.20.2" - globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -4423,18 +2251,6 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -4442,99 +2258,28 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" - integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== - dependencies: - "@sindresorhus/is" "^4.6.0" - "@szmarczak/http-timer" "^5.0.1" - "@types/cacheable-request" "^6.0.2" - "@types/responselike" "^1.0.0" - cacheable-lookup "^6.0.4" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - form-data-encoder "1.7.1" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^2.0.0" - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^11.8.5: - version "11.8.5" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" - integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - hardhat-contract-sizer@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9" @@ -4553,28 +2298,27 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.0.tgz#574478790fa4f4a45c5ccf162e82e54f36671749" - integrity sha512-CaEGa13tkJNe2/rdaBiive4pmdNShwxvdWVhr1zfb6aVpRhQt9VNO0l/UIBt/zzajz38ZFjvhfM2bj8LDXo9gw== +hardhat@^2.19.4: + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-blockchain" "7.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-evm" "2.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-statemanager" "2.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - "@nomicfoundation/ethereumjs-vm" "7.0.1" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -4608,11 +2352,6 @@ hardhat@^2.17.0: uuid "^8.3.2" ws "^7.4.6" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -4629,31 +2368,22 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -4663,14 +2393,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -4679,34 +2401,23 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" - integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== - dependencies: - no-case "^2.2.0" - upper-case "^1.1.3" - "heap@>= 0.2.0": version "0.2.7" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -highlightjs-solidity@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz#48b945f41886fa49af9f06023e6e87fffc243745" - integrity sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg== - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4716,21 +2427,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -4741,11 +2437,6 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -4757,11 +2448,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== - http-response-object@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" @@ -4769,31 +2455,6 @@ http-response-object@^3.0.1: dependencies: "@types/node" "^10.0.3" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -4802,61 +2463,28 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== +ignore@^5.1.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== immutable@^4.0.0-rc.12: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -4880,44 +2508,11 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -4925,31 +2520,6 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -4957,55 +2527,23 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.5, is-buffer@~2.0.3: +is-buffer@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has-tostringtag "^1.0.0" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + hasown "^2.0.0" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5016,19 +2554,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -5040,109 +2566,21 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-lower-case@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" - integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== - dependencies: - lower-case "^1.1.0" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.3: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-upper-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" - integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== - dependencies: - upper-case "^1.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5153,45 +2591,17 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - js-sdsl@^4.1.4: version "4.2.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== -js-sha3@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" - integrity sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA== - -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@3.x: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -5199,65 +2609,18 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0, js-yaml@^4.1.0: +js-yaml@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - json-schema-traverse@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -5286,16 +2649,6 @@ jsonschema@^1.2.4: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -5305,20 +2658,6 @@ keccak@^3.0.0, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== - dependencies: - json-buffer "3.0.1" - kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -5331,13 +2670,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - level-supports@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" @@ -5359,7 +2691,7 @@ level@^8.0.0: browser-level "^1.0.1" classic-level "^1.2.0" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== @@ -5367,25 +2699,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5394,21 +2707,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -5416,53 +2714,31 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== -lodash.isequalwith@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz#266726ddd528f854f21f4ea98a065606e0fbc6b0" - integrity sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -5471,39 +2747,12 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== - dependencies: - get-func-name "^2.0.0" - -lower-case-first@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" - integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - lower-case "^1.1.2" - -lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + get-func-name "^2.0.1" lru-cache@^5.1.1: version "5.1.1" @@ -5534,14 +2783,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -matcher-collection@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" - integrity sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ== - dependencies: - "@types/minimatch" "^3.0.3" - minimatch "^3.0.2" - mcl-wasm@^0.7.1: version "0.7.9" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" @@ -5556,11 +2797,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -5575,21 +2811,11 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -5598,53 +2824,18 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5655,20 +2846,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - minimatch@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" @@ -5676,52 +2860,23 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: +mkdirp@0.5.x: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -5729,36 +2884,6 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - mocha@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" @@ -5786,121 +2911,48 @@ mocha@^10.0.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - ansi-colors "3.2.3" + ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - -nano-base32@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" - integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== - nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -5911,43 +2963,11 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^2.2.0, no-case@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -5960,31 +2980,11 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" @@ -5997,144 +2997,34 @@ nopt@3.x: dependencies: abbrev "1" -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.0.11, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== obliterator@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -6146,50 +3036,16 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - ordinal@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -6197,13 +3053,6 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -6218,20 +3067,6 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -6251,103 +3086,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== - dependencies: - no-case "^2.2.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-cache-control@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" - integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== - dependencies: - camel-case "^3.0.0" - upper-case-first "^1.1.0" - -path-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" - integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== - dependencies: - no-case "^2.2.0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6363,40 +3106,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -6407,7 +3121,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17, pbkdf2@^3.0.3: +pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -6418,94 +3132,31 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier-plugin-solidity@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz#9a35124f578404caf617634a8cab80862d726cba" - integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== - dependencies: - "@solidity-parser/parser" "^0.16.0" - semver "^7.3.8" - solidity-comments-extractor "^0.0.7" - -prettier@2.8.0, prettier@^2.3.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== - -prettier@^1.14.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise@^8.0.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -6513,106 +3164,36 @@ promise@^8.0.0: dependencies: asap "~2.0.6" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pure-rand@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.5.tgz#bda2a7f6a1fc0f284d78d78ca5902f26f2ad35cf" - integrity sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw== +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@6.11.0, qs@^6.4.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@^6.4.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1, raw-body@^2.4.1: +raw-body@^2.4.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -6622,27 +3203,10 @@ raw-body@2.5.1, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - readable-stream@^2.2.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6661,22 +3225,6 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -6703,30 +3251,6 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0, regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" @@ -6741,88 +3265,21 @@ req-from@^2.0.0: dependencies: resolve-from "^3.0.0" -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.79.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -6835,49 +3292,20 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.6: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6885,19 +3313,7 @@ rimraf@^2.2.8: dependencies: glob "^7.1.3" -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160-min@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" - integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: +ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -6912,11 +3328,6 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" @@ -6936,21 +3347,7 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.2.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6960,16 +3357,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -6994,12 +3382,7 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -7013,57 +3396,23 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - semver@^6.3.0: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -sentence-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" - integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== - dependencies: - no-case "^2.2.0" - upper-case-first "^1.1.2" - serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -7071,36 +3420,15 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" setimmediate@^1.0.5: version "1.0.5" @@ -7128,37 +3456,6 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" -sha3@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" - integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== - dependencies: - buffer "6.0.3" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - shelljs@^0.8.3: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" @@ -7177,39 +3474,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -7219,13 +3488,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== - dependencies: - no-case "^2.2.0" - solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -7241,61 +3503,10 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@^0.8.21: - version "0.8.21" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.21.tgz#c3cd505c360ea2fa0eaa5ab574ef96bffb1a2766" - integrity sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg== - dependencies: - command-exists "^1.2.8" - commander "^8.1.0" - follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -solhint@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" - integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== - dependencies: - "@solidity-parser/parser" "^0.14.1" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" - optionalDependencies: - prettier "^1.14.3" - -solidity-comments-extractor@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" - integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== - -solidity-coverage@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" - integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== +solidity-coverage@^0.8.6-sha1.0: + version "0.8.6-sha1.0" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.6-sha1.0.tgz#95d211767013b16e27b1da3115c42d05649fc94f" + integrity sha512-BOkCMqt1XoElZgPSilFYf9jT5KPqcffEO/uopy0gUTVy5dtQvCKByKafM6n6RlJzWAYyD18/ZtcE45rUKOhdmA== dependencies: "@ethersproject/abi" "^5.0.9" "@solidity-parser/parser" "^0.16.0" @@ -7309,14 +3520,14 @@ solidity-coverage@^0.8.4: globby "^10.0.1" jsonschema "^1.2.4" lodash "^4.17.15" - mocha "7.1.2" + mocha "^10.2.0" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" semver "^7.3.4" + sha1 "^1.1.1" shelljs "^0.8.3" - web3-utils "^1.3.6" source-map-support@^0.5.13: version "0.5.21" @@ -7338,32 +3549,6 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -7374,21 +3559,6 @@ squirrelly@^8.0.8: resolved "https://registry.yarnpkg.com/squirrelly/-/squirrelly-8.0.8.tgz#d6704650b2170b8040d5de5bff9fa69cb62b5e0f" integrity sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -7401,36 +3571,17 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7438,15 +3589,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -7456,24 +3598,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -7488,13 +3612,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -7502,13 +3619,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -7516,18 +3626,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -7535,28 +3633,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-json-comments@2.0.1, strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -7590,31 +3671,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swap-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" - integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== - dependencies: - lower-case "^1.1.1" - upper-case "^1.1.1" - -swarm-js@^0.1.40: - version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" - integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^11.8.5" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - sync-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" @@ -7641,16 +3697,6 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - table@^6.8.0: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" @@ -7662,29 +3708,6 @@ table@^6.8.0: string-width "^4.2.3" strip-ansi "^6.0.1" -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - then-request@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" @@ -7702,36 +3725,13 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -title-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" - integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== - dependencies: - no-case "^2.2.0" - upper-case "^1.0.3" - -tmp@0.0.33, tmp@^0.0.33: +tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -7744,23 +3744,10 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-command-line-args@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" - integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" command-line-args "^5.1.1" @@ -7772,86 +3759,48 @@ ts-essentials@^7.0.1: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== +ts-node@^11.0.0-beta.1: + version "11.0.0-beta.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-11.0.0-beta.1.tgz#95c4916bf828615a6b9ac9a334135b66479e4f02" + integrity sha512-WMSROP+1pU22Q/Tm40mjfRg130yD8i0g6ROST04ZpocfH8sl1zD75ON4XQMcBEVViXMVemJBH0alflE7xePdRA== dependencies: "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" + "@tsconfig/node14" "*" + "@tsconfig/node16" "*" + "@tsconfig/node18" "*" + "@tsconfig/node20" "*" acorn "^8.4.1" acorn-walk "^8.1.1" arg "^4.1.0" - create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" v8-compile-cache-lib "^3.0.1" - yn "3.1.1" -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -7859,16 +3808,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -7879,28 +3823,10 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typechain@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" - integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: "@types/prettier" "^2.1.1" debug "^4.3.1" @@ -7913,22 +3839,15 @@ typechain@^8.1.1: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== typical@^4.0.0: version "4.0.0" @@ -7945,20 +3864,10 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.14.0: version "5.22.1" @@ -7967,40 +3876,21 @@ undici@^5.14.0: dependencies: busboy "^1.6.0" -undici@^5.4.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.13.0.tgz#56772fba89d8b25e39bddc8c26a438bd73ea69bb" - integrity sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q== - dependencies: - busboy "^1.6.0" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -upper-case-first@^1.1.0, upper-case-first@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" - integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== - dependencies: - upper-case "^1.1.1" - -upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -8008,661 +3898,29 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== - -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.0: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -walk-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-3.0.0.tgz#67f882925021e20569a1edd560b8da31da8d171c" - integrity sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw== - dependencies: - "@types/minimatch" "^3.0.4" - ensure-posix-path "^1.1.0" - matcher-collection "^2.0.1" - minimatch "^3.0.4" - -web3-bzz@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" - integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - -web3-bzz@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.1.tgz#81397be5ce262d03d82b92e9d8acc11f8a609ea1" - integrity sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - -web3-core-helpers@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" - integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== - dependencies: - web3-eth-iban "1.7.4" - web3-utils "1.7.4" - -web3-core-helpers@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz#7904747b23fd0afa4f2c86ed98ea9418ccad7672" - integrity sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw== - dependencies: - web3-eth-iban "1.8.1" - web3-utils "1.8.1" - -web3-core-method@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" - integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-utils "1.7.4" - -web3-core-method@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.1.tgz#0fc5a433a9fc784c447522f141c0a8e0163c7790" - integrity sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.8.1" - web3-core-promievent "1.8.1" - web3-core-subscriptions "1.8.1" - web3-utils "1.8.1" - -web3-core-promievent@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" - integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz#f334c8b2ceac6c2228f06d2a515f6d103157f036" - integrity sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" - integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== - dependencies: - util "^0.12.0" - web3-core-helpers "1.7.4" - web3-providers-http "1.7.4" - web3-providers-ipc "1.7.4" - web3-providers-ws "1.7.4" - -web3-core-requestmanager@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz#272ffa55b7b568ecbc8e4a257ca080355c31c60e" - integrity sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw== - dependencies: - util "^0.12.0" - web3-core-helpers "1.8.1" - web3-providers-http "1.8.1" - web3-providers-ipc "1.8.1" - web3-providers-ws "1.8.1" - -web3-core-subscriptions@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" - integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" - -web3-core-subscriptions@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz#f5ae1380e92746eadfab6475b8a70ef5a1be6bbf" - integrity sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.8.1" - -web3-core@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" - integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== - dependencies: - "@types/bn.js" "^5.1.0" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-requestmanager "1.7.4" - web3-utils "1.7.4" - -web3-core@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.1.tgz#050b1c408d1f9b7ae539e90f7f7d1b7a7d10578b" - integrity sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw== - dependencies: - "@types/bn.js" "^5.1.0" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-requestmanager "1.8.1" - web3-utils "1.8.1" - -web3-eth-abi@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" - integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.7.4" - -web3-eth-abi@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz#47455d6513217c4b0866fea6f97b1c4afa0b6535" - integrity sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.8.1" - -web3-eth-accounts@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" - integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== - dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.2" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" - -web3-eth-accounts@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz#1ce7387721f118aeb0376291e4d8bbe2ac323406" - integrity sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg== - dependencies: - "@ethereumjs/common" "2.5.0" - "@ethereumjs/tx" "3.3.2" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-utils "1.8.1" - -web3-eth-contract@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" - integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== - dependencies: - "@types/bn.js" "^5.1.0" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-utils "1.7.4" - -web3-eth-contract@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz#bdf3e33bbcb79a1b6144dffd6a0deefd2e459272" - integrity sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg== - dependencies: - "@types/bn.js" "^5.1.0" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-promievent "1.8.1" - web3-core-subscriptions "1.8.1" - web3-eth-abi "1.8.1" - web3-utils "1.8.1" - -web3-eth-ens@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" - integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-contract "1.7.4" - web3-utils "1.7.4" - -web3-eth-ens@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz#e78a9651fea8282abe8565b001819e2d645e5929" - integrity sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-promievent "1.8.1" - web3-eth-abi "1.8.1" - web3-eth-contract "1.8.1" - web3-utils "1.8.1" - -web3-eth-iban@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" - integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== - dependencies: - bn.js "^5.2.1" - web3-utils "1.7.4" - -web3-eth-iban@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz#c6484e5d68ca644aa78431301e7acd5df24598d1" - integrity sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg== - dependencies: - bn.js "^5.2.1" - web3-utils "1.8.1" - -web3-eth-personal@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" - integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-eth-personal@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz#00b5ff1898b62044d25ed5fddd8486168d4827cf" - integrity sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-net "1.8.1" - web3-utils "1.8.1" - -web3-eth@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" - integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== - dependencies: - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-accounts "1.7.4" - web3-eth-contract "1.7.4" - web3-eth-ens "1.7.4" - web3-eth-iban "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-eth@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.1.tgz#395f6cd56edaac5dbb23e8cec9886c3fd32c430e" - integrity sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg== - dependencies: - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-subscriptions "1.8.1" - web3-eth-abi "1.8.1" - web3-eth-accounts "1.8.1" - web3-eth-contract "1.8.1" - web3-eth-ens "1.8.1" - web3-eth-iban "1.8.1" - web3-eth-personal "1.8.1" - web3-net "1.8.1" - web3-utils "1.8.1" - -web3-net@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" - integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== - dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" - -web3-net@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.1.tgz#2bed4d4b93166724129ec33d0e5dea98880285f4" - integrity sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ== - dependencies: - web3-core "1.8.1" - web3-core-method "1.8.1" - web3-utils "1.8.1" - -web3-providers-http@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" - integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== - dependencies: - web3-core-helpers "1.7.4" - xhr2-cookies "1.1.0" - -web3-providers-http@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.1.tgz#8aa89c11a9272f11ddb74b871273c92225faa28d" - integrity sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg== - dependencies: - abortcontroller-polyfill "^1.7.3" - cross-fetch "^3.1.4" - es6-promise "^4.2.8" - web3-core-helpers "1.8.1" - -web3-providers-ipc@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" - integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.7.4" - -web3-providers-ipc@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz#6128a3a3a824d06bf0efcfe86325401f8691a5ca" - integrity sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.8.1" - -web3-providers-ws@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" - integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" - websocket "^1.0.32" - -web3-providers-ws@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz#5e5370e07eb8c615ed298ebc8602b283c7b7d649" - integrity sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.8.1" - websocket "^1.0.32" - -web3-shh@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" - integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== - dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-net "1.7.4" - -web3-shh@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.1.tgz#028a95cf9d3a36020380938b9a127610efbb9be7" - integrity sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g== - dependencies: - web3-core "1.8.1" - web3-core-method "1.8.1" - web3-core-subscriptions "1.8.1" - web3-net "1.8.1" - -web3-utils@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" - integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.8.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.2.5, web3-utils@^1.3.6: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" - integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" - integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== - dependencies: - web3-bzz "1.7.4" - web3-core "1.7.4" - web3-eth "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-shh "1.7.4" - web3-utils "1.7.4" - -web3@^1.2.5: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.1.tgz#8ea67215ef5f3a6f6d3381800b527242ea22885a" - integrity sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ== - dependencies: - web3-bzz "1.8.1" - web3-core "1.8.1" - web3-eth "1.8.1" - web3-eth-personal "1.8.1" - web3-net "1.8.1" - web3-shh "1.8.1" - web3-utils "1.8.1" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which-typed-array@^1.1.2: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: +which@^1.1.1, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -8685,23 +3943,6 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -8716,100 +3957,27 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -8819,41 +3987,16 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -8864,22 +4007,6 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - yargs@16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -8893,31 +4020,6 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 19ed1d3a8bf456c759e947be2007f9f3118ae8fa Mon Sep 17 00:00:00 2001 From: steven2308 Date: Wed, 10 Jan 2024 14:45:52 -0500 Subject: [PATCH 2/3] All test pass, several broken typings yet. --- contracts/mocks/OwnableMintableERC721Mock.sol | 19 +- test/behavior/catalog.ts | 16 +- test/behavior/equippableAssets.ts | 20 +- test/behavior/equippableParts.ts | 2 +- test/behavior/equippableSlots.ts | 24 +- test/behavior/erc721.ts | 5 +- test/behavior/mintingImpl.ts | 2 +- test/behavior/multiasset.ts | 26 +- test/behavior/nestable.ts | 32 +- test/behavior/royalties.ts | 2 +- test/bulkWriter.ts | 8 +- test/extensions/reclaimableChild.ts | 4 +- test/extensions/tokenAttributesRepository.ts | 3986 +++++++++-------- test/implementations/generalBehavior.ts | 10 +- test/implementations/lazyMintErc20Pay.ts | 10 +- .../implementations/lazyMintNativeTokenPay.ts | 76 +- test/implementations/premint.ts | 4 +- test/multiasset.ts | 4 +- test/nestable.ts | 10 +- test/renderUtils.ts | 34 +- test/royaltiesSplitter.ts | 20 +- test/setup/equippableSlots.ts | 6 +- test/utils.ts | 60 +- 23 files changed, 2257 insertions(+), 2123 deletions(-) diff --git a/contracts/mocks/OwnableMintableERC721Mock.sol b/contracts/mocks/OwnableMintableERC721Mock.sol index 5e934dc3..d47e88a2 100644 --- a/contracts/mocks/OwnableMintableERC721Mock.sol +++ b/contracts/mocks/OwnableMintableERC721Mock.sol @@ -5,11 +5,22 @@ pragma solidity ^0.8.21; /// @dev This mock smart contract is intended to be used with `@defi-wonderland/smock` and doesn't need any business /// logic. contract OwnableMintableERC721Mock { - function owner() public pure returns (address) { - return address(0); + + address private _mockOwner; + address private _mockOwnerOf; + + constructor ( + address mockOwner, address mockOwnerOf + ) { + _mockOwner = mockOwner; + _mockOwnerOf = mockOwnerOf; + } + + function owner() public view returns (address) { + return _mockOwner; } - function ownerOf(uint256) public pure returns (address) { - return address(0); + function ownerOf(uint256) public view returns (address) { + return _mockOwnerOf; } } diff --git a/test/behavior/catalog.ts b/test/behavior/catalog.ts index eb5a0e4e..9ebab839 100644 --- a/test/behavior/catalog.ts +++ b/test/behavior/catalog.ts @@ -10,9 +10,9 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string let addrs: SignerWithAddress[]; const metadataUriDefault = 'src'; - const noType = 0; - const slotType = 1; - const fixedType = 2; + const noType = 0n; + const slotType = 1n; + const fixedType = 2n; const sampleSlotPartData = { itemType: slotType, @@ -64,13 +64,13 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string const partId = 1; await testCatalog.addPart({ partId: partId, part: sampleFixedPartData }); - expect(await testCatalog.getPart(partId)).to.eql([2, 0, [], metadataUriDefault]); + expect(await testCatalog.getPart(partId)).to.eql([2n, 0n, [], metadataUriDefault]); }); it('can add slot part', async function () { const partId = 2; await testCatalog.addPart({ partId: partId, part: sampleSlotPartData }); - expect(await testCatalog.getPart(partId)).to.eql([1, 0, [], metadataUriDefault]); + expect(await testCatalog.getPart(partId)).to.eql([1n, 0n, [], metadataUriDefault]); }); it('can add parts list', async function () { @@ -93,8 +93,8 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string { partId: partId2, part: partData2 }, ]); expect(await testCatalog.getParts([partId, partId2])).to.eql([ - [slotType, 0, [], 'src1'], - [fixedType, 1, [], 'src2'], + [slotType, 0n, [], 'src1'], + [fixedType, 1n, [], 'src2'], ]); }); @@ -249,7 +249,7 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string await testCatalog.setEquippableToAll(partId); // This should reset it: - testCatalog.setEquippableAddresses(partId, [addrs[1].address]); + await testCatalog.setEquippableAddresses(partId, [addrs[1].address]); expect(await testCatalog.checkIsEquippableToAll(partId)).to.eql(false); }); diff --git a/test/behavior/equippableAssets.ts b/test/behavior/equippableAssets.ts index faf8cebc..3ec94777 100644 --- a/test/behavior/equippableAssets.ts +++ b/test/behavior/equippableAssets.ts @@ -338,10 +338,10 @@ async function shouldBehaveLikeEquippableAssets( .withArgs(tokenId, resId2, resId); expect(await chunkyEquip.getActiveAssets(tokenId)).to.be.eql([resId2]); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([0n]); // Replacements should be gone - expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(bn(0)); + expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(0n); }); it('can replace non existing asset to token, it could have been deleted', async function () { @@ -352,7 +352,7 @@ async function shouldBehaveLikeEquippableAssets( await chunkyEquip.acceptAsset(tokenId, 0, resId); expect(await chunkyEquip.getActiveAssets(tokenId)).to.be.eql([resId]); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.eql([bn(0)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.eql([0n]); }); }); @@ -384,7 +384,7 @@ async function shouldBehaveLikeEquippableAssets( await chunkyEquip.addAssetToToken(tokenId, resId2, resId); await chunkyEquip.rejectAsset(tokenId, 0, resId2); - expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(bn(0)); + expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(0n); }); it('can reject asset if approved', async function () { @@ -429,7 +429,7 @@ async function shouldBehaveLikeEquippableAssets( await chunkyEquip.addAssetToToken(tokenId, resId2, resId); await chunkyEquip.rejectAllAssets(tokenId, 1); - expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(bn(0)); + expect(await chunkyEquip.getAssetReplacements(tokenId, resId2)).to.eql(0n); }); it('can reject all pending assets at max capacity', async function () { @@ -446,7 +446,7 @@ async function shouldBehaveLikeEquippableAssets( } await chunkyEquip.rejectAllAssets(tokenId, 128); - expect(await chunkyEquip.getAssetReplacements(1, 2)).to.eql(bn(0)); + expect(await chunkyEquip.getAssetReplacements(1, 2)).to.eql(0n); }); it('can reject all assets if approved', async function () { @@ -509,11 +509,11 @@ async function shouldBehaveLikeEquippableAssets( it('can set and get priorities', async function () { const tokenId = await addAssetsToToken(); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([0n, bn(1)]); await expect(chunkyEquip.setPriority(tokenId, [1, 0])) .to.emit(chunkyEquip, 'AssetPrioritySet') .withArgs(tokenId); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), bn(0)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), 0n]); }); it('can set and get priorities if approved', async function () { @@ -522,11 +522,11 @@ async function shouldBehaveLikeEquippableAssets( await chunkyEquip.approveForAssets(await approvedAddress.getAddress(), tokenId); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([0n, bn(1)]); await expect(chunkyEquip.connect(approvedAddress).setPriority(tokenId, [1, 0])) .to.emit(chunkyEquip, 'AssetPrioritySet') .withArgs(tokenId); - expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), bn(0)]); + expect(await chunkyEquip.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), 0n]); }); it('cannot set priorities for non owned token', async function () { diff --git a/test/behavior/equippableParts.ts b/test/behavior/equippableParts.ts index 20a20bf2..f4093f2c 100644 --- a/test/behavior/equippableParts.ts +++ b/test/behavior/equippableParts.ts @@ -131,7 +131,7 @@ async function shouldBehaveLikeEquippableWithParts() { ); expect(allAssets).to.eql([ 'ipfs:neonRes/1', // metadataURI - bn(0), // equippableGroupId + 0n, // equippableGroupId await catalogContract.getAddress(), // catalogAddress, expectedFixedParts, expectedSlotParts, diff --git a/test/behavior/equippableSlots.ts b/test/behavior/equippableSlots.ts index 9c46b138..69ef6d5d 100644 --- a/test/behavior/equippableSlots.ts +++ b/test/behavior/equippableSlots.ts @@ -237,7 +237,7 @@ async function shouldBehaveLikeEquippableWithSlots( }); it('cannot set a valid equippable group with part id 0', async function () { - const equippableGroupId = 1; + const equippableGroupId = 1n; const partId = 0; // The malicious child indicates it can be equipped into soldier: await expect( @@ -610,7 +610,7 @@ async function shouldBehaveLikeEquippableWithSlots( const expectedFixedParts = [ [ bn(partIdForBody), // partId - 1, // z + 1n, // z 'genericBody.png', // metadataURI ], ]; @@ -618,7 +618,7 @@ async function shouldBehaveLikeEquippableWithSlots( [ bn(partIdForWeapon), // partId bn(weaponAssetsEquip[0]), // childAssetId - 2, // z + 2n, // z await weapon.getAddress(), // childAddress weaponsIds[0], // childTokenId 'ipfs:weapon/equip/5', // childAssetMetadata @@ -627,10 +627,10 @@ async function shouldBehaveLikeEquippableWithSlots( [ // Nothing on equipped on background slot: bn(partIdForBackground), // partId - bn(0), // childAssetId - 0, // z + 0n, // childAssetId + 0n, // z ethers.ZeroAddress, // childAddress - bn(0), // childTokenId + 0n, // childTokenId '', // childAssetMetadata 'noBackground.png', // partMetadata ], @@ -642,7 +642,7 @@ async function shouldBehaveLikeEquippableWithSlots( ); expect(allAssets).to.eql([ 'ipfs:soldier/', // metadataURI - bn(0), // equippableGroupId + 0n, // equippableGroupId await catalog.getAddress(), // catalogAddress expectedFixedParts, expectedSlotParts, @@ -683,8 +683,8 @@ async function shouldBehaveLikeEquippableWithSlots( [ expectedSlots, [ - [bn(0), bn(0), bn(0), ethers.ZeroAddress], - [bn(0), bn(0), bn(0), ethers.ZeroAddress], + [0n, 0n, 0n, ethers.ZeroAddress], + [0n, 0n, 0n, ethers.ZeroAddress], ], ['', ''], ], @@ -708,7 +708,7 @@ async function shouldBehaveLikeEquippableWithSlots( // If a slot has nothing equipped, it returns an empty equip: const expectedEquips = [ [bn(soldierResId), bn(weaponResId), weaponsIds[0], await weapon.getAddress()], - [bn(0), bn(0), bn(0), ethers.ZeroAddress], + [0n, 0n, 0n, ethers.ZeroAddress], ]; const expectedMetadata = ['ipfs:weapon/equip/5', '']; expect(await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId)).to.eql( @@ -736,8 +736,8 @@ async function shouldBehaveLikeEquippableWithSlots( const expectedSlots = [bn(partIdForWeapon), bn(partIdForBackground)]; // If a slot has nothing equipped, it returns an empty equip: const expectedEquips = [ - [bn(0), bn(0), bn(0), ethers.ZeroAddress], - [bn(0), bn(0), bn(0), ethers.ZeroAddress], + [0n, 0n, 0n, ethers.ZeroAddress], + [0n, 0n, 0n, ethers.ZeroAddress], ]; const expectedMetadata = ['', '']; expect(await view.getEquipped(await soldier.getAddress(), soldiersIds[0], soldierResId)).to.eql( diff --git a/test/behavior/erc721.ts b/test/behavior/erc721.ts index e7f01000..4ed8a667 100644 --- a/test/behavior/erc721.ts +++ b/test/behavior/erc721.ts @@ -3,6 +3,7 @@ import { ethers } from 'hardhat'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { Contract, ContractTransaction } from 'ethers'; import { bn } from '../utils'; +import { RMRKNestableLazyMintErc20 } from '../../typechain-types'; // Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/test/token/ERC721/ERC721.behavior.js @@ -58,7 +59,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the given address does not own any tokens', function () { it('returns 0', async function () { - expect(await this.token.balanceOf(others[0].address)).to.eql(bn(0)); + expect(await this.token.balanceOf(others[0].address)).to.eql(0n); }); }); @@ -225,7 +226,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('when the sender is not authorized for the token id', function () { it('reverts', async function () { // Standard ERC721 will use the latter. Every Nestable would have it defined and use it instead - const error = this.token.interface.errors['RMRKNotApprovedOrDirectOwner()'] + const error = this.token.interface.getError('RMRKNotApprovedOrDirectOwner()') ? 'RMRKNotApprovedOrDirectOwner' : 'ERC721NotApprovedOrOwner'; await expect( diff --git a/test/behavior/mintingImpl.ts b/test/behavior/mintingImpl.ts index 6803c515..d09e1a95 100644 --- a/test/behavior/mintingImpl.ts +++ b/test/behavior/mintingImpl.ts @@ -12,7 +12,7 @@ async function shouldControlValidMinting(): Promise { }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.parseEther('0.05'); + const HALF_ETH = ONE_ETH / 2n; await expect( this.token.mint(addrs[0].address, 1, { value: HALF_ETH }), ).to.be.revertedWithCustomError(this.token, 'RMRKWrongValueSent'); diff --git a/test/behavior/multiasset.ts b/test/behavior/multiasset.ts index 75f54824..e95fcdee 100644 --- a/test/behavior/multiasset.ts +++ b/test/behavior/multiasset.ts @@ -145,10 +145,10 @@ async function shouldBehaveLikeMultiAsset( .withArgs(tokenId, resId3, resId2); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId, resId3]); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([0n, bn(1)]); // Replacements should be gone - expect(await this.token.getAssetReplacements(tokenId, resId3)).to.eql(bn(0)); + expect(await this.token.getAssetReplacements(tokenId, resId3)).to.eql(0n); }); it('can replace non existing asset to token, it could have been deleted', async function () { @@ -158,7 +158,7 @@ async function shouldBehaveLikeMultiAsset( await this.token.connect(tokenOwner).acceptAsset(tokenId, 0, resId); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId]); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([0n]); }); it('can reject asset and replacements are cleared', async function () { @@ -170,7 +170,7 @@ async function shouldBehaveLikeMultiAsset( await addAssetToTokenFunc(this.token, tokenId, resId2, resId); await this.token.connect(tokenOwner).rejectAsset(tokenId, 0, resId2); - expect(await this.token.getAssetReplacements(tokenId, resId2)).to.eql(bn(0)); + expect(await this.token.getAssetReplacements(tokenId, resId2)).to.eql(0n); }); it('can reject all assets and replacements are cleared', async function () { @@ -182,7 +182,7 @@ async function shouldBehaveLikeMultiAsset( await addAssetToTokenFunc(this.token, tokenId, resId2, resId); await this.token.connect(tokenOwner).rejectAllAssets(tokenId, 1); - expect(await this.token.getAssetReplacements(tokenId, resId2)).to.eql(bn(0)); + expect(await this.token.getAssetReplacements(tokenId, resId2)).to.eql(0n); }); }); }); @@ -207,8 +207,8 @@ async function shouldBehaveLikeMultiAsset( expect( await this.renderUtils.getPendingAssets(await this.token.getAddress(), tokenId), ).to.eql([ - [resId1, bn(0), bn(0), resData1], - [resId2, bn(1), bn(0), resData2], + [resId1, 0n, 0n, resData1], + [resId2, bn(1), 0n, resData2], ]); await expect(this.token.connect(tokenOwner).acceptAsset(tokenId, 0, resId1)) @@ -217,7 +217,7 @@ async function shouldBehaveLikeMultiAsset( expect( await this.renderUtils.getPendingAssets(await this.token.getAddress(), tokenId), - ).to.eql([[resId2, bn(0), bn(0), resData2]]); + ).to.eql([[resId2, 0n, 0n, resData2]]); expect(await this.token.getActiveAssets(tokenId)).to.be.eql([resId1]); expect(await this.token.getAssetMetadata(tokenId, resId1)).equal(resData1); }); @@ -384,12 +384,12 @@ async function shouldBehaveLikeMultiAsset( describe('Priorities', async function () { it('can set and get priorities', async function () { - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([0n, bn(1)]); await expect(this.token.connect(tokenOwner).setPriority(tokenId, [1, 0])) .to.emit(this.token, 'AssetPrioritySet') .withArgs(tokenId); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), bn(0)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), 0n]); }); it('can set and get priorities if approved', async function () { @@ -400,7 +400,7 @@ async function shouldBehaveLikeMultiAsset( await expect(this.token.connect(approved).setPriority(tokenId, [1, 0])) .to.emit(this.token, 'AssetPrioritySet') .withArgs(tokenId); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), bn(0)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), 0n]); }); it('can set and get priorities if approved for all', async function () { @@ -408,11 +408,11 @@ async function shouldBehaveLikeMultiAsset( .connect(tokenOwner) .setApprovalForAllForAssets(await operator.getAddress(), true); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(0), bn(1)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([0n, bn(1)]); await expect(this.token.connect(operator).setPriority(tokenId, [1, 0])) .to.emit(this.token, 'AssetPrioritySet') .withArgs(tokenId); - expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), bn(0)]); + expect(await this.token.getActiveAssetPriorities(tokenId)).to.be.eql([bn(1), 0n]); }); it('cannot set priorities for non owned token', async function () { diff --git a/test/behavior/nestable.ts b/test/behavior/nestable.ts index 7868f640..7ed10ba2 100644 --- a/test/behavior/nestable.ts +++ b/test/behavior/nestable.ts @@ -40,11 +40,7 @@ async function shouldBehaveLikeNestable( it('can mint with no destination', async function () { const tokenId = await mint(child, await tokenOwner.getAddress()); expect(await child.ownerOf(tokenId)).to.equal(await tokenOwner.getAddress()); - expect(await child.directOwnerOf(tokenId)).to.eql([ - await tokenOwner.getAddress(), - bn(0), - false, - ]); + expect(await child.directOwnerOf(tokenId)).to.eql([await tokenOwner.getAddress(), 0n, false]); }); it('has right owners', async function () { @@ -75,7 +71,7 @@ async function shouldBehaveLikeNestable( it('cannot nest mint to a non-contract destination', async function () { await expect( - nestMint(child, await tokenOwner.getAddress(), bn(0)), + nestMint(child, await tokenOwner.getAddress(), 0n), ).to.be.revertedWithCustomError(child, 'RMRKIsNotContract'); }); @@ -125,7 +121,7 @@ async function shouldBehaveLikeNestable( // RMRK owner is an address for the parent expect(await parent.directOwnerOf(parentId)).to.eql([ await tokenOwner.getAddress(), - bn(0), + 0n, false, ]); // RMRK owner is a contract for the child @@ -699,11 +695,7 @@ async function shouldBehaveLikeNestable( // New owner of child expect(await child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); - expect(await child.directOwnerOf(childId)).to.eql([ - await tokenOwner.getAddress(), - bn(0), - false, - ]); + expect(await child.directOwnerOf(childId)).to.eql([await tokenOwner.getAddress(), 0n, false]); // Grandchild is still owned by child expect(await child.ownerOf(grandchildId)).to.eql(await tokenOwner.getAddress()); @@ -739,7 +731,7 @@ async function shouldBehaveLikeNestable( rootOwnerAddress = await tokenOwner.getAddress(); } expect(await child.ownerOf(childId)).to.eql(rootOwnerAddress); - expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, bn(0), false]); + expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, 0n, false]); // Transferring updates balances downstream expect(await child.balanceOf(rootOwnerAddress)).to.equal(1); @@ -927,11 +919,7 @@ async function shouldBehaveLikeNestable( // New owner of child expect(await child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); - expect(await child.directOwnerOf(childId)).to.eql([ - await tokenOwner.getAddress(), - bn(0), - false, - ]); + expect(await child.directOwnerOf(childId)).to.eql([await tokenOwner.getAddress(), 0n, false]); // Grandchild is still owned by child expect(await child.ownerOf(grandchildId)).to.eql(await tokenOwner.getAddress()); @@ -967,7 +955,7 @@ async function shouldBehaveLikeNestable( rootOwnerAddress = await tokenOwner.getAddress(); } expect(await child.ownerOf(childId)).to.eql(rootOwnerAddress); - expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, bn(0), false]); + expect(await child.directOwnerOf(childId)).to.eql([rootOwnerAddress, 0n, false]); // transferring updates balances downstream expect(await child.balanceOf(rootOwnerAddress)).to.equal(1); @@ -1030,11 +1018,7 @@ async function shouldBehaveLikeNestable( expect(await parent.balanceOf(await newOwner.getAddress())).to.equal(1); expect(await parent.ownerOf(parentId)).to.eql(await newOwner.getAddress()); - expect(await parent.directOwnerOf(parentId)).to.eql([ - await newOwner.getAddress(), - bn(0), - false, - ]); + expect(await parent.directOwnerOf(parentId)).to.eql([await newOwner.getAddress(), 0n, false]); // New owner of child expect(await child.ownerOf(childId)).to.eql(await newOwner.getAddress()); diff --git a/test/behavior/royalties.ts b/test/behavior/royalties.ts index 6829a22d..2a066ca3 100644 --- a/test/behavior/royalties.ts +++ b/test/behavior/royalties.ts @@ -9,7 +9,7 @@ async function shouldHaveRoyalties( it('can get royalty data', async function () { const owner = (await ethers.getSigners())[0]; const tokenId = await mint(this.token, await owner.getAddress()); - expect(await this.token.royaltyInfo(tokenId, ONE_ETH.mul(10))).to.eql([ADDRESS_ZERO, ONE_ETH]); + expect(await this.token.royaltyInfo(tokenId, ONE_ETH * 10n)).to.eql([ADDRESS_ZERO, ONE_ETH]); }); it('can get royalty receipient and % in basis points', async function () { diff --git a/test/bulkWriter.ts b/test/bulkWriter.ts index 7ffd3a04..a4101a9f 100644 --- a/test/bulkWriter.ts +++ b/test/bulkWriter.ts @@ -173,7 +173,7 @@ describe('Advanced Equip Render Utils', async function () { expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), - ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + ).to.eql([0n, 0n, 0n, ADDRESS_ZERO]); expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); @@ -198,7 +198,7 @@ describe('Advanced Equip Render Utils', async function () { expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), - ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + ).to.eql([0n, 0n, 0n, ADDRESS_ZERO]); }); it('can use bulk with only equip operations', async function () { @@ -383,7 +383,7 @@ describe('Advanced Equip Render Utils', async function () { expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), - ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + ).to.eql([0n, 0n, 0n, ADDRESS_ZERO]); expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemMid), ).to.eql([bn(assetForKanariaFull), bn(assetForGemAMid), gemId2, await gem.getAddress()]); @@ -407,7 +407,7 @@ describe('Advanced Equip Render Utils', async function () { expect( await kanaria.getEquipment(kanariaId, await catalog.getAddress(), slotIdGemLeft), - ).to.eql([bn(0), bn(0), bn(0), ADDRESS_ZERO]); + ).to.eql([0n, 0n, 0n, ADDRESS_ZERO]); }); it('can use bulk with only equip operations', async function () { diff --git a/test/extensions/reclaimableChild.ts b/test/extensions/reclaimableChild.ts index a35aa01a..0736ceac 100644 --- a/test/extensions/reclaimableChild.ts +++ b/test/extensions/reclaimableChild.ts @@ -85,7 +85,7 @@ async function shouldBehaveLikeReclaimableChild() { expect(await this.child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); expect(await this.child.directOwnerOf(childId)).to.eql([ await tokenOwner.getAddress(), - bn(0), + 0n, false, ]); }); @@ -185,7 +185,7 @@ async function shouldBehaveLikeReclaimableChild() { expect(await this.child.ownerOf(childId)).to.eql(await tokenOwner.getAddress()); expect(await this.child.directOwnerOf(childId)).to.eql([ await tokenOwner.getAddress(), - bn(0), + 0n, false, ]); }); diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 098b9763..a9fc3c67 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -1,1947 +1,2039 @@ -// import { ethers } from 'hardhat'; -// import { expect } from 'chai'; -// import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; -// import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -// import { IERC165, IERC7508 } from '../interfaces'; -// import { OwnableMintableERC721Mock, RMRKTokenAttributesRepository } from '../../typechain-types'; -// import { bn } from '../utils'; -// import { smock, FakeContract } from '@defi-wonderland/smock'; - -// // --------------- FIXTURES ----------------------- - -// async function tokenAttributesFixture() { -// const factory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); -// const tokenAttributes = await factory.deploy(); -// await tokenAttributes.waitForDeployment(); - -// return { tokenAttributes }; -// } - -// async function ownedCollectionFixture() { -// const ownedCollection = await smock.fake('OwnableMintableERC721Mock'); - -// return { ownedCollection }; -// } - -// // --------------- TESTS ----------------------- - -// describe('RMRKTokenAttributesRepository', async function () { -// let tokenAttributes: RMRKTokenAttributesRepository; -// let ownedCollection: FakeContract; - -// beforeEach(async function () { -// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); -// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - -// this.tokenAttributes = tokenAttributes; -// this.ownedCollection = ownedCollection; -// }); - -// shouldBehaveLikeTokenAttributesRepositoryInterface(); - -// describe('RMRKTokenAttributesRepository', async function () { -// let issuer: SignerWithAddress; -// let owner: SignerWithAddress; -// const tokenId = 1; -// const tokenId2 = 2; - -// beforeEach(async function () { -// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); -// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - -// const signers = await ethers.getSigners(); -// issuer = signers[0]; -// owner = signers[1]; - -// ownedCollection.owner.returns(await issuer.getAddress()); - -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); -// }); - -// it('can set and get token attributes', async function () { -// expect( -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description', -// 'test description', -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'description', 'test description'); -// expect( -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description1', -// 'test description', -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'description1', 'test description'); -// expect( -// await tokenAttributes.setBoolAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'rare', -// true, -// ), -// ) -// .to.emit(tokenAttributes, 'BoolAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'rare', true); -// expect( -// await tokenAttributes.setAddressAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'owner', -// await owner.getAddress(), -// ), -// ) -// .to.emit(tokenAttributes, 'AddressAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'owner', await owner.getAddress()); -// expect( -// await tokenAttributes.setUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'atk', -// bn(100), -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'atk', bn(100)); -// expect( -// await tokenAttributes.setUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'health', -// bn(100), -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(100)); -// expect( -// await tokenAttributes.setUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'health', -// bn(95), -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(95)); -// expect( -// await tokenAttributes.setUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'health', -// bn(80), -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'health', bn(80)); -// expect( -// await tokenAttributes.setBytesAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'data', -// '0x1234', -// ), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeSet') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'data', '0x1234'); - -// expect( -// await tokenAttributes.getStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description', -// ), -// ).to.eql('test description'); -// expect( -// await tokenAttributes.getStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description1', -// ), -// ).to.eql('test description'); -// expect( -// await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'rare'), -// ).to.eql(true); -// expect( -// await tokenAttributes.getAddressAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'owner', -// ), -// ).to.eql(await owner.getAddress()); -// expect( -// await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'atk'), -// ).to.eql(bn(100)); -// expect( -// await tokenAttributes.getUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'health', -// ), -// ).to.eql(bn(80)); -// expect( -// await tokenAttributes.getBytesAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'data', -// ), -// ).to.eql('0x1234'); - -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description', -// 'test description update', -// ); -// expect( -// await tokenAttributes.getStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'description', -// ), -// ).to.eql('test description update'); -// }); - -// it('can set multiple attributes of multiple types at the same time', async function () { -// await expect( -// tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [ -// { key: 'string1', value: 'value1' }, -// { key: 'string2', value: 'value2' }, -// ], -// [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ], -// [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ], -// [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ], -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs( -// await ownedCollection.getAddress(), -// tokenId, -// 'address2', -// await issuer.getAddress(), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); -// }); - -// it('can update multiple attributes of multiple types at the same time', async function () { -// await tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [ -// { key: 'string1', value: 'value0' }, -// { key: 'string2', value: 'value1' }, -// ], -// [ -// { key: 'uint1', value: bn(0) }, -// { key: 'uint2', value: bn(1) }, -// ], -// [ -// { key: 'bool1', value: false }, -// { key: 'bool2', value: true }, -// ], -// [ -// { key: 'address1', value: await issuer.getAddress() }, -// { key: 'address2', value: await owner.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x5678' }, -// { key: 'bytes2', value: '0x1234' }, -// ], -// ); - -// await expect( -// tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [ -// { key: 'string1', value: 'value1' }, -// { key: 'string2', value: 'value2' }, -// ], -// [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ], -// [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ], -// [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ], -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs( -// await ownedCollection.getAddress(), -// tokenId, -// 'address2', -// await issuer.getAddress(), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); -// }); - -// it('can set and update multiple attributes of multiple types at the same time even if not all types are updated at the same time', async function () { -// await tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [{ key: 'string1', value: 'value0' }], -// [ -// { key: 'uint1', value: bn(0) }, -// { key: 'uint2', value: bn(1) }, -// ], -// [ -// { key: 'bool1', value: false }, -// { key: 'bool2', value: true }, -// ], -// [ -// { key: 'address1', value: await issuer.getAddress() }, -// { key: 'address2', value: await owner.getAddress() }, -// ], -// [], -// ); - -// await expect( -// tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ], -// [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ], -// [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ], -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs( -// await ownedCollection.getAddress(), -// tokenId, -// 'address2', -// await issuer.getAddress(), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); - -// await expect( -// tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// [], -// [ -// { key: 'bool1', value: false }, -// { key: 'bool2', value: true }, -// ], -// [], -// [], -// ), -// ) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', false) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', true); -// }); - -// it('can set and update multiple attributes of multiple types at the same time', async function () { -// await expect( -// tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [ -// { key: 'string1', value: 'value1' }, -// { key: 'string2', value: 'value2' }, -// ], -// [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ], -// [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ], -// [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ], -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs( -// await ownedCollection.getAddress(), -// tokenId, -// 'address2', -// await issuer.getAddress(), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); -// }); - -// it('should allow to retrieve multiple attributes at once', async function () { -// await tokenAttributes.setAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [ -// { key: 'string1', value: 'value1' }, -// { key: 'string2', value: 'value2' }, -// ], -// [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ], -// [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ], -// [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ], -// [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ], -// ); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// ['string1', 'string2'], -// ['uint1', 'uint2'], -// ['bool1', 'bool2'], -// ['address1', 'address2'], -// ['bytes1', 'bytes2'], -// ), -// ).to.eql([ -// [ -// ['string1', 'value1'], -// ['string2', 'value2'], -// ], -// [ -// ['uint1', bn(1)], -// ['uint2', bn(2)], -// ], -// [ -// ['bool1', true], -// ['bool2', false], -// ], -// [ -// ['address1', await owner.getAddress()], -// ['address2', await issuer.getAddress()], -// ], -// [ -// ['bytes1', '0x1234'], -// ['bytes2', '0x5678'], -// ], -// ]); -// }); - -// it('can set multiple string attributes at the same time', async function () { -// await expect( -// tokenAttributes.setStringAttributes(await ownedCollection.getAddress(), tokenId, [ -// { key: 'string1', value: 'value1' }, -// { key: 'string2', value: 'value2' }, -// ]), -// ) -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2'); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// ['string1', 'string2'], -// [], -// [], -// [], -// [], -// ), -// ).to.eql([ -// [ -// ['string1', 'value1'], -// ['string2', 'value2'], -// ], -// [], -// [], -// [], -// [], -// ]); -// }); - -// it('can set multiple uint attributes at the same time', async function () { -// await expect( -// tokenAttributes.setUintAttributes(await ownedCollection.getAddress(), tokenId, [ -// { key: 'uint1', value: bn(1) }, -// { key: 'uint2', value: bn(2) }, -// ]), -// ) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', bn(1)) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', bn(2)); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// ['uint1', 'uint2'], -// [], -// [], -// [], -// ), -// ).to.eql([ -// [], -// [ -// ['uint1', bn(1)], -// ['uint2', bn(2)], -// ], -// [], -// [], -// [], -// ]); -// }); - -// it('can set multiple bool attributes at the same time', async function () { -// await expect( -// tokenAttributes.setBoolAttributes(await ownedCollection.getAddress(), tokenId, [ -// { key: 'bool1', value: true }, -// { key: 'bool2', value: false }, -// ]), -// ) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// [], -// ['bool1', 'bool2'], -// [], -// [], -// ), -// ).to.eql([ -// [], -// [], -// [ -// ['bool1', true], -// ['bool2', false], -// ], -// [], -// [], -// ]); -// }); - -// it('can set multiple address attributes at the same time', async function () { -// await expect( -// tokenAttributes.setAddressAttributes(await ownedCollection.getAddress(), tokenId, [ -// { key: 'address1', value: await owner.getAddress() }, -// { key: 'address2', value: await issuer.getAddress() }, -// ]), -// ) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', await owner.getAddress()) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs( -// await ownedCollection.getAddress(), -// tokenId, -// 'address2', -// await issuer.getAddress(), -// ); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// [], -// [], -// ['address1', 'address2'], -// [], -// ), -// ).to.eql([ -// [], -// [], -// [], -// [ -// ['address1', await owner.getAddress()], -// ['address2', await issuer.getAddress()], -// ], -// [], -// ]); -// }); - -// it('can set multiple bytes attributes at the same time', async function () { -// await expect( -// tokenAttributes.setBytesAttributes(await ownedCollection.getAddress(), tokenId, [ -// { key: 'bytes1', value: '0x1234' }, -// { key: 'bytes2', value: '0x5678' }, -// ]), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); - -// expect( -// await tokenAttributes.getAttributes( -// await ownedCollection.getAddress(), -// tokenId, -// [], -// [], -// [], -// [], -// ['bytes1', 'bytes2'], -// ), -// ).to.eql([ -// [], -// [], -// [], -// [], -// [ -// ['bytes1', '0x1234'], -// ['bytes2', '0x5678'], -// ], -// ]); -// }); - -// it('can reuse keys and values are fine', async function () { -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// 'X1', -// ); -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId2, -// 'X', -// 'X2', -// ); - -// expect( -// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql('X1'); -// expect( -// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), -// ).to.eql('X2'); -// }); - -// it('can reuse keys among different attributes and values are fine', async function () { -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// 'test description', -// ); -// await tokenAttributes.setBoolAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// true, -// ); -// await tokenAttributes.setAddressAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// await owner.getAddress(), -// ); -// await tokenAttributes.setUintAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// bn(100), -// ); -// await tokenAttributes.setBytesAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// '0x1234', -// ); - -// expect( -// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql('test description'); -// expect( -// await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql(true); -// expect( -// await tokenAttributes.getAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql(await owner.getAddress()); -// expect( -// await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql(bn(100)); -// expect( -// await tokenAttributes.getBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql('0x1234'); -// }); - -// it('can reuse string values and values are fine', async function () { -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// 'common string', -// ); -// await tokenAttributes.setStringAttribute( -// await ownedCollection.getAddress(), -// tokenId2, -// 'X', -// 'common string', -// ); - -// expect( -// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), -// ).to.eql('common string'); -// expect( -// await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), -// ).to.eql('common string'); -// }); - -// it('should not allow to set string values to unauthorized caller', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .setStringAttribute(await ownedCollection.getAddress(), tokenId, 'X', 'test description'), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to set uint values to unauthorized caller', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .setUintAttribute(await ownedCollection.getAddress(), tokenId, 'X', bn(42)), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to set boolean values to unauthorized caller', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .setBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X', true), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to set address values to unauthorized caller', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// tokenId, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to set bytes values to unauthorized caller', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .setBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X', '0x1234'), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); -// }); - -// describe('Token attributes access control', async function () { -// let issuer: SignerWithAddress; -// let owner: SignerWithAddress; -// const tokenId = 1; -// const tokenId2 = 2; - -// beforeEach(async function () { -// ({ tokenAttributes } = await loadFixture(tokenAttributesFixture)); -// ({ ownedCollection } = await loadFixture(ownedCollectionFixture)); - -// const signers = await ethers.getSigners(); -// issuer = signers[0]; -// owner = signers[1]; - -// ownedCollection.owner.returns(await issuer.getAddress()); -// }); - -// it('should not allow registering an already registered collection', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await expect( -// tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionAlreadyRegistered'); -// }); - -// it('should not allow to register a collection if caller is not the owner of the collection', async function () { -// await expect( -// tokenAttributes -// .connect(owner) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// true, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to register a collection without Ownable implemented', async function () { -// ownedCollection.owner.reset(); - -// await expect( -// tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'OwnableNotImplemented'); -// }); - -// it('should allow to manage access control for registered collections', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// expect( -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl( -// await ownedCollection.getAddress(), -// 'X', -// 2, -// await owner.getAddress(), -// ), -// ) -// .to.emit(tokenAttributes, 'AccessControlUpdate') -// .withArgs(await ownedCollection.getAddress(), 'X', 2, owner); -// }); - -// it('should allow issuer to manage collaborators', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// expect( -// await tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ), -// ) -// .to.emit(tokenAttributes, 'CollaboratorUpdate') -// .withArgs(await ownedCollection.getAddress(), [await owner.getAddress()], [true]); -// }); - -// it('should not allow to manage collaborators of an unregistered collection', async function () { -// await expect( -// tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); -// }); - -// it('should not allow to manage collaborators if the caller is not the issuer', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await expect( -// tokenAttributes -// .connect(owner) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await expect( -// tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress(), await issuer.getAddress()], -// [true], -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'CollaboratorArraysNotEqualLength'); -// }); - -// it('should not allow to manage access control for unregistered collections', async function () { -// await expect( -// tokenAttributes -// .connect(issuer) -// .manageAccessControl( -// await ownedCollection.getAddress(), -// 'X', -// 2, -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); -// }); - -// it('should not allow to manage access control if the caller is not issuer', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await expect( -// tokenAttributes -// .connect(owner) -// .manageAccessControl( -// await ownedCollection.getAddress(), -// 'X', -// 2, -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// true, -// ); - -// await expect( -// tokenAttributes -// .connect(owner) -// .manageAccessControl( -// await ownedCollection.getAddress(), -// 'X', -// 2, -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should return the expected value when checking for collaborators', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// expect( -// await tokenAttributes.isCollaborator( -// await owner.getAddress(), -// await ownedCollection.getAddress(), -// ), -// ).to.be.false; - -// await tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ); - -// expect( -// await tokenAttributes.isCollaborator( -// await owner.getAddress(), -// await ownedCollection.getAddress(), -// ), -// ).to.be.true; -// }); - -// it('should return the expected value when checking for specific addresses', async function () { -// await tokenAttributes.registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// expect( -// await tokenAttributes.isSpecificAddress( -// await owner.getAddress(), -// await ownedCollection.getAddress(), -// 'X', -// ), -// ).to.be.false; - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, await owner.getAddress()); - -// expect( -// await tokenAttributes.isSpecificAddress( -// await owner.getAddress(), -// await ownedCollection.getAddress(), -// 'X', -// ), -// ).to.be.true; -// }); - -// it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl(await ownedCollection.getAddress(), await issuer.getAddress(), true); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 0, ethers.ZeroAddress); - -// await expect( -// tokenAttributes -// .connect(owner) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); - -// ownedCollection.owner.returns(await owner.getAddress()); - -// await expect( -// tokenAttributes -// .connect(issuer) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); - -// it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 1, ethers.ZeroAddress); - -// await tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ); - -// await tokenAttributes -// .connect(owner) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); - -// await expect( -// tokenAttributes -// .connect(issuer) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); -// }); - -// it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, ethers.ZeroAddress); - -// await tokenAttributes -// .connect(issuer) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); - -// await expect( -// tokenAttributes -// .connect(owner) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); - -// await tokenAttributes -// .connect(issuer) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await owner.getAddress()], -// [true], -// ); - -// await tokenAttributes -// .connect(owner) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); -// }); - -// it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl(await ownedCollection.getAddress(), await issuer.getAddress(), true); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 2, ethers.ZeroAddress); - -// ownedCollection.owner.returns(await owner.getAddress()); - -// await tokenAttributes -// .connect(owner) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); - -// await expect( -// tokenAttributes -// .connect(issuer) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); - -// await tokenAttributes -// .connect(owner) -// .manageCollaborators( -// await ownedCollection.getAddress(), -// [await issuer.getAddress()], -// [true], -// ); - -// await tokenAttributes -// .connect(issuer) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); -// }); - -// it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 3, ethers.ZeroAddress); - -// await expect( -// tokenAttributes -// .connect(owner) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); - -// ownedCollection.ownerOf.returns(await owner.getAddress()); - -// await tokenAttributes -// .connect(owner) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); - -// await expect( -// tokenAttributes -// .connect(issuer) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); -// }); - -// it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 4, ethers.ZeroAddress); - -// await expect( -// tokenAttributes -// .connect(owner) -// .setAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotSpecificAddress'); - -// await tokenAttributes -// .connect(issuer) -// .manageAccessControl(await ownedCollection.getAddress(), 'X', 4, await owner.getAddress()); - -// await tokenAttributes -// .connect(owner) -// .setAddressAttribute(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); -// }); - -// it('should allow to use presigned message to modify the parameters', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// ); -// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// ); -// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// ); -// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// ); -// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// ); - -// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); -// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); -// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); -// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); -// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); - -// const uintR: string = uintSignature.substring(0, 66); -// const uintS: string = '0x' + uintSignature.substring(66, 130); -// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - -// const stringR: string = stringSignature.substring(0, 66); -// const stringS: string = '0x' + stringSignature.substring(66, 130); -// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - -// const boolR: string = boolSignature.substring(0, 66); -// const boolS: string = '0x' + boolSignature.substring(66, 130); -// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - -// const bytesR: string = bytesSignature.substring(0, 66); -// const bytesS: string = '0x' + bytesSignature.substring(66, 130); -// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - -// const addressR: string = addressSignature.substring(0, 66); -// const addressS: string = '0x' + addressSignature.substring(66, 130); -// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetUintAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// uintV, -// uintR, -// uintS, -// ), -// ) -// .to.emit(tokenAttributes, 'UintAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), 1, 'X', 1); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetStringAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// stringV, -// stringR, -// stringS, -// ), -// ) -// .to.emit(tokenAttributes, 'StringAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), 1, 'X', 'test'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBoolAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// boolV, -// boolR, -// boolS, -// ), -// ) -// .to.emit(tokenAttributes, 'BoolAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), 1, 'X', true); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBytesAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// bytesV, -// bytesR, -// bytesS, -// ), -// ) -// .to.emit(tokenAttributes, 'BytesAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), 1, 'X', '0x1234'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetAddressAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// addressV, -// addressR, -// addressS, -// ), -// ) -// .to.emit(tokenAttributes, 'AddressAttributeUpdated') -// .withArgs(await ownedCollection.getAddress(), 1, 'X', await owner.getAddress()); -// }); - -// it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// await mine(1000, { interval: 15 }); - -// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(10), -// ); -// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(10), -// ); -// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(10), -// ); -// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(10), -// ); -// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(10), -// ); - -// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); -// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); -// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); -// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); -// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); - -// const uintR: string = uintSignature.substring(0, 66); -// const uintS: string = '0x' + uintSignature.substring(66, 130); -// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - -// const stringR: string = stringSignature.substring(0, 66); -// const stringS: string = '0x' + stringSignature.substring(66, 130); -// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - -// const boolR: string = boolSignature.substring(0, 66); -// const boolS: string = '0x' + boolSignature.substring(66, 130); -// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - -// const bytesR: string = bytesSignature.substring(0, 66); -// const bytesS: string = '0x' + bytesSignature.substring(66, 130); -// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - -// const addressR: string = addressSignature.substring(0, 66); -// const addressS: string = '0x' + addressSignature.substring(66, 130); -// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetUintAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(10), -// uintV, -// uintR, -// uintS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetStringAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(10), -// stringV, -// stringR, -// stringS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBoolAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(10), -// boolV, -// boolR, -// boolS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBytesAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(10), -// bytesV, -// bytesR, -// bytesS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetAddressAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(10), -// addressV, -// addressR, -// addressS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); -// }); - -// it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { -// await tokenAttributes -// .connect(issuer) -// .registerAccessControl( -// await ownedCollection.getAddress(), -// await issuer.getAddress(), -// false, -// ); - -// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// ); -// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// ); -// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// ); -// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// ); -// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// ); - -// const uintSignature = await owner.signMessage(ethers.getBytes(uintMessage)); -// const stringSignature = await owner.signMessage(ethers.getBytes(stringMessage)); -// const boolSignature = await owner.signMessage(ethers.getBytes(boolMessage)); -// const bytesSignature = await owner.signMessage(ethers.getBytes(bytesMessage)); -// const addressSignature = await owner.signMessage(ethers.getBytes(addressMessage)); - -// const uintR: string = uintSignature.substring(0, 66); -// const uintS: string = '0x' + uintSignature.substring(66, 130); -// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - -// const stringR: string = stringSignature.substring(0, 66); -// const stringS: string = '0x' + stringSignature.substring(66, 130); -// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - -// const boolR: string = boolSignature.substring(0, 66); -// const boolS: string = '0x' + boolSignature.substring(66, 130); -// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - -// const bytesR: string = bytesSignature.substring(0, 66); -// const bytesS: string = '0x' + bytesSignature.substring(66, 130); -// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - -// const addressR: string = addressSignature.substring(0, 66); -// const addressS: string = '0x' + addressSignature.substring(66, 130); -// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetUintAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// uintV, -// uintR, -// uintS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetStringAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// stringV, -// stringR, -// stringS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBoolAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// boolV, -// boolR, -// boolS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBytesAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// bytesV, -// bytesR, -// bytesS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetAddressAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// addressV, -// addressR, -// addressS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); -// }); - -// it('should not allow to use presigned message to modify the parameters if the signer is not authorized to modify them', async function () { -// const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// ); -// const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// ); -// const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// ); -// const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// ); -// const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// ); - -// const uintSignature = await issuer.signMessage(ethers.getBytes(uintMessage)); -// const stringSignature = await issuer.signMessage(ethers.getBytes(stringMessage)); -// const boolSignature = await issuer.signMessage(ethers.getBytes(boolMessage)); -// const bytesSignature = await issuer.signMessage(ethers.getBytes(bytesMessage)); -// const addressSignature = await issuer.signMessage(ethers.getBytes(addressMessage)); - -// const uintR: string = uintSignature.substring(0, 66); -// const uintS: string = '0x' + uintSignature.substring(66, 130); -// const uintV: string = parseInt(uintSignature.substring(130, 132), 16); - -// const stringR: string = stringSignature.substring(0, 66); -// const stringS: string = '0x' + stringSignature.substring(66, 130); -// const stringV: string = parseInt(stringSignature.substring(130, 132), 16); - -// const boolR: string = boolSignature.substring(0, 66); -// const boolS: string = '0x' + boolSignature.substring(66, 130); -// const boolV: string = parseInt(boolSignature.substring(130, 132), 16); - -// const bytesR: string = bytesSignature.substring(0, 66); -// const bytesS: string = '0x' + bytesSignature.substring(66, 130); -// const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16); - -// const addressR: string = addressSignature.substring(0, 66); -// const addressS: string = '0x' + addressSignature.substring(66, 130); -// const addressV: string = parseInt(addressSignature.substring(130, 132), 16); - -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetUintAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 1, -// bn(9999999999), -// uintV, -// uintR, -// uintS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetStringAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// 'test', -// bn(9999999999), -// stringV, -// stringR, -// stringS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBoolAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// true, -// bn(9999999999), -// boolV, -// boolR, -// boolS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetBytesAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// '0x1234', -// bn(9999999999), -// bytesV, -// bytesR, -// bytesS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// await expect( -// tokenAttributes -// .connect(owner) -// .presignedSetAddressAttribute( -// await issuer.getAddress(), -// await ownedCollection.getAddress(), -// 1, -// 'X', -// await owner.getAddress(), -// bn(9999999999), -// addressV, -// addressR, -// addressS, -// ), -// ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); -// }); -// }); -// }); - -// async function shouldBehaveLikeTokenAttributesRepositoryInterface() { -// it('can support IERC165', async function () { -// expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); -// }); - -// it('can support IERC7508', async function () { -// expect(await this.tokenAttributes.supportsInterface(IERC7508)).to.equal(true); -// }); -// } +import { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { IERC165, IERC7508 } from '../interfaces'; +import { OwnableMintableERC721Mock, RMRKTokenAttributesRepository } from '../../typechain-types'; + +// --------------- FIXTURES ----------------------- + +enum AccessType { + Issuer, + Collaborator, + IssuerOrCollaborator, + TokenOwner, + SpecificAddress, +} + +async function tokenAttributesFixture() { + const factory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); + const tokenAttributes = await factory.deploy(); + await tokenAttributes.waitForDeployment(); + + return tokenAttributes; +} + +async function ownedCollectionFixture() { + const factory = await ethers.getContractFactory('OwnableMintableERC721Mock'); + const [owner, ownerOf] = await ethers.getSigners(); + const ownedCollection = await factory.deploy(owner, ownerOf); + await ownedCollection.waitForDeployment(); + + return ownedCollection; +} + +// --------------- TESTS ----------------------- + +describe('RMRKTokenAttributesRepository', async function () { + let tokenAttributes: RMRKTokenAttributesRepository; + let ownedCollection: OwnableMintableERC721Mock; + let collectionOwner: SignerWithAddress; + let tokenOwner: SignerWithAddress; + let collaborator: SignerWithAddress; + const tokenId = 1n; + const tokenId2 = 2n; + + beforeEach(async function () { + tokenAttributes = await loadFixture(tokenAttributesFixture); + ownedCollection = await loadFixture(ownedCollectionFixture); + [collectionOwner, tokenOwner, collaborator] = await ethers.getSigners(); + + this.tokenAttributes = tokenAttributes; + this.ownedCollection = ownedCollection; + }); + + shouldBehaveLikeTokenAttributesRepositoryInterface(); + + describe('Registering attributes and setting values', async function () { + beforeEach(async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + }); + + it('can set and get token attributes', async function () { + expect( + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description', + 'test description', + ), + ) + .to.emit(tokenAttributes, 'StringAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'description', 'test description'); + expect( + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description1', + 'test description', + ), + ) + .to.emit(tokenAttributes, 'StringAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'description1', 'test description'); + expect( + await tokenAttributes.setBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'rare', + true, + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'rare', true); + expect( + await tokenAttributes.setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'owner', + await tokenOwner.getAddress(), + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeSet') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'owner', + await tokenOwner.getAddress(), + ); + expect( + await tokenAttributes.setUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'atk', + 100n, + ), + ) + .to.emit(tokenAttributes, 'UintAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'atk', 100n); + expect( + await tokenAttributes.setUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'health', + 100n, + ), + ) + .to.emit(tokenAttributes, 'UintAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 100n); + expect( + await tokenAttributes.setUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'health', + 95n, + ), + ) + .to.emit(tokenAttributes, 'UintAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 95n); + expect( + await tokenAttributes.setUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'health', + 80n, + ), + ) + .to.emit(tokenAttributes, 'UintAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 80n); + expect( + await tokenAttributes.setBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'data', + '0x1234', + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeSet') + .withArgs(await ownedCollection.getAddress(), tokenId, 'data', '0x1234'); + + expect( + await tokenAttributes.getStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description', + ), + ).to.eql('test description'); + expect( + await tokenAttributes.getStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description1', + ), + ).to.eql('test description'); + expect( + await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'rare'), + ).to.eql(true); + expect( + await tokenAttributes.getAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'owner', + ), + ).to.eql(await tokenOwner.getAddress()); + expect( + await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'atk'), + ).to.eql(100n); + expect( + await tokenAttributes.getUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'health', + ), + ).to.eql(80n); + expect( + await tokenAttributes.getBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'data', + ), + ).to.eql('0x1234'); + + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description', + 'test description update', + ); + expect( + await tokenAttributes.getStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'description', + ), + ).to.eql('test description update'); + }); + + it('can set multiple attributes of multiple types at the same time', async function () { + await expect( + tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address1', + await tokenOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address2', + await collectionOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + }); + + it('can update multiple attributes of multiple types at the same time', async function () { + await tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [ + { key: 'string1', value: 'value0' }, + { key: 'string2', value: 'value1' }, + ], + [ + { key: 'uint1', value: 0n }, + { key: 'uint2', value: 1n }, + ], + [ + { key: 'bool1', value: false }, + { key: 'bool2', value: true }, + ], + [ + { key: 'address1', value: await collectionOwner.getAddress() }, + { key: 'address2', value: await tokenOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x5678' }, + { key: 'bytes2', value: '0x1234' }, + ], + ); + + await expect( + tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address1', + await tokenOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address2', + await collectionOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + }); + + it('can set and update multiple attributes of multiple types at the same time even if not all types are updated at the same time', async function () { + await tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [{ key: 'string1', value: 'value0' }], + [ + { key: 'uint1', value: 0n }, + { key: 'uint2', value: 1n }, + ], + [ + { key: 'bool1', value: false }, + { key: 'bool2', value: true }, + ], + [ + { key: 'address1', value: await collectionOwner.getAddress() }, + { key: 'address2', value: await tokenOwner.getAddress() }, + ], + [], + ); + + await expect( + tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address1', + await tokenOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address2', + await collectionOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + + await expect( + tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + [], + [ + { key: 'bool1', value: false }, + { key: 'bool2', value: true }, + ], + [], + [], + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', false) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', true); + }); + + it('can set and update multiple attributes of multiple types at the same time', async function () { + await expect( + tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address1', + await tokenOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address2', + await collectionOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + }); + + it('should allow to retrieve multiple attributes at once', async function () { + await tokenAttributes.setAttributes( + await ownedCollection.getAddress(), + tokenId, + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + ['string1', 'string2'], + ['uint1', 'uint2'], + ['bool1', 'bool2'], + ['address1', 'address2'], + ['bytes1', 'bytes2'], + ), + ).to.eql([ + [ + ['string1', 'value1'], + ['string2', 'value2'], + ], + [ + ['uint1', 1n], + ['uint2', 2n], + ], + [ + ['bool1', true], + ['bool2', false], + ], + [ + ['address1', await tokenOwner.getAddress()], + ['address2', await collectionOwner.getAddress()], + ], + [ + ['bytes1', '0x1234'], + ['bytes2', '0x5678'], + ], + ]); + }); + + it('can set multiple string attributes at the same time', async function () { + await expect( + tokenAttributes.setStringAttributes(await ownedCollection.getAddress(), tokenId, [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ]), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2'); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + ['string1', 'string2'], + [], + [], + [], + [], + ), + ).to.eql([ + [ + ['string1', 'value1'], + ['string2', 'value2'], + ], + [], + [], + [], + [], + ]); + }); + + it('can set multiple uint attributes at the same time', async function () { + await expect( + tokenAttributes.setUintAttributes(await ownedCollection.getAddress(), tokenId, [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ]), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + ['uint1', 'uint2'], + [], + [], + [], + ), + ).to.eql([ + [], + [ + ['uint1', 1n], + ['uint2', 2n], + ], + [], + [], + [], + ]); + }); + + it('can set multiple bool attributes at the same time', async function () { + await expect( + tokenAttributes.setBoolAttributes(await ownedCollection.getAddress(), tokenId, [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ]), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + [], + ['bool1', 'bool2'], + [], + [], + ), + ).to.eql([ + [], + [], + [ + ['bool1', true], + ['bool2', false], + ], + [], + [], + ]); + }); + + it('can set multiple address attributes at the same time', async function () { + await expect( + tokenAttributes.setAddressAttributes(await ownedCollection.getAddress(), tokenId, [ + { key: 'address1', value: await tokenOwner.getAddress() }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ]), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address1', + await tokenOwner.getAddress(), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs( + await ownedCollection.getAddress(), + tokenId, + 'address2', + await collectionOwner.getAddress(), + ); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + [], + [], + ['address1', 'address2'], + [], + ), + ).to.eql([ + [], + [], + [], + [ + ['address1', await tokenOwner.getAddress()], + ['address2', await collectionOwner.getAddress()], + ], + [], + ]); + }); + + it('can set multiple bytes attributes at the same time', async function () { + await expect( + tokenAttributes.setBytesAttributes(await ownedCollection.getAddress(), tokenId, [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ]), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + + expect( + await tokenAttributes.getAttributes( + await ownedCollection.getAddress(), + tokenId, + [], + [], + [], + [], + ['bytes1', 'bytes2'], + ), + ).to.eql([ + [], + [], + [], + [], + [ + ['bytes1', '0x1234'], + ['bytes2', '0x5678'], + ], + ]); + }); + + it('can reuse keys and values are fine', async function () { + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'X1', + ); + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId2, + 'X', + 'X2', + ); + + expect( + await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql('X1'); + expect( + await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), + ).to.eql('X2'); + }); + + it('can reuse keys among different attributes and values are fine', async function () { + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test description', + ); + await tokenAttributes.setBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + ); + await tokenAttributes.setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + await tokenAttributes.setUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 100n, + ); + await tokenAttributes.setBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + ); + + expect( + await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql('test description'); + expect( + await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql(true); + expect( + await tokenAttributes.getAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql(await tokenOwner.getAddress()); + expect( + await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql(100n); + expect( + await tokenAttributes.getBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql('0x1234'); + }); + + it('can reuse string values and values are fine', async function () { + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'common string', + ); + await tokenAttributes.setStringAttribute( + await ownedCollection.getAddress(), + tokenId2, + 'X', + 'common string', + ); + + expect( + await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), + ).to.eql('common string'); + expect( + await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), + ).to.eql('common string'); + }); + + it('should not allow to set string values to unauthorized caller', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setStringAttribute(await ownedCollection.getAddress(), tokenId, 'X', 'test description'), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to set uint values to unauthorized caller', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setUintAttribute(await ownedCollection.getAddress(), tokenId, 'X', 42n), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to set boolean values to unauthorized caller', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X', true), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to set address values to unauthorized caller', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to set bytes values to unauthorized caller', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X', '0x1234'), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + }); + + describe('Token attributes access control', async function () { + it('should not allow registering an already registered collection', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await expect( + tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionAlreadyRegistered'); + }); + + it('should not allow to register a collection if caller is not the owner of the collection', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + true, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to register a collection without Ownable implemented', async function () { + const erc20Factory = await ethers.getContractFactory('ERC20Mock'); + const erc20 = await erc20Factory.deploy(); + await expect( + tokenAttributes.registerAccessControl( + await erc20.getAddress(), + await collectionOwner.getAddress(), + false, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'OwnableNotImplemented'); + }); + + it('should allow to manage access control for registered collections', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + expect( + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + await tokenOwner.getAddress(), + ), + ) + .to.emit(tokenAttributes, 'AccessControlUpdate') + .withArgs(await ownedCollection.getAddress(), 'X', 2, tokenOwner); + }); + + it('should allow issuer to manage collaborators', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + expect( + await tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ), + ) + .to.emit(tokenAttributes, 'CollaboratorUpdate') + .withArgs(await ownedCollection.getAddress(), [await tokenOwner.getAddress()], [true]); + }); + + it('should not allow to manage collaborators of an unregistered collection', async function () { + await expect( + tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); + }); + + it('should not allow to manage collaborators if the caller is not the issuer', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await expect( + tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress(), await collectionOwner.getAddress()], + [true], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'CollaboratorArraysNotEqualLength'); + }); + + it('should not allow to manage access control for unregistered collections', async function () { + await expect( + tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); + }); + + it('should not allow to manage access control if the caller is not issuer', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + true, + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should return the expected value when checking for collaborators', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + expect( + await tokenAttributes.isCollaborator( + await tokenOwner.getAddress(), + await ownedCollection.getAddress(), + ), + ).to.be.false; + + await tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ); + + expect( + await tokenAttributes.isCollaborator( + await tokenOwner.getAddress(), + await ownedCollection.getAddress(), + ), + ).to.be.true; + }); + + it('should return the expected value when checking for specific addresses', async function () { + await tokenAttributes.registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + expect( + await tokenAttributes.isSpecificAddress( + await tokenOwner.getAddress(), + await ownedCollection.getAddress(), + 'X', + ), + ).to.be.false; + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + await tokenOwner.getAddress(), + ); + + expect( + await tokenAttributes.isSpecificAddress( + await tokenOwner.getAddress(), + await ownedCollection.getAddress(), + 'X', + ), + ).to.be.true; + }); + + it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + true, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.Issuer, + ethers.ZeroAddress, + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + + it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.Collaborator, + ethers.ZeroAddress, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ); + + await tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + + await expect( + tokenAttributes + .connect(collectionOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); + }); + + it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + ethers.ZeroAddress, + ); + + await tokenAttributes + .connect(collectionOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + + await tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await tokenOwner.getAddress()], + [true], + ); + + await tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + }); + + it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + true, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.IssuerOrCollaborator, + ethers.ZeroAddress, + ); + + await tokenAttributes + .connect(collectionOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + + await tokenAttributes + .connect(collectionOwner) + .manageCollaborators( + await ownedCollection.getAddress(), + [await collaborator.getAddress()], + [true], + ); + + await tokenAttributes + .connect(collaborator) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + }); + + it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.TokenOwner, + ethers.ZeroAddress, + ); + + await expect( + tokenAttributes + .connect(collaborator) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); + + await expect( + tokenAttributes + .connect(collectionOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); + + await tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + }); + + it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.SpecificAddress, + ethers.ZeroAddress, + ); + + await expect( + tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotSpecificAddress'); + + await tokenAttributes + .connect(collectionOwner) + .manageAccessControl( + await ownedCollection.getAddress(), + 'X', + AccessType.SpecificAddress, + await tokenOwner.getAddress(), + ); + + await tokenAttributes + .connect(tokenOwner) + .setAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + ); + }); + + it('should allow to use presigned message to modify the parameters', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + ); + const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + ); + const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + ); + const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + ); + const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + ); + + const uintSignature = await collectionOwner.signMessage(ethers.getBytes(uintMessage)); + const stringSignature = await collectionOwner.signMessage(ethers.getBytes(stringMessage)); + const boolSignature = await collectionOwner.signMessage(ethers.getBytes(boolMessage)); + const bytesSignature = await collectionOwner.signMessage(ethers.getBytes(bytesMessage)); + const addressSignature = await collectionOwner.signMessage(ethers.getBytes(addressMessage)); + + const uintR: string = uintSignature.substring(0, 66); + const uintS: string = '0x' + uintSignature.substring(66, 130); + const uintV: string = parseInt(uintSignature.substring(130, 132), 16).toString(); + + const stringR: string = stringSignature.substring(0, 66); + const stringS: string = '0x' + stringSignature.substring(66, 130); + const stringV: string = parseInt(stringSignature.substring(130, 132), 16).toString(); + + const boolR: string = boolSignature.substring(0, 66); + const boolS: string = '0x' + boolSignature.substring(66, 130); + const boolV: string = parseInt(boolSignature.substring(130, 132), 16).toString(); + + const bytesR: string = bytesSignature.substring(0, 66); + const bytesS: string = '0x' + bytesSignature.substring(66, 130); + const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16).toString(); + + const addressR: string = addressSignature.substring(0, 66); + const addressS: string = '0x' + addressSignature.substring(66, 130); + const addressV: string = parseInt(addressSignature.substring(130, 132), 16).toString(); + + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetUintAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + uintV, + uintR, + uintS, + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), 1, 'X', 1); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetStringAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + stringV, + stringR, + stringS, + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), 1, 'X', 'test'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBoolAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + boolV, + boolR, + boolS, + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), 1, 'X', true); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBytesAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + bytesV, + bytesR, + bytesS, + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), 1, 'X', '0x1234'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetAddressAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + addressV, + addressR, + addressS, + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(await ownedCollection.getAddress(), 1, 'X', await tokenOwner.getAddress()); + }); + + it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + await mine(1000, { interval: 15 }); + + const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 10n, + ); + const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 10n, + ); + const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 10n, + ); + const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 10n, + ); + const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 10n, + ); + + const uintSignature = await collectionOwner.signMessage(ethers.getBytes(uintMessage)); + const stringSignature = await collectionOwner.signMessage(ethers.getBytes(stringMessage)); + const boolSignature = await collectionOwner.signMessage(ethers.getBytes(boolMessage)); + const bytesSignature = await collectionOwner.signMessage(ethers.getBytes(bytesMessage)); + const addressSignature = await collectionOwner.signMessage(ethers.getBytes(addressMessage)); + + const uintR: string = uintSignature.substring(0, 66); + const uintS: string = '0x' + uintSignature.substring(66, 130); + const uintV: string = parseInt(uintSignature.substring(130, 132), 16).toString(); + + const stringR: string = stringSignature.substring(0, 66); + const stringS: string = '0x' + stringSignature.substring(66, 130); + const stringV: string = parseInt(stringSignature.substring(130, 132), 16).toString(); + + const boolR: string = boolSignature.substring(0, 66); + const boolS: string = '0x' + boolSignature.substring(66, 130); + const boolV: string = parseInt(boolSignature.substring(130, 132), 16).toString(); + + const bytesR: string = bytesSignature.substring(0, 66); + const bytesS: string = '0x' + bytesSignature.substring(66, 130); + const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16).toString(); + + const addressR: string = addressSignature.substring(0, 66); + const addressS: string = '0x' + addressSignature.substring(66, 130); + const addressV: string = parseInt(addressSignature.substring(130, 132), 16).toString(); + + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetUintAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 10n, + uintV, + uintR, + uintS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetStringAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 10n, + stringV, + stringR, + stringS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBoolAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 10n, + boolV, + boolR, + boolS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBytesAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 10n, + bytesV, + bytesR, + bytesS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetAddressAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 10n, + addressV, + addressR, + addressS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'ExpiredDeadline'); + }); + + it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { + await tokenAttributes + .connect(collectionOwner) + .registerAccessControl( + await ownedCollection.getAddress(), + await collectionOwner.getAddress(), + false, + ); + + const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + ); + const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + ); + const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + ); + const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + ); + const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + ); + + const uintSignature = await tokenOwner.signMessage(ethers.getBytes(uintMessage)); + const stringSignature = await tokenOwner.signMessage(ethers.getBytes(stringMessage)); + const boolSignature = await tokenOwner.signMessage(ethers.getBytes(boolMessage)); + const bytesSignature = await tokenOwner.signMessage(ethers.getBytes(bytesMessage)); + const addressSignature = await tokenOwner.signMessage(ethers.getBytes(addressMessage)); + + const uintR: string = uintSignature.substring(0, 66); + const uintS: string = '0x' + uintSignature.substring(66, 130); + const uintV: string = parseInt(uintSignature.substring(130, 132), 16).toString(); + + const stringR: string = stringSignature.substring(0, 66); + const stringS: string = '0x' + stringSignature.substring(66, 130); + const stringV: string = parseInt(stringSignature.substring(130, 132), 16).toString(); + + const boolR: string = boolSignature.substring(0, 66); + const boolS: string = '0x' + boolSignature.substring(66, 130); + const boolV: string = parseInt(boolSignature.substring(130, 132), 16).toString(); + + const bytesR: string = bytesSignature.substring(0, 66); + const bytesS: string = '0x' + bytesSignature.substring(66, 130); + const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16).toString(); + + const addressR: string = addressSignature.substring(0, 66); + const addressS: string = '0x' + addressSignature.substring(66, 130); + const addressV: string = parseInt(addressSignature.substring(130, 132), 16).toString(); + + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetUintAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + uintV, + uintR, + uintS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetStringAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + stringV, + stringR, + stringS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBoolAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + boolV, + boolR, + boolS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBytesAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + bytesV, + bytesR, + bytesS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetAddressAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + addressV, + addressR, + addressS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'InvalidSignature'); + }); + + it('should not allow to use presigned message to modify the parameters if the signer is not authorized to modify them', async function () { + const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + ); + const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + ); + const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + ); + const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + ); + const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + ); + + const uintSignature = await collectionOwner.signMessage(ethers.getBytes(uintMessage)); + const stringSignature = await collectionOwner.signMessage(ethers.getBytes(stringMessage)); + const boolSignature = await collectionOwner.signMessage(ethers.getBytes(boolMessage)); + const bytesSignature = await collectionOwner.signMessage(ethers.getBytes(bytesMessage)); + const addressSignature = await collectionOwner.signMessage(ethers.getBytes(addressMessage)); + + const uintR: string = uintSignature.substring(0, 66); + const uintS: string = '0x' + uintSignature.substring(66, 130); + const uintV: string = parseInt(uintSignature.substring(130, 132), 16).toString(); + + const stringR: string = stringSignature.substring(0, 66); + const stringS: string = '0x' + stringSignature.substring(66, 130); + const stringV: string = parseInt(stringSignature.substring(130, 132), 16).toString(); + + const boolR: string = boolSignature.substring(0, 66); + const boolS: string = '0x' + boolSignature.substring(66, 130); + const boolV: string = parseInt(boolSignature.substring(130, 132), 16).toString(); + + const bytesR: string = bytesSignature.substring(0, 66); + const bytesS: string = '0x' + bytesSignature.substring(66, 130); + const bytesV: string = parseInt(bytesSignature.substring(130, 132), 16).toString(); + + const addressR: string = addressSignature.substring(0, 66); + const addressS: string = '0x' + addressSignature.substring(66, 130); + const addressV: string = parseInt(addressSignature.substring(130, 132), 16).toString(); + + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetUintAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 1, + 9999999999n, + uintV, + uintR, + uintS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetStringAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + 'test', + 9999999999n, + stringV, + stringR, + stringS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBoolAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + true, + 9999999999n, + boolV, + boolR, + boolS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetBytesAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + '0x1234', + 9999999999n, + bytesV, + bytesR, + bytesS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetAddressAttribute( + await collectionOwner.getAddress(), + await ownedCollection.getAddress(), + tokenId, + 'X', + await tokenOwner.getAddress(), + 9999999999n, + addressV, + addressR, + addressS, + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + }); + }); +}); + +async function shouldBehaveLikeTokenAttributesRepositoryInterface() { + it('can support IERC165', async function () { + expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); + }); + + it('can support IERC7508', async function () { + expect(await this.tokenAttributes.supportsInterface(IERC7508)).to.equal(true); + }); +} diff --git a/test/implementations/generalBehavior.ts b/test/implementations/generalBehavior.ts index 299a46bf..1d96a6f8 100644 --- a/test/implementations/generalBehavior.ts +++ b/test/implementations/generalBehavior.ts @@ -742,10 +742,10 @@ async function testEquippableBehavior(mintingType: MintingType) { describe('Equippable Behavior', async function () { it('can add equippable assets', async function () { await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); - const equippableGroupId = 1; + const equippableGroupId = 1n; const catalogAddress = await rmrkERC20.getAddress(); // Could be any address const metadataURI = 'ipfs://asset-metadata'; - const partIds = [1, 2, 3]; + const partIds = [1n, 2n, 3n]; await contract.addEquippableAssetEntry( equippableGroupId, catalogAddress, @@ -765,8 +765,8 @@ async function testEquippableBehavior(mintingType: MintingType) { }); it('can set valid parent for equippable group', async function () { - const equippableGroupId = 1; - const partId = 10; + const equippableGroupId = 1n; + const partId = 10n; await expect( contract.setValidParentForEquippableGroup( equippableGroupId, @@ -792,7 +792,7 @@ async function testEquippableBehavior(mintingType: MintingType) { }); it('cannot set valid parent for equippable group if not owner or contributor', async function () { - const equippableGroupId = 1; + const equippableGroupId = 1n; const partId = 10; await expect( contract diff --git a/test/implementations/lazyMintErc20Pay.ts b/test/implementations/lazyMintErc20Pay.ts index 7923b096..fc48ef2b 100644 --- a/test/implementations/lazyMintErc20Pay.ts +++ b/test/implementations/lazyMintErc20Pay.ts @@ -107,31 +107,31 @@ async function shouldControlValidMintingErc20Pay(): Promise { beforeEach(async function () { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; - const erc20Address = await this.token.getAddress(); + const erc20Address = await this.token.erc20TokenAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); erc20 = erc20Factory.attach(erc20Address); }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.parseEther('0.05'); + const HALF_ETH = ONE_ETH / 2n; await erc20.mint(addrs[0].address, ONE_ETH); await erc20.approve(await this.token.getAddress(), HALF_ETH); - await expect(this.token.mint(addrs[0].address, 1)).to.be.revertedWithCustomError( + await expect(this.token.mint(addrs[0].address, 1n)).to.be.revertedWithCustomError( erc20, 'ERC20InsufficientAllowance', ); }); it('cannot mint 0 units', async function () { - await expect(this.token.mint(addrs[0].address, 0)).to.be.revertedWithCustomError( + await expect(this.token.mint(addrs[0].address, 0n)).to.be.revertedWithCustomError( this.token, 'RMRKMintZero', ); }); it('cannot mint over max supply', async function () { - await expect(this.token.mint(addrs[0].address, 99999)).to.be.revertedWithCustomError( + await expect(this.token.mint(addrs[0].address, 99999n)).to.be.revertedWithCustomError( this.token, 'RMRKMintOverMax', ); diff --git a/test/implementations/lazyMintNativeTokenPay.ts b/test/implementations/lazyMintNativeTokenPay.ts index ffaff01c..633ec5cf 100644 --- a/test/implementations/lazyMintNativeTokenPay.ts +++ b/test/implementations/lazyMintNativeTokenPay.ts @@ -10,6 +10,13 @@ import { ONE_ETH, singleFixtureWithArgs, } from '../utils'; +import { + RMRKEquippableLazyMintNative, + RMRKMultiAssetLazyMintNative, + RMRKMultiAssetLazyMintNative, + RMRKNestableLazyMintNative, + RMRKNestableMultiAssetLazyMintNative, +} from '../../typechain-types'; async function multiAssetFixture(): Promise { return await singleFixtureWithArgs('RMRKMultiAssetLazyMintNative', [ @@ -85,85 +92,88 @@ describe('EquippableNativeTokenPay Minting', async () => { async function shouldControlValidMintingNativeTokenPay(): Promise { let addrs: SignerWithAddress[]; + let token: + | RMRKMultiAssetLazyMintNative + | RMRKNestableLazyMintNative + | RMRKNestableMultiAssetLazyMintNative + | RMRKEquippableLazyMintNative; beforeEach(async function () { [, ...addrs] = await ethers.getSigners(); + token = this.token; }); it('cannot mint under price', async function () { - const HALF_ETH = ethers.parseEther('0.05'); + const HALF_ETH = ONE_ETH / 2n; await expect( - this.token.mint(addrs[0].address, 1, { value: HALF_ETH }), - ).to.be.revertedWithCustomError(this.token, 'RMRKWrongValueSent'); + token.mint(addrs[0].address, 1, { value: HALF_ETH }), + ).to.be.revertedWithCustomError(token, 'RMRKWrongValueSent'); }); it('cannot mint 0 units', async function () { - await expect(this.token.mint(addrs[0].address, 0)).to.be.revertedWithCustomError( - this.token, + await expect(token.mint(addrs[0].address, 0)).to.be.revertedWithCustomError( + token, 'RMRKMintZero', ); }); it('cannot mint over max supply', async function () { - await expect(this.token.mint(addrs[0].address, 99999)).to.be.revertedWithCustomError( - this.token, + await expect(token.mint(addrs[0].address, 99999)).to.be.revertedWithCustomError( + token, 'RMRKMintOverMax', ); }); it('can mint tokens through sale logic', async function () { - await mintFromNativeToken(this.token, addrs[0].address); - expect(await this.token.ownerOf(1)).to.equal(addrs[0].address); - expect(await this.token.totalSupply()).to.equal(1); - expect(await this.token.balanceOf(addrs[0].address)).to.equal(1); + await mintFromNativeToken(token, addrs[0].address); + expect(await token.ownerOf(1)).to.equal(addrs[0].address); + expect(await token.totalSupply()).to.equal(1); + expect(await token.balanceOf(addrs[0].address)).to.equal(1); }); it('reduces total supply on burn', async function () { - const tokenId = await mintFromNativeToken(this.token, addrs[0].address); - expect(await this.token.totalSupply()).to.equal(1); - await this.token.connect(addrs[0]).burn(tokenId); - expect(await this.token.totalSupply()).to.equal(0); + const tokenId = await mintFromNativeToken(token, addrs[0].address); + expect(await token.totalSupply()).to.equal(1); + await token.connect(addrs[0])['burn(uint256)'](tokenId); + + expect(await token.totalSupply()).to.equal(0); }); it('reduces total supply on burn and does not reuse ID', async function () { - const tokenId = await mintFromNativeToken(this.token, addrs[0].address); - await this.token.connect(addrs[0]).burn(tokenId); + const tokenId = await mintFromNativeToken(token, addrs[0].address); + await token.connect(addrs[0])['burn(uint256)'](tokenId); - const newTokenId = await mintFromNativeToken(this.token, addrs[0].address); + const newTokenId = await mintFromNativeToken(token, addrs[0].address); expect(newTokenId).to.equal(tokenId + 1n); - expect(await this.token.totalSupply()).to.equal(1); + expect(await token.totalSupply()).to.equal(1); }); it('can mint multiple tokens through sale logic', async function () { - await this.token.connect(addrs[0]).mint(addrs[0].address, 10, { value: ONE_ETH * 10n }); - expect(await this.token.totalSupply()).to.equal(10); - expect(await this.token.balanceOf(addrs[0].address)).to.equal(10); + await token.connect(addrs[0]).mint(addrs[0].address, 10, { value: ONE_ETH * 10n }); + expect(await token.totalSupply()).to.equal(10); + expect(await token.balanceOf(addrs[0].address)).to.equal(10); }); describe('Nest minting', async () => { let parentId: bigint; beforeEach(async function () { - if (this.token.nestMint === undefined) { + if (token.nestMint === undefined) { this.skip(); } - parentId = await mintFromNativeToken(this.token, addrs[0].address); + parentId = await mintFromNativeToken(token, addrs[0].address); }); it('can nest mint tokens through sale logic', async function () { - const childId = await nestMintFromNativeToken( - this.token, - await this.token.getAddress(), - parentId, - ); - expect(await this.token.ownerOf(childId)).to.equal(addrs[0].address); - expect(await this.token.totalSupply()).to.equal(2); + const childId = await nestMintFromNativeToken(token, await token.getAddress(), parentId); + expect(await token.ownerOf(childId)).to.equal(addrs[0].address); + expect(await token.totalSupply()).to.equal(2); }); it('cannot nest mint over max supply', async function () { await expect( - this.token.nestMint(await this.token.getAddress(), 99999, 1), - ).to.be.revertedWithCustomError(this.token, 'RMRKMintOverMax'); + token.nestMint(await token.getAddress(), 99999, 1), + ).to.be.revertedWithCustomError(token, 'RMRKMintOverMax'); }); }); } diff --git a/test/implementations/premint.ts b/test/implementations/premint.ts index d2d4e972..3b5ca8c2 100644 --- a/test/implementations/premint.ts +++ b/test/implementations/premint.ts @@ -125,12 +125,12 @@ async function shouldControlValidPreMinting(): Promise { it('reduces total supply on burn and does not reuse ID', async function () { let tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); - let event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + let event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); const tokenId = event?.args?.tokenId; await this.token.connect(owner)['burn(uint256)'](tokenId); tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); - event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); const newTokenId = event?.args?.tokenId; expect(newTokenId).to.equal(tokenId + 1n); diff --git a/test/multiasset.ts b/test/multiasset.ts index 0cc39418..cb600a99 100644 --- a/test/multiasset.ts +++ b/test/multiasset.ts @@ -119,8 +119,8 @@ describe('MultiAssetMock Other Behavior', async function () { await expect(token.addAssetToToken(tokenId, resId2, 0)).to.emit(token, 'AssetAddedToTokens'); expect(await renderUtils.getPendingAssets(await token.getAddress(), tokenId)).to.eql([ - [resId, bn(0), bn(0), 'data1'], - [resId2, bn(1), bn(0), 'data2'], + [resId, 0n, 0n, 'data1'], + [resId2, bn(1), 0n, 'data2'], ]); }); diff --git a/test/nestable.ts b/test/nestable.ts index 826c6388..0d0bea34 100644 --- a/test/nestable.ts +++ b/test/nestable.ts @@ -124,7 +124,7 @@ describe('NestableMock transfer hooks', function () { true, '0x', ); - expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(0n); expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(1)); // Nest again @@ -139,13 +139,13 @@ describe('NestableMock transfer hooks', function () { ); expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(1)); - expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(0)); + expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(0n); await parent.acceptChild(parentId, 0, await child.getAddress(), childId); await parent['burn(uint256,uint256)'](parentId, 1); - expect(await parent.balancePerNftOf(await owner.getAddress(), 0)).to.eql(bn(0)); - expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(bn(0)); - expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(bn(0)); + expect(await parent.balancePerNftOf(await owner.getAddress(), 0)).to.eql(0n); + expect(await child.balancePerNftOf(await parent.getAddress(), parentId)).to.eql(0n); + expect(await child.balancePerNftOf(await otherOwner.getAddress(), 0)).to.eql(0n); }); }); diff --git a/test/renderUtils.ts b/test/renderUtils.ts index 9a3cb052..cca7a06b 100644 --- a/test/renderUtils.ts +++ b/test/renderUtils.ts @@ -221,7 +221,7 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { it('can get pending assets', async function () { expect(await renderUtils.getPendingAssets(await equip.getAddress(), tokenId)).to.eql([ - [resId4, bn(0), bn(0), 'ipfs://res4.jpg'], + [resId4, 0n, 0n, 'ipfs://res4.jpg'], [resId3, bn(1), resId, 'ipfs://res3.jpg'], ]); }); @@ -318,7 +318,7 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { expect( await renderUtilsEquip.getExtendedEquippableActiveAssets(await equip.getAddress(), tokenId), ).to.eql([ - [resId, bn(0), bn(10), ADDRESS_ZERO, 'ipfs://res1.jpg', []], + [resId, 0n, bn(10), ADDRESS_ZERO, 'ipfs://res1.jpg', []], [ resId2, bn(1), @@ -334,8 +334,8 @@ describe('MultiAsset Nestable and Equip Render Utils', async function () { expect( await renderUtilsEquip.getExtendedPendingAssets(await equip.getAddress(), tokenId), ).to.eql([ - [resId4, bn(2), bn(0), bn(0), await catalog.getAddress(), 'ipfs://res4.jpg', [bn(4)]], - [resId3, bn(0), bn(1), resId, ADDRESS_ZERO, 'ipfs://res3.jpg', []], + [resId4, bn(2), 0n, 0n, await catalog.getAddress(), 'ipfs://res4.jpg', [bn(4)]], + [resId3, 0n, bn(1), resId, ADDRESS_ZERO, 'ipfs://res3.jpg', []], ]); }); @@ -468,14 +468,14 @@ describe('Advanced Equip Render Utils', async function () { assetForKanariaFull, ), ).to.eql([ - bn(0), // child Index + 0n, // child Index [ // [Slot Id, child asset Id, parent asset Id, Asset priority, catalog address, isEquipped, partMetadata, childAssetMetadata, parentAssetMetadata] [ bn(slotIdGemRight), bn(assetForGemARight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', @@ -520,7 +520,7 @@ describe('Advanced Equip Render Utils', async function () { bn(slotIdGemRight), bn(assetForGemARight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', @@ -562,7 +562,7 @@ describe('Advanced Equip Render Utils', async function () { bn(slotIdGemRight), bn(assetForGemBRight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), true, 'ipfs://metadataSlotGemRight', @@ -605,7 +605,7 @@ describe('Advanced Equip Render Utils', async function () { bn(slotIdGemRight), bn(assetForGemBRight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), true, 'ipfs://metadataSlotGemRight', @@ -701,14 +701,14 @@ describe('Advanced Equip Render Utils', async function () { assetForKanariaFull, ), ).to.eql([ - bn(0), // child Index + 0n, // child Index [ // [Slot Id, child asset Id, parent asset Id, Asset priority, catalog address, isEquipped, partMetadata, childAssetMetadata, parentAssetMetadata] [ bn(slotIdGemRight), bn(assetForGemBRight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', @@ -784,7 +784,7 @@ describe('Advanced Equip Render Utils', async function () { bn(slotIdGemRight), bn(assetForGemBRight), bn(assetForKanariaFull), - bn(0), + 0n, await catalog.getAddress(), false, 'ipfs://metadataSlotGemRight', @@ -936,8 +936,8 @@ describe('Extended NFT render utils', function () { expect(data.issuer).to.eql(await issuer.getAddress()); expect(data.name).to.eql('MultiAsset'); expect(data.symbol).to.eql('MA'); - expect(data.activeChildrenNumber).to.eql(bn(0)); - expect(data.pendingChildrenNumber).to.eql(bn(0)); + expect(data.activeChildrenNumber).to.eql(0n); + expect(data.pendingChildrenNumber).to.eql(0n); expect(data.isSoulbound).to.be.false; expect(data.hasMultiAssetInterface).to.be.true; expect(data.hasNestingInterface).to.be.false; @@ -979,8 +979,8 @@ describe('Extended NFT render utils', function () { expect(data.tokenMetadataUri).to.eql('ipfs://tokenURI'); expect(data.directOwner).to.eql(await rootOwner.getAddress()); expect(data.rootOwner).to.eql(await rootOwner.getAddress()); - expect(data.activeAssetCount).to.eql(bn(0)); - expect(data.pendingAssetCount).to.eql(bn(0)); + expect(data.activeAssetCount).to.eql(0n); + expect(data.pendingAssetCount).to.eql(0n); expect(data.priorities).to.eql([]); expect(data.maxSupply).to.eql(bn(10000)); expect(data.totalSupply).to.eql(bn(4)); @@ -1232,7 +1232,7 @@ describe('Extended NFT render utils', function () { await nestableMultiAsset.getAddress(), parentTokenOne, ), - ).to.eql([await rootOwner.getAddress(), ethers.BigInt(0), false, false, false]); + ).to.eql([await rootOwner.getAddress(), 0n, false, false, false]); }); it('can identify rejected children', async function () { diff --git a/test/royaltiesSplitter.ts b/test/royaltiesSplitter.ts index f59c3b72..899934f5 100644 --- a/test/royaltiesSplitter.ts +++ b/test/royaltiesSplitter.ts @@ -27,8 +27,11 @@ describe('RMRKRoyaltiesSplitter', () => { }); it('can get beneficiaries and shares', async () => { - expect(await royaltiesSplitter.getBenefiariesAndShares()).to.deep.equal([ + const beneficiariesAddresses = await Promise.all( beneficiaries.map(async (b) => await b.getAddress()), + ); + expect(await royaltiesSplitter.getBenefiariesAndShares()).to.deep.equal([ + beneficiariesAddresses, SHARES_BPS, ]); }); @@ -37,12 +40,19 @@ describe('RMRKRoyaltiesSplitter', () => { const amount = ethers.parseEther('1'); await expect(async () => sender.sendTransaction({ to: await royaltiesSplitter.getAddress(), value: amount }), + ).to.changeEtherBalances( + [beneficiary1, beneficiary2, beneficiary3], + [(amount * 2500n) / 10000n, (amount * 2500n) / 10000n, (amount * 5000n) / 10000n], + ); + }); + + it('should emit event on payments distributed', async () => { + const amount = ethers.parseEther('1'); + expect( + await sender.sendTransaction({ to: await royaltiesSplitter.getAddress(), value: amount }), ) - .to.changeEtherBalance(beneficiary1, (amount * 2500n) / 10000n) - .and.changeEtherBalance(beneficiary2, (amount * 2500n) / 10000n) - .and.changeEtherBalance(beneficiary3, (amount * 5000n) / 10000n) .to.emit(royaltiesSplitter, 'NativePaymentDistributed') - .withArgs(await sender.getAddress(), amount); + .withArgs(sender.address, amount); }); it('should distribute ERC20 payment correctly', async () => { diff --git a/test/setup/equippableSlots.ts b/test/setup/equippableSlots.ts index 3af947d7..ca0b737b 100644 --- a/test/setup/equippableSlots.ts +++ b/test/setup/equippableSlots.ts @@ -168,7 +168,7 @@ async function setupContextForSlots( } async function addAssetsToWeapon(): Promise { - const equippableGroupId = 1; // Assets to equip will both use this + const equippableGroupId = 1n; // Assets to equip will both use this for (let i = 0; i < weaponAssetsFull.length; i++) { await weapon.addEquippableAssetEntry( @@ -211,7 +211,7 @@ async function setupContextForSlots( } async function addAssetsToWeaponGem(): Promise { - const equippableGroupId = 1; // Assets to equip will use this + const equippableGroupId = 1n; // Assets to equip will use this await weaponGem.addEquippableAssetEntry( weaponGemAssetFull, 0, // Not meant to equip @@ -242,7 +242,7 @@ async function setupContextForSlots( } async function addAssetsToBackground(): Promise { - const equippableGroupId = 1; // Assets to equip will use this + const equippableGroupId = 1n; // Assets to equip will use this await background.addEquippableAssetEntry( backgroundAssetId, equippableGroupId, diff --git a/test/utils.ts b/test/utils.ts index 145af45b..6abb2c0d 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,10 +1,14 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; +import { Contract, EventLog } from 'ethers'; import { ethers } from 'hardhat'; import { + RMRKEquippableLazyMintNative, RMRKEquippableMock, RMRKEquippablePreMint, + RMRKMultiAssetLazyMintNative, RMRKMultiAssetPreMint, + RMRKNestableLazyMintNative, + RMRKNestableMultiAssetLazyMintNative, RMRKNestableMultiAssetPreMint, RMRKNestableMultiAssetPreMintSoulbound, } from '../typechain-types'; @@ -36,9 +40,10 @@ async function mintFromMockPremint( ): Promise { const tx = await token.mint(to, 1, `ipfs://tokenURI`); // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); // Get the tokenId from the event - return bn(event?.args?.tokenId); + // @ts-ignore + return event.args[2]; } async function nestMintFromMock( @@ -64,9 +69,10 @@ async function nestMintFromMockPreMint( `ipfs://tokenURI`, ); // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); // Get the tokenId from the event - return bn(event?.args?.tokenId); + // @ts-ignore + return event.args[2]; } async function mintFromErc20Pay(token: Contract, to: string): Promise { @@ -80,17 +86,34 @@ async function mintFromErc20Pay(token: Contract, to: string): Promise { const tx = await token.mint(to, 1); // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); // Get the tokenId from the event - return event?.args?.tokenId; + // @ts-ignore + return event.args[2]; } -async function mintFromNativeToken(token: Contract, to: string): Promise { +async function mintFromNativeToken( + token: + | RMRKMultiAssetLazyMintNative + | RMRKNestableLazyMintNative + | RMRKNestableMultiAssetLazyMintNative + | RMRKEquippableLazyMintNative, + to: string, +): Promise { const tx = await token.mint(to, 1, { value: ONE_ETH }); + const receipt = await tx.wait(); + if (receipt === null || receipt === undefined) { + throw new Error('No events in receipt'); + } // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + // @ts-ignore + const event = receipt.logs.find((e) => e.eventName === 'Transfer'); + if (event === undefined) { + throw new Error('No Transfer event in receipt'); + } // Get the tokenId from the event - return event?.args?.tokenId; + // @ts-ignore + return event.args[2]; } async function nestMintFromErc20Pay( @@ -108,21 +131,26 @@ async function nestMintFromErc20Pay( const tx = await token.nestMint(to, 1, destinationId); // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); // Get the tokenId from the event - return event?.args?.tokenId; + // @ts-ignore + return event.args[2]; } async function nestMintFromNativeToken( - token: Contract, + token: + | RMRKNestableLazyMintNative + | RMRKNestableMultiAssetLazyMintNative + | RMRKEquippableLazyMintNative, to: string, destinationId: bigint, ): Promise { const tx = await token.nestMint(to, 1, destinationId, { value: ONE_ETH }); // Get the event from the tx - const event = (await tx.wait()).events?.find((e) => e.event === 'Transfer'); + const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); // Get the tokenId from the event - return event?.args?.tokenId; + // @ts-ignore + return event.args[2]; } async function transfer( @@ -181,7 +209,6 @@ async function addAssetEntryEquippablesFromMock(token: Contract, data?: string): ADDRESS_ZERO, data !== undefined ? data : 'metaURI', [], - [], ); return assetId; } @@ -193,7 +220,6 @@ async function addAssetEntryEquippablesFromImpl(token: Contract, data?: string): ADDRESS_ZERO, data !== undefined ? data : 'metaURI', [], - [], ); return await token.totalAssets(); } From 8eb44d221cda9d33df61cb63e4c7939105809fe9 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Thu, 11 Jan 2024 12:40:09 -0500 Subject: [PATCH 3/3] Fixes most of typing issues. --- test/behavior/catalog.ts | 6 +- test/behavior/equippableAssets.ts | 8 +- test/behavior/equippableParts.ts | 64 ++-- test/behavior/equippableSlots.ts | 258 ++++++++++------ test/behavior/erc721.ts | 58 ++-- test/behavior/multiasset.ts | 13 +- test/behavior/nestable.ts | 17 +- test/behavior/ownableLock.ts | 4 +- test/catalogUtils.ts | 1 - test/equippable.ts | 6 +- test/extensions/reclaimableChild.ts | 4 +- test/extensions/soulbound.ts | 17 +- test/extensions/typedMultiasset.ts | 24 +- test/implementations/generalBehavior.ts | 66 +++-- test/implementations/lazyMintErc20Pay.ts | 91 +++--- .../implementations/lazyMintNativeTokenPay.ts | 96 +++--- test/implementations/premint.ts | 105 ++++--- test/minifiedEquippable.ts | 12 +- test/multiasset.ts | 13 +- test/nestable.ts | 46 +-- test/nestableMultiasset.ts | 12 +- test/ownableLock.ts | 4 +- test/setup/equippableParts.ts | 87 +++--- test/setup/equippableSlots.ts | 13 +- test/utils.ts | 275 +++++++++++++----- 25 files changed, 805 insertions(+), 495 deletions(-) diff --git a/test/behavior/catalog.ts b/test/behavior/catalog.ts index 9ebab839..68bef3d5 100644 --- a/test/behavior/catalog.ts +++ b/test/behavior/catalog.ts @@ -1,11 +1,11 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { Contract } from 'ethers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { IOtherInterface, IERC165, IRMRKCatalog } from '../interfaces'; +import { RMRKCatalogImpl } from '../../typechain-types'; async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string, type: string) { - let testCatalog: Contract; + let testCatalog: RMRKCatalogImpl; let addrs: SignerWithAddress[]; const metadataUriDefault = 'src'; @@ -33,7 +33,7 @@ async function shouldBehaveLikeCatalog(contractName: string, metadataURI: string addrs = signersAddr; const Catalog = await ethers.getContractFactory(contractName); - testCatalog = await Catalog.deploy(metadataURI, type); + testCatalog = await Catalog.deploy(metadataURI, type); await testCatalog.waitForDeployment(); }); diff --git a/test/behavior/equippableAssets.ts b/test/behavior/equippableAssets.ts index 3ec94777..68bafa9c 100644 --- a/test/behavior/equippableAssets.ts +++ b/test/behavior/equippableAssets.ts @@ -1,15 +1,15 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; import { ADDRESS_ZERO, bn } from '../utils'; import { IERC165, IERC6220, IOtherInterface } from '../interfaces'; +import { RMRKEquippableMock } from '../../typechain-types'; async function shouldBehaveLikeEquippableAssets( - mint: (token: Contract, to: string) => Promise, + mint: (token: RMRKEquippableMock, to: string) => Promise, ) { - let chunky: Contract; - let chunkyEquip: Contract; + let chunky: RMRKEquippableMock; + let chunkyEquip: RMRKEquippableMock; let owner: SignerWithAddress; let addrs: SignerWithAddress[]; diff --git a/test/behavior/equippableParts.ts b/test/behavior/equippableParts.ts index f4093f2c..f7850a29 100644 --- a/test/behavior/equippableParts.ts +++ b/test/behavior/equippableParts.ts @@ -1,6 +1,5 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { Contract } from 'ethers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { partIdForHead1, @@ -16,7 +15,8 @@ import { maskAssetsEquip, maskEquippableGroupId, } from '../setup/equippableParts'; -import { bn } from '../utils'; +import { GenericEquippable, bn } from '../utils'; +import { RMRKCatalogImpl, RMRKEquipRenderUtils } from '../../typechain-types'; // The general idea is having these tokens: Neon and Mask // Masks can be equipped into Neons. @@ -24,10 +24,10 @@ import { bn } from '../utils'; // Neon will use an asset per token, which uses fixed parts to compose the body // Mask will have 2 assets per weapon, one for full view, one for equipping. Both are composed using fixed parts async function shouldBehaveLikeEquippableWithParts() { - let catalogContract: Contract; - let neonContract: Contract; - let maskContract: Contract; - let viewContract: Contract; + let catalogContract: RMRKCatalogImpl; + let neonContract: GenericEquippable; + let maskContract: GenericEquippable; + let viewContract: RMRKEquipRenderUtils; let addrs: SignerWithAddress[]; beforeEach(async function () { @@ -46,9 +46,13 @@ async function shouldBehaveLikeEquippableWithParts() { const childIndex = 0; const weaponResId = maskAssetsEquip[0]; // This asset is assigned to weapon first weapon await expect( - neonContract - .connect(addrs[0]) - .equip([neons[0], childIndex, neonResIds[0], partIdForMask, weaponResId]), + neonContract.connect(addrs[0]).equip({ + tokenId: neons[0], + childIndex: childIndex, + assetId: neonResIds[0], + slotPartId: partIdForMask, + childAssetId: weaponResId, + }), ) .to.emit(neonContract, 'ChildAssetEquipped') .withArgs( @@ -61,9 +65,9 @@ async function shouldBehaveLikeEquippableWithParts() { ); // All part slots are included on the response: - const expectedSlots = [bn(partIdForMask)]; + const expectedSlots = [partIdForMask]; const expectedEquips = [ - [bn(neonResIds[0]), bn(weaponResId), bn(masks[0]), await maskContract.getAddress()], + [neonResIds[0], weaponResId, masks[0], await maskContract.getAddress()], ]; const expectedMetadata = ['ipfs:weapon/equip/5']; expect( @@ -81,9 +85,13 @@ async function shouldBehaveLikeEquippableWithParts() { const badChildIndex = 3; const weaponResId = maskAssetsEquip[0]; // This asset is assigned to weapon first weapon await expect( - neonContract - .connect(addrs[0]) - .equip([neons[0], badChildIndex, neonResIds[0], partIdForMask, weaponResId]), + neonContract.connect(addrs[0]).equip({ + tokenId: neons[0], + childIndex: badChildIndex, + assetId: neonResIds[0], + slotPartId: partIdForMask, + childAssetId: weaponResId, + }), ).to.be.reverted; // Bad index }); }); @@ -92,31 +100,35 @@ async function shouldBehaveLikeEquippableWithParts() { it('can compose all parts for neon', async function () { const childIndex = 0; const weaponResId = maskAssetsEquip[0]; // This asset is assigned to weapon first weapon - await neonContract - .connect(addrs[0]) - .equip([neons[0], childIndex, neonResIds[0], partIdForMask, weaponResId]); + await neonContract.connect(addrs[0]).equip({ + tokenId: neons[0], + childIndex: childIndex, + assetId: neonResIds[0], + slotPartId: partIdForMask, + childAssetId: weaponResId, + }); const expectedFixedParts = [ [ - bn(partIdForHead1), // partId + partIdForHead1, // partId 1n, // z 'ipfs://head1.png', // metadataURI ], [ - bn(partIdForBody1), // partId + partIdForBody1, // partId 1n, // z 'ipfs://body1.png', // metadataURI ], [ - bn(partIdForHair1), // partId + partIdForHair1, // partId 2n, // z 'ipfs://hair1.png', // metadataURI ], ]; const expectedSlotParts = [ [ - bn(partIdForMask), // partId - bn(maskAssetsEquip[0]), // childAssetId + partIdForMask, // partId + maskAssetsEquip[0], // childAssetId 2n, // z await maskContract.getAddress(), // childAddress masks[0], // childTokenId @@ -141,17 +153,17 @@ async function shouldBehaveLikeEquippableWithParts() { it('can compose all parts for mask', async function () { const expectedFixedParts = [ [ - bn(partIdForMaskCatalog1), // partId + partIdForMaskCatalog1, // partId 3n, // z 'ipfs://maskCatalog1.png', // metadataURI ], [ - bn(partIdForHorns1), // partId + partIdForHorns1, // partId 5n, // z 'ipfs://horn1.png', // metadataURI ], [ - bn(partIdForEars1), // partId + partIdForEars1, // partId 4n, // z 'ipfs://ears1.png', // metadataURI ], @@ -163,7 +175,7 @@ async function shouldBehaveLikeEquippableWithParts() { ); expect(allAssets).to.eql([ `ipfs:weapon/equip/${maskAssetsEquip[0]}`, // metadataURI - bn(maskEquippableGroupId), // equippableGroupId + maskEquippableGroupId, // equippableGroupId await catalogContract.getAddress(), // catalogAddress expectedFixedParts, [], diff --git a/test/behavior/equippableSlots.ts b/test/behavior/equippableSlots.ts index 69ef6d5d..31d8e4ea 100644 --- a/test/behavior/equippableSlots.ts +++ b/test/behavior/equippableSlots.ts @@ -1,7 +1,6 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; import { partIdForBody, partIdForWeapon, @@ -18,7 +17,8 @@ import { weaponGemsIds, backgroundsIds, } from '../setup/equippableSlots'; -import { bn } from '../utils'; +import { GenericCatalog, GenericEquippable, bn } from '../utils'; +import { RMRKEquipRenderUtils } from '../../typechain-types'; // The general idea is having these tokens: Soldier, Weapon, WeaponGem and Background. // Weapon and Background can be equipped into Soldier. WeaponGem can be equipped into Weapon @@ -28,14 +28,14 @@ import { bn } from '../utils'; // Background will have a single asset for each, it can be used as full view and to equip // Weapon Gems will have 2 enumerated assets, one for full view, one for equipping. async function shouldBehaveLikeEquippableWithSlots( - nestMint: (token: Contract, to: string, parentId: bigint) => Promise, + nestMint: (token: GenericEquippable, to: string, parentId: bigint) => Promise, ) { - let catalog: Contract; - let soldier: Contract; - let weapon: Contract; - let weaponGem: Contract; - let background: Contract; - let view: Contract; + let catalog: GenericCatalog; + let soldier: GenericEquippable; + let weapon: GenericEquippable; + let weaponGem: GenericEquippable; + let background: GenericEquippable; + let view: RMRKEquipRenderUtils; let addrs: SignerWithAddress[]; @@ -177,18 +177,20 @@ async function shouldBehaveLikeEquippableWithSlots( const weaponChildIndex = 0; const backgroundChildIndex = 1; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(addrs[0]) - .equip([soldiersIds[0], weaponChildIndex, soldierResId, partIdForWeapon, weaponResId]); - await soldier - .connect(addrs[0]) - .equip([ - soldiersIds[0], - backgroundChildIndex, - soldierResId, - partIdForBackground, - backgroundAssetId, - ]); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: weaponChildIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: backgroundChildIndex, + assetId: soldierResId, + slotPartId: partIdForBackground, + childAssetId: backgroundAssetId, + }); const expectedSlots = [bn(partIdForWeapon), bn(partIdForBackground)]; const expectedEquips = [ @@ -218,9 +220,13 @@ async function shouldBehaveLikeEquippableWithSlots( const badChildIndex = 3; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon await expect( - soldier - .connect(addrs[0]) - .equip([soldiersIds[0], badChildIndex, soldierResId, partIdForWeapon, weaponResId]), + soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: badChildIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ).to.be.reverted; // Bad index }); @@ -274,9 +280,13 @@ async function shouldBehaveLikeEquippableWithSlots( // Weapon is child on index 0, background on index 1 await expect( - soldier - .connect(addrs[0]) - .equip([soldierId, childIndex, soldierResId, partIdForWeaponGem, weaponGemAssetEquip]), + soldier.connect(addrs[0]).equip({ + tokenId: soldierId, + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeaponGem, + childAssetId: weaponGemAssetEquip, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKTargetAssetCannotReceiveSlot'); }); @@ -285,15 +295,13 @@ async function shouldBehaveLikeEquippableWithSlots( const backgroundChildIndex = 1; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon await expect( - soldier - .connect(addrs[0]) - .equip([ - soldiersIds[0], - backgroundChildIndex, - soldierResId, - partIdForWeapon, - weaponResId, - ]), + soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: backgroundChildIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKTokenCannotBeEquippedWithAssetIntoSlot'); }); @@ -301,18 +309,26 @@ async function shouldBehaveLikeEquippableWithSlots( const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon await expect( - soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForBackground, weaponResId]), + soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForBackground, + childAssetId: weaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKTokenCannotBeEquippedWithAssetIntoSlot'); }); it('cannot equip child with wrong asset (weapon in background)', async function () { const childIndex = 0; await expect( - soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, backgroundAssetId]), + soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: backgroundAssetId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKTokenCannotBeEquippedWithAssetIntoSlot'); }); @@ -323,7 +339,13 @@ async function shouldBehaveLikeEquippableWithSlots( await expect( soldier .connect(addrs[1]) // Owner is addrs[0] - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]), + .equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKNotApprovedForAssetsOrOwner'); }); @@ -331,9 +353,13 @@ async function shouldBehaveLikeEquippableWithSlots( // Weapon is child on index 0, background on index 1 const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); const weaponAssetIndex = 3; await mintWeaponToSoldier(addrs[0], soldiersIds[0], weaponAssetIndex); @@ -341,15 +367,13 @@ async function shouldBehaveLikeEquippableWithSlots( const newWeaponChildIndex = 2; const newWeaponResId = weaponAssetsEquip[weaponAssetIndex]; await expect( - soldier - .connect(addrs[0]) - .equip([ - soldiersIds[0], - newWeaponChildIndex, - soldierResId, - partIdForWeapon, - newWeaponResId, - ]), + soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: newWeaponChildIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: newWeaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKSlotAlreadyUsed'); }); @@ -363,7 +387,13 @@ async function shouldBehaveLikeEquippableWithSlots( await expect( soldier .connect(addrs[0]) // Owner is addrs[0] - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]), + .equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKEquippableEquipNotAllowedByCatalog'); }); @@ -378,18 +408,20 @@ async function shouldBehaveLikeEquippableWithSlots( soldierID = soldiersIds[0]; soldierOwner = addrs[0]; - await soldier - .connect(soldierOwner) - .equip([soldierID, weaponChildIndex, soldierResId, partIdForWeapon, weaponResId]); - await soldier - .connect(soldierOwner) - .equip([ - soldierID, - backgroundChildIndex, - soldierResId, - partIdForBackground, - backgroundAssetId, - ]); + await soldier.connect(soldierOwner).equip({ + tokenId: soldierID, + childIndex: weaponChildIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); + await soldier.connect(soldierOwner).equip({ + tokenId: soldierID, + childIndex: backgroundChildIndex, + assetId: soldierResId, + slotPartId: partIdForBackground, + childAssetId: backgroundAssetId, + }); }); it('can replace parent equipped asset and still unequip it', async function () { @@ -471,9 +503,13 @@ async function shouldBehaveLikeEquippableWithSlots( await soldier.connect(soldierOwner).acceptAsset(soldierID, 0, newSoldierResId); await expect( - soldier - .connect(soldierOwner) - .equip([soldierID, weaponChildIndex, newSoldierResId, partIdForWeapon, weaponResId]), + soldier.connect(soldierOwner).equip({ + tokenId: soldierID, + childIndex: weaponChildIndex, + assetId: newSoldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ).to.be.revertedWithCustomError(soldier, 'RMRKSlotAlreadyUsed'); }); }); @@ -486,9 +522,13 @@ async function shouldBehaveLikeEquippableWithSlots( const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(soldierOwner) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(soldierOwner).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await unequipWeaponAndCheckFromAddress(soldierOwner); }); @@ -500,9 +540,13 @@ async function shouldBehaveLikeEquippableWithSlots( const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon const approved = addrs[1]; - await soldier - .connect(soldierOwner) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(soldierOwner).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await soldier .connect(soldierOwner) @@ -517,9 +561,13 @@ async function shouldBehaveLikeEquippableWithSlots( const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon const approved = addrs[1]; - await soldier - .connect(soldierOwner) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(soldierOwner).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await soldier .connect(soldierOwner) @@ -537,9 +585,13 @@ async function shouldBehaveLikeEquippableWithSlots( // Weapon is child on index 0, background on index 1 const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await expect( soldier.connect(addrs[1]).unequip(soldiersIds[0], soldierResId, partIdForWeapon), @@ -554,9 +606,13 @@ async function shouldBehaveLikeEquippableWithSlots( const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(soldierOwner) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(soldierOwner).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await unequipWeaponAndCheckFromAddress(soldierOwner); await soldier @@ -578,9 +634,13 @@ async function shouldBehaveLikeEquippableWithSlots( // Weapon is child on index 0 const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); await expect( soldier @@ -603,9 +663,13 @@ async function shouldBehaveLikeEquippableWithSlots( it('can compose equippables for soldier', async function () { const childIndex = 0; const weaponResId = weaponAssetsEquip[0]; // This asset is assigned to weapon first weapon - await soldier - .connect(addrs[0]) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]); + await soldier.connect(addrs[0]).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }); const expectedFixedParts = [ [ @@ -691,9 +755,13 @@ async function shouldBehaveLikeEquippableWithSlots( ); await expect( - soldier - .connect(from) - .equip([soldiersIds[0], childIndex, soldierResId, partIdForWeapon, weaponResId]), + soldier.connect(from).equip({ + tokenId: soldiersIds[0], + childIndex: childIndex, + assetId: soldierResId, + slotPartId: partIdForWeapon, + childAssetId: weaponResId, + }), ) .to.emit(soldier, 'ChildAssetEquipped') .withArgs( diff --git a/test/behavior/erc721.ts b/test/behavior/erc721.ts index 4ed8a667..87e55c99 100644 --- a/test/behavior/erc721.ts +++ b/test/behavior/erc721.ts @@ -2,8 +2,8 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { Contract, ContractTransaction } from 'ethers'; -import { bn } from '../utils'; -import { RMRKNestableLazyMintErc20 } from '../../typechain-types'; +import { GenericSafeTransferable, GenericTransferable, bn } from '../utils'; +import { ERC721ReceiverMock, RMRKNestableLazyMintErc20 } from '../../typechain-types'; // Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/test/token/ERC721/ERC721.behavior.js @@ -12,10 +12,10 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { let approved: SignerWithAddress; let anotherApproved: SignerWithAddress; let operator: SignerWithAddress; - let toWhom: SignerWithAddress | Contract; + let toWhom: SignerWithAddress | ERC721ReceiverMock; let others: SignerWithAddress[]; let receipt: ContractTransaction; - let receiver: Contract; + let receiver: ERC721ReceiverMock; const firstTokenId = bn(5042); const secondTokenId = bn(79217); @@ -272,19 +272,19 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('via transferFrom', function () { shouldTransferTokensByUsers(function ( - token: Contract, + token: GenericTransferable, from: string, to: string, tokenId: bigint, user: SignerWithAddress, ) { - return token.connect(user)['transferFrom(address,address,uint256)'](from, to, tokenId); + return token.connect(user).transferFrom(from, to, tokenId); }); }); describe('via safeTransferFrom', function () { const safeTransferFromWithData = function ( - token: Contract, + token: GenericTransferable, from: string, to: string, tokenId: bigint, @@ -296,7 +296,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { }; const safeTransferFromWithoutData = function ( - token: Contract, + token: GenericTransferable, from: string, to: string, tokenId: bigint, @@ -314,7 +314,7 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a valid receiver contract', function () { beforeEach(async function () { - receiver = await this.ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); + receiver = await this.receiverFactory.deploy(RECEIVER_MAGIC_VALUE, Error.None); await receiver.waitForDeployment(); toWhom = receiver; }); @@ -374,8 +374,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a receiver contract returning unexpected value', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const invalidReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const invalidReceiver = await receiverFactory.deploy( ethers.zeroPadValue('0x42', 4), Error.None, ); @@ -392,8 +392,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a receiver contract that reverts with message', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy( ethers.zeroPadValue('0x42', 4), Error.RevertWithMessage, ); @@ -412,8 +412,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a receiver contract that reverts without message', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy( RECEIVER_MAGIC_VALUE, Error.RevertWithoutMessage, ); @@ -432,8 +432,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('to a receiver contract that panics', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy( RECEIVER_MAGIC_VALUE, Error.Panic, ); @@ -472,8 +472,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { describe('via safeMint', function () { // regular minting is tested in ERC721Mintable.test.js and others it('calls onERC721Received — with data', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - receiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + receiver = await receiverFactory.deploy(RECEIVER_MAGIC_VALUE, Error.None); await receiver.waitForDeployment(); const receipt = await this.token['safeMint(address,uint256,bytes)']( await receiver.getAddress(), @@ -487,8 +487,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { }); it('calls onERC721Received — without data', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - receiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.None); + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + receiver = await receiverFactory.deploy(RECEIVER_MAGIC_VALUE, Error.None); await receiver.waitForDeployment(); const receipt = await this.token['safeMint(address,uint256)']( await receiver.getAddress(), @@ -503,8 +503,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('to a receiver contract returning unexpected value', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const invalidReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const invalidReceiver = await receiverFactory.deploy( ethers.zeroPadValue('0x42', 4), Error.None, ); @@ -518,8 +518,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('to a receiver contract that reverts with message', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy( ethers.zeroPadValue('0x42', 4), Error.RevertWithMessage, ); @@ -534,8 +534,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('to a receiver contract that reverts without message', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy( + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy( RECEIVER_MAGIC_VALUE, Error.RevertWithoutMessage, ); @@ -550,8 +550,8 @@ async function shouldBehaveLikeERC721(name: string, symbol: string) { context('to a receiver contract that panics', function () { it('reverts', async function () { - const ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); - const revertingReceiver = await ERC721Receiver.deploy(RECEIVER_MAGIC_VALUE, Error.Panic); + const receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); + const revertingReceiver = await receiverFactory.deploy(RECEIVER_MAGIC_VALUE, Error.Panic); await revertingReceiver.waitForDeployment(); await expect( this.token diff --git a/test/behavior/multiasset.ts b/test/behavior/multiasset.ts index e95fcdee..8f93e8ce 100644 --- a/test/behavior/multiasset.ts +++ b/test/behavior/multiasset.ts @@ -1,15 +1,18 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; -import { bn } from '../utils'; +import { GenericEquippable, GenericMintable, GenericMultiAsset, bn } from '../utils'; import { IERC165, IOtherInterface, IERC5773 } from '../interfaces'; +import { RMRKEquippableMock, RMRKMinifiedEquippableMock } from '../../typechain-types'; async function shouldBehaveLikeMultiAsset( - mint: (token: Contract, to: string) => Promise, - addAssetEntryFunc: (token: Contract, data?: string) => Promise, + mint: (token: GenericMintable, to: string) => Promise, + addAssetEntryFunc: ( + token: GenericMultiAsset | GenericEquippable | RMRKEquippableMock | RMRKMinifiedEquippableMock, + data?: string, + ) => Promise, addAssetToTokenFunc: ( - token: Contract, + token: GenericMultiAsset, tokenId: bigint, resId: bigint, replaces: bigint | number, diff --git a/test/behavior/nestable.ts b/test/behavior/nestable.ts index 7ed10ba2..e44c9ff2 100644 --- a/test/behavior/nestable.ts +++ b/test/behavior/nestable.ts @@ -1,21 +1,20 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; -import { bn, ADDRESS_ZERO } from '../utils'; +import { bn, ADDRESS_ZERO, GenericNestMintable } from '../utils'; import { IERC165, IERC721, IERC7401, IOtherInterface } from '../interfaces'; async function shouldBehaveLikeNestable( - mint: (token: Contract, to: string) => Promise, - nestMint: (token: Contract, to: string, parentId: bigint) => Promise, + mint: (token: GenericNestMintable, to: string) => Promise, + nestMint: (token: GenericNestMintable, to: string, parentId: bigint) => Promise, transfer: ( - token: Contract, + token: GenericNestMintable, caller: SignerWithAddress, to: string, tokenId: bigint, ) => Promise, nestTransfer: ( - token: Contract, + token: GenericNestMintable, caller: SignerWithAddress, to: string, tokenId: bigint, @@ -24,8 +23,8 @@ async function shouldBehaveLikeNestable( ) { let addrs: SignerWithAddress[]; let tokenOwner: SignerWithAddress; - let parent: Contract; - let child: Contract; + let parent: GenericNestMintable; + let child: GenericNestMintable; beforeEach(async function () { const [, signerTokenOwner, ...signersAddr] = await ethers.getSigners(); @@ -1210,7 +1209,7 @@ async function shouldBehaveLikeNestable( } async function checkAcceptedAndPendingChildren( - contract: Contract, + contract: GenericNestMintable, tokenId: bigint, expectedAccepted: any[], expectedPending: any[], diff --git a/test/behavior/ownableLock.ts b/test/behavior/ownableLock.ts index 75b02999..5ebda659 100644 --- a/test/behavior/ownableLock.ts +++ b/test/behavior/ownableLock.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract } from 'ethers'; +import { OwnableLockMock } from '../../typechain-types'; async function shouldBehaveOwnableLock(ismock: boolean) { - let ownableLock: Contract; + let ownableLock: OwnableLockMock; let owner: SignerWithAddress; let addrs: SignerWithAddress[]; diff --git a/test/catalogUtils.ts b/test/catalogUtils.ts index e1f678a8..90a0939b 100644 --- a/test/catalogUtils.ts +++ b/test/catalogUtils.ts @@ -10,7 +10,6 @@ import { RMRKEquippableMock, } from '../typechain-types'; import { setupContextForSlots } from './setup/equippableSlots'; -import { Contract } from 'ethers'; import { backgroundAssetId, backgroundsIds, diff --git a/test/equippable.ts b/test/equippable.ts index feeb49b4..c601aa6e 100644 --- a/test/equippable.ts +++ b/test/equippable.ts @@ -1,4 +1,3 @@ -import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { @@ -6,6 +5,7 @@ import { mintFromMock, nestMintFromMock, addAssetEntryEquippablesFromMock, + GenericMintable, } from './utils'; import { setupContextForParts } from './setup/equippableParts'; import { setupContextForSlots } from './setup/equippableSlots'; @@ -160,7 +160,7 @@ describe('MinifiedEquippableMock Assets', async () => { // --------------- MULTI ASSET BEHAVIOR ----------------------- describe('MinifiedEquippableMock MA behavior', async () => { - let nextTokenId = 1; + let nextTokenId = 1n; let equip: RMRKEquippableMock; let renderUtils: RMRKMultiAssetRenderUtils; @@ -170,7 +170,7 @@ describe('MinifiedEquippableMock MA behavior', async () => { this.renderUtils = renderUtils; }); - async function mintToNestable(token: Contract, to: string): Promise { + async function mintToNestable(token: GenericMintable, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; await equip.mint(to, tokenId); diff --git a/test/extensions/reclaimableChild.ts b/test/extensions/reclaimableChild.ts index 0736ceac..5c5de2fd 100644 --- a/test/extensions/reclaimableChild.ts +++ b/test/extensions/reclaimableChild.ts @@ -31,8 +31,8 @@ describe('RMRKNestableClaimableChildMock', async function () { async function shouldBehaveLikeReclaimableChild() { let addrs: SignerWithAddress[]; let tokenOwner: SignerWithAddress; - let parentId: number; - let childId: number; + let parentId: bigint; + let childId: bigint; beforeEach(async function () { addrs = await ethers.getSigners(); diff --git a/test/extensions/soulbound.ts b/test/extensions/soulbound.ts index eac88504..afba266e 100644 --- a/test/extensions/soulbound.ts +++ b/test/extensions/soulbound.ts @@ -1,4 +1,3 @@ -import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture, mine } from '@nomicfoundation/hardhat-network-helpers'; @@ -8,9 +7,19 @@ import { IERC165, IERC6454, IOtherInterface } from '../interfaces'; import { RMRKSoulboundAfterBlockNumberMock, RMRKSoulboundAfterTransactionsMock, + RMRKSoulboundEquippableMock, + RMRKSoulboundMultiAssetMock, + RMRKSoulboundNestableMock, + RMRKSoulboundNestableMultiAssetMock, RMRKSoulboundPerTokenMock, } from '../../typechain-types'; +type GenericSoulboundNestable = + | RMRKSoulboundNestableMock + | RMRKSoulboundNestableMultiAssetMock + | RMRKSoulboundEquippableMock; +type GenericSoulbound = GenericSoulboundNestable | RMRKSoulboundMultiAssetMock; + // --------------- FIXTURES ----------------------- async function soulboundMultiAssetFixture() { @@ -206,7 +215,7 @@ describe('RMRKSoulbound variants', async function () { }); async function shouldBehaveLikeSoulboundBasic() { - let soulbound: Contract; + let soulbound: GenericSoulbound; let owner: SignerWithAddress; let otherOwner: SignerWithAddress; let tokenId: bigint; @@ -239,7 +248,7 @@ async function shouldBehaveLikeSoulboundBasic() { }); it('can burn', async function () { - await soulbound.connect(owner)['burn(uint256)'](tokenId); + await (soulbound).connect(owner)['burn(uint256)'](tokenId); await expect(soulbound.ownerOf(tokenId)).to.be.revertedWithCustomError( soulbound, 'ERC721InvalidTokenId', @@ -248,7 +257,7 @@ async function shouldBehaveLikeSoulboundBasic() { } async function shouldBehaveLikeSoulboundNestable() { - let soulbound: Contract; + let soulbound: GenericSoulboundNestable; let owner: SignerWithAddress; let tokenId: bigint; diff --git a/test/extensions/typedMultiasset.ts b/test/extensions/typedMultiasset.ts index 4bd405a2..c1293854 100644 --- a/test/extensions/typedMultiasset.ts +++ b/test/extensions/typedMultiasset.ts @@ -1,9 +1,8 @@ -import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { bn, mintFromMock } from '../utils'; +import { GenericTypedMultiAsset, bn, mintFromMock } from '../utils'; import { IERC165, IERC6220, @@ -12,6 +11,11 @@ import { IRMRKTypedMultiAsset, IOtherInterface, } from '../interfaces'; +import { + RMRKNestableTypedMultiAssetMock, + RMRKTypedEquippableMock, + RMRKTypedMultiAssetMock, +} from '../../typechain-types'; // --------------- FIXTURES ----------------------- @@ -40,7 +44,7 @@ async function typedEquippableFixture() { } describe('RMRKTypedMultiAssetMock', async function () { - let typedMultiAsset: Contract; + let typedMultiAsset: RMRKTypedMultiAssetMock; beforeEach(async function () { ({ typedMultiAsset } = await loadFixture(typeMultiAssetFixture)); @@ -53,7 +57,7 @@ describe('RMRKTypedMultiAssetMock', async function () { describe('RMRKTypedMultiAssetMock get top assets', async function () { let owner: SignerWithAddress; - let tokenId: number; + let tokenId: bigint; const resId = bn(1); const resId2 = bn(2); @@ -98,7 +102,7 @@ describe('RMRKTypedMultiAssetMock', async function () { }); describe('RMRKNestableTypedMultiAssetMock', async function () { - let typedNestableMultiAsset: Contract; + let typedNestableMultiAsset: RMRKNestableTypedMultiAssetMock; beforeEach(async function () { ({ typedNestableMultiAsset } = await loadFixture(nestableTypedMultiAssetFixture)); @@ -115,7 +119,7 @@ describe('RMRKNestableTypedMultiAssetMock', async function () { }); describe('RMRKTypedEquippableMock', async function () { - let typedEquippable: Contract; + let typedEquippable: RMRKTypedEquippableMock; beforeEach(async function () { ({ typedEquippable } = await loadFixture(typedEquippableFixture)); @@ -151,10 +155,10 @@ async function shouldBehaveLikeTypedMultiAssetInterface() { } async function shouldBehaveLikeTypedMultiAsset( - mint: (token: Contract, to: string) => Promise, + mint: (token: GenericTypedMultiAsset, to: string) => Promise, ) { let owner: SignerWithAddress; - let tokenId: number; + let tokenId: bigint; beforeEach(async function () { const signers = await ethers.getSigners(); @@ -179,10 +183,10 @@ async function shouldBehaveLikeTypedMultiAsset( } async function shouldBehaveLikeTypedEquippable( - mint: (token: Contract, to: string) => Promise, + mint: (token: RMRKTypedEquippableMock, to: string) => Promise, ) { let owner: SignerWithAddress; - let tokenId: number; + let tokenId: bigint; beforeEach(async function () { const signers = await ethers.getSigners(); diff --git a/test/implementations/generalBehavior.ts b/test/implementations/generalBehavior.ts index 1d96a6f8..54294b9c 100644 --- a/test/implementations/generalBehavior.ts +++ b/test/implementations/generalBehavior.ts @@ -3,6 +3,7 @@ import { expect } from 'chai'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ERC20Mock, + RMRKAbstractEquippable, RMRKEquippableLazyMintErc20, RMRKEquippableLazyMintErc20Soulbound, RMRKEquippableLazyMintNative, @@ -27,6 +28,7 @@ import { RMRKNestableMultiAssetPreMintSoulbound, RMRKNestablePreMint, RMRKNestablePreMintSoulbound, + RMRKImplementationBase, } from '../../typechain-types'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { Contract } from 'ethers'; @@ -41,6 +43,17 @@ import { IERC6454, IERC6220, } from '../interfaces'; +import { + GenericAbstractImplementation, + GenericEquippable, + GenericMintable, + GenericMintableERC20Pay, + GenericMintableNativeToken, + GenericMintablePreMint, + GenericMultiAsset, + GenericNestMintable, + GenericReadyToUse, +} from '../utils'; export enum LegoCombination { None, @@ -666,7 +679,7 @@ async function testInterfaceSupport(legoCombination: LegoCombination, isSoulboun } async function testMultiAssetBehavior(mintingType: MintingType) { - let contract: Contract; + let contract: GenericMultiAsset; let owner: SignerWithAddress; let holder: SignerWithAddress; let rmrkERC20: ERC20Mock; @@ -727,7 +740,7 @@ async function testMultiAssetBehavior(mintingType: MintingType) { } async function testEquippableBehavior(mintingType: MintingType) { - let contract: Contract; + let contract: RMRKAbstractEquippable; let owner: SignerWithAddress; let holder: SignerWithAddress; let rmrkERC20: ERC20Mock; @@ -804,7 +817,7 @@ async function testEquippableBehavior(mintingType: MintingType) { } async function testGeneralBehavior(mintingType: MintingType) { - let contract: Contract; + let contract: GenericAbstractImplementation; let owner: SignerWithAddress; let holder: SignerWithAddress; let royaltyRecipient: SignerWithAddress; @@ -832,7 +845,7 @@ async function testGeneralBehavior(mintingType: MintingType) { it('reduces total supply on burn and id not reduced', async function () { await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); - await contract.connect(holder)['burn(uint256)'](1); + await (contract).connect(holder)['burn(uint256)'](1); expect(await contract.totalSupply()).to.eql(0n); await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); @@ -844,25 +857,28 @@ async function testGeneralBehavior(mintingType: MintingType) { const expectedError = (await contract.supportsInterface(IERC7401)) ? 'RMRKNotApprovedOrDirectOwner' : 'ERC721NotApprovedOrOwner'; - await expect(contract.connect(owner)['burn(uint256)'](1)).to.be.revertedWithCustomError( - contract, - expectedError, - ); + await expect( + (contract).connect(owner)['burn(uint256)'](1), + ).to.be.revertedWithCustomError(contract, expectedError); }); it('cannot mint 0 tokens', async function () { if (mintingType == MintingType.RMRKPreMint) { await expect( - contract.connect(owner).mint(await holder.getAddress(), 0, 'ipfs://tokenURI'), + (contract) + .connect(owner) + .mint(await holder.getAddress(), 0, 'ipfs://tokenURI'), ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } else if (mintingType == MintingType.RMRKLazyMintNativeToken) { await expect( - contract.connect(owner).mint(await holder.getAddress(), 0, { value: pricePerMint }), + (contract) + .connect(owner) + .mint(await holder.getAddress(), 0, { value: pricePerMint }), ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } else if (mintingType == MintingType.RMRKLazyMintERC20) { await rmrkERC20.connect(owner).approve(await contract.getAddress(), pricePerMint); await expect( - contract.connect(owner).mint(await holder.getAddress(), 0), + (contract).connect(owner).mint(await holder.getAddress(), 0), ).to.be.revertedWithCustomError(contract, 'RMRKMintZero'); } }); @@ -870,9 +886,9 @@ async function testGeneralBehavior(mintingType: MintingType) { it('has expected tokenURI', async function () { await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKPreMint) { - expect(await contract.tokenURI(1)).to.eql('ipfs://tokenURI'); + expect(await (contract).tokenURI(1)).to.eql('ipfs://tokenURI'); } else { - expect(await contract.tokenURI(1)).to.eql('ipfs://tokenURI/1'); + expect(await (contract).tokenURI(1)).to.eql('ipfs://tokenURI/1'); } }); @@ -881,7 +897,7 @@ async function testGeneralBehavior(mintingType: MintingType) { mintingType == MintingType.RMRKLazyMintERC20 || mintingType == MintingType.RMRKLazyMintNativeToken ) { - expect(await contract.pricePerMint()).to.eql(pricePerMint); + expect(await (contract).pricePerMint()).to.eql(pricePerMint); } }); @@ -890,12 +906,14 @@ async function testGeneralBehavior(mintingType: MintingType) { await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKLazyMintNativeToken) { const balanceBefore = await ethers.provider.getBalance(holder.address); - await contract.connect(owner).withdraw(await holder.getAddress(), pricePerMint * 2n); + await (contract) + .connect(owner) + .withdraw(await holder.getAddress(), pricePerMint * 2n); const balanceAfter = await ethers.provider.getBalance(holder.address); expect(balanceAfter).to.eql(balanceBefore + pricePerMint * 2n); } else if (mintingType == MintingType.RMRKLazyMintERC20) { const balanceBefore = await rmrkERC20.balanceOf(await holder.getAddress()); - await contract + await (contract) .connect(owner) .withdrawRaisedERC20( await rmrkERC20.getAddress(), @@ -913,11 +931,13 @@ async function testGeneralBehavior(mintingType: MintingType) { await mint(await holder.getAddress(), contract, owner, rmrkERC20, mintingType); if (mintingType == MintingType.RMRKLazyMintNativeToken) { await expect( - contract.connect(holder).withdraw(await holder.getAddress(), pricePerMint), + (contract) + .connect(holder) + .withdraw(await holder.getAddress(), pricePerMint), ).to.be.revertedWithCustomError(contract, 'RMRKNotOwner'); } else if (mintingType == MintingType.RMRKLazyMintERC20) { await expect( - contract + (contract) .connect(holder) .withdrawRaisedERC20( await rmrkERC20.getAddress(), @@ -946,17 +966,19 @@ async function testGeneralBehavior(mintingType: MintingType) { async function mint( to: string, - contract: Contract, + contract: GenericAbstractImplementation, owner: SignerWithAddress, rmrkERC20: ERC20Mock, mintingType: MintingType, ) { if (mintingType == MintingType.RMRKPreMint) { - await contract.connect(owner).mint(to, 1, 'ipfs://tokenURI'); + await (contract).connect(owner).mint(to, 1, 'ipfs://tokenURI'); } else if (mintingType == MintingType.RMRKLazyMintNativeToken) { - await contract.connect(owner).mint(to, 1, { value: pricePerMint }); + await (contract) + .connect(owner) + .mint(to, 1, { value: pricePerMint }); } else if (mintingType == MintingType.RMRKLazyMintERC20) { await rmrkERC20.connect(owner).approve(await contract.getAddress(), pricePerMint); - await contract.connect(owner).mint(to, 1); + await (contract).connect(owner).mint(to, 1); } } diff --git a/test/implementations/lazyMintErc20Pay.ts b/test/implementations/lazyMintErc20Pay.ts index fc48ef2b..db2aef2a 100644 --- a/test/implementations/lazyMintErc20Pay.ts +++ b/test/implementations/lazyMintErc20Pay.ts @@ -8,64 +8,85 @@ import { ONE_ETH, singleFixtureWithArgs, } from '../utils'; -import { Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { ERC20Mock } from '../../typechain-types'; - -async function multiAssetFixture(): Promise { +import { + ERC20Mock, + RMRKEquippableLazyMintErc20, + RMRKMultiAssetLazyMintErc20, + RMRKNestableLazyMintErc20, + RMRKNestableMultiAssetLazyMintErc20, +} from '../../typechain-types'; + +async function multiAssetFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); await erc20.waitForDeployment(); - return await singleFixtureWithArgs('RMRKMultiAssetLazyMintErc20', [ - 'MultiAsset', - 'MA', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], - ]); + return ( + (( + await singleFixtureWithArgs('RMRKMultiAssetLazyMintErc20', [ + 'MultiAsset', + 'MA', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], + ]) + )) + ); } -async function nestableFixture(): Promise { +async function nestableFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); await erc20.waitForDeployment(); - return await singleFixtureWithArgs('RMRKNestableLazyMintErc20', [ - 'Nestable', - 'N', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], - ]); + return ( + (( + await singleFixtureWithArgs('RMRKNestableLazyMintErc20', [ + 'Nestable', + 'N', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], + ]) + )) + ); } -async function nestableMultiAssetFixture(): Promise { +async function nestableMultiAssetFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); await erc20.waitForDeployment(); - return await singleFixtureWithArgs('RMRKNestableMultiAssetLazyMintErc20', [ - 'MultiAsset', - 'MA', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], - ]); + return ( + (( + await singleFixtureWithArgs('RMRKNestableMultiAssetLazyMintErc20', [ + 'MultiAsset', + 'MA', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], + ]) + )) + ); } -async function equippableFixture(): Promise { +async function equippableFixture(): Promise { const erc20Factory = await ethers.getContractFactory('ERC20Mock'); const erc20 = await erc20Factory.deploy(); await erc20.waitForDeployment(); - return await singleFixtureWithArgs('RMRKEquippableLazyMintErc20', [ - 'MultiAsset', - 'MA', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], - ]); + return ( + (( + await singleFixtureWithArgs('RMRKEquippableLazyMintErc20', [ + 'MultiAsset', + 'MA', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [await erc20.getAddress(), ADDRESS_ZERO, 0, 10000, ONE_ETH], + ]) + )) + ); } describe('MultiAssetErc20Pay Minting', async () => { diff --git a/test/implementations/lazyMintNativeTokenPay.ts b/test/implementations/lazyMintNativeTokenPay.ts index 633ec5cf..9d447f05 100644 --- a/test/implementations/lazyMintNativeTokenPay.ts +++ b/test/implementations/lazyMintNativeTokenPay.ts @@ -1,7 +1,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { expect } from 'chai'; -import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { ADDRESS_ZERO, @@ -13,49 +12,64 @@ import { import { RMRKEquippableLazyMintNative, RMRKMultiAssetLazyMintNative, - RMRKMultiAssetLazyMintNative, RMRKNestableLazyMintNative, RMRKNestableMultiAssetLazyMintNative, } from '../../typechain-types'; -async function multiAssetFixture(): Promise { - return await singleFixtureWithArgs('RMRKMultiAssetLazyMintNative', [ - 'MultiAsset', - 'MA', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [ADDRESS_ZERO, 1000, 10000, ONE_ETH], - ]); +async function multiAssetFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKMultiAssetLazyMintNative', [ + 'MultiAsset', + 'MA', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [ADDRESS_ZERO, 1000, 10000, ONE_ETH], + ]) + )) + ); } -async function nestableFixture(): Promise { - return await singleFixtureWithArgs('RMRKNestableLazyMintNative', [ - 'Nestable', - 'N', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [ADDRESS_ZERO, 1000, 10000, ONE_ETH], - ]); +async function nestableFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKNestableLazyMintNative', [ + 'Nestable', + 'N', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [ADDRESS_ZERO, 1000, 10000, ONE_ETH], + ]) + )) + ); } -async function nestableMultiAssetFixture(): Promise { - return await singleFixtureWithArgs('RMRKNestableMultiAssetLazyMintNative', [ - 'MultiAsset', - 'NMA', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [ADDRESS_ZERO, 1000, 10000, ONE_ETH], - ]); +async function nestableMultiAssetFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKNestableMultiAssetLazyMintNative', [ + 'MultiAsset', + 'NMA', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [ADDRESS_ZERO, 1000, 10000, ONE_ETH], + ]) + )) + ); } -async function equippableFixture(): Promise { - return await singleFixtureWithArgs('RMRKEquippableLazyMintNative', [ - 'Equippable', - 'EQ', - 'ipfs://collection-meta', - 'ipfs://tokenURI', - [ADDRESS_ZERO, 1000, 10000, ONE_ETH], - ]); +async function equippableFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKEquippableLazyMintNative', [ + 'Equippable', + 'EQ', + 'ipfs://collection-meta', + 'ipfs://tokenURI', + [ADDRESS_ZERO, 1000, 10000, ONE_ETH], + ]) + )) + ); } describe('MultiAssetNativeTokenPay Minting', async () => { @@ -134,14 +148,14 @@ async function shouldControlValidMintingNativeTokenPay(): Promise { it('reduces total supply on burn', async function () { const tokenId = await mintFromNativeToken(token, addrs[0].address); expect(await token.totalSupply()).to.equal(1); - await token.connect(addrs[0])['burn(uint256)'](tokenId); + await (token).connect(addrs[0])['burn(uint256)'](tokenId); expect(await token.totalSupply()).to.equal(0); }); it('reduces total supply on burn and does not reuse ID', async function () { const tokenId = await mintFromNativeToken(token, addrs[0].address); - await token.connect(addrs[0])['burn(uint256)'](tokenId); + await (token).connect(addrs[0])['burn(uint256)'](tokenId); const newTokenId = await mintFromNativeToken(token, addrs[0].address); expect(newTokenId).to.equal(tokenId + 1n); @@ -158,21 +172,25 @@ async function shouldControlValidMintingNativeTokenPay(): Promise { let parentId: bigint; beforeEach(async function () { - if (token.nestMint === undefined) { + if ((token).nestMint === undefined) { this.skip(); } parentId = await mintFromNativeToken(token, addrs[0].address); }); it('can nest mint tokens through sale logic', async function () { - const childId = await nestMintFromNativeToken(token, await token.getAddress(), parentId); + const childId = await nestMintFromNativeToken( + token, + await token.getAddress(), + parentId, + ); expect(await token.ownerOf(childId)).to.equal(addrs[0].address); expect(await token.totalSupply()).to.equal(2); }); it('cannot nest mint over max supply', async function () { await expect( - token.nestMint(await token.getAddress(), 99999, 1), + (token).nestMint(await token.getAddress(), 99999, 1), ).to.be.revertedWithCustomError(token, 'RMRKMintOverMax'); }); }); diff --git a/test/implementations/premint.ts b/test/implementations/premint.ts index 3b5ca8c2..a3199200 100644 --- a/test/implementations/premint.ts +++ b/test/implementations/premint.ts @@ -1,52 +1,73 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { ADDRESS_ZERO, singleFixtureWithArgs } from '../utils'; -import { Contract } from 'ethers'; +import { ADDRESS_ZERO, getTokenIdFromTx, singleFixtureWithArgs } from '../utils'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; - -async function multiAssetFixture(): Promise { - return await singleFixtureWithArgs('RMRKMultiAssetPreMint', [ - 'MultiAsset', - 'MA', - 'ipfs://collection-meta', - 10000, - ADDRESS_ZERO, - 0, - ]); +import { + RMRKEquippablePreMint, + RMRKMultiAssetPreMint, + RMRKNestableMultiAssetPreMint, + RMRKNestablePreMint, +} from '../../typechain-types'; + +async function multiAssetFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKMultiAssetPreMint', [ + 'MultiAsset', + 'MA', + 'ipfs://collection-meta', + 10000, + ADDRESS_ZERO, + 0, + ]) + )) + ); } -async function nestableFixture(): Promise { - return await singleFixtureWithArgs('RMRKNestablePreMint', [ - 'Nestable', - 'N', - 'ipfs://collection-meta', - 10000, - ADDRESS_ZERO, - 0, - ]); +async function nestableFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKNestablePreMint', [ + 'Nestable', + 'N', + 'ipfs://collection-meta', + 10000, + ADDRESS_ZERO, + 0, + ]) + )) + ); } -async function nestableMultiAssetFixture(): Promise { - return await singleFixtureWithArgs('RMRKNestableMultiAssetPreMint', [ - 'NestableMultiAsset', - 'NMA', - 'ipfs://collection-meta', - 10000, - ADDRESS_ZERO, - 0, - ]); +async function nestableMultiAssetFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKNestableMultiAssetPreMint', [ + 'NestableMultiAsset', + 'NMA', + 'ipfs://collection-meta', + 10000, + ADDRESS_ZERO, + 0, + ]) + )) + ); } -async function equippableFixture(): Promise { - return await singleFixtureWithArgs('RMRKEquippablePreMint', [ - 'Equippable', - 'EQ', - 'ipfs://collection-meta', - 10000, - ADDRESS_ZERO, - 0, - ]); +async function equippableFixture(): Promise { + return ( + (( + await singleFixtureWithArgs('RMRKEquippablePreMint', [ + 'Equippable', + 'EQ', + 'ipfs://collection-meta', + 10000, + ADDRESS_ZERO, + 0, + ]) + )) + ); } describe('MultiAssetPreMint Minting', async () => { @@ -125,13 +146,11 @@ async function shouldControlValidPreMinting(): Promise { it('reduces total supply on burn and does not reuse ID', async function () { let tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); - let event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - const tokenId = event?.args?.tokenId; + const tokenId = await getTokenIdFromTx(tx); await this.token.connect(owner)['burn(uint256)'](tokenId); tx = await this.token.connect(owner).mint(await owner.getAddress(), 1, 'ipfs://tokenURI'); - event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - const newTokenId = event?.args?.tokenId; + const newTokenId = await getTokenIdFromTx(tx); expect(newTokenId).to.equal(tokenId + 1n); expect(await this.token.totalSupply()).to.equal(1); diff --git a/test/minifiedEquippable.ts b/test/minifiedEquippable.ts index 72e9d0bc..c0f27777 100644 --- a/test/minifiedEquippable.ts +++ b/test/minifiedEquippable.ts @@ -1,10 +1,11 @@ // Note: This is just a copy of the equippable test suit with the additional tests // for ERC721 and nestable behavior, but using MinifiedEquippable instead. -import { Contract } from 'ethers'; import { ethers } from 'hardhat'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { + GenericEquippable, + GenericMintable, addAssetEntryEquippablesFromMock, addAssetToToken, mintFromMock, @@ -124,7 +125,10 @@ async function equippableFixture() { return { equip, renderUtils }; } -async function parentChildFixture(): Promise<{ parent: Contract; child: Contract }> { +async function parentChildFixture(): Promise<{ + parent: GenericEquippable; + child: GenericEquippable; +}> { return parentChildFixtureWithArgs('RMRKMinifiedEquippableMock', [], []); } @@ -184,7 +188,7 @@ describe('MinifiedEquippableMock MA behavior', async () => { this.renderUtils = renderUtils; }); - async function mintToNestable(token: Contract, to: string): Promise { + async function mintToNestable(token: GenericMintable, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; await equip.mint(to, tokenId); @@ -198,7 +202,7 @@ describe('MinifiedEquippableMock ERC721 behavior', function () { beforeEach(async function () { const { equip } = await loadFixture(equippableFixture); this.token = equip; - this.ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); + this.receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); }); shouldBehaveLikeERC721('Chunky', 'CHNK'); diff --git a/test/multiasset.ts b/test/multiasset.ts index cb600a99..d280a6f6 100644 --- a/test/multiasset.ts +++ b/test/multiasset.ts @@ -22,7 +22,9 @@ async function singleFixture(): Promise<{ const renderUtils = await renderUtilsFactory.deploy(); await renderUtils.waitForDeployment(); - const token = await singleFixtureWithArgs('RMRKMultiAssetMock', []); + const token = ( + (await singleFixtureWithArgs('RMRKMultiAssetMock', [])) + ); return { token, renderUtils }; } @@ -49,9 +51,10 @@ describe('MultiAssetMock Other Behavior', async function () { describe('Minting', async function () { it('cannot mint id 0', async function () { - await expect( - token['mint(address,uint256)'](addrs[0].address, 0), - ).to.be.revertedWithCustomError(token, 'RMRKIdZeroForbidden'); + await expect(token.mint(addrs[0].address, 0)).to.be.revertedWithCustomError( + token, + 'RMRKIdZeroForbidden', + ); }); }); @@ -252,7 +255,7 @@ describe('RMRKMultiAssetMock ERC721 behavior', function () { beforeEach(async function () { const { token } = await loadFixture(singleFixture); this.token = token; - this.ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); + this.receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); }); shouldBehaveLikeERC721('RmrkTest', 'RMRKTST'); diff --git a/test/nestable.ts b/test/nestable.ts index 0d0bea34..01c4d3cd 100644 --- a/test/nestable.ts +++ b/test/nestable.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { Contract } from 'ethers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { @@ -14,17 +13,22 @@ import { } from './utils'; import shouldBehaveLikeNestable from './behavior/nestable'; import shouldBehaveLikeERC721 from './behavior/erc721'; +import { RMRKNestableMock } from '../typechain-types'; -async function singleFixture(): Promise { - return singleFixtureWithArgs('RMRKNestableMock', []); +async function singleFixture(): Promise { + return (await singleFixtureWithArgs('RMRKNestableMock', [])); } -function parentChildFixture(): Promise<{ parent: Contract; child: Contract }> { - return parentChildFixtureWithArgs('RMRKNestableMock', [], []); + +async function parentChildFixture(): Promise<{ + parent: RMRKNestableMock; + child: RMRKNestableMock; +}> { + return await parentChildFixtureWithArgs('RMRKNestableMock', [], []); } describe('NestableMock', function () { - let parent: Contract; - let child: Contract; + let parent: RMRKNestableMock; + let child: RMRKNestableMock; let owner: SignerWithAddress; beforeEach(async function () { @@ -40,24 +44,26 @@ describe('NestableMock', function () { describe('Minting', async function () { it('cannot mint id 0', async function () { const tokenId = 0; - await expect( - child['mint(address,uint256)'](await owner.getAddress(), tokenId), - ).to.be.revertedWithCustomError(child, 'RMRKIdZeroForbidden'); + await expect(child.mint(await owner.getAddress(), tokenId)).to.be.revertedWithCustomError( + child, + 'RMRKIdZeroForbidden', + ); }); it('cannot nest mint id 0', async function () { const parentId = await mintFromMock(child, await owner.getAddress()); const childId = 0; await expect( - child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), + child.nestMint(await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'RMRKIdZeroForbidden'); }); it('cannot mint already minted token', async function () { const tokenId = await mintFromMock(child, await owner.getAddress()); - await expect( - child['mint(address,uint256)'](await owner.getAddress(), tokenId), - ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); + await expect(child.mint(await owner.getAddress(), tokenId)).to.be.revertedWithCustomError( + child, + 'ERC721TokenAlreadyMinted', + ); }); it('cannot nest mint already minted token', async function () { @@ -65,7 +71,7 @@ describe('NestableMock', function () { const childId = await nestMintFromMock(child, await parent.getAddress(), parentId); await expect( - child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), + child.nestMint(await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); }); @@ -74,26 +80,26 @@ describe('NestableMock', function () { const childId = await nestMintFromMock(child, await parent.getAddress(), parentId); await expect( - child['nestMint(address,uint256,uint256)'](await parent.getAddress(), childId, parentId), + child.nestMint(await parent.getAddress(), childId, parentId), ).to.be.revertedWithCustomError(child, 'ERC721TokenAlreadyMinted'); }); }); }); describe('NestableMock ERC721 behavior', function () { - let token: Contract; + let token: RMRKNestableMock; beforeEach(async function () { token = await loadFixture(singleFixture); this.token = token; - this.ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); + this.receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); }); shouldBehaveLikeERC721('Chunky', 'CHNKY'); }); describe('NestableMock transfer hooks', function () { - let parent: Contract; - let child: Contract; + let parent: RMRKNestableMock; + let child: RMRKNestableMock; let owner: SignerWithAddress; let otherOwner: SignerWithAddress; diff --git a/test/nestableMultiasset.ts b/test/nestableMultiasset.ts index 5d631cfb..68c09045 100644 --- a/test/nestableMultiasset.ts +++ b/test/nestableMultiasset.ts @@ -1,6 +1,5 @@ import { expect } from 'chai'; import { ethers } from 'hardhat'; -import { Contract } from 'ethers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { @@ -27,13 +26,16 @@ async function singleFixture(): Promise<{ await renderUtils.waitForDeployment(); const token = ( - await singleFixtureWithArgs('RMRKNestableMultiAssetMock', []) + (await singleFixtureWithArgs('RMRKNestableMultiAssetMock', [])) ); return { token, renderUtils }; } -async function parentChildFixture(): Promise<{ parent: Contract; child: Contract }> { - return parentChildFixtureWithArgs('RMRKNestableMultiAssetMock', [], []); +async function parentChildFixture(): Promise<{ + parent: RMRKNestableMultiAssetMock; + child: RMRKNestableMultiAssetMock; +}> { + return await parentChildFixtureWithArgs('RMRKNestableMultiAssetMock', [], []); } describe('NestableMultiAssetMock Nestable Behavior', function () { @@ -62,7 +64,7 @@ describe('NestableMultiAssetMock ERC721 behavior', function () { beforeEach(async function () { ({ token } = await loadFixture(singleFixture)); this.token = token; - this.ERC721Receiver = await ethers.getContractFactory('ERC721ReceiverMock'); + this.receiverFactory = await ethers.getContractFactory('ERC721ReceiverMock'); }); shouldBehaveLikeERC721('NestableMultiAsset', 'NMA'); diff --git a/test/ownableLock.ts b/test/ownableLock.ts index 1f1d7aa1..b765eeca 100644 --- a/test/ownableLock.ts +++ b/test/ownableLock.ts @@ -1,10 +1,10 @@ import { ethers } from 'hardhat'; -import { Contract } from 'ethers'; import shouldBehaveLikeOwnableLock from './behavior/ownableLock'; +import { OwnableLockMock } from '../typechain-types'; describe('Ownable Lock', async () => { - let token: Contract; + let token: OwnableLockMock; const ismock = true; diff --git a/test/setup/equippableParts.ts b/test/setup/equippableParts.ts index 0d927be1..681e8d20 100644 --- a/test/setup/equippableParts.ts +++ b/test/setup/equippableParts.ts @@ -1,45 +1,46 @@ import { ethers } from 'hardhat'; -import { Contract } from 'ethers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { RMRKCatalogImpl } from '../../typechain-types'; +import { GenericEquippable } from '../utils'; let addrs: SignerWithAddress[]; -const partIdForHead1 = 1; -const partIdForHead2 = 2; -const partIdForHead3 = 3; -const partIdForBody1 = 4; -const partIdForBody2 = 5; -const partIdForHair1 = 6; -const partIdForHair2 = 7; -const partIdForHair3 = 8; -const partIdForMaskCatalog1 = 9; -const partIdForMaskCatalog2 = 10; -const partIdForMaskCatalog3 = 11; -const partIdForEars1 = 12; -const partIdForEars2 = 13; -const partIdForHorns1 = 14; -const partIdForHorns2 = 15; -const partIdForHorns3 = 16; -const partIdForMaskCatalogEquipped1 = 17; -const partIdForMaskCatalogEquipped2 = 18; -const partIdForMaskCatalogEquipped3 = 19; -const partIdForEarsEquipped1 = 20; -const partIdForEarsEquipped2 = 21; -const partIdForHornsEquipped1 = 22; -const partIdForHornsEquipped2 = 23; -const partIdForHornsEquipped3 = 24; -const partIdForMask = 25; +const partIdForHead1 = 1n; +const partIdForHead2 = 2n; +const partIdForHead3 = 3n; +const partIdForBody1 = 4n; +const partIdForBody2 = 5n; +const partIdForHair1 = 6n; +const partIdForHair2 = 7n; +const partIdForHair3 = 8n; +const partIdForMaskCatalog1 = 9n; +const partIdForMaskCatalog2 = 10n; +const partIdForMaskCatalog3 = 11n; +const partIdForEars1 = 12n; +const partIdForEars2 = 13n; +const partIdForHorns1 = 14n; +const partIdForHorns2 = 15n; +const partIdForHorns3 = 16n; +const partIdForMaskCatalogEquipped1 = 17n; +const partIdForMaskCatalogEquipped2 = 18n; +const partIdForMaskCatalogEquipped3 = 19n; +const partIdForEarsEquipped1 = 20n; +const partIdForEarsEquipped2 = 21n; +const partIdForHornsEquipped1 = 22n; +const partIdForHornsEquipped2 = 23n; +const partIdForHornsEquipped3 = 24n; +const partIdForMask = 25n; -const uniqueNeons = 10; -const uniqueMasks = 4; +const uniqueNeons = 10n; +const uniqueMasks = 4n; // Ids could be the same since they are different collections, but to avoid log problems we have them unique const neons: bigint[] = []; const masks: bigint[] = []; -const neonResIds = [100, 101, 102, 103, 104]; -const maskAssetsFull = [1, 2, 3, 4]; // Must match the total of uniqueAssets -const maskAssetsEquip = [5, 6, 7, 8]; // Must match the total of uniqueAssets -const maskEquippableGroupId = 1; // Assets to equip will all use this +const neonResIds = [100n, 101n, 102n, 103n, 104n]; +const maskAssetsFull = [1n, 2n, 3n, 4n]; // Must match the total of uniqueAssets +const maskAssetsEquip = [5n, 6n, 7n, 8n]; // Must match the total of uniqueAssets +const maskEquippableGroupId = 1n; // Assets to equip will all use this enum ItemType { None, @@ -48,11 +49,11 @@ enum ItemType { } async function setupContextForParts( - catalog: Contract, - neon: Contract, - mask: Contract, - mint: (token: Contract, to: string) => Promise, - nestMint: (token: Contract, to: string, parentId: bigint) => Promise, + catalog: RMRKCatalogImpl, + neon: GenericEquippable, + mask: GenericEquippable, + mint: (token: GenericEquippable, to: string) => Promise, + nestMint: (token: GenericEquippable, to: string, parentId: bigint) => Promise, ) { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; @@ -387,10 +388,14 @@ async function setupContextForParts( // Add 2 assets to each weapon, one full, one for equip // There are 10 weapon tokens for 4 unique assets so we use % for (let i = 0; i < masks.length; i++) { - await mask.addAssetToToken(masks[i], maskAssetsFull[i % uniqueMasks], 0); - await mask.addAssetToToken(masks[i], maskAssetsEquip[i % uniqueMasks], 0); - await mask.connect(addrs[i % 3]).acceptAsset(masks[i], 0, maskAssetsFull[i % uniqueMasks]); - await mask.connect(addrs[i % 3]).acceptAsset(masks[i], 0, maskAssetsEquip[i % uniqueMasks]); + await mask.addAssetToToken(masks[i], maskAssetsFull[i % Number(uniqueMasks)], 0); + await mask.addAssetToToken(masks[i], maskAssetsEquip[i % Number(uniqueMasks)], 0); + await mask + .connect(addrs[i % 3]) + .acceptAsset(masks[i], 0, maskAssetsFull[i % Number(uniqueMasks)]); + await mask + .connect(addrs[i % 3]) + .acceptAsset(masks[i], 0, maskAssetsEquip[i % Number(uniqueMasks)]); } } } diff --git a/test/setup/equippableSlots.ts b/test/setup/equippableSlots.ts index ca0b737b..5e457ba1 100644 --- a/test/setup/equippableSlots.ts +++ b/test/setup/equippableSlots.ts @@ -1,6 +1,7 @@ import { ethers } from 'hardhat'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogImpl, RMRKEquippableMock } from '../../typechain-types'; +import { GenericEquippable } from '../utils'; const partIdForBody = 1; const partIdForWeapon = 2; @@ -35,12 +36,12 @@ let addrs: SignerWithAddress[]; async function setupContextForSlots( catalog: RMRKCatalogImpl, catalogForWeapon: RMRKCatalogImpl, - soldier: RMRKEquippableMock, - weapon: RMRKEquippableMock, - weaponGem: RMRKEquippableMock, - background: RMRKEquippableMock, - mint: (token: RMRKEquippableMock, to: string) => Promise, - nestMint: (token: RMRKEquippableMock, to: string, parentId: bigint) => Promise, + soldier: GenericEquippable, + weapon: GenericEquippable, + weaponGem: GenericEquippable, + background: GenericEquippable, + mint: (token: GenericEquippable, to: string) => Promise, + nestMint: (token: GenericEquippable, to: string, parentId: bigint) => Promise, ) { const [, ...signersAddr] = await ethers.getSigners(); addrs = signersAddr; diff --git a/test/utils.ts b/test/utils.ts index 6abb2c0d..66f24790 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,16 +1,45 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; -import { Contract, EventLog } from 'ethers'; +import { Contract, ContractTransactionResponse, EventLog } from 'ethers'; import { ethers } from 'hardhat'; import { + ERC20Mock, + RMRKAbstractEquippable, + RMRKAbstractMultiAsset, + RMRKAbstractNestable, + RMRKAbstractNestableMultiAsset, + RMRKCatalogImpl, + RMRKEquippableLazyMintErc20, + RMRKEquippableLazyMintErc20Soulbound, RMRKEquippableLazyMintNative, + RMRKEquippableLazyMintNativeSoulbound, RMRKEquippableMock, RMRKEquippablePreMint, + RMRKEquippablePreMintSoulbound, + RMRKMinifiedEquippableMock, + RMRKMultiAssetLazyMintErc20, + RMRKMultiAssetLazyMintErc20Soulbound, RMRKMultiAssetLazyMintNative, + RMRKMultiAssetLazyMintNativeSoulbound, + RMRKMultiAssetMock, RMRKMultiAssetPreMint, + RMRKMultiAssetPreMintSoulbound, + RMRKNestableLazyMintErc20, + RMRKNestableLazyMintErc20Soulbound, RMRKNestableLazyMintNative, + RMRKNestableLazyMintNativeSoulbound, + RMRKNestableMock, + RMRKNestableMultiAssetLazyMintErc20, + RMRKNestableMultiAssetLazyMintErc20Soulbound, RMRKNestableMultiAssetLazyMintNative, + RMRKNestableMultiAssetLazyMintNativeSoulbound, + RMRKNestableMultiAssetMock, RMRKNestableMultiAssetPreMint, RMRKNestableMultiAssetPreMintSoulbound, + RMRKNestablePreMint, + RMRKNestablePreMintSoulbound, + RMRKNestableTypedMultiAssetMock, + RMRKTypedEquippableMock, + RMRKTypedMultiAssetMock, } from '../typechain-types'; let nextTokenId = 1; @@ -18,11 +47,110 @@ let nextChildTokenId = 100; const ONE_ETH = ethers.parseEther('1.0'); const ADDRESS_ZERO = ethers.ZeroAddress; +type GenericCatalog = RMRKCatalogImpl; +type GenericReadyToUse = + | RMRKMultiAssetPreMint + | RMRKMultiAssetPreMintSoulbound + | RMRKNestablePreMint + | RMRKNestablePreMintSoulbound + | RMRKNestableMultiAssetPreMint + | RMRKNestableMultiAssetPreMintSoulbound + | RMRKEquippablePreMint + | RMRKEquippablePreMintSoulbound + | RMRKMultiAssetLazyMintNative + | RMRKMultiAssetLazyMintNativeSoulbound + | RMRKNestableLazyMintNative + | RMRKNestableLazyMintNativeSoulbound + | RMRKNestableMultiAssetLazyMintNative + | RMRKNestableMultiAssetLazyMintNativeSoulbound + | RMRKEquippableLazyMintNative + | RMRKEquippableLazyMintNativeSoulbound + | RMRKMultiAssetLazyMintErc20 + | RMRKMultiAssetLazyMintErc20Soulbound + | RMRKNestableLazyMintErc20 + | RMRKNestableLazyMintErc20Soulbound + | RMRKNestableMultiAssetLazyMintErc20 + | RMRKNestableMultiAssetLazyMintErc20Soulbound + | RMRKEquippableLazyMintErc20 + | RMRKEquippableLazyMintErc20Soulbound; +type GenericMultiAsset = + | RMRKMultiAssetPreMint + | RMRKMultiAssetPreMintSoulbound + | RMRKNestableMultiAssetPreMint + | RMRKNestableMultiAssetPreMintSoulbound + | RMRKEquippablePreMint + | RMRKEquippablePreMintSoulbound + | RMRKMultiAssetLazyMintNative + | RMRKMultiAssetLazyMintNativeSoulbound + | RMRKNestableMultiAssetLazyMintNative + | RMRKNestableMultiAssetLazyMintNativeSoulbound + | RMRKEquippableLazyMintNative + | RMRKEquippableLazyMintNativeSoulbound + | RMRKNestableMultiAssetLazyMintErc20 + | RMRKMultiAssetLazyMintErc20 + | RMRKMultiAssetLazyMintErc20Soulbound + | RMRKNestableMultiAssetLazyMintErc20Soulbound + | RMRKEquippableLazyMintErc20 + | RMRKEquippableLazyMintErc20Soulbound; +type GenericEquippable = RMRKEquippableMock | RMRKMinifiedEquippableMock; +type GenericNestMintable = + | RMRKEquippableMock + | RMRKMinifiedEquippableMock + | RMRKNestableMock + | RMRKNestableMultiAssetMock; +type GenericTypedMultiAsset = + | RMRKTypedMultiAssetMock + | RMRKNestableTypedMultiAssetMock + | RMRKTypedEquippableMock; +type GenericMintable = + | GenericMultiAsset + | GenericEquippable + | GenericNestMintable + | RMRKMultiAssetMock + | GenericTypedMultiAsset; + +// Pre-mint +type GenericNestMintablePreMint = + | RMRKEquippablePreMint + | RMRKNestableMultiAssetPreMint + | RMRKNestableMultiAssetPreMintSoulbound; +type GenericMintablePreMint = GenericNestMintablePreMint | RMRKMultiAssetPreMint; +// ERC20 payment +type GenericNestMintableERC20Pay = + | RMRKEquippableLazyMintErc20 + | RMRKNestableLazyMintErc20 + | RMRKNestableMultiAssetLazyMintErc20; +type GenericMintableERC20Pay = GenericNestMintableERC20Pay | RMRKMultiAssetLazyMintErc20; +// Native token payment +type GenericNestMintableNativeToken = + | RMRKEquippableLazyMintNative + | RMRKNestableLazyMintNative + | RMRKNestableMultiAssetLazyMintNative; +type GenericMintableNativeToken = GenericNestMintableNativeToken | RMRKMultiAssetLazyMintNative; +// Transferable +type GenericSafeTransferable = RMRKMinifiedEquippableMock; +type GenericTransferable = + | GenericMintable + | GenericMintablePreMint + | GenericMintableERC20Pay + | GenericMintableNativeToken; +type GenericNestTransferable = + | GenericNestMintable + | GenericNestMintablePreMint + | GenericNestMintableERC20Pay + | GenericNestMintableNativeToken; + +type GenericAbstractImplementation = + | RMRKAbstractEquippable + | RMRKAbstractMultiAsset + | RMRKAbstractNestable + | RMRKAbstractNestableMultiAsset; + function bn(x: number): bigint { return BigInt(x); } -async function mintFromMock(token: RMRKEquippableMock, to: string): Promise { +async function mintFromMock(token: GenericMintable, to: string): Promise { const tokenId = nextTokenId; nextTokenId++; await token.mint(to, tokenId); @@ -30,24 +158,13 @@ async function mintFromMock(token: RMRKEquippableMock, to: string): Promise { +async function mintFromMockPremint(token: GenericMintablePreMint, to: string): Promise { const tx = await token.mint(to, 1, `ipfs://tokenURI`); - // Get the event from the tx - const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - // Get the tokenId from the event - // @ts-ignore - return event.args[2]; + return await getTokenIdFromTx(tx); } async function nestMintFromMock( - token: RMRKEquippableMock, + token: GenericNestMintable, to: string, parentId: bigint, ): Promise { @@ -57,63 +174,47 @@ async function nestMintFromMock( return bn(childTokenId); } -async function nestMintFromMockPreMint( - token: Contract, - to: string, - parentId: bigint, -): Promise { - const tx = await token['nestMint(address,uint256,uint256,string)']( - to, - 1, - parentId, - `ipfs://tokenURI`, - ); +async function getTokenIdFromTx(tx: ContractTransactionResponse): Promise { + const receipt = await tx.wait(); + if (receipt === null || receipt === undefined) { + throw new Error('No events in receipt'); + } // Get the event from the tx - const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); + // @ts-ignore + const event = receipt.logs.find((e) => e.eventName === 'Transfer'); + if (event === undefined) { + throw new Error('No Transfer event in receipt'); + } // Get the tokenId from the event // @ts-ignore return event.args[2]; } -async function mintFromErc20Pay(token: Contract, to: string): Promise { +async function nestMintFromMockPreMint( + token: GenericNestMintablePreMint, + to: string, + parentId: bigint, +): Promise { + const tx = await token.nestMint(to, 1, parentId, `ipfs://tokenURI`); + return await getTokenIdFromTx(tx); +} + +async function mintFromErc20Pay(token: GenericMintableERC20Pay, to: string): Promise { const erc20Address = await token.erc20TokenAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); - const erc20 = erc20Factory.attach(erc20Address); + const erc20 = erc20Factory.attach(erc20Address); const owner = (await ethers.getSigners())[0]; await erc20.mint(await owner.getAddress(), ONE_ETH); await erc20.approve(await token.getAddress(), ONE_ETH); const tx = await token.mint(to, 1); - // Get the event from the tx - const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - // Get the tokenId from the event - // @ts-ignore - return event.args[2]; + return await getTokenIdFromTx(tx); } -async function mintFromNativeToken( - token: - | RMRKMultiAssetLazyMintNative - | RMRKNestableLazyMintNative - | RMRKNestableMultiAssetLazyMintNative - | RMRKEquippableLazyMintNative, - to: string, -): Promise { +async function mintFromNativeToken(token: GenericMintableNativeToken, to: string): Promise { const tx = await token.mint(to, 1, { value: ONE_ETH }); - const receipt = await tx.wait(); - if (receipt === null || receipt === undefined) { - throw new Error('No events in receipt'); - } - // Get the event from the tx - // @ts-ignore - const event = receipt.logs.find((e) => e.eventName === 'Transfer'); - if (event === undefined) { - throw new Error('No Transfer event in receipt'); - } - // Get the tokenId from the event - // @ts-ignore - return event.args[2]; + return await getTokenIdFromTx(tx); } async function nestMintFromErc20Pay( @@ -123,18 +224,14 @@ async function nestMintFromErc20Pay( ): Promise { const erc20Address = await token.erc20TokenAddress(); const erc20Factory = await ethers.getContractFactory('ERC20Mock'); - const erc20 = erc20Factory.attach(erc20Address); + const erc20 = erc20Factory.attach(erc20Address); const owner = (await ethers.getSigners())[0]; await erc20.mint(await owner.getAddress(), ONE_ETH); await erc20.approve(await token.getAddress(), ONE_ETH); const tx = await token.nestMint(to, 1, destinationId); - // Get the event from the tx - const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - // Get the tokenId from the event - // @ts-ignore - return event.args[2]; + return await getTokenIdFromTx(tx); } async function nestMintFromNativeToken( @@ -146,26 +243,20 @@ async function nestMintFromNativeToken( destinationId: bigint, ): Promise { const tx = await token.nestMint(to, 1, destinationId, { value: ONE_ETH }); - // Get the event from the tx - const event = (await tx.wait()).logs.find((e) => e.eventName === 'Transfer'); - // Get the tokenId from the event - // @ts-ignore - return event.args[2]; + return await getTokenIdFromTx(tx); } async function transfer( - token: Contract, + token: GenericTransferable, caller: SignerWithAddress, to: string, tokenId: bigint, ): Promise { - await token - .connect(caller) - ['transferFrom(address,address,uint256)'](await caller.getAddress(), to, tokenId); + await token.connect(caller).transferFrom(await caller.getAddress(), to, tokenId); } async function nestTransfer( - token: Contract, + token: GenericNestTransferable, caller: SignerWithAddress, to: string, tokenId: bigint, @@ -187,7 +278,10 @@ async function addAssetToToken( let nextAssetId = 1; -async function addAssetEntryFromMock(token: Contract, data?: string): Promise { +async function addAssetEntryFromMock( + token: RMRKMultiAssetMock | RMRKNestableMultiAssetMock, + data?: string, +): Promise { const assetId = bn(nextAssetId); nextAssetId++; await token.addAssetEntry(assetId, data !== undefined ? data : 'metaURI'); @@ -199,7 +293,10 @@ async function addAssetEntryFromImpl(token: Contract, data?: string): Promise { +async function addAssetEntryEquippablesFromMock( + token: RMRKEquippableMock | RMRKMinifiedEquippableMock, + data?: string, +): Promise { const assetId = bn(nextAssetId); const equippableGroupId = bn(1); nextAssetId++; @@ -226,7 +323,7 @@ async function addAssetEntryEquippablesFromImpl(token: Contract, data?: string): async function singleFixtureWithArgs(contractName: string, args: any[]): Promise { const factory = await ethers.getContractFactory(contractName); - const token = await factory.deploy(...args); + const token = await factory.deploy(...args); await token.waitForDeployment(); return token; } @@ -235,12 +332,12 @@ async function parentChildFixtureWithArgs( contractName: string, parentArgs: any[], childArgs: any[], -): Promise<{ parent: Contract; child: Contract }> { +): Promise<{ parent: GenericEquippable; child: GenericEquippable }> { const factory = await ethers.getContractFactory(contractName); - const parent = await factory.deploy(...parentArgs); + const parent = await factory.deploy(...parentArgs); await parent.waitForDeployment(); - const child = await factory.deploy(...childArgs); + const child = await factory.deploy(...childArgs); await child.waitForDeployment(); return { parent, child }; @@ -254,17 +351,35 @@ export { addAssetToToken, ADDRESS_ZERO, bn, - mintFromNativeToken, + getTokenIdFromTx, mintFromErc20Pay, mintFromMock, mintFromMockPremint, - nestMintFromNativeToken, + mintFromNativeToken, nestMintFromErc20Pay, nestMintFromMock, nestMintFromMockPreMint, + nestMintFromNativeToken, nestTransfer, ONE_ETH, parentChildFixtureWithArgs, singleFixtureWithArgs, transfer, + GenericAbstractImplementation, + GenericReadyToUse, + GenericCatalog, + GenericEquippable, + GenericMintable, + GenericMintableERC20Pay, + GenericMintableNativeToken, + GenericMintablePreMint, + GenericMultiAsset, + GenericNestMintable, + GenericNestMintableERC20Pay, + GenericNestMintableNativeToken, + GenericNestMintablePreMint, + GenericNestTransferable, + GenericSafeTransferable, + GenericTransferable, + GenericTypedMultiAsset, };