diff --git a/.env.example b/.env.example index c15a988..66c503c 100644 --- a/.env.example +++ b/.env.example @@ -6,3 +6,10 @@ PINATA_API_SECRET='3333' NFT_CONTRACT_ADDRESS = '0x5FbDB2315678afecb367f032d93F642f64180aa3' IPFS_FOLDER_CID='CIDID' ETHERSCAN_API_KEY='YOUR_API-KEY' + +MNEMONIC=some-mnemonic + +NFTY_PASS_BASE_URL=www.placeholder.com/ + +NFTY_HALLOWEEN_BASE_URL=www.placeholder2.com/ +NFTY_HALLOWEEN_NFTY_PASS_ADDRESS=0xF78aaEE20f2a464DeAdC6E815D8fea50A9e8Cd52 diff --git a/.gitignore b/.gitignore index aaa61ca..8ecf844 100644 --- a/.gitignore +++ b/.gitignore @@ -118,5 +118,4 @@ lint/outputs/ lint/tmp/ # lint/reports/ -node_modules -node_modules +abi diff --git a/README.md b/README.md index 7612800..293987c 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,92 @@ Check `package.json` scripts for more options. Use `.env.example` file and adapt it to you values and settings. Have Fun! + +## Nfty Village contract development instructions + +To build on top of Nfty Contracts we will have to deploy them. We will do this on +Rinkeby testnet and then we will verify the contract so it will be possible to interact +with it on Etherscan. + +The environment file example is name `.env.example`, you can check what variables are +needed there or you can just follow this guide in which I will tell you what to setup. + +### Installation + +```sh +npm i -g hardhat-shorthand +npm install +hh compile +``` + +To execute tests +```sh +hh test +``` + +### General Setup + +#### 1. RPC provider +I recommend you to use [Alchemy API](https://www.alchemy.com/) + +```dosini +RINKEBY_RPC_URL=https://eth-rinkeby.alchemyapi.io/v2/ +``` + +#### 2. Mnemonic +You can export you mnemonic from MetaMask + +```dosini +MNEMONIC=your-mnemonic-passphrase +``` + +#### 3. Etherscan API +Setup [Etherscan API](https://etherscan.io/) key so you will be able to verify your contract, this will enable +you to interact with smart contract via Etherscan. + +```dosini +ETHERSCAN_API_KEY= +``` + +### Deploying Nfty Pass + +To deploy Nfty Pass we will set default base uri which the contract will have + +```dosini +NFTY_PASS_BASE_URL=www.placeholder.com/ +``` + +#### Deployment + +First argument is Contract address that was deployed and the second one is base url +that was used in deployment. +```sh +hh deploy --tags pass --network rinkeby + +hh verify "www.placeholder.com/" --network rinkeby +``` + +The ABI json file which is needed by the GUI to interact with smart contract is located +at `./abi/contracts/NftyPass/NftyPass.json` + +### Deploying Nfty Halloween set +To deploy Halloween set we will have set NftyPass Contract Address and base url + +```dosini +NFTY_HALLOWEEN_BASE_URL=www.placeholder2.com/ +NFTY_HALLOWEEN_NFTY_PASS_ADDRESS=0xbe715eBA71324CE2277144D09aFe678c881B6615 +``` + +First argument is contract address. + +Second argument is `NFTY_HALLOWEEN_BASE_URL` + +Third argument is `NFTY_HALLOWEEN_NFTY_PASS_ADDRESS` +```sh +hh deploy --tags halloween --network rinkeby + +hh verify "www.placeholder2.com/" "0xbe715eBA71324CE2277144D09aFe678c881B6615" --network rinkeby +``` + +ABI json file is located at `./abi/contracts/NftyHalloween/NftyHalloween.json` + diff --git a/contracts/ERC721CustomEnumerable.sol b/contracts/ERC721CustomEnumerable.sol new file mode 100644 index 0000000..1f5f934 --- /dev/null +++ b/contracts/ERC721CustomEnumerable.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +/** + * @dev This implements an optional extension of {ERC721} defined in the EIP that adds + * enumerability of all the token ids in the contract as well as all token ids owned by each + * account. + */ +abstract contract ERC721CustomEnumerable is ERC721 { + // Mapping from owner to list of owned token IDs + mapping(address => mapping(uint256 => uint256)) private _ownedTokens; + + // Mapping from token ID to index of the owner tokens list + mapping(uint256 => uint256) private _ownedTokensIndex; + + // Array with all token ids, used for enumeration + uint256[] private _allTokens; + + // Mapping from token id to position in the allTokens array + mapping(uint256 => uint256) private _allTokensIndex; + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override + returns (bool) + { + return + interfaceId == type(ERC721CustomEnumerable).interfaceId || + super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. + */ + function tokenOfOwnerByIndex(address owner, uint256 index) + public + view + virtual + returns (uint256) + { + require( + index < ERC721.balanceOf(owner), + "ERC721CustomEnumerable: owner index out of bounds" + ); + return _ownedTokens[owner][index]; + } + + /** + * @dev See {IERC721Enumerable-tokenByIndex}. + */ + function tokenByIndex(uint256 index) public view virtual returns (uint256) { + require( + index < _allTokens.length, + "ERC721CustomEnumerable: global index out of bounds" + ); + return _allTokens[index]; + } + + /** + * @dev Hook that is called before any token transfer. This includes minting + * and burning. + * + * Calling conditions: + * + * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be + * transferred to `to`. + * - When `from` is zero, `tokenId` will be minted for `to`. + * - When `to` is zero, ``from``'s `tokenId` will be burned. + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override { + super._beforeTokenTransfer(from, to, tokenId); + + if (from == address(0)) { + _addTokenToAllTokensEnumeration(tokenId); + } else if (from != to) { + _removeTokenFromOwnerEnumeration(from, tokenId); + } + if (to == address(0)) { + _removeTokenFromAllTokensEnumeration(tokenId); + } else if (to != from) { + _addTokenToOwnerEnumeration(to, tokenId); + } + } + + /** + * @dev Private function to add a token to this extension's ownership-tracking data structures. + * @param to address representing the new owner of the given token ID + * @param tokenId uint256 ID of the token to be added to the tokens list of the given address + */ + function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { + uint256 length = ERC721.balanceOf(to); + _ownedTokens[to][length] = tokenId; + _ownedTokensIndex[tokenId] = length; + } + + /** + * @dev Private function to add a token to this extension's token tracking data structures. + * @param tokenId uint256 ID of the token to be added to the tokens list + */ + function _addTokenToAllTokensEnumeration(uint256 tokenId) private { + _allTokensIndex[tokenId] = _allTokens.length; + _allTokens.push(tokenId); + } + + /** + * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that + * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for + * gas optimizations e.g. when performing a transfer operation (avoiding double writes). + * This has O(1) time complexity, but alters the order of the _ownedTokens array. + * @param from address representing the previous owner of the given token ID + * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address + */ + function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) + private + { + // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and + // then delete the last slot (swap and pop). + + uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; + uint256 tokenIndex = _ownedTokensIndex[tokenId]; + + // When the token to delete is the last token, the swap operation is unnecessary + if (tokenIndex != lastTokenIndex) { + uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; + + _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token + _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index + } + + // This also deletes the contents at the last position of the array + delete _ownedTokensIndex[tokenId]; + delete _ownedTokens[from][lastTokenIndex]; + } + + /** + * @dev Private function to remove a token from this extension's token tracking data structures. + * This has O(1) time complexity, but alters the order of the _allTokens array. + * @param tokenId uint256 ID of the token to be removed from the tokens list + */ + function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { + // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and + // then delete the last slot (swap and pop). + + uint256 lastTokenIndex = _allTokens.length - 1; + uint256 tokenIndex = _allTokensIndex[tokenId]; + + // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so + // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding + // an 'if' statement (like in _removeTokenFromOwnerEnumeration) + uint256 lastTokenId = _allTokens[lastTokenIndex]; + + _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token + _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index + + // This also deletes the contents at the last position of the array + delete _allTokensIndex[tokenId]; + _allTokens.pop(); + } +} diff --git a/contracts/NftyHalloween.sol b/contracts/NftyHalloween.sol new file mode 100644 index 0000000..a7ac773 --- /dev/null +++ b/contracts/NftyHalloween.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.4; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/security/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@1001-digital/erc721-extensions/contracts/RandomlyAssigned.sol"; + +import "./ERC721CustomEnumerable.sol"; + +contract NftyHalloween is + ERC721, + Pausable, + Ownable, + RandomlyAssigned, + ERC721CustomEnumerable +{ + uint256 public constant MAX_TOKENS = 9000; + string private nftyBaseURI = ""; + IERC721 public nftyPass; + + mapping(uint256 => address) private claimed; + + constructor( + string memory _nftyBaseURI, + address _nftyPass + ) ERC721("NftyHalloween", "NFTYH") + RandomlyAssigned(MAX_TOKENS, 0) + { + nftyBaseURI = _nftyBaseURI; + nftyPass = IERC721(_nftyPass); + } + + function mint(uint256 pass) external whenNotPaused { + require(nftyPass.ownerOf(pass) == msg.sender, "Pass not owned by sender"); + require(claimed[pass] == address(0), "Pass already used"); + + claimed[pass] = msg.sender; + uint256 next = nextToken(); + _safeMint(msg.sender, next); + } + + function setBaseURI(string memory baseURI) external onlyOwner { + nftyBaseURI = baseURI; + } + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal override(ERC721, ERC721CustomEnumerable) { + super._beforeTokenTransfer(from, to, tokenId); + } + + function claimedPass(uint256 pass) public view returns (address) { + address claimedAddress = claimed[pass]; + require(claimedAddress != address(0), "Pass not claimed"); + + return claimedAddress; + } + + function _baseURI() internal view virtual override returns (string memory) { + return nftyBaseURI; + } + + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721, ERC721CustomEnumerable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } +} diff --git a/contracts/NftyPass.sol b/contracts/NftyPass.sol index 04b8528..6bbe567 100644 --- a/contracts/NftyPass.sol +++ b/contracts/NftyPass.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.4; -import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; diff --git a/deploy/01_Deploy.ts b/deploy/01_Deploy_Pass.ts similarity index 88% rename from deploy/01_Deploy.ts rename to deploy/01_Deploy_Pass.ts index 4fb60a3..d532801 100644 --- a/deploy/01_Deploy.ts +++ b/deploy/01_Deploy_Pass.ts @@ -17,7 +17,9 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { accounts[0] )) as NftyPass__factory; - nftTokenContract = await tokenFactory.deploy("www.placeholder.com/"); + nftTokenContract = await tokenFactory.deploy( + process.env.NFTY_PASS_BASE_URL || "www.placeholder.com/" + ); console.log( `The address the Contract WILL have once mined: ${nftTokenContract.address}` @@ -37,4 +39,4 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }; export default func; func.id = "deploy"; -func.tags = ["local"]; +func.tags = ["pass"]; diff --git a/deploy/02_Deploy_Halloween.ts b/deploy/02_Deploy_Halloween.ts new file mode 100644 index 0000000..b3ef6c8 --- /dev/null +++ b/deploy/02_Deploy_Halloween.ts @@ -0,0 +1,44 @@ +import { Signer } from "ethers"; +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { NftyHalloween, NftyHalloween__factory } from "../typechain"; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + let accounts: Signer[]; + let nftTokenContract: NftyHalloween; + + accounts = await hre.ethers.getSigners(); + + console.log(await accounts[0].getAddress()); + + const tokenFactory = (await hre.ethers.getContractFactory( + "NftyHalloween", + accounts[0] + )) as NftyHalloween__factory; + + nftTokenContract = await tokenFactory.deploy( + process.env.NFTY_HALLOWEEN_BASE_URL || "www.placeholder.com/", + process.env.NFTY_HALLOWEEN_NFTY_PASS_ADDRESS || + "0xBB21DE52AF8d8db738D967C688CEB90FBdAa30C3" + ); + + console.log( + `The address the Contract WILL have once mined: ${nftTokenContract.address}` + ); + + console.log( + `The transaction that was sent to the network to deploy the Contract: ${nftTokenContract.deployTransaction.hash}` + ); + + console.log( + "The contract is NOT deployed yet; we must wait until it is mined..." + ); + + await nftTokenContract.deployed(); + + console.log("Minted..."); +}; +export default func; +func.id = "deploy"; +func.tags = ["halloween"]; diff --git a/hardhat.config.ts b/hardhat.config.ts index 5bc5bf3..2bcc4af 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -7,6 +7,7 @@ import "@nomiclabs/hardhat-etherscan"; import "@nomiclabs/hardhat-solhint"; import "@typechain/hardhat"; import "dotenv/config"; +import "hardhat-abi-exporter"; import "hardhat-deploy"; import "solidity-coverage"; @@ -105,4 +106,10 @@ module.exports = { mocha: { timeout: 100000, }, + abiExporter: { + path: "./abi", + clear: true, + flat: false, + spacing: 2, + }, }; diff --git a/package-lock.json b/package-lock.json index fffb6b1..44ce2a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,10 +5,10 @@ "requires": true, "packages": { "": { - "name": "nfty-village", "version": "1.0.0", "license": "MIT", "devDependencies": { + "@1001-digital/erc721-extensions": "0.0.13", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@0.3.0-beta.11", "@nomiclabs/hardhat-etherscan": "2.1.7", "@nomiclabs/hardhat-solhint": "2.0.0", @@ -30,6 +30,7 @@ "dotenv": "10.0.0", "ethers": "5.5.1", "hardhat": "2.6.7", + "hardhat-abi-exporter": "^2.3.0", "hardhat-deploy": "0.9.4", "mocha-skip-if": "0.0.3", "prettier": "2.4.1", @@ -48,6 +49,15 @@ "web3": "1.6.0" } }, + "node_modules/@1001-digital/erc721-extensions": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@1001-digital/erc721-extensions/-/erc721-extensions-0.0.13.tgz", + "integrity": "sha512-13oFgpfzebQtTEM5hp+vLxNGBZd1vILUqHx6DURbeo4upO0HEO+TZWw1KM06sE0s4VSGC21UWzVbnw6oCXnMpA==", + "dev": true, + "peerDependencies": { + "@openzeppelin/contracts": "^4.2.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.14.5", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", @@ -1544,14 +1554,6 @@ "node": ">= 0.8.0" } }, - "node_modules/@nomiclabs/hardhat-solhint/node_modules/path-key": { - "version": "2.0.1", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomiclabs/hardhat-solhint/node_modules/prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", @@ -1599,25 +1601,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@nomiclabs/hardhat-solhint/node_modules/shebang-command": { - "version": "1.2.0", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nomiclabs/hardhat-solhint/node_modules/shebang-regex": { - "version": "1.0.0", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@nomiclabs/hardhat-solhint/node_modules/slice-ansi": { "version": "2.1.0", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", @@ -1724,17 +1707,6 @@ "node": ">= 0.8.0" } }, - "node_modules/@nomiclabs/hardhat-solhint/node_modules/which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/@nomiclabs/hardhat-web3": { "version": "2.0.0", "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", @@ -1896,13 +1868,14 @@ "dev": true }, "node_modules/@truffle/interface-adapter": { - "version": "0.5.3", - "integrity": "sha512-LCwOKlIMZqRNbncJG3Q+BS+aFg2bXU95jjgLNwFK+K//eoj4QhdxQPq2bTejRg4ag0UOr8MqJQbYFzkJxJBujQ==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz", + "integrity": "sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ==", "dev": true, "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", - "web3": "1.5.0" + "web3": "1.5.3" } }, "node_modules/@truffle/interface-adapter/node_modules/@ethersproject/abi": { @@ -1932,9 +1905,9 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", - "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==", + "version": "12.20.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.33.tgz", + "integrity": "sha512-5XmYX2GECSa+CxMYaFsr2mrql71Q4EvHjKS+ox/SiwSdaASMoBIWE6UmZqFO+VX1jIcsYLStI4FFoB6V7FeIYw==", "dev": true }, "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { @@ -2001,28 +1974,28 @@ "dev": true }, "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.0.tgz", - "integrity": "sha512-p6mOU+t11tV5Z0W9ISO2ReZlbB1ICp755ogl3OXOWZ+/oWy12wwnIva+z+ypsZc3P8gaoGaTvEwSfXM9NF164w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.3.tgz", + "integrity": "sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.5.0", - "web3-core": "1.5.0", - "web3-eth": "1.5.0", - "web3-eth-personal": "1.5.0", - "web3-net": "1.5.0", - "web3-shh": "1.5.0", - "web3-utils": "1.5.0" + "web3-bzz": "1.5.3", + "web3-core": "1.5.3", + "web3-eth": "1.5.3", + "web3-eth-personal": "1.5.3", + "web3-net": "1.5.3", + "web3-shh": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.0.tgz", - "integrity": "sha512-IqlecWpwTMO/O5qa0XZZubQh4GwAtO/CR+e2FQ/7oB5eXQyre3DZ/MYu8s5HCLxCR33Fcqda9q2dbNtm1wSQYw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.3.tgz", + "integrity": "sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -2035,56 +2008,57 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.0.tgz", - "integrity": "sha512-1o/etaPSK8tFOWTA6df3t9J6ez4epeyzlNmyh/gx8uHasfa16XLKD8//A9T+O/TmvyQAaA4hWAsQcvlRcuaZ8Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.3.tgz", + "integrity": "sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ==", "dev": true, "dependencies": { "@types/bn.js": "^4.11.5", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-requestmanager": "1.5.0", - "web3-utils": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-requestmanager": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.0.tgz", - "integrity": "sha512-7s5SrJbG5O0C0Oi9mqKLYchco72djZhk59B7kTla5vUorAxMc99SY7k9BoDgwbFl2dlZon2GtFUEW2RXUNkb1g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz", + "integrity": "sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw==", "dev": true, "dependencies": { - "web3-eth-iban": "1.5.0", - "web3-utils": "1.5.0" + "web3-eth-iban": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.0.tgz", - "integrity": "sha512-izPhpjbn9jVBjMeFcsU7a5+/nqni9hS5oU+d00HJGTVbp8KV6zplhYw4GjkRqyy6OQzooO8Gx2MMUyRdv5x1wg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.3.tgz", + "integrity": "sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg==", "dev": true, "dependencies": { + "@ethereumjs/common": "^2.4.0", "@ethersproject/transactions": "^5.0.0-beta.135", - "web3-core-helpers": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-utils": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.0.tgz", - "integrity": "sha512-7GkbOIMtcp1qN8LRMMmwIhulzEldT+3Mu7ii2WgAcFFKT1yzUl6Gmycf8mmoEKpAuADAQ9Qeyk0PskTR6rTYlQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz", + "integrity": "sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg==", "dev": true, "dependencies": { "eventemitter3": "4.0.4" @@ -2094,74 +2068,74 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.0.tgz", - "integrity": "sha512-Sr5T2JuXOAsINJ2tf7Rgi2a+Dy2suBDKT8eMc1pcspPmaBhvTKOQfM9XdsO4yjJKYw6tt/Tagw4GKZm4IOx7mw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz", + "integrity": "sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg==", "dev": true, "dependencies": { "util": "^0.12.0", - "web3-core-helpers": "1.5.0", - "web3-providers-http": "1.5.0", - "web3-providers-ipc": "1.5.0", - "web3-providers-ws": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-providers-http": "1.5.3", + "web3-providers-ipc": "1.5.3", + "web3-providers-ws": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.0.tgz", - "integrity": "sha512-dx9P1mZvJkQRiYpSo9SvFhYNzy5E9GHeLOc3uqxPaDxKU7Cu9fJnFHo/P6+wfD6ZhGIP23ZLK/uyor5UpdTqDQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz", + "integrity": "sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.5.0" + "web3-core-helpers": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.0.tgz", - "integrity": "sha512-31ni3YliTDYLKuWt8naitZ4Ru86whZlqvz6kFzCaBaCR/EumzA9ejzNbcX9okio9zUtKSHH37Bk0+WogfU9Jqg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.3.tgz", + "integrity": "sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q==", "dev": true, "dependencies": { - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-eth-accounts": "1.5.0", - "web3-eth-contract": "1.5.0", - "web3-eth-ens": "1.5.0", - "web3-eth-iban": "1.5.0", - "web3-eth-personal": "1.5.0", - "web3-net": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-eth-accounts": "1.5.3", + "web3-eth-contract": "1.5.3", + "web3-eth-ens": "1.5.3", + "web3-eth-iban": "1.5.3", + "web3-eth-personal": "1.5.3", + "web3-net": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.0.tgz", - "integrity": "sha512-rfT/SvfZY9+SNJRzTHxLFaebQRBhS67tGqUqLxlyy6EsAcEmIs/g4mAUH5atYwPE9bOQeiVoLKLbwJEBIcw86w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz", + "integrity": "sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg==", "dev": true, "dependencies": { "@ethersproject/abi": "5.0.7", - "web3-utils": "1.5.0" + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.0.tgz", - "integrity": "sha512-tqvF2bKECaS6jDux8h1dkdsrfb5SHIVVA6hu2lJmZNlTBqFIq2A8rfOkqcanie6Vh5n5U7Dnc2LUoN9rxgaSSg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz", + "integrity": "sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw==", "dev": true, "dependencies": { "@ethereumjs/common": "^2.3.0", @@ -2171,10 +2145,10 @@ "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", "uuid": "3.3.2", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" @@ -2197,51 +2171,51 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.0.tgz", - "integrity": "sha512-v4laiJRzdcoDwvqaMCzJH1BUosbTVsd01Qp+9v05Q94KycjkdeahPRXX6PEcUNW/ZF8N006iExUweGjajTZnTA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz", + "integrity": "sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg==", "dev": true, "dependencies": { "@types/bn.js": "^4.11.5", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.0.tgz", - "integrity": "sha512-NiaGfOnsCqP+3hOCeP3Q9IrlV/1ZCDiv8VmN1yF5Ya6n6YeO4TJU9MKP8i5038RFETjLIfGtXr5fthbsob30hA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz", + "integrity": "sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw==", "dev": true, "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-eth-contract": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-eth-contract": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.0.tgz", - "integrity": "sha512-cFfiPA8xs4lemMJjDb9KfXzPvs6rBrRl8y4rgvh/JWlZZgKolzo7KLXq4NR3oFd/C81s0Lslvz2st1EREp5CNA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz", + "integrity": "sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw==", "dev": true, "dependencies": { "bn.js": "^4.11.9", - "web3-utils": "1.5.0" + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" @@ -2254,43 +2228,43 @@ "dev": true }, "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.0.tgz", - "integrity": "sha512-FYBrzMS6q/df8ud1kAN1p6lqdP/pd0szogcuyrVyi++bFQiovnR+QosudFsbn/aAZPDHOEh0UV4P3KVKbLqw9g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz", + "integrity": "sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew==", "dev": true, "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-net": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-net": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.0.tgz", - "integrity": "sha512-oGgEtO2fRtJjAp0K1/fvH247MeeDemFL+5tF+PxII9b/gBxnVe+MzP+oNLr4dTrweromjv34tioR3kUgsqwCWg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.3.tgz", + "integrity": "sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ==", "dev": true, "dependencies": { - "web3-core": "1.5.0", - "web3-core-method": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-method": "1.5.3", + "web3-utils": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.0.tgz", - "integrity": "sha512-y1RuxsCGrWdsIUyuZBEN+3F8trl3bDZNajwLS2KYBGlB99sWYZHPmvbAsBpaW1d/I12W0fQiWOVzp63L7KPTow==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.3.tgz", + "integrity": "sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw==", "dev": true, "dependencies": { - "web3-core-helpers": "1.5.0", + "web3-core-helpers": "1.5.3", "xhr2-cookies": "1.1.0" }, "engines": { @@ -2298,26 +2272,26 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.0.tgz", - "integrity": "sha512-Hda9wlOaIJC9/qMOVkayK+fbBHDZBmPcoL7TfjQX7hrtZn8V3+gR27ciyRXmuW7QD3hDg7CJfe5uRK8brh3nSA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz", + "integrity": "sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg==", "dev": true, "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.5.0" + "web3-core-helpers": "1.5.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.0.tgz", - "integrity": "sha512-TCwOhu5WbuQCSUoar+U+7N1NqI4A6MlcdZqsC7AhTogYYtnXOPRWfiHMZtUP7Qw50GKJ37FIH3YDItcHTNHd6A==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz", + "integrity": "sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.5.0", + "web3-core-helpers": "1.5.3", "websocket": "^1.0.32" }, "engines": { @@ -2325,21 +2299,45 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.0.tgz", - "integrity": "sha512-TwpcxXNh+fBnyRcCPPqVqaCB4IjSpVL2/5OR2WwCnZwejs1ife+pej8DYVZWm0m1tSzIDRTdNbsJf/DN0cAxYQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.3.tgz", + "integrity": "sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-core": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-net": "1.5.0" + "web3-core": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-net": "1.5.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.5.3.tgz", + "integrity": "sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, "engines": { "node": ">=8.0.0" } }, + "node_modules/@truffle/interface-adapter/node_modules/web3-utils/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/@truffle/provider": { "version": "0.2.35", "integrity": "sha512-50go3TQOcfNVN8srUfHb7OIKFi6oEOFyybzZneDwSG6z6yD0A0Oc2Vk7/CeYiEkto7qrXXbIcVOP5zb++t3Q+g==", @@ -3991,6 +3989,7 @@ "node_modules/cids": { "version": "0.7.5", "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "buffer": "^5.5.0", @@ -4199,7 +4198,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "stable api reached", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "varint": "^5.0.0" @@ -7055,17 +7054,6 @@ "node": ">=6" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/globals": { "version": "11.12.0", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", @@ -7264,6 +7252,18 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/hardhat-abi-exporter": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.3.0.tgz", + "integrity": "sha512-9EVhogHgFWsi4Bc46tv+WirOR+auGBZrv9V5/qAHBjOqYiZPbNXoFUo/yQhOAsF8Bz4Q9p4jHpdeQXnYt7g6Yw==", + "dev": true, + "engines": { + "node": ">=12.10.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0" + } + }, "node_modules/hardhat-deploy": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.9.4.tgz", @@ -9089,17 +9089,6 @@ "node": ">=6" } }, - "node_modules/mocha/node_modules/which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -9127,6 +9116,7 @@ "node_modules/multiaddr/node_modules/cids": { "version": "0.8.3", "integrity": "sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "buffer": "^5.6.0", @@ -9143,6 +9133,7 @@ "node_modules/multiaddr/node_modules/cids/node_modules/multibase": { "version": "1.0.1", "integrity": "sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "base-x": "^3.0.8", @@ -9156,6 +9147,7 @@ "node_modules/multiaddr/node_modules/multibase": { "version": "0.7.0", "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "base-x": "^3.0.8", @@ -9179,6 +9171,7 @@ "node_modules/multiaddr/node_modules/multihashes/node_modules/multibase": { "version": "1.0.1", "integrity": "sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "base-x": "^3.0.8", @@ -9192,6 +9185,7 @@ "node_modules/multibase": { "version": "0.6.1", "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "base-x": "^3.0.8", @@ -9201,6 +9195,7 @@ "node_modules/multicodec": { "version": "1.0.4", "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "buffer": "^5.6.0", @@ -9220,6 +9215,7 @@ "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dev": true, "dependencies": { "base-x": "^3.0.8", @@ -9723,6 +9719,15 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-parse": { "version": "1.0.7", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", @@ -10309,6 +10314,18 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", @@ -10485,17 +10502,6 @@ "node": ">=0.8.0" } }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/sc-istanbul/node_modules/wordwrap": { "version": "1.0.0", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", @@ -10662,16 +10668,37 @@ "sha.js": "bin.js" } }, - "node_modules/shelljs": { - "version": "0.8.4", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "shebang-regex": "^1.0.0" }, - "bin": { + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { "shjs": "bin/shjs" }, "engines": { @@ -10811,17 +10838,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/solc/node_modules/semver": { "version": "5.7.1", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", @@ -11095,14 +11111,6 @@ "node": ">= 0.8.0" } }, - "node_modules/solhint/node_modules/path-key": { - "version": "2.0.1", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/solhint/node_modules/prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", @@ -11150,25 +11158,6 @@ "semver": "bin/semver.js" } }, - "node_modules/solhint/node_modules/shebang-command": { - "version": "1.2.0", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/node_modules/shebang-regex": { - "version": "1.0.0", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/solhint/node_modules/slice-ansi": { "version": "2.1.0", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", @@ -11250,17 +11239,6 @@ "node": ">= 0.8.0" } }, - "node_modules/solhint/node_modules/which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/solidity-comments-extractor": { "version": "0.0.7", "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", @@ -13087,6 +13065,18 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", @@ -13490,6 +13480,13 @@ } }, "dependencies": { + "@1001-digital/erc721-extensions": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@1001-digital/erc721-extensions/-/erc721-extensions-0.0.13.tgz", + "integrity": "sha512-13oFgpfzebQtTEM5hp+vLxNGBZd1vILUqHx6DURbeo4upO0HEO+TZWw1KM06sE0s4VSGC21UWzVbnw6oCXnMpA==", + "dev": true, + "requires": {} + }, "@babel/code-frame": { "version": "7.14.5", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", @@ -14560,11 +14557,6 @@ "word-wrap": "~1.2.3" } }, - "path-key": { - "version": "2.0.1", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", @@ -14594,19 +14586,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "slice-ansi": { "version": "2.1.0", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", @@ -14688,14 +14667,6 @@ "requires": { "prelude-ls": "~1.1.2" } - }, - "which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -14829,13 +14800,14 @@ "dev": true }, "@truffle/interface-adapter": { - "version": "0.5.3", - "integrity": "sha512-LCwOKlIMZqRNbncJG3Q+BS+aFg2bXU95jjgLNwFK+K//eoj4QhdxQPq2bTejRg4ag0UOr8MqJQbYFzkJxJBujQ==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz", + "integrity": "sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ==", "dev": true, "requires": { "bn.js": "^5.1.3", "ethers": "^4.0.32", - "web3": "1.5.0" + "web3": "1.5.3" }, "dependencies": { "@ethersproject/abi": { @@ -14865,9 +14837,9 @@ } }, "@types/node": { - "version": "12.20.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", - "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==", + "version": "12.20.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.33.tgz", + "integrity": "sha512-5XmYX2GECSa+CxMYaFsr2mrql71Q4EvHjKS+ox/SiwSdaASMoBIWE6UmZqFO+VX1jIcsYLStI4FFoB6V7FeIYw==", "dev": true }, "eth-lib": { @@ -14937,24 +14909,24 @@ "dev": true }, "web3": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.0.tgz", - "integrity": "sha512-p6mOU+t11tV5Z0W9ISO2ReZlbB1ICp755ogl3OXOWZ+/oWy12wwnIva+z+ypsZc3P8gaoGaTvEwSfXM9NF164w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.3.tgz", + "integrity": "sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w==", "dev": true, "requires": { - "web3-bzz": "1.5.0", - "web3-core": "1.5.0", - "web3-eth": "1.5.0", - "web3-eth-personal": "1.5.0", - "web3-net": "1.5.0", - "web3-shh": "1.5.0", - "web3-utils": "1.5.0" + "web3-bzz": "1.5.3", + "web3-core": "1.5.3", + "web3-eth": "1.5.3", + "web3-eth-personal": "1.5.3", + "web3-net": "1.5.3", + "web3-shh": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-bzz": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.0.tgz", - "integrity": "sha512-IqlecWpwTMO/O5qa0XZZubQh4GwAtO/CR+e2FQ/7oB5eXQyre3DZ/MYu8s5HCLxCR33Fcqda9q2dbNtm1wSQYw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.3.tgz", + "integrity": "sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -14963,109 +14935,110 @@ } }, "web3-core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.0.tgz", - "integrity": "sha512-1o/etaPSK8tFOWTA6df3t9J6ez4epeyzlNmyh/gx8uHasfa16XLKD8//A9T+O/TmvyQAaA4hWAsQcvlRcuaZ8Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.3.tgz", + "integrity": "sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ==", "dev": true, "requires": { "@types/bn.js": "^4.11.5", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-requestmanager": "1.5.0", - "web3-utils": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-requestmanager": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-core-helpers": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.0.tgz", - "integrity": "sha512-7s5SrJbG5O0C0Oi9mqKLYchco72djZhk59B7kTla5vUorAxMc99SY7k9BoDgwbFl2dlZon2GtFUEW2RXUNkb1g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz", + "integrity": "sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw==", "dev": true, "requires": { - "web3-eth-iban": "1.5.0", - "web3-utils": "1.5.0" + "web3-eth-iban": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-core-method": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.0.tgz", - "integrity": "sha512-izPhpjbn9jVBjMeFcsU7a5+/nqni9hS5oU+d00HJGTVbp8KV6zplhYw4GjkRqyy6OQzooO8Gx2MMUyRdv5x1wg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.3.tgz", + "integrity": "sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg==", "dev": true, "requires": { + "@ethereumjs/common": "^2.4.0", "@ethersproject/transactions": "^5.0.0-beta.135", - "web3-core-helpers": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-utils": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-core-promievent": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.0.tgz", - "integrity": "sha512-7GkbOIMtcp1qN8LRMMmwIhulzEldT+3Mu7ii2WgAcFFKT1yzUl6Gmycf8mmoEKpAuADAQ9Qeyk0PskTR6rTYlQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz", + "integrity": "sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg==", "dev": true, "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.0.tgz", - "integrity": "sha512-Sr5T2JuXOAsINJ2tf7Rgi2a+Dy2suBDKT8eMc1pcspPmaBhvTKOQfM9XdsO4yjJKYw6tt/Tagw4GKZm4IOx7mw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz", + "integrity": "sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg==", "dev": true, "requires": { "util": "^0.12.0", - "web3-core-helpers": "1.5.0", - "web3-providers-http": "1.5.0", - "web3-providers-ipc": "1.5.0", - "web3-providers-ws": "1.5.0" + "web3-core-helpers": "1.5.3", + "web3-providers-http": "1.5.3", + "web3-providers-ipc": "1.5.3", + "web3-providers-ws": "1.5.3" } }, "web3-core-subscriptions": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.0.tgz", - "integrity": "sha512-dx9P1mZvJkQRiYpSo9SvFhYNzy5E9GHeLOc3uqxPaDxKU7Cu9fJnFHo/P6+wfD6ZhGIP23ZLK/uyor5UpdTqDQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz", + "integrity": "sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.5.0" + "web3-core-helpers": "1.5.3" } }, "web3-eth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.0.tgz", - "integrity": "sha512-31ni3YliTDYLKuWt8naitZ4Ru86whZlqvz6kFzCaBaCR/EumzA9ejzNbcX9okio9zUtKSHH37Bk0+WogfU9Jqg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.3.tgz", + "integrity": "sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q==", "dev": true, "requires": { - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-eth-accounts": "1.5.0", - "web3-eth-contract": "1.5.0", - "web3-eth-ens": "1.5.0", - "web3-eth-iban": "1.5.0", - "web3-eth-personal": "1.5.0", - "web3-net": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-eth-accounts": "1.5.3", + "web3-eth-contract": "1.5.3", + "web3-eth-ens": "1.5.3", + "web3-eth-iban": "1.5.3", + "web3-eth-personal": "1.5.3", + "web3-net": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-eth-abi": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.0.tgz", - "integrity": "sha512-rfT/SvfZY9+SNJRzTHxLFaebQRBhS67tGqUqLxlyy6EsAcEmIs/g4mAUH5atYwPE9bOQeiVoLKLbwJEBIcw86w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz", + "integrity": "sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg==", "dev": true, "requires": { "@ethersproject/abi": "5.0.7", - "web3-utils": "1.5.0" + "web3-utils": "1.5.3" } }, "web3-eth-accounts": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.0.tgz", - "integrity": "sha512-tqvF2bKECaS6jDux8h1dkdsrfb5SHIVVA6hu2lJmZNlTBqFIq2A8rfOkqcanie6Vh5n5U7Dnc2LUoN9rxgaSSg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz", + "integrity": "sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw==", "dev": true, "requires": { "@ethereumjs/common": "^2.3.0", @@ -15075,10 +15048,10 @@ "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", "uuid": "3.3.2", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-utils": "1.5.3" }, "dependencies": { "scrypt-js": { @@ -15096,45 +15069,45 @@ } }, "web3-eth-contract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.0.tgz", - "integrity": "sha512-v4laiJRzdcoDwvqaMCzJH1BUosbTVsd01Qp+9v05Q94KycjkdeahPRXX6PEcUNW/ZF8N006iExUweGjajTZnTA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz", + "integrity": "sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg==", "dev": true, "requires": { "@types/bn.js": "^4.11.5", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-eth-ens": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.0.tgz", - "integrity": "sha512-NiaGfOnsCqP+3hOCeP3Q9IrlV/1ZCDiv8VmN1yF5Ya6n6YeO4TJU9MKP8i5038RFETjLIfGtXr5fthbsob30hA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz", + "integrity": "sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw==", "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-promievent": "1.5.0", - "web3-eth-abi": "1.5.0", - "web3-eth-contract": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-promievent": "1.5.3", + "web3-eth-abi": "1.5.3", + "web3-eth-contract": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-eth-iban": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.0.tgz", - "integrity": "sha512-cFfiPA8xs4lemMJjDb9KfXzPvs6rBrRl8y4rgvh/JWlZZgKolzo7KLXq4NR3oFd/C81s0Lslvz2st1EREp5CNA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz", + "integrity": "sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw==", "dev": true, "requires": { "bn.js": "^4.11.9", - "web3-utils": "1.5.0" + "web3-utils": "1.5.3" }, "dependencies": { "bn.js": { @@ -15146,71 +15119,94 @@ } }, "web3-eth-personal": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.0.tgz", - "integrity": "sha512-FYBrzMS6q/df8ud1kAN1p6lqdP/pd0szogcuyrVyi++bFQiovnR+QosudFsbn/aAZPDHOEh0UV4P3KVKbLqw9g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz", + "integrity": "sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew==", "dev": true, "requires": { "@types/node": "^12.12.6", - "web3-core": "1.5.0", - "web3-core-helpers": "1.5.0", - "web3-core-method": "1.5.0", - "web3-net": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-helpers": "1.5.3", + "web3-core-method": "1.5.3", + "web3-net": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-net": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.0.tgz", - "integrity": "sha512-oGgEtO2fRtJjAp0K1/fvH247MeeDemFL+5tF+PxII9b/gBxnVe+MzP+oNLr4dTrweromjv34tioR3kUgsqwCWg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.3.tgz", + "integrity": "sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ==", "dev": true, "requires": { - "web3-core": "1.5.0", - "web3-core-method": "1.5.0", - "web3-utils": "1.5.0" + "web3-core": "1.5.3", + "web3-core-method": "1.5.3", + "web3-utils": "1.5.3" } }, "web3-providers-http": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.0.tgz", - "integrity": "sha512-y1RuxsCGrWdsIUyuZBEN+3F8trl3bDZNajwLS2KYBGlB99sWYZHPmvbAsBpaW1d/I12W0fQiWOVzp63L7KPTow==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.3.tgz", + "integrity": "sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw==", "dev": true, "requires": { - "web3-core-helpers": "1.5.0", + "web3-core-helpers": "1.5.3", "xhr2-cookies": "1.1.0" } }, "web3-providers-ipc": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.0.tgz", - "integrity": "sha512-Hda9wlOaIJC9/qMOVkayK+fbBHDZBmPcoL7TfjQX7hrtZn8V3+gR27ciyRXmuW7QD3hDg7CJfe5uRK8brh3nSA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz", + "integrity": "sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg==", "dev": true, "requires": { "oboe": "2.1.5", - "web3-core-helpers": "1.5.0" + "web3-core-helpers": "1.5.3" } }, "web3-providers-ws": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.0.tgz", - "integrity": "sha512-TCwOhu5WbuQCSUoar+U+7N1NqI4A6MlcdZqsC7AhTogYYtnXOPRWfiHMZtUP7Qw50GKJ37FIH3YDItcHTNHd6A==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz", + "integrity": "sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.5.0", + "web3-core-helpers": "1.5.3", "websocket": "^1.0.32" } }, "web3-shh": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.0.tgz", - "integrity": "sha512-TwpcxXNh+fBnyRcCPPqVqaCB4IjSpVL2/5OR2WwCnZwejs1ife+pej8DYVZWm0m1tSzIDRTdNbsJf/DN0cAxYQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.3.tgz", + "integrity": "sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q==", "dev": true, "requires": { - "web3-core": "1.5.0", - "web3-core-method": "1.5.0", - "web3-core-subscriptions": "1.5.0", - "web3-net": "1.5.0" + "web3-core": "1.5.3", + "web3-core-method": "1.5.3", + "web3-core-subscriptions": "1.5.3", + "web3-net": "1.5.3" + } + }, + "web3-utils": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.5.3.tgz", + "integrity": "sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } } } @@ -19048,16 +19044,6 @@ "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "globals": { @@ -19232,6 +19218,13 @@ } } }, + "hardhat-abi-exporter": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.3.0.tgz", + "integrity": "sha512-9EVhogHgFWsi4Bc46tv+WirOR+auGBZrv9V5/qAHBjOqYiZPbNXoFUo/yQhOAsF8Bz4Q9p4jHpdeQXnYt7g6Yw==", + "dev": true, + "requires": {} + }, "hardhat-deploy": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.9.4.tgz", @@ -20588,14 +20581,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -21119,6 +21104,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-parse": { "version": "1.0.7", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", @@ -21561,6 +21552,15 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "ripemd160": { "version": "2.0.2", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", @@ -21683,14 +21683,6 @@ "has-flag": "^1.0.0" } }, - "which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "wordwrap": { "version": "1.0.0", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", @@ -21837,6 +21829,21 @@ "safe-buffer": "^5.0.1" } }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "shelljs": { "version": "0.8.4", "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", @@ -21947,14 +21954,6 @@ "graceful-fs": "^4.1.6" } }, - "rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "semver": { "version": "5.7.1", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", @@ -22163,11 +22162,6 @@ "word-wrap": "~1.2.3" } }, - "path-key": { - "version": "2.0.1", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", @@ -22197,19 +22191,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "slice-ansi": { "version": "2.1.0", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", @@ -22271,14 +22252,6 @@ "requires": { "prelude-ls": "~1.1.2" } - }, - "which": { - "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -23817,6 +23790,15 @@ } } }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "which-boxed-primitive": { "version": "1.0.2", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", diff --git a/package.json b/package.json index 3f3913b..036a0cd 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ ], "license": "MIT", "devDependencies": { + "@1001-digital/erc721-extensions": "0.0.13", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@0.3.0-beta.11", "@nomiclabs/hardhat-etherscan": "2.1.7", "@nomiclabs/hardhat-solhint": "2.0.0", @@ -43,6 +44,7 @@ "chai-bn": "0.3.0", "chai-ethers": "0.0.1", "dotenv": "10.0.0", + "hardhat-abi-exporter": "^2.3.0", "ethers": "5.5.1", "hardhat": "2.6.7", "hardhat-deploy": "0.9.4", diff --git a/test/NftyHalloween.ts b/test/NftyHalloween.ts new file mode 100644 index 0000000..ea9e568 --- /dev/null +++ b/test/NftyHalloween.ts @@ -0,0 +1,147 @@ +import { assert, expect } from "chai"; +import { Signer } from "ethers"; +import { ethers, web3 } from "hardhat"; + +import { + NftyHalloween, + NftyHalloween__factory, + NftyPass, + NftyPass__factory, +} from "../typechain"; + +describe("Nfty Halloween", function () { + let accounts: Signer[]; + const uri = "www.placeholder.com/"; + + let passContract: NftyPass; + let halloweenContract: NftyHalloween; + + beforeEach(async function () { + accounts = await ethers.getSigners(); + + const passFactory = (await ethers.getContractFactory( + "NftyPass", + accounts[0] + )) as NftyPass__factory; + passContract = await passFactory.deploy("some-uri"); + + const halloweenFactory = (await ethers.getContractFactory( + "NftyHalloween", + accounts[0] + )) as NftyHalloween__factory; + halloweenContract = await halloweenFactory.deploy( + uri, + passContract.address + ); + }); + + describe("Init", function () { + it("Should set max token supply", async function () { + const maxTokens = await halloweenContract.MAX_TOKENS(); + expect(await halloweenContract.totalSupply()).to.equal(maxTokens); + }); + }); + + describe("Mint", function () { + beforeEach(async () => { + const value = await passContract.PRICE(); + + await passContract.safeMint(await accounts[0].getAddress(), { + value, + }); + await passContract.safeMint(await accounts[1].getAddress(), { + value, + }); + await passContract.safeMint(await accounts[2].getAddress(), { + value, + }); + }); + it("Should Mint successfully", async function () { + expect(await halloweenContract.tokenCount()).to.equal(0); + + await halloweenContract.connect(accounts[0]).mint(0); + expect(await halloweenContract.claimedPass(0)).to.equal( + await accounts[0].getAddress() + ); + + await halloweenContract.connect(accounts[1]).mint(1); + expect(await halloweenContract.claimedPass(1)).to.equal( + await accounts[1].getAddress() + ); + + await halloweenContract.connect(accounts[2]).mint(2); + expect(await halloweenContract.claimedPass(2)).to.equal( + await accounts[2].getAddress() + ); + + expect(await halloweenContract.tokenCount()).to.equal(3); + + expect( + halloweenContract.claimedPass(3) + ).eventually.to.be.rejectedWith("Pass not claimed"); + }); + + it("Should Throw Pass not owned by sender", async function () { + expect( + halloweenContract.connect(accounts[0]).mint(1) + ).eventually.to.be.rejectedWith("Pass not owned by sender"); + }); + + it("Should Throw Pass already used", async function () { + await halloweenContract.connect(accounts[0]).mint(0); + + expect( + halloweenContract.connect(accounts[0]).mint(0) + ).eventually.to.be.rejectedWith("Pass already used"); + }); + + it("Should Mint - with different address", async function () { + await passContract + .connect(accounts[0]) + .transferFrom( + await accounts[0].getAddress(), + await accounts[1].getAddress(), + 0 + ); + + // tslint:disable-next-line:no-unused-expression + expect(halloweenContract.connect(accounts[1]).mint(0)).eventually.to + .be.fulfilled; + }); + + it("Should Throw Pass already used - with different address", async function () { + await halloweenContract.connect(accounts[0]).mint(0); + await passContract + .connect(accounts[0]) + .transferFrom( + await accounts[0].getAddress(), + await accounts[1].getAddress(), + 0 + ); + + expect( + halloweenContract.connect(accounts[1]).mint(0) + ).eventually.to.be.rejectedWith("Pass already used"); + }); + + it("Should Reject because pass not owned by sender even if its approved", async function () { + await passContract + .connect(accounts[0]) + .approve(await accounts[1].getAddress(), 0); + + expect( + halloweenContract.connect(accounts[1]).mint(0) + ).eventually.to.be.rejectedWith("Pass not owned by sender"); + }); + + it("Should Reject because pass not owned by sender even if its approved for all", async function () { + await passContract + .connect(accounts[0]) + .setApprovalForAll(await accounts[1].getAddress(), true); + + expect( + halloweenContract.connect(accounts[1]).mint(0) + ).eventually.to.be.rejectedWith("Pass not owned by sender"); + }); + }); +});