{"_id":"@ethereum-waffle/mock-contract","_rev":"143-841ee936991262f976b7418e4fb05125","name":"@ethereum-waffle/mock-contract","dist-tags":{"latest":"4.0.4","beta":"3.0.0-beta.3","alpha":"4.0.2","dev":"4.0.4-dev.238c11c"},"versions":{"2.4.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"2.4.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"ethers":"^4.0.45"},"devDependencies":{"@ethereum-waffle/compiler":"^2.4.1","@ethereum-waffle/chai":"^2.4.1","@ethereum-waffle/provider":"^2.4.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.6.1","@typescript-eslint/parser":"^2.6.1","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.5.1","mocha":"^6.2.1","rimraf":"^3.0.0","ts-node":"^8.4.1","typescript":"^3.7.2"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@2.4.1","dist":{"shasum":"978a986912eff04c80c37d375742646ba80d032b","integrity":"sha512-3H+xlQyBDL+lSiBzmDr+NHrDobDD9og1zVga5epcUwRm4QtCeDGUa3uOXkW4V0BuYiTdwkF36M4i+15fYwCuvA==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-2.4.1.tgz","fileCount":13,"unpackedSize":84117,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerRCoCRA9TVsSAnZWagAAZEoP/1GRaUkFJgbhpYsCk40Q\nomEpO82TRDpWFbR4s6eTN8AITgpD42EKASEn3sf3UInLSRd4/I3vfpebrr8l\nSmdpfFn98dAD6hOKDGgoNs50i/iBOUrJXgNaZGCFVvfhixQo1hqQyFUoa3Q5\nZwMe1/AmatJXseepR3xyXKrINFE0Qr6BfLDW7Hfq4OYAsPrVxmW2rF4xIbZ2\n7jCGFEMg+illCmLI71/9wh8Ji8gui4wkGmfJjHuXGcMjyVBehtAzMTaGM2sT\nGbSIXFeq+6GIVR9BnZEkXwaoBzCSUFTwH0VUd89f4uGSjcW1k9J6emAgPfPS\nu4YZ0kZHzN9xRfvEdl8+YXW7gBuZEZeQw0I2g+izQtljlSVXXWr+sJYxHWq0\nwyoMGlUK7MJsGPgqyg3/MoEOoVVKyp4D4isWlUY9YU1MSRfs3HLvMAyTq5kI\nZQzcwhbR1bQ0R758Bo8y8RFDn2r03h0SYlf5AK+JUiKuEJ+J12JETuwR5L01\nAFfwEtBQSQGEgSUGVG0fh9Rs70kFljUgQxii+BHT/QaEZ84QjcNYZ/ZmKSNy\nx6zWRxIPa6aB6ZHvtvm3iz/AXRFrt1WXpJWyMlH+w4y/YZqG6b9i2XNjNsOX\nEct9KbpMaknFhYD44StphKgBZRKSd3FmOuUBmhFd9uwguudiPpfGDPRN9ewb\nRSLz\r\n=s0tW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyuER6Byq4nJGoK8Fv4mTZf5eohl3Qx8SbUY+jEBPB0gIgBZXWwltkNxcpd6kvpvABhWNtVSXGDXPbml4HlWQXSyo="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_2.4.1_1588400296390_0.5593654303470856"},"_hasShrinkwrap":false},"2.5.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"2.5.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"ethers":"^4.0.45"},"devDependencies":{"@ethereum-waffle/chai":"^2.5.0","@ethereum-waffle/compiler":"^2.5.0","@ethereum-waffle/provider":"^2.5.0","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@2.5.0","dist":{"shasum":"b0b46a8d1a0c7d874848fb153dfcc4f3f292bfbe","integrity":"sha512-VcwrcFiLnY5wUj3OWx5d0M8CPv6Aupur4VThVet6J4QKCIvH2oZdPXPf8yr+fY1C799lZAPFKGcxFuhHVoRH3Q==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-2.5.0.tgz","fileCount":12,"unpackedSize":82894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesXZBCRA9TVsSAnZWagAAw7UP/jbDoFifMXbxjdRVaDBL\nyHwCo8JQ3sw3BlaKfHjY4t5QirRdRbCVa2HAZh3XTmI2kqE7Cfx2tT9pwqcz\nxPb8OnpRXBPb0LcpE7wp3vIL7pVX78y+Yu6fj1QH22fGD2ukMxqvhuDW1kTG\nPGOtmw+YymGBrLqyTM/tafBwcfNkEkHUOtOSxlu7EPhGle2CJe6GPbJ94M0Z\nFyoLpJl1VUmAd8rui9YiR0ooX7NpwclIm/yMTv0kKgwW9YiXeM1gyR6jOW0u\n4AAb9yzDs1E4cSL6PITn2FMR687Wwu3j4t1i3JW/gJbB1a2/58dYEqN/dRZs\n68WioHy5DFSblbrUmQl8Semhnv1BjsFqEzSrLwSsmdJt99LZR/TV+hVmyFS/\nWRX1X9DKKPVhllQLuzLsbt0l9L2/AlS7/UdqMLclo4/9MkaGrEOWtYzKOGpi\nwIDm1U8dGbLj1z1Ji9XUfltewvzsh5DSmB90AMYJhEscAMDTanO3d8P/tiQi\nc2TGVQgYqW/l68P0OiCVzGSkzhMqn8tqACjTKN1kRXlRJCu4Yf+oVdbQnwbb\nQTFyn/4pGeP5APPbyH44n7hlFCPHG42ICUKBHIU2JePPmVu4WkumnCa8aEJ8\nUoExnz2r8gqSvd5p2SB+lb5nOirQgF1oVuyJBvbY3xKE5ad3sLcOhRE91esr\nGIdd\r\n=/bCN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMYml3Qcuu66Fo2j3LTYVR4HuBNOVSwpyrJNjAUo1ftQIhAKGfbcv12xoMgrueINlynlx58MhxO5ZK5GOSFBKu6Ken"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_2.5.0_1588688449150_0.4872373041041229"},"_hasShrinkwrap":false},"3.0.0-beta.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.0-beta.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.0-beta.137","ethers":"^5.0.0-beta.184"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.0-beta.1","@ethereum-waffle/compiler":"^3.0.0-beta.1","@ethereum-waffle/provider":"^3.0.0-beta.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"readmeFilename":"README.md","readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n[![CircleCI](https://circleci.com/gh/EthWorks/Waffle.svg?style=svg)](https://circleci.com/gh/EthWorks/Waffle)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Warning\n@ethereum-waffle/mock-contract is an experimental package. Breaking changes will not result in a new major version.\n\n## Installation\nIn the current version of waffle (v2.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint private constant RICHNESS = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > RICHNESS;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nconst {use, expect} = require('chai');\nconst {ContractFactory, utils} = require('ethers');\nconst {MockProvider} = require('@ethereum-waffle/provider');\nconst {waffleChai} = require('@ethereum-waffle/chai');\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\nconst IERC20 = require('../build/IERC20');\nconst AmIRichAlready = require('../build/AmIRichAlready');\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  async function setup() {\n    const [sender, receiver] = new MockProvider().getWallets();\n    const mockERC20 = await deployMockContract(sender, IERC20.abi);\n    const contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    const contract = await contractFactory.deploy(mockERC20.address);\n    return {sender, receiver, contract, mockERC20};\n  }\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    const {contract, mockERC20, sender, receiver} = await setup();\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.0-beta.1","dist":{"shasum":"8bdf947c13b8fe9f5323ca9daac19fee5ec1d6eb","integrity":"sha512-FFthi27ID67/+VxdfIpluWAgm7uAiMoMLmLzhIeyDZZ0eOo7nw47bU6HKGxTT5Vcp3O/MVqOH+++E1Q+E3gRWw==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.0-beta.1.tgz","fileCount":12,"unpackedSize":82901,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesbGkCRA9TVsSAnZWagAAWQAP/2YH4CjK9Y2tsjkmIsqf\nqpnZnsd5j7Pv7IW3DWEDu9lNSJJ1M4QRwVKRWwYpEJqoDQ/ad7V8LQApfe2q\n2u38sJPA4Rwdgt5lWlbfqnTuvzwzs2Oo2SsMtItXLEHnAvZiu7XT+C2lO3Xa\ne6l2qC2aGhJLfeX+5HcufjNLYrIEVgSS2Oust6GAhMdFgJjGOgeQm+ST43aj\nWCu2j+4aAMCIGd4li+RAHhTA2D8hx0rAWGCPGb/xKi0jHZ9n2xyw1uqUzoXT\nGnYKFUaM8CDGc+waVAN1KJQEyrSnV6P+lLtQIhs1s2BducpavvYpcZ1Re5Dx\nxYMIS126PH/4sQe/pfsxLskErk9AYCRsyj16B2kjzhKVJmmwTRTd3wlOznvH\nMkNWKOV4LTeND3pC17BswdUPfyt3EPHkoweIZIKwMzPdD/HDtR/h3uPL+gXP\nD4vY05KA0jqsyrHpCp0Vjp3+9JyD1MMDUaGoBdvYhQoDgpTuOZEvTDab9k3j\nPHROumjeMUWmWjhgZ/KiwwQxiLxeyVhmKyy0O+FqB1PSPb3LZVtuGVOC/T2G\nqcYE35Q/7+khMdRVMzBl9crx+Bk/icY6YZlTp/uqv6PHXtJyqSoFJdJEqt8B\ni9CHVLPdiV0iueOL3fvRpBQ0/flGO4x3DkLZrsGSn379+NPj5msXlJrCvLja\n2m6I\r\n=SQ8U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEqfxHLm/4SA3zn14wcYrNjF+/crjCGfz4i5u6q0s5NQIhAMiuoPRyPNE1OUJn+dQ4xbK2JB42KC+EjXdxaoeHhRc/"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.0-beta.1_1588703652336_0.5111891708854952"},"_hasShrinkwrap":false},"2.5.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"2.5.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"ethers":"^4.0.45"},"devDependencies":{"@ethereum-waffle/chai":"^2.5.1","@ethereum-waffle/compiler":"^2.5.1","@ethereum-waffle/provider":"^2.5.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@2.5.1","dist":{"shasum":"83dbd85bbcab0c0747eadca1bb802f228d7b0874","integrity":"sha512-KuUCaCaMRKOI9sJ/MqiJU9ne8wpMWN4NB3beGZpPEo66jK2Ythvz5mgYLNAwAZdzM531NPKc/cWmLUdEF7jnlw==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-2.5.1.tgz","fileCount":12,"unpackedSize":82894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexVEkCRA9TVsSAnZWagAAdoYQAJGTEBQcJFYjQH3jBuGu\nduyQQoQDck5Ou4ya4FrtsvQTqNG5TdQoUP74yO35W2QQOTX6uP8w/LCFl2J3\nXDBe99C+cICt4Yo1X+JGpd6xc2e9tNUnEAcm39/HaFxSfQ4R5Sk19Qj0PAai\nDRW03KhRyGMBM05LqiPnNp7VzdX7I+jXkXhNrs9NJbewvVzKdtEw8iZMyqQR\nV5qHOMquMmlrO7u4LbtGl1ifAUl9+T/7BQFbYYyxr0Xde4LmbEyZy1ssg9EW\nb8mv2OrWW12mMgWN27GzKDsfWb+9iSxuMrdv7W72Qu/GeZEY8MmUE34pk8ws\nOtnvJougGj3LKM7Y1QgYKEz8H9KDZKJ3yZLakSjOaknGg3hXZI0pKWSD1NRF\nSeJUQjKwbrGDwZFNJ/oZQc/scU2agDhhMbSH5ZlIUkbO41Z7SXHV1eSBUn2q\nXUSF/0VZ4gFAQtMl3M3pLHTYTXmAfIcE2HPdixp5v+Rg8qkxnOFzEYIT/7ZG\nipaAkLo5QjK24UZAz+/mxoAERfwY4MqCHjfVBPCiGcARPpjy1aNZ/gLje16C\nBXLPSpHuhdRKntcjYm7rgV9kffrn98RNu7DHVML/kQXtMgabPgYO/9Xlcs5H\nYPN6rsz8H+jED/OqZIn7b8GHadj8l+BNbhE4Uj8N/wrrkNu7YW7QLO/2gxAp\nowjy\r\n=vUWi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHLGQPx0wBP/ehwpS779b17UFS6dU10+uvjA/NsRC40IAiB3YAicBNGLAJRX98THj6pagd/4A0rExKnDn23pDaazxQ=="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_2.5.1_1589989668290_0.378690730192186"},"_hasShrinkwrap":false},"3.0.0-beta.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.0-beta.2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.0-beta.137","ethers":"^5.0.0-beta.184"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.0-beta.2","@ethereum-waffle/compiler":"^3.0.0-beta.2","@ethereum-waffle/provider":"^3.0.0-beta.2","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"readmeFilename":"README.md","readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n[![CircleCI](https://circleci.com/gh/EthWorks/Waffle.svg?style=svg)](https://circleci.com/gh/EthWorks/Waffle)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Warning\n@ethereum-waffle/mock-contract is an experimental package. Breaking changes will not result in a new major version.\n\n## Installation\nIn the current version of waffle (v2.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint private constant RICHNESS = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > RICHNESS;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nconst {use, expect} = require('chai');\nconst {ContractFactory, utils} = require('ethers');\nconst {MockProvider} = require('@ethereum-waffle/provider');\nconst {waffleChai} = require('@ethereum-waffle/chai');\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\nconst IERC20 = require('../build/IERC20');\nconst AmIRichAlready = require('../build/AmIRichAlready');\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  async function setup() {\n    const [sender, receiver] = new MockProvider().getWallets();\n    const mockERC20 = await deployMockContract(sender, IERC20.abi);\n    const contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    const contract = await contractFactory.deploy(mockERC20.address);\n    return {sender, receiver, contract, mockERC20};\n  }\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    const {contract, mockERC20, sender, receiver} = await setup();\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.0-beta.2","dist":{"shasum":"fb85775699fb552ade7eab6a93aa1d07686ac9b6","integrity":"sha512-abCD/Exx/y29NWObcn2S9K5Lirj5NzMkQaT82PY7YLz1m7xWn1C/d8PEcJ8VDY/9APHslEOcsGuEpkp0PgV68g==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.0-beta.2.tgz","fileCount":12,"unpackedSize":82901,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezAzrCRA9TVsSAnZWagAAOqYP/1k3dy/TSWozWFoZFqPv\n2QKaZxu1aVDe3QAnCIHAQyF9WbC0kIiIH8qphLs+R4EVnoMeP3sWQB5uoiCS\nlzdf6AZQ83n6TuzVgd4iAZTGRhZt8AshdBNBABMSxw+TXbvgrmlvVKKt4Ecl\neVtX1H9R2YscFiwjFU1VvgsoTUYRGNfYXQ6IDahBUEtfx2mthBtt3Vcpxf/K\nZUR9SVq/gqXF6RAh7cRQKiepabV1//Tsgqquj6J6c+UZaCEz9G8888D3/Kkr\nQhcc5qFqrpXGaDLOgUWomWeCCaq3cgwibT2W1jUB+biD1223dlryEKzI1tqZ\n6XdEpyyoy8qfys3Vzc8oyjiqjFNWD5OiKkUrU+Ra8gvRQ1R5Zpq6tF64/DEA\nxQCE0e4v7wbq/YUuA6TT7pnJZ0yBPyBGXfWmW4T7a7zslhppsv/fWaSspP9p\nJ341CAt2akxRqLb2woTnDjq1cGU6It/fOEwuEbSNyfTDghL0Eg1Q2rNRRa9n\nXFHrok1ZWFhu9BqDxy4zcsPS/oI14BiirvDMJuB2UEZr2ZqYcCPRsgUOF2XV\n/zQTMag265Uojf5gvuoSWcbquKEtSNzoVMC+8ddJoXTcOAGuxFkbp01+HWBL\neUJmd3FLW9j0sHNMU8G2nnMowWm8lAOERUNhQoV9URqopKeA1U9FqeHJ9FH4\n07TJ\r\n=G/LZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvZNeyGG30RkRa4d0rXejcKrXGWunL7zFqij4aMPywtQIgbzwFHjJu/i3QlrNXIk4RNROSpqyqlShD/IwDpqv88Y4="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.0-beta.2_1590430955499_0.6986808917438423"},"_hasShrinkwrap":false},"3.0.0-beta.3":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.0-beta.3","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.0-beta.137","ethers":"^5.0.0-beta.184"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.0-beta.3","@ethereum-waffle/compiler":"^3.0.0-beta.3","@ethereum-waffle/provider":"^3.0.0-beta.3","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"readmeFilename":"README.md","readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n[![CircleCI](https://circleci.com/gh/EthWorks/Waffle.svg?style=svg)](https://circleci.com/gh/EthWorks/Waffle)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v2.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint private constant RICHNESS = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > RICHNESS;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nconst {use, expect} = require('chai');\nconst {ContractFactory, utils} = require('ethers');\nconst {MockProvider} = require('@ethereum-waffle/provider');\nconst {waffleChai} = require('@ethereum-waffle/chai');\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\nconst IERC20 = require('../build/IERC20');\nconst AmIRichAlready = require('../build/AmIRichAlready');\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  async function setup() {\n    const [sender, receiver] = new MockProvider().getWallets();\n    const mockERC20 = await deployMockContract(sender, IERC20.abi);\n    const contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    const contract = await contractFactory.deploy(mockERC20.address);\n    return {sender, receiver, contract, mockERC20};\n  }\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    const {contract, mockERC20} = await setup();\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    const {contract, mockERC20, sender, receiver} = await setup();\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.0-beta.3","dist":{"shasum":"8d4f02fd19e054f5acb6a1d0d65c0c07b9f3dd0e","integrity":"sha512-mxyJUGR/RBHwtoz1vh34Yu0k1vetStUZppztu22ai432PkDf3YevqeU/qUPf2WgWEHsOWUNCU9cDtdn9G9wU5w==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.0-beta.3.tgz","fileCount":12,"unpackedSize":81218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe427xCRA9TVsSAnZWagAAIf0P+gIg+kKM7pknFuU9r+zf\n3eDUaO5yPFq4jjskvhaeXn/ym/bm9U+e9I5aF38tPrcI2vOr6mW4t0s/6Nlr\naOlP/Lx5IwzkKMekwL1Ok2+ar79lHTy2m/EpwOMinY3ZtGwOSR1je9YBkGx/\niepaGvo44yyaKZ09ynIOfbJmap/ITODqoGBsVUIOXyGqowQsW9Z8RZjjHrii\nOq8VGsUcHOtKFZrb1XoZipqz65n1Us49adlzGBkJSI8I2gwghNzMmtEkC1V+\n4nLJ8mtwJAvg+KP/GjZ5ymndHaaTg5usMVIp9BSqSP9TwVOdMLKtstnW1SuU\nq6UVpUhKFFwZ5jS81CE1vlE+iyR9mpWRSL3oUKendacoMuti6CyHivgTx6nM\nGH8FUGSZDGdHjyzGvZtAU/KQjoRPAQ7in0xcO/nPP7uWugsnNnMhvZsogVOF\n8DRMNCJ98czvrdxda0OYNoQVJo9BEyJXBdlSFy4oxz5rouR2QUWK+cJsoDdh\n/WmsICxfTlV65N58ZHxWImA+vnPlJJefyoFf4z3XBktDiqFJ+8oPihFkZnsS\nVKaq5KBI0uh4397sjG5rfUj1+rHU0tLX+jEbxLPi5/Y98cDLVF05awMmIRwU\ntZVCil/eP2nqn5UIqigMkk6NxNXqVZV97QNjUCbaviQlWDYXtHm7L/gqpbe3\nsQ/X\r\n=2C/m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICc0CCRvLokcAIQoCQGqWcsyyae6CvsGucMZTBXtaw0HAiEA4YUu4Z1+xMDOKloSoRv5uIKyxuj7DcllfZpB8ltKmvY="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.0-beta.3_1591963376881_0.2897068069979849"},"_hasShrinkwrap":false},"3.0.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.0","@ethereum-waffle/compiler":"^3.0.0","@ethereum-waffle/provider":"^3.0.0","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.0","dist":{"shasum":"309522b88f0266c6274835900e0e4382a4b7f1d2","integrity":"sha512-xv3O0uygk/RbQ4aa+u7GSiC4MUpF3FA01oyBKzPmcd/X1DOyAmq5/+1jDvSgb3NYEjCW4gufyN9hPpDkGoW8ew==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.0.tgz","fileCount":12,"unpackedSize":81172,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5Gj5CRA9TVsSAnZWagAAl1sQAJmWT0pU4EnomZO8DYMn\nos/UinMq3XKeHopB9rwNcVmvo5iBuajvGsFYy7ibHDPse0e2xDkyRQJL04ay\nHKlM51AWzQB3Up/l8A6P6bS15uHcwcim5zezoy4PWYRY9MjttoR8rgLN+Lnn\nfpqq47UwQ1A0yWIUi2lXlPUXZY1j4VeZVlWZABIucvQzFkkNli9RAehEzmZ/\njLTzi06sG6Uxrsox3xHDD29izHOKYAN2ePTvibCKDbQUxnQBHU5ZQathpL6K\nb2SHWXh2pXNl7Gy+FcM/Odn+TDbd+tyKwJbR4Jy96SJQCdcSdpmpeGUH9b2A\nXfDJx8eGmEGGdO/3L9ekwR+Q+x+Qqs2lw3pHW+j8J5ORvp6Ys/8iHcFkVa8v\nVePw75G8ZofieGkhoxi0fVyDayLhgJDp8uKuZyh7hboxrgT5doDWuveUrTt3\nEErFyrtymOZjE3AUtD8m8qQesHBDX9q141R9IKSQVMp6sfjJbq0nGEODw7om\n1OeAbxETr0ma7NNlNlD4XxQl3d93W3XtCMF9lFuefNu1ZUgGuGGUc8H24gKe\nOJ3SrYsX9twX9YwdYNAxOVho8zSuG2eAnh/4up0Zxdubxb8Ud3AmvUigxxdj\ne1h0JCW2+jVXIBORPvvutIAUplLfYhN5K6kkd1ssDrW69O2QyME8Ca0EMBPe\neKKQ\r\n=BIMj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBnKIu854AIinvbgWIU8prHUwdyfnhEXyyDFm4lwUvfAAiEAg7ObAjJp1Sn0Mzixd5MCfRXBG1eTSSryYyXYf/TZCLg="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.0_1592027385145_0.3598651463460931"},"_hasShrinkwrap":false},"3.0.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.1","@ethereum-waffle/compiler":"^3.0.1","@ethereum-waffle/provider":"^3.0.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.1","dist":{"shasum":"8b99513bfada9ca6af5142b4d9fce527c7f40e37","integrity":"sha512-rtdq/N6gM75KE+u3K9+N+NFtk1hy39SSoNjmJmr3PwJmWmXhJnOEDdU5N567ViRBdMNiQNnZfdKtu/b1pbL5JA==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.1.tgz","fileCount":12,"unpackedSize":81172,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfAapYCRA9TVsSAnZWagAAWLEP/17YYOxEZaNfMSKxJ1aX\ncRpzOwmqfm6HPwhVFFLXFDESSMhpjaSdhQ177gacadO3np0Zd7RjQtLRNQkO\nqf3u6thyWHKI8tHz8tmUM540Da8DkbIju1AaaHjcSGv4UdqmEW+09dfUkNGc\nFhqthkHgA8/dH+tDbchMPfdpbhr+CZ4H+rwgmpjfIpC2ORW8uCvHc+YAxLxb\nrqIKitPrLwNZKHsTmaepwvmk1OGVs4JxgjknOLcYp5Z4TK0vV2AE4TbriSRB\nUPQOJYR+xMBaKerq+2+rVcNngbsqgtOb3jw8pfL9+CLFpn9STVUlkfvKWIXL\nTiWcysEAdWLCCFbJDzVs1wgBN3BGO2wY0Gje/A1EmtWZ0+oP0nFkxXcN4RVv\npm0GT40DGyq12E5k+iXyzsLCv1Ct91d8Q2ehnPoi+Eyad8Fyg/LdAHT8MkQq\nev92x08WSGHpRl1aRLlcZLstDIkwthbDRm8aqOf2FhXqkWWm8AJUED/RLV94\nmuIC26XozGOkqxBd7Czq00ztDbXNNpwlG4u/gUnZtP7ZC5AhNYF6yryhUt2g\nO6badXZSamZgNl+nFjC82/hfDGABNsxmhCPBHNJ1JK40SXDutfC0LBpjUcTv\nYVAX3KXOezJt+JAbUx/HbTWUOib+wQVJJFcbzV8KmwY/3oTGykWvxiVb7MGI\n8/iu\r\n=O1xu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH5Y4rNUOwXoe1DBrTqy1hvcr0epMv4c/P51AMIJMw3cAiBLBLDX8zbOioxJpV5iM+zUcXmv8UUapftOum/v7lDIBA=="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.1_1593944664058_0.04842332072026223"},"_hasShrinkwrap":false},"3.0.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.2","@ethereum-waffle/compiler":"^3.0.2","@ethereum-waffle/provider":"^3.0.2","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.2","dist":{"shasum":"ba0ecdd872c1eedb75a223c20d3afbea32d843f6","integrity":"sha512-a3THe64cR24TxgwU2Tmk8uwZDWGv9QCKUpEhKVVArxRIF800AKMZfhIF61liXMkSVQDgivtYsayNniYxM8M11Q==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.2.tgz","fileCount":12,"unpackedSize":81172,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCYHzCRA9TVsSAnZWagAA7yQP/1YjebA3feQEnLw2PlUn\naIrOLKA7kTNoRpW/e0zmxQy14qlWHzyxNVWgQKLJpKURXyBqK01ZvINkmM0w\nT9Xij2t+HUG5FIIPcFTGOLPMtrvfhijpj7v7f5ZfuLJB35F87hbxi0VaJ+rG\ndIbU/MwdzKJJrfnLIkuO76oGuxFK9NJHduECLxDwdA608XRex6IglGraw3X1\nYvM9YADxKe1BS1L7nwc2MKhI2eps87a9q5jjFPGb3CnIf81F11ls0m4dyrYc\na5L77BEnjkijC57vu/R7KEHPVjBch652qdSHjlnc4eZ3aXq28pYiI9TyfVUh\nWVd/rq3tMpi54JrQ8uNBCJ5eAeDC6wlMqwiJgAWkEpXAmzlOGwByRve9PmFg\naM9+tht/xLL82fAdSAvhTg/NE5/vfReFlF4cRBnHTfi6FfcXakdJ5kQ6BhTj\nMfx2qQ/F6TG6jsQL0rIJM058hhZ4p90GrEEesbJk1U7iO5lNfF07QrcEoaJ9\nABp2bwphtpLLmlT3Cm7eLheuPmQR43V9Ve6CSuQYU59Qv3yFB+fCuzbGze5c\nbmaSfJybEFd8XfptGe4ovWgbSVoXYQWhZLiv62vH3bmaacfnxGHL+oWNV6eF\nn0wvWTban766bhN+i9fjsgcwPz/SIDP6Khn8XjA+EeX5vSgXBO8biJgpPzxQ\n11eh\r\n=WUME\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGynsUcMCJ6aVXxeXc1xryRSyHA0renhyJvtP8iDA6EYAiAn93GT30hd5mqBMRpnMsXxciGSGwPhlCdgkNC0mjwZAg=="}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.2_1594458611118_0.762432095320752"},"_hasShrinkwrap":false},"3.0.3":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.0.3","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.0.3","@ethereum-waffle/compiler":"^3.0.3","@ethereum-waffle/provider":"^3.0.3","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.0.3","dist":{"shasum":"c69e4629d9a9d8687d57263d99d3f9876ae1a59f","integrity":"sha512-gtacIiGxBOlcon1HNK1aP+TvilXzyembBOaN5pDGLmhoaCeLIGitOHl4H/+zuMA6obACLw6D8ehLdpSMMSEQ1A==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.3.tgz","fileCount":12,"unpackedSize":151804,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTRwkCRA9TVsSAnZWagAA7fMP/ijh1cHW5S5v4kbJCk76\n8cR+d19naGmXB7z0CbgLxBuWCumIlvneOeEj8Y1+wmxcofgqZ3liNjpSbbgh\n8Uld8pcmH7+o17uOitfHRnoAhwcuE61AWaaA8Wik+TT8/etU7KGhgeMzUERl\nISdiQ83lzeyZKrOObjKSOvYunh7vJTpS2Z5dLBvy5OEqElbSSyXM283n8jym\nRUB8++DHwFvenVwDXV/bBr2MwOC7CpDohmIIv76syHch3yX1OA7boCszO8m+\n+SR/Ep8Sz9gaHd7ZcAFKGTKeUEfmByQfYOsDsOEJqb7dqvmIOcguTnMEkVoC\ntO0Z5zOV9/REyjVc48G4AfQZjq5qJZy6p1jkFABxqNhhR6gm2CjNVWKmw8wJ\nB2Uu96mCgR7pYynofHcWn0wJJK6l1fuR6gMxfT0s8F1fxkBlNZ0sC0RBOAZP\nE7KoGssIxn2EgmuTurZxtqr7hn5809Ip7tD34xs52aUgoLGSDU80BD00dlPP\nzO9DDsDRccEK0tpSzC6/h2L5c604RpZY2vzbFZi4Bm5p7zhGGpN2GQY2grfU\neAXOGPe3Uy3Am+DiI/LegIla8prK97rrLbbqERFa0UpGzmhnt6XtYlO5e/H9\nlv/+62zc8JRpKOFoY5f8lOi2+1/dpgJD0oMOEq4F1srWsGFqk3OjAzwIqXYS\n/UG1\r\n=jmFr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDAW1WUlCDAwGudcYJiKAceaYvlWTO5mRC9xWBnVapkDQIhAOD2tgMBu/LkCBi4oOzJN/cJ1ouzJs0tOZFw+9WKP/Dp"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.0.3_1598888995951_0.6873334194308878"},"_hasShrinkwrap":false},"3.1.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.1.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.1.0","@ethereum-waffle/compiler":"^3.1.0","@ethereum-waffle/provider":"^3.1.0","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.1.0","dist":{"shasum":"64a6f8ba4e18b9b22305f0ef9e673848e1fb2c6a","integrity":"sha512-mhvyb9P5aM7D2qHmaAH2ONbR95L7pVveRR9s7zfcxYdzJP0KCjy2IZfPmhOZDe/lW1tXuM3m/OL+oHfKTRYbdw==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.1.0.tgz","fileCount":12,"unpackedSize":151804,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfT1VtCRA9TVsSAnZWagAApOEQAI33Bz6njJDx48Co3asT\nfbuTPIGYpJMqBPeABUt+bSZtr0tzoDRRDrZH3FV/g3fOul4qRwySoeDByRyj\niAWAcCNRn9NvLbIyCNjbGKGpc/oOyiolZOtP2SbSCv8tR2bzeEqCMCe58Fjs\nknx24t0Bp1AgvWiyKQfZXHizbc9WEpoAZLmJyckSYpVDKQ6W/1vRRs3FJRxc\nEbBgxh/NeiiScl9P2lFKXiyNT+ZR7cYeGW6H5obYoCwftGKv5PPzAQXM9kfv\nEIX0O5gHESGgBKs3T1gD8Pjzhgsu15vVj4HlKondvb2ifMsCtnWTeO1p01Q3\nYNq3bxjdkBIrEXyMCTw6TB9PnpGssCkTEb6m52zoUUUxa7jTO3sojHUAytZ5\n6R5KR/xay4FYkQktK/kVMTj8lTfLfuHaSPTwA0f3RiwunomZg9yHT91tfAxj\n/F738zE5gGsUdBpBcpXC+lEFXWRxXCvUsaGC4KPX+DzTojGUp0gnZpP05Wac\nGKCWKvWDePiPnAa6QDhj9InHSHjuTnpjV3OVuS6B6XxrcDKq0qb3JqYxEiYI\nTwloZXLgswESyU7H009c60zZdh0b1HBKZz1rLc6w2cRGExW0goy7v72MW1K/\nFqGSd2/w6mSSI+PYGkl+fQAkgELcK0KuImygVxBRP3e+tO4ii00DbQ3RW++D\n+n+i\r\n=YVJB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUcjjH/tPBT05w51pd0XenPNUkYyfybwbPMEh4u8oeMgIhAIpMh18TWIOHE10Yhj9SvLWRYUw83BNUxqjfuyNTEVfg"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.1.0_1599034732866_0.40046731871085695"},"_hasShrinkwrap":false},"3.1.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.1.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.1.1","@ethereum-waffle/compiler":"^3.1.1","@ethereum-waffle/provider":"^3.1.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.1.1","dist":{"shasum":"ae0fe5bcdb7a0ba64069098394ea4e54a02ed293","integrity":"sha512-by4eUeL7FGQzczi4nM94YcnYWV9EPsjx9WI9A66LzLHHPdEyIvAUZyyBQ+9hLYwUqJ78ppLoVx+xYWEagHx/jg==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.1.1.tgz","fileCount":12,"unpackedSize":151804,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbzMeCRA9TVsSAnZWagAA0PsP/RbQEroFiEG+d4iBhbb+\nSS0HbQWgWXtvquOqwUob1iwgWe0gLlYy4eL0scBajhv1/n2dXChD2dnuvsGI\n87hyPxdVbRdSnb7Qah4UPUGlvcQ2ILiH0D4GwSRDtuYadAgaw8xdqevmriJP\nkl4zc0uzo2FZGGoYT/pigNJi+HCkQvIMIB6qtFB5xDs5jHqF5b+I3sH/zs6A\nqQq/4ljBNiVfPgWU8IEiu6WjPeG89sItyVgJckjl6D0hP1UfL8yBkJHL417r\n6TDWOAlI/BdgRseVi9DK4/lTRXgcZKBXtyZxmVkV6bOu6qchSS0rExIBhEGn\nPIQNupn5BReNt6oL1nQulOTAU7TtXqgjPMmQJVh4j5iUB9OqC8mP/At9nhsa\naon4wk4yqAb8PBSnaESkw/oqRNKL36uVJbWElgw8QXZXdlM3As3Llszm19Bc\nzEfJIQo81E7ptrMuXUk1b91MwF5hi4pe8EUFigzzrBtgBYMKQRB2YflgBfmN\nl8tS3enaUwyuYEnM/4jLgb/cCu+A3Bz2aVQKxzEZf2ZR8OdZmtA6Evy47+xU\nR3rIenshQp1kuP0ZXKFiE3i4PFWjxGxu5wAuqaYFSjKGfB6wUbGlHbekiCJG\nFfV1BlHXN1Fhr9MV9yjnHyeoqz4n1wG99nEL9xNklYLicA9OWTwkZV1zPeui\nP06u\r\n=3jAr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDd5A27e2qsP97V0Br6bvgWDIWfq8Tc5FzqtxzHQxYPVgIhAK3BKXnPhAmPeiFC3qMDewQCtfZGpbUgHp9F6hYpyZbZ"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.1.1_1601123101462_0.21758585491784976"},"_hasShrinkwrap":false},"3.1.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.1.2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.1.2","@ethereum-waffle/compiler":"^3.1.2","@ethereum-waffle/provider":"^3.1.2","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.1.2","dist":{"shasum":"4dd3c02454b797ad7a8e5d42fbd20eaee75af3cc","integrity":"sha512-P3AZGqVWE1ZJ3Gqiko/oPC4CfnNSbHwq2awNsa4HLj2URHeRE5fIQMuAxCT3bCwf4QGdE7yxOVkFHDLu40hNuw==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.1.2.tgz","fileCount":12,"unpackedSize":151692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfktOGCRA9TVsSAnZWagAAB2YP/j6aMCZIdiefwV3q26f4\nEj+UXJZ2mO2IkmdBdNHw5ejawZ1dQ/OghoIr0G0ztsazYOZwo5kGRVePlyDs\ngaeYg+pwK9hpiNjp7GZiRnRPg3tpVpOZAgHKghL6tCJN4hsE4R/VcV25cCj7\nt82RRy/PCk52BcaEdYMsPmcoZGjejL5MnxmMPFA9n/q1lTUoTnc1Y4OGlQI2\nP19LQvfX+RAQx45zBSX8NburYHy/rwuT5eSyXnBWfCqObQvyoVWurskkqHI/\nJVM7nlMTI9OCK61Oo4BrXogLuEYr2cYjaBfQGBLkvguFsAN2+ccTtjdN+ZOq\nx4XAb6Lhs5sKKT1CvJlmQ8p0gDGSavjMgXscwsBBbpqCl2TERMIK/PmDZR8y\nPFQ/yKcIrUwXzhOMxOyNLI2v5O4Sjgzw0PXm9IG3p57Shs1i2Eb7cSiMns09\nxL18dpv6PH01xrJCRQIAVaMuhAANCDEkEcszGq3ezHoyuFbCUyGeqJPAZTYM\nVLH0pjC+TUjsNoJDzsDdXUVFAdZf6MS40Lbd1SXl8jVtvhvKULGETF+oKRPM\nR9P2Jmu5k/Y1Lho/MrmDbb7wFnJPMlkOlw9C4exssoe2aghQ5No5Uehxnt/H\nkEAvYUh0UIYXQncsOWYhHbzLflTx79QXI9Zo6LBO9j0QWLb0E7+QnMx9bRGl\nKVom\r\n=DyBS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDL71OHjoqElPWEhYVTza/8daRDdMW4CsZNART38YHeTAIhAJXJbJI8STLEWtfSwWdyXnu47FuUVaEsK7qyvsH8zni4"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.1.2_1603457926170_0.5476225572416074"},"_hasShrinkwrap":false},"3.2.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.2.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.2.0","@ethereum-waffle/compiler":"^3.2.0","@ethereum-waffle/provider":"^3.2.0","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.2.0","dist":{"shasum":"be9441060f8b58f1d7e344f74e5dd158d41a7c45","integrity":"sha512-TfBt9ka2DXVxxIBee3WB0gSLgWCo9ZegqcdXjCz0QGlu+dEhL8W3+aLDYQoyx3kwlecfNl8EQ1V7g7GH8wrlMg==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.2.0.tgz","fileCount":12,"unpackedSize":151692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnRAlCRA9TVsSAnZWagAAzOcP/0Ely4GZX5JfJk3W1jsa\n392VG98Fo9Q0/EB+ZLycjwMpqv+QuyCco5qyzq5vAw7zoaZHavFXIyIg1xWm\nhU7V2CUgy4b2zGpmE7JyFIuaXB134zKnOxGR/IKoFcMI2aF3rI+F5GqUSv8N\nesy+2PD6cCzD1BpBaQlN7kqAaDIs+zeFn8n1orr77n6hBlTIlHP8Q6mNIBUO\nHYNOFUBkf8SYw3Aobvhi5wJmWKxNkL6W2ws42QSfCK6RXp0MkdEVBs55KNOi\njRE1zjk5f6z5yx/gt3hSU8R7ATg9Ru91SDBMut1UKZSdsr7RWG45Ki+2ZZMr\nKVx5XXPm2ep+3kM8jWioKNPS9iOSjP1C2kYnS94V9g7MXrajm0+kDcKkRZTF\nbnGCpOBFAjlEkCp94Q6OB7/M3nVXPs9/+wswRDZSCejt1zLhmMg8xzu5SgkR\ncb1zaRGeRwV5ZyJ+uzYfssZU96zrvg3jzXpCZuflNrEZMB+d+y2f8aikzlLt\nOyCIiJqyxk0t9OF5D06atz/OPDU+jOqHuJoaW3dQC3M9NXKzzPNVVoKw4Cga\ndOs3x36fAVNF0vqYPKpXfmVTIPF04PAkIkWUhxf/hJfhbJOw38cfM4G2FlQ3\nV5yx4rchlSgAwu8i6S2Q1oxLLWMphgtV4Uq2bHa0FtMZiEY8GXNXP3LE5TzO\n7WmD\r\n=PBvE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDKD+//bQuK13HNSDfFFALDI8Td5zUXeDv0z4DVxU0oAIhAIK5BWijY8QrrrD1kXQ0ir3hKlKMDmiFpXflzKwhrfxa"}]},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.2.0_1604128804787_0.03175207926292045"},"_hasShrinkwrap":false},"3.2.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.2.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.2.1","@ethereum-waffle/compiler":"^3.2.1","@ethereum-waffle/provider":"^3.2.1","@types/chai":"^4.2.3","@types/chai-as-promised":"^7.1.2","@types/mocha":"^5.2.7","@typescript-eslint/eslint-plugin":"^2.30.0","@typescript-eslint/parser":"^2.30.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"^6.8.0","eslint-plugin-import":"^2.20.2","mocha":"^7.1.2","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.2.1","dist":{"shasum":"bf5f63f61c9749eb3270108893a88ff161e68f58","integrity":"sha512-39GMp/IqsHF+3j3XK38cWA+nX7Q6ABfMsYkuAjtfpTguTFQKXx2C1/VJZwGOyb4de2pl4bssmN37VEraB3NWbQ==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.2.1.tgz","fileCount":12,"unpackedSize":151692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvSyUCRA9TVsSAnZWagAA8/oQAJ4Wc1CMthM9gaGg7n54\nm95mX4JPh6Zjg0LrxSe7Dj4p6UDUbPHPmHMnNcS4fEOwcdQBdDgVNYFXAc6V\nZ5PwFOXB2cGQQbbRo0G1KtVxAJWcSqKeDwSpusrgb8Hri+yUT00n2VWKJVvn\n0toKmmvjZ2KNijapgBcVyhB9Ev+lOAeaAMliV9nbxzVdtMQQqthmK6fDoduV\nXwZ0TmQ6XboDEclKapJjgXI+FFSukAKcHzhVNWNbxYSJWm5HDp2GoGmUjfcs\ndeotD/wExmDOEAEfiYvAJDgozJaNgZnFaBSRmtfUPfA48hytiSEfzrazMj25\nQHI6hKqfEhYdRlFh9wmHNLUWhbmG9iWAYnYBOsXtY2uUbFCwR6Rxu5rWLIaB\nZBuy1QFoDVClQ/9aXPjINxCnnG5Nq8IrfO4IXxt5KUnhY8zpC3omgtmz7os9\nSNHUkFVRANm97pFdcFJl01lTxbhp7BT4s/9rrqAnJn/NvCnt645emaXEfgo7\nFTUtJGVOlw/88jXCbunFfcHRPmBLdyBFxSgjKEciDpvKtOjtoR6UvV1pkG+4\n2UFablJytQ8QRnr0FG2CvJy1TyGmNtZLi3CdJLiZnP6K4tysJllXfL0utXHX\nomp3+qwK/mVgAxqYwpcyUKlhBjXvJZTv8QTIttTPIjHT0ccd6/SIeUOWRYkv\nNVAk\r\n=qGjZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICCYO9ASdiZtTjgcMP1ocxbKyvlB6CdGn+wzlB3vTaHWAiEArvkAPOiNc41XdcD1TSxs3dVh6KDphgDQvlz2IbbqP0I="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.2.1_1606233236347_0.02127562014440998"},"_hasShrinkwrap":false},"3.2.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.2.2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git@github.com:EthWorks/Waffle.git"},"private":false,"license":"MIT","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.2.2","@ethereum-waffle/compiler":"^3.2.2","@ethereum-waffle/provider":"^3.2.2"},"licenseText":"Copyright 2020 Ethworks sp z o.o.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"@ethereum-waffle/mock-contract@3.2.2","dist":{"shasum":"5749b03cbb4850150f81cf66151c4523eb7436f0","integrity":"sha512-H60Cc5C7sYNU4LuPMSKDh8YIaN9/fkwEjznY78CEbOosO+lMlFYdA+5VZjeDGDuYKfsBqsocQdkj1CRyoi1KNw==","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.2.2.tgz","fileCount":16,"unpackedSize":8336472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgDFt0CRA9TVsSAnZWagAAUwMP/iGTlF4urCRVJhTPesH6\nQw5Mm8LAecOU7xFe5GvaP4J3EzRdhrcsYdgVJpUHkXQM3dXw0XpQ81JgUGMy\nhILH/4yU3t3pZsJG5QNB4NMaPMeVJttr68p2UYr9uhszsbh4HCySSqoE5dDr\nCJyhaMcgD/cUKzcCXCE7KZF6kFssWlsh4YDK+qZqdX+sUMEGIyPgKxmbWR/s\nOzIkzPV0Z/TyB4/3gNXkVEpw38WvDgAUkmoRFl/f0bDhVvHXjEXnRZw8XXap\nYQr08jRWD9CsuTub8yvMoaZw5iMcAwToqKpU4Lr1jqz1Z1iunp3NFaZ4AR4v\n5hBu91ygObtdgfR59+bKGqdjq5nzOvtI9mp2jizvge3WXM+ZF0VW9nUW1V9Q\nSWJc1jzXakK17R4pL4QuFPkM6vjmm//fFybxWziWmoqprInDXMvOVS9X1COY\nQUTjlBrX1FP1gWzk9HKBe47pUP/+FqEYa0gbk58qobaEZiIlj8i/ry0/sqhZ\nAxNSIYvYHETJdZ7nPXzzEFwXThsBVfEIie+wRubN6cDykQR/nQ04ycpvfKRP\nMWu2jnZ9HAqHqHF8jYgJOLsDrM8XFDnxUp5iBtokI8DHQPJt8FLPeHyxeei4\ntGhVaehzw0VQNbjZf5cr8GPOCztN+9y5Bsm7+1CN/UPUjOwXDr4CpIUpG7vW\nZ6RP\r\n=c2XO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDeJ5j9StztFjTYVe2FlkM5fJsr6pDvm7eaig94eIIIBAIhAPMewRKQ3C+WEmnrgH+0girrlrZvFNpjRGBYLXr0OuPx"}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.2.2_1611422579951_0.09695755939126127"},"_hasShrinkwrap":false},"3.3.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.3.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.0.1","ethers":"^5.0.1"},"devDependencies":{"@ethereum-waffle/chai":"^3.4.0","@ethereum-waffle/compiler":"^3.4.0","@ethereum-waffle/provider":"^3.4.0"},"_id":"@ethereum-waffle/mock-contract@3.3.0","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==","shasum":"7b331f1c95c5d46ee9478f7a6be2869f707d307a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz","fileCount":11,"unpackedSize":8336724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgy0cxCRA9TVsSAnZWagAA4MUP/jl10dnQKpTkFUnGsvHj\nZ5l0LMAco+KFtDfT8ZqZr8jroivSqTQtizItbVy4dCiBCkq2hon+zyLwbibV\no8+ZZJlDd6BxKSCssbL0Yz9QxY5fBQFOEIZPUuJpPpyzupdpm/yizLhPmtuC\nThz5GibUe92ULLvTZaMfpHgtFIPfmaod5s2WNJBnC4D3lKkuvkRHaFobDkVH\nugSPEjptM1J5Ml0ialbaPoj1A9fe/2owMFPshvaKRra0oQOCA4G6WUeond5o\nF0Pm7rrGJvNV1Dl+GOv+abDAlCFBYjZ+5JcHWxf1Y2lI9BmR0QLTTnVmVxyU\nYLDn+ijoD+Fm//Goz01BFufPOnYBX/choyu5DRvHfFCr/NgmZrNfYAHhGdq+\nCY35EcbMqMyxbtUyHsIouYnctPW/uwmrum9czNPFc/jK9nKspjWe/rLrCEww\nHxZseFqGdo1m1PLgCxqOiBY8JAkzapTesuuoOqGwBJNt2BNWpEjQ4GHgMZj1\n4d96LiiXyr9R3O4YtUVxfrHgdjz9+eptHDM9cZKS6XoAU0WVvNNwAadwMdc7\n1ublAuudRLtCl2VwOq8vkSKyqoby4TDThiSNufmQ55iYHV/JjBn5nYTWC3gb\n5D8dyJkaYI3EnQSp/T7NlkVUYguS74zD61ShHTXMKDhdHgaFpQ+hNFLN/qIT\noUsx\r\n=aG+2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFWRez0NBtpBPwzUv2gc9qwc2DI2dr87x3HEnQdcnkzAIgKgRe8OeqJpI7Dlot6uChG4u+AV0LktpZ2yb+t2Tykh4="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.3.0_1623934769298_0.05040614121165943"},"_hasShrinkwrap":false},"3.3.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.3.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.5.0","ethers":"^5.5.2"},"devDependencies":{"@ethereum-waffle/chai":"^3.4.2","@ethereum-waffle/compiler":"^3.4.0","@ethereum-waffle/provider":"^3.4.1"},"_id":"@ethereum-waffle/mock-contract@3.3.1","_nodeVersion":"12.22.8","_npmVersion":"6.14.15","dist":{"integrity":"sha512-h9yChF7IkpJLODg/o9/jlwKwTcXJLSEIq3gewgwUJuBHnhPkJGekcZvsTbximYc+e42QUZrDUATSuTCIryeCEA==","shasum":"dfd53a6e184f5e4c5e1119a8aef67f2d88914497","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.3.1.tgz","fileCount":11,"unpackedSize":8336810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxjAlCRA9TVsSAnZWagAAfUQP/3uUHAX14Q3gH3TXZR7t\nzIggY9u0MFr1bjcciUNAdrlYROZ1R8WR8kJleTC39HVbiyrmSwlhPzMP9Ys7\nEihKrqB+LvgA6F6MHnzREhoMCM3v+otqGQBy71XQ4pmoj837vxH+SX+7G0Mb\n5Fyrsjm97GUD53HIAcUYQdrgRJ0jn9TH5ImEvYU6A4mvkjNFFpteVbNUAXjV\n26Tz4TctjChSjXvTpP3OXcJSc7S6/Udr/W/MrFSYY+SoDuQlSPBdH9/F1C2z\nOBicDJV3sZJbpQTqopSqzMvRbGazdIu1b9/OBZ5XRCmrDnCdFKf+eFJfI0zY\n8rBFoP8bHl2AxiO7d64sF3B8k+y6UDFmQq0cjYgIIpiMSqsYdx3oMo01tIez\n/BkuzfszimTQPL0LQNEpIaaqRqLi3akI393v5xwJmLnobY3XcO2OsXML9Aqp\neIQnJhugCOgIGLXQxcMmEDUi+8rLv0Y8mQu8OR6z5rtTiakOC1D0Y4ndgLXc\nRt2bo3N6+ffyhOJMliZDiLkrXrrqaZElgzTwILsL/DdabYVbg1aAy5WuNl/N\nxwJVMIb5mzNpwDSvOGIQH3tcKiHjI7xYkVXzEVBWpsXvM9u52WVmxKYLJ5fy\nbvz9PK4ypTFPteMNFVt/gbBOcCutPE7F65qgTGJC8OxbtPVjsLsZdlr/Fzbp\nZd5b\r\n=AMai\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFNy14kwV39RQ1XNGmPizxVXfzLS7Nb5FJuQrLXgi5k5AiEA6LzohsCsGTU00OmD7imjzVmd2xdhhg9Gdg6eDXkQDZ4="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.3.1_1640378405336_0.9845866881034557"},"_hasShrinkwrap":false},"4.0.0-alpha.0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.5.0","ethers":"^5.5.4"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.0","@ethereum-waffle/compiler":"4.0.0-alpha.0","@ethereum-waffle/provider":"4.0.0-alpha.0"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.0","_nodeVersion":"12.22.10","_npmVersion":"6.14.16","dist":{"integrity":"sha512-7VuXE5/lqnRpGmHWFIoLQ3qjmd3EjpSZtBed8VmuGcMNRR0jg5NBjezChwT/rVBM4ak+SRdi9mc3UQeG0VUoCg==","shasum":"df131e0ad61d20d3dae1157d6ae93468d39a8e86","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.0.tgz","fileCount":11,"unpackedSize":8336953,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKgZvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIDg/+MCT0yPAVOyOfnPh7BKcmRBmLnf2rc15IHV8GoG0MFjeTUTeA\r\nvN0snbb8TubaSd64u0lbLkJAEPMDVORpPl2EShNXDvounWCrMns+wta09hOk\r\n83jq1PKSxsB/NFCT4PsDDbZmovavCXkKE6bt6yM7Gq4KbASlpYqZUQbDkc7Y\r\ngvfyEqqExqorSEq6YiLx/heyFyTMq9ToHB6mS+G8jpXCnvF6RAYF5lvvGHe0\r\nQUORIszzLRUHrt9GzwgOBDZ/cYY6ZXYeir5KQQFJCDoXs1FG7+rBoHEb6t8T\r\nMDgrDBnKUf2RgkXzX2C4xYRys4QviqDCtMAasp6+5otNhlqYcc/VvNDU6c2d\r\nAY2CgdogJ3tGoC+tQ6816qS0kNvDzWy761WtJER8p5cWAkAfKFoAM90Rkg9T\r\n+E0pxBo9XBtRhyNyo9eDMgxX+X1+VdUuT8Oh0Uuldkr6hZ0v7SPRDfTTJTSb\r\ngtg/E+sURHAn4wuD4QhLgtq0BvjNNDRdRPoHm+rzqA33t1hombBgjNGxG9UR\r\ntxuAlQY/0wdG50uvb0zbaG+/2VOlBKzmuUEHue1NLEyNduE6V13F+wqXgZ3/\r\napmzdoeVjj9CRuVcJyTOQbquWtALBVqL3SsJOkiew3EcbhKuFdDOLRoXOZ/K\r\nvr0kWfYam2MjAhluYCzI9LFLbXcfEMEoB0A=\r\n=cdL3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAh5w5/AKE8VcN+MD1Fkt8gTC/+Ng+k6tYCP/yblsgoMAiEAxf4n/gkLlj37h1wc0E8bFfqCZSJG063dK8UnwTx1YyU="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.0_1646921327146_0.293768581668312"},"_hasShrinkwrap":false},"4.0.0-alpha.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.1","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.5.0","ethers":"^5.5.4"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.1","@ethereum-waffle/compiler":"4.0.0-alpha.1","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.1","typechain":"^7.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.1","_integrity":"sha512-bRJvLtGNdRhfthrxJ3gWqmDIJ5hmBpO/sLjMHimHbBoQYxd5HzxB4LSeNFyx2gSiRwEs6P/ybA+dA6sJeFHJpw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.1.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.1.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-bRJvLtGNdRhfthrxJ3gWqmDIJ5hmBpO/sLjMHimHbBoQYxd5HzxB4LSeNFyx2gSiRwEs6P/ybA+dA6sJeFHJpw==","shasum":"d4be193b690e64788a19a95ae91509f8ae0e342c","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.1.tgz","fileCount":11,"unpackedSize":8337029,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiOvfoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/fQ/9G2imfOsJHWp2ZhN68PE9VpZujW5+0dvDiIW5ZbtNy0tYIdck\r\nqzvJ1GOKdUYq1Pf9oggDv31vu4iXgyrkio7ABfj6QbEF+93RDqCydEopN2hU\r\nm782EGyC/XTut+ANFrnB+ZKEXMHuq6DKd7qeMIOkVR6Q1Wa4ywcKZPJkCsQx\r\nCaVCWb7UMQytBojLFmF9JkrR7pIX/f6HyqbmTHvNYG2X7SxPq0lOun5M/HbU\r\n9CgCyBxJCDjKXxgEEF4R4LZI3WBktfWJSop8pCaOjpUsqqRZLR+u7EtbPSHE\r\nD/RrpRDQXWj+WZrdTrttXGQvu41ofsVgduR0iQhhr0W7IQdJP3G9Yzl/rI1e\r\no5fmoSOSENtlJ6XJmAs0jDN5qoUTKWvARsHzscD2Pcn7JZKqPcKZRYf30NJm\r\nfjAWcKBG0+mmGUsT4pFuAhF5V9g+wmWPrkPZYvZJhEuNg3x3WCpcZx03mJDe\r\n6+KMPfNYTT0HtlMoo5G80OQCL5hJX+oOms2XzvweXmZnQXKKPEvYzMAWNtXs\r\niWaZ85uGFZ90MtK7a68B+W5ciUzoEOXGcxKBG2Qo63Q0Z8VyCTs2rFuacSxI\r\n/8xVfhxmmVU6IT4y1vQLF0AU2TsBReOCdS1leUrNf0SR57qKm4PW/VWOolr4\r\nzdukgsKIF44O5l/OVUeyv0nFO2zOOSLL4oo=\r\n=eq7O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCrG/wYfqKyD+fRaFIKja+Z0D50OBSTABgR7YfmNq3BsAIgTz6945GJC8aFTBvGIqzGj75mEosvATqDFDG543nurPs="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.1_1648031719931_0.32290771456347866"},"_hasShrinkwrap":false},"3.4.4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"3.4.4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"prepublishOnly":"yarn build","test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.5.0","ethers":"^5.5.2"},"devDependencies":{"@ethereum-waffle/chai":"^3.4.4","@ethereum-waffle/compiler":"^3.4.4","@ethereum-waffle/provider":"^3.4.4"},"_id":"@ethereum-waffle/mock-contract@3.4.4","_nodeVersion":"12.22.10","_npmVersion":"6.14.16","dist":{"integrity":"sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==","shasum":"fc6ffa18813546f4950a69f5892d4dd54b2c685a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz","fileCount":11,"unpackedSize":8336810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiOxXxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqntA/8CFv+pHql07MdOYHwwhrUkAIsAv9jPiA/heCN9gtR0QEMCgW9\r\njnYMvg4nRiAAeThZzgyIBhaSzMwZVqeqFtSw0J3mejWo3ahnGETocHZMaOzD\r\nx1OdeS4/mE23wG/ev7aM54fKBO8BJb/HrVOKAH0yHTFYVFxMuIjHSAKN2gC+\r\neIFt6pkWtZeUllKlE7j8ZN5KxKyuQpdSCWHNNUQxa+4b84KgAWzu8inYevKO\r\n08eKhzM3yCcTTO0waE+J/zZFlIJgLOGRdF6hzgqE987KsRdl44itGS5/DCm4\r\ni2CHu/DXHblt+pvRcL7baofO3/8zhsVcO0vvurWH2L9vC7CeSBo4gP2ECUPA\r\n0V7KGf1q6JKYLLBXQRBWHHMIcir3BC0rqrvQuiKOPYVeC3z++LZnKBL8DBHo\r\nsk0u2HKnd5pJ2zqw+fYV2bVk8gyI3ZcFoRoc4y92NUxbmg6+tlvl4lD+D2Ae\r\nsOvMYVulmsZu+xyM0I0iqNMbJ7lq/AXHpMN4KE8t2PguxGQHf/rfkGqUKiEo\r\nnS6JPZmFQLNqkqZXxXeg7p4PeGsxzsEvRDwuHOhn0DMBUVYvHM9wlPaJSysy\r\nMseMhvk6hCcJFXqFX+c/hRP3drWDjKHmdhVl4dQLd41uoVCmGZBtftJqqaHg\r\nBOJNleQbZZGLibyoqv0taEy0bv+mGc2udXQ=\r\n=jawy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEK3AWkliC5QO1bNdOy5RgQ3HxFbgWLClk4xi1RKoSWSAiEA06k7WmoJ+EcKsybWdoYLGyTGKUTEYDQRbQ88F0vFhsU="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_3.4.4_1648039409285_0.9437384997984819"},"_hasShrinkwrap":false},"4.0.0-alpha.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.2","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"^5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.2","@ethereum-waffle/compiler":"4.0.0-alpha.2","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.2","typechain":"^7.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.2","_integrity":"sha512-zHzbKdtSUeBG/cEEZGGX1/yDkFbOz021/OaIGcPGKEpl1w+LEinw8kCbkUqm2XwcyTWSLZekU9ijzZKG5hhRyg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.2.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.2.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-zHzbKdtSUeBG/cEEZGGX1/yDkFbOz021/OaIGcPGKEpl1w+LEinw8kCbkUqm2XwcyTWSLZekU9ijzZKG5hhRyg==","shasum":"fc6fa7351aa66b54e0ca4cd0a6a8ab6ef6e79369","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.2.tgz","fileCount":11,"unpackedSize":8337049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPIkyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1VhAAoA+Rzs8OKdshQ5VYDWEM8RzcOtSMJpEh5tp4mAc8TVvJuWJQ\r\nj0q99XaaIBE8Sns+xoN5vqQ9AfS5lYjHVAqAxj/qtChpuzs0io3j28Y7pLgq\r\nAvbjBEgl99kWyXBgorKLhiBMgn2MnJJ0PfpukT+J4U1ilDr8M/oUVu66S3mX\r\nzHR6TuwAmoEcxqfj1j6mgtTwtURH5K8+QEKbHGLl7rzQ5MY2dTfHN03b56O5\r\nse47Dy/L2ze7XmF9eXyctEsDRgy3TQlghwwEnHo6odVArbjdoGfvqpl7kcRx\r\nRbZedrwAI9N+yzYK77SmofO6Mzy40KU7MawFDDDXF43wyJoBAkBHkjmoHw1f\r\ngIz2SFgNso98PPMKGcHQv1odpqEuJmDYPUCL03FWqYIe486IHSZ+bhNFCil2\r\n2lctRjla9Z3NoDJoG8NFFjYMwx9gO0vL+hI+tTMcpGhdvjimV7kMtWLLVDV+\r\nK1tF73SuwVb3mYl9OA2jRDn90hoDtLhtaBh6kkve4pul2+9aEJZcOFOimJf+\r\nul1R3Bpuim/kXO9YOLjnS5N9RsFX2Q+GSgXcj5sg+ZR/V0/ErwiJxdYOzT/r\r\nHpR9w3RucT3vzVKKsIDaShtUIjXolMCqjaUBYd947Sr3mcGAnD64l06qjgG6\r\ngRKF7KFESAt+5TaY7JDEi+urwanAN9hX8ZI=\r\n=FfiW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAVe9CRFCucNjko0UmHYzCe2wrWtvdg8CuYSPNgu1w+MAiEA70kVbiwd2k4lihkKM2XL8rIsT76rrchq+ZLC5YdyAeI="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.2_1648134450109_0.29935845645058023"},"_hasShrinkwrap":false},"4.0.0-alpha.3":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.3","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"^5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.3","@ethereum-waffle/compiler":"4.0.0-alpha.3","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.3","typechain":"^7.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.3","_integrity":"sha512-/Ne6VfCiliTWHY8etVss7kz/DUKRNXvuw+F1cdA19VTh6ruucC7bHn5b7OfXJDLUql0ylRsDXCHd3i6E8rAfHg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.3.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.3.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-/Ne6VfCiliTWHY8etVss7kz/DUKRNXvuw+F1cdA19VTh6ruucC7bHn5b7OfXJDLUql0ylRsDXCHd3i6E8rAfHg==","shasum":"f2090d290b44900622dde2784392a876fecbd5c3","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.3.tgz","fileCount":11,"unpackedSize":8337049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPaXDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrISQ//d2eT762+KcMWaSYTXuo4v+OemFkUhs1qnEb+HGDLXODfJ2MI\r\nnPw+niEmq/FOvLtNahkPo+4jsBCZJvF/jHBwI0lqB5D8m5R1yx5zdSxb588X\r\nkovPxGIlHWWdqxx3mq7q1goOQ/8NhoWVMLYNwne2o0nmXD/G6itbnwVb7gGf\r\noBPvzWMmUFkZ4XGqXhAzhARTumg/pcC9cKViDOMw7151mPmdctN6ANrGQojE\r\naiITo9OriJbqeOS/BTyXize13xAR+TNLlvr8iov2k6eNoboiM1q6a063BygQ\r\npeuh6dEP5RHdY3xLMDR8k/Q6lOJKnr0AVIomHSpy/UUccuC+vH7xno/6bF+O\r\nnevLKXPksyAyjIU3I4knOz1jIu+dLZTJUaU801lgmtScZATUF6hhJM4ih99H\r\nsZ8bDeCZq16mjdjR0D5II4fB/7j7FINOhYR1e6RJQqzdhsZjVS0Mzbqf/IFd\r\n5O1df1I49/jKl5uHGps6T/QDPmQCz9OWy1p6uUe6Q7ZJIQNhrzybDViClTDX\r\n6mRCi7hyMTr4kO0Pom8q9aUvHlwFNwdRfKZp9EaJUtruEAXc4L8YR2XWMUUl\r\nB2kWnNssrOGX1YKuVv0G3XT0zMucL+S4tKaVpEIUOxVVHZjqLQW3j2odiE5o\r\nwS+Ara5s8fzWZyk4HMCKNm5jLSBff0PmcS8=\r\n=wLGS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6jvXSQghSrZpuX5BVl+ajwWBtyGgavEAYJo5g6k+8KgIgANFDJQVGcP15AIaswWJKd/zI7yYZ2uJFE+WLeQYPGdA="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.3_1648207299178_0.1545821091293278"},"_hasShrinkwrap":false},"4.0.0-alpha.4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.4","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"^5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.4","@ethereum-waffle/compiler":"4.0.0-alpha.4","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.4","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.4","_integrity":"sha512-8nz+PHb48s9PLVLG0EVV5MJLJ0CTMDcK3KYZq0HxmdZMJKTtJNFuNjGo07VhdY8rlv/JNXphhjitUTlGC+yY0A==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.4.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-8nz+PHb48s9PLVLG0EVV5MJLJ0CTMDcK3KYZq0HxmdZMJKTtJNFuNjGo07VhdY8rlv/JNXphhjitUTlGC+yY0A==","shasum":"58fb0441d875ef906c9337ff678d995e814846ab","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.4.tgz","fileCount":11,"unpackedSize":8337049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPcs3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonAA//YpzLTg+UwjL3KNr7BTL5Z9MoH4AIdlmNCB3kOi/FB36XuXYX\r\n0CAr5XS3OuOYwthanykGb/j1smeR8wB1uZUNTQxroaX7knn3fBPtViXcR1OO\r\niySAEMH+akMcSb8MASGXkqiTBF2vo3A2V3BrAIKBnNj7Lauy+L2D0+mb5CMT\r\nomlY0ejX9PDeVx1oiozllrH7q1K8yTyyPHhrkXoUfbZ0C2ZYiHgbi+epkp6a\r\nndk285VQ11RTj9qel7VqcF8bJQb7o+zERnvFd8SFsIimTWMRjOzyF5ryIzcu\r\nODA/u2+hNEiJrmnlS1JHWIe+HMyYtLIaY+Ia9F3ZELrwRPysCWZmJZdiUN06\r\nevnS8W1BI4W+Y4h7/JAZJsRTcNrJgVSsb3Fo34SPZI9VESfqflmpgugGPr0W\r\nBKi6qFdJ/dFpcGSbDIvrxCmHZl/1PeszuW5YjVVrTbnkyx9asWFyeb5hfTKz\r\ndLbNm/ISCAzQWKWDrfdHgtEOaJPWV++5LQuHimGmsWf2q3psUEHHapTqoywI\r\nI7xcE2xn93cZ4J+Krp1RmLgvNbmg0dJvHg5PEA4ga/66P2Ya9wIZrby9vIUD\r\n10h8MqeXj6QoZG9TfeiL23AUCCHdrEV0BG9h/oCk2ZJBKeyWmX/sz3X5QP2l\r\nPkRkKoeOOZ2GjP+NCSy9sYoo16ad077uByY=\r\n=owpO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2JcY/xTTd40tgzfoZuPVQJ1KF8s5AqCIMWd+Ah7su4gIhAJPvd4RzybDKfWMB78rpepBpd/n2lEPOsE6MBEDoRxUb"}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.4_1648216886675_0.263088819243567"},"_hasShrinkwrap":false},"4.0.0-alpha.5":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.5","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"^5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.5","@ethereum-waffle/compiler":"4.0.0-alpha.5","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.5","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.5","_integrity":"sha512-3gTh6QuNrBPFb/KHlIBVF7trmefNXLClhwpI8RflAkv5GLVpCLAfNRixDxnWAxKOtjt0RWNVpf9c0Dk2zhhuXQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.5.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.5.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-3gTh6QuNrBPFb/KHlIBVF7trmefNXLClhwpI8RflAkv5GLVpCLAfNRixDxnWAxKOtjt0RWNVpf9c0Dk2zhhuXQ==","shasum":"5d325ae2b24c772cd85981fcd05d6780daab3866","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.5.tgz","fileCount":11,"unpackedSize":8337049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPeThACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrj4A//VMjthcbol766c8Xs6axDwEExczX2KDbKzPlJzoiy3NrSkoiy\r\nbwVva/JBFfsU8NuGsFd7NNh0r7wK8RAC8SiW03J77BqcdiePg2eZmeqaCP9Y\r\nKQjr/qSZ1WtVnBHjHrKnB2VIoqlNTxFTU/Y4MgfjNFikW/M/NFzK4rbzEsqk\r\nhrUywfBtSbeNbGIGOhX4bk0gsbVPuOhR8PleXlwwAWfDMxntlNNgLuABsTV+\r\nun/2xv3kCJR4K+cFPsoEci5QS0JXCeAMXGNrMER7iKWIwkJogHi4Op197Eqd\r\nPuRyF+AJ70fO7h3KIvFEWwnNicU0cBP2BbykLz1Cxn//SCWM9v7KaMhxKSJ/\r\nIwjU4UHmMyjP00sZS0oGdhYPH8Ml4EXqwGXbgmDeN3acI3cw1P5PFfJj3xCf\r\nVDGTqb4U8FjbKdZhdqURQcPNNUmbRkIQPhfPIet12XgZiEW1HI5RUXYRnV89\r\nydl2kHTAVD0E4CUPwGeITo56wy7wPvl9oQnkhRzPiSQG3d+c8DqWxb/l5UDv\r\nVHV8rAWlq6Yn6ZPMZ++eCAjbu9rxjKXWNCJd+AK1SpXjaX6IdezKjeA9K8B/\r\nHjtrAoX5f8BK+Fz7d//r/JNlGcMBqhzE4VAGxVCbkHEN+SdUiTm+3LG12MBB\r\n26nKn1phJdEuh94OMa7HRkv8BxQzhxaSAHA=\r\n=bvsD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCXtwNwjunkFWuXXmRHrKdJ1MbS28nEnahiWvCl+QtLCAIhAPJS+VqhuDtVfX/OXRJsgokKJUwOgRdukc9b7CbSEE9P"}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.5_1648223457475_0.9607001662478623"},"_hasShrinkwrap":false},"4.0.0-alpha.6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.6","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"^5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.6","@ethereum-waffle/compiler":"4.0.0-alpha.6","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.6","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.6","_integrity":"sha512-x3+z1Nn5KWgjNRmRceSklXJUt0J5WMlys8E4fxLOdv9lzAhnYfB5+Itidxf80yq5BWPmJIE6+mesuRj+lNLIcQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.6.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-x3+z1Nn5KWgjNRmRceSklXJUt0J5WMlys8E4fxLOdv9lzAhnYfB5+Itidxf80yq5BWPmJIE6+mesuRj+lNLIcQ==","shasum":"13840bf66c830254431d9424d82401b1f6eeb017","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.6.tgz","fileCount":11,"unpackedSize":8337004,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQcoIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJBA/9EL/7IfUS+ADrz6U/oizTUljQw7HT8NlbIsIDMRDAwREYpe4u\r\nMy5GfUzI/sKVTU8KyJRaivWAgIIHjNOLaErM1YuvXoXwK/7hnk7VegFonn06\r\nfsSqUBdSAyroDxmYDwRqR8Sez6e1PIOZvgV7SzmFnoJ/vFZ/9/awFWqQ/m5d\r\niM1wsLss8aUge1TVrFpjrBak3UpRkf+GF57yIyxX+qyediWxWTGyHDYFTJO0\r\ngppPdNFfv8Un3GujVGFZJtUt4C87tQlLp58LRzeMi7dGa7Wly4KYcoCq24qi\r\nhRzPxpWzuTw/I6YIDZzHj3kJiTR6q7aC6ECKDKWPC8rLs3UdJan35n5AASm4\r\nlWyJJGMQ6k004w84woEBszVYTFexWFBQTQuNm6SM8/sRuSaG8dDwsnEKTDyF\r\nE6kfftCTwLb8N6olSfQRc8Y3CJ8O1d898C380Wim7KHEAiX48Y4OwvAldVse\r\nMEMqGAVXYFBk2UVRKecR0a+ouEd3yxzq9mkpLo7EXrpG8sId2g5e9orotk6z\r\nMc9MglOI0rMhrmB9hXcq7U5DX2KCR9Eb4RZ5y3I0AAQIwszqQEDPErE/f/Ey\r\n6QxoKWy6/kwSaJZ2ZcplHvoH/4fNpRBlVN+o7C+e7NGtopA41/b9XdFS6/da\r\n4QpLO2GLGAhhg5fCO1M7ZS1fmpQUgibVNrY=\r\n=5YVP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH/JvDTGD9gtaJvJB/uGmbBX/oBB985FneksdqpfRYXfAiAWEebGSZpoOuD5uemMBmsBBC5lpKpiGpEZsjARSTqGBw=="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.6_1648478727940_0.5653588993327738"},"_hasShrinkwrap":false},"4.0.0-alpha.7":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.7","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.7","@ethereum-waffle/compiler":"4.0.0-alpha.7","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.7","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.7","_integrity":"sha512-ia2TAGvesWmclsNjE3CKvjN5+zTWRDMOGp8N0B8lGyNkp9HoeX8gO7bRx3s6/PDvaTKKL/yZ1tBqxn9CgtM5vg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.7.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.7.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-ia2TAGvesWmclsNjE3CKvjN5+zTWRDMOGp8N0B8lGyNkp9HoeX8gO7bRx3s6/PDvaTKKL/yZ1tBqxn9CgtM5vg==","shasum":"1d03022b626e94dda476e9a7050b30555bf6d90a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.7.tgz","fileCount":11,"unpackedSize":8337003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQd3rACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoWLA//dPKNBSQWXysYlxGswCwXpeL/ZmygJQHx9FntAEmFbRsx8eJw\r\nC7JdSbY/YnFVjmVXqCIOpmwxagYOShug+NY0NSqzwZo8RS+Ip3Rx/g76H7Zx\r\neiamjQYJZYGXOPKZFFaRj9OLi9BBHYwTFzABaY55hH+je8RDS2iBLBhsFsxv\r\nTKA1GxkSkENWhahebeghUddfSMs9KjccCRcCXmjoSp892GkHNGT7rJGc7oJv\r\n9nFhsl7INq8Wc1mJIy1PxcwNPyb7jxEzg8jS+iQEpDKBXzfxjQlby4nlh0ux\r\ntp2psn0KhgRD9ex8Lo2sL7JCArJNtVlM57lo6fjyPGVEvLp37sgA90cW/84g\r\nWvp/tDOYO2FCxstSOkhC1OuawTXeaXa2t4mKBe++H4YskvcgC+V/9bHzh/EJ\r\nwRG0iSuawc7M5gk/ancVpalW4j9nwwPrOB3/l7GEJuzwFd2clMbW6SWnrZib\r\nMQVIxFYz8ZvyeLNIUDeIX6sq3w/QVmdPrMB2qgVmPkTBrzy9CekZ9gt4hQL7\r\nNxTmFv4+sKj4WD+Tcz65JFrGA/5iEkDekaB6u4aKg91kNQBQ54aydIktUUMq\r\nj9DBZpGBI12ie7NVK4jK1+BVYu9qBj3nhh2qQly0WRME+ZkfWWgeX/GYSBOl\r\nAqMHI5W9mblMZbD59SO1OsQ7JRn9dny+H/Q=\r\n=6oqt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGoX6i/rmvFqvH84M1Rh04BTVNksSlOc0DyxhWYYeGz0AiEAhjaYqMimnGvxEN7VqLvpLpWW13tpAz6woa/h6ni567c="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.7_1648483819677_0.592305290110996"},"_hasShrinkwrap":false},"4.0.0-alpha.8":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.8","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.8","@ethereum-waffle/compiler":"4.0.0-alpha.8","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.8","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.8","_integrity":"sha512-zfZQkaT+zjldgY3KvUicEsgi/NjR/Gh00hHpDJOjMJAOsJE27kBAKu6kAB5P434CkMubtJoMR3qGgtmF84nCxw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.8.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.8.tgz","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-zfZQkaT+zjldgY3KvUicEsgi/NjR/Gh00hHpDJOjMJAOsJE27kBAKu6kAB5P434CkMubtJoMR3qGgtmF84nCxw==","shasum":"5b759067c9aad67ea4f0fb276b4cdf5dab389976","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.8.tgz","fileCount":11,"unpackedSize":8337003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQxbUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJcQ//fnOGaetXACBtBnsdB1xwrc77VElVTd+JfBXvypb1r7dvZsIG\r\nBL6KUdF2+iJUH/WQBX/OS4AJstQtXT6tpmLuQCcsZIAxausvgrYLTkC35KF9\r\ncWe2Wh0cIOS8G2mBpR+mL6lse+CDqyMjrrlEZ1/dWnte2R4midBzCw29bxIs\r\niKsY0sCbx4GMkq9BbLQxcI5GpIfMgeY4OFREbWN49DPSGcvIONvbknsiRXrM\r\nBHP7B8M1tP7ORJ7eEn5Rj0gYeqb4NMF4wYCv8npM30jH4CosC3eXXkJiQKJW\r\nBHeaHg5e5SOM/PxBNZPbhNST4kgKuIhoYO8QlkulxgECe+kdwII7Wu1UrfHa\r\nGsR0Rh/RlQOK2kzSNkiSqQvg1Sp0n+GEAvGbAx1T6lckRoqrPwUyOfgXGiAa\r\n5VbjcggwqbSeAEv7sT6fE/4MJpzyERpxyhGfLVUbt9Ur6JqF65vInzhR0j/H\r\nFVPvypWJoSYywcT7OD1p5pDeikfyEgidM0RKl0tAC4dpcZh1I0YI1aIXTGBG\r\n/29dYbec3sC1bMUwDhFCinKZuTGCihznwWjr3IJAx9AGag8hnVHKiqphFN18\r\nQirKCOWGYoK3AvnsZcxZ4Pgqepxoi6CmQWMpIoatT5FqsRsK79vLgN1OQsp0\r\nFit87Cc3Ffmc0oE4Yk7cRWBK5mYr4vy+PAM=\r\n=AbXf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD70SoqtZhD5ExhwU3In/2didIRmU1SSNzLVCa7xIoQxQIgTiVmB1txjQrbBdquUiunp6wzqWG1C9olYAJd7AVevYc="}]},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.8_1648563924092_0.6379186243211774"},"_hasShrinkwrap":false},"4.0.0-alpha.9":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.9","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"e7299db6b37b027b6aeafdacb75f45c632898674","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.9","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-ccvnSMYOZhJu99FMos/Ed6t9uYkDxuMPko+rTgPzvhctXrPGCY8WzBKMfrKxwJp0xzNnuw+P3KIL0YIQ0mIhHA==","shasum":"fe5328efc6cc2dc44e07d41111feb82f8e6c7a60","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.9.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9xzWLayactdj3SEds1fZwDq3jjJcuxkPMCoFSM/3Z0QIhAOcupt7CnhvXTN4K4ctg6/okw0LgQmdz6BJsBQufY67j"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTGAYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCZQ//Vh0maRx+uQiMm+eulUV0ZX9lI+UjTEBQN/8ieW5SDasu/gPZ\r\nz0maGuRcukxIUj9GLsidLNtZbBzGovZoKZzAJHiatOPugA5bDFyYZ95NI9+G\r\nYIJG0GuFLBq/JpdfnZtCXOdoZ76TDv9stf7besje4knThSq+0V5HS9s/H3Od\r\n/nl8yZvqvCBAJD6r+04lmUIxknHJh0hjWkf33IhHSaW+iUGm/wruJVy4JLUw\r\nWZvJ7Imvk8OJ6A8RZ0kZZmWV2+E+BaMJMV5Lwf0zcNKtYmJhxDbbhDutXM7p\r\nyg9VANUNLA7U9n1auBpZ8ogw9a865DnYF5mpzszU+ajgLg/Hau5lSGbnOWmb\r\nUv5OL68jw4bAFZmOkNq3gdjMqHnShaxY3BADzqm3xLKCCaSzLD38N9PAdLYJ\r\nT+FY8BBiKkgzQHl8ovU4QbVNqtDg1EkqoX/4wA6KKDGhVoT5M4ATLSBPMvwX\r\nHbZ2GF07EJc/V6M3kIzBZQRUriL20zMIlZm7dECx689Unw01UQ9BH0AE0W/+\r\nVD0Y37PVKH5M0AFDCIa+8JJJrjLaHzMSGhmVqU1iR8Y1E5zmBh7T0KfrvMwM\r\nmWzgdsptL84e2hyn4JWtTbJXyc76NuAoKi/rSkOjUKZeGdQWUU7tOPK1NSKv\r\nRr/rSpA5sVhTBrbm2R/5hymSKbRKYgP68+g=\r\n=tbgH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.9_1649172504397_0.7863690534510344"},"_hasShrinkwrap":false},"4.0.0-alpha.10":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.10","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"528e32b3e375eb66b2f111ad8c2d5da95d51c15b","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.10","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-PqCJM6nHuu/T83+jBoECNMG4s+8xkKFH1PmbFEla7Hq+MxOK8W/qXcq/tUQ9QUTRbr8Jz0u43YjQZb3DcE+I/Q==","shasum":"6a96548f49674e9bdf22f7f499b48d5bbc736cd0","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.10.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDWw/NCJWw02LUKHhhKcDuhJmnbaNXVE/vjehKcLWGw/AiEAqvdXPxWTNS+LxNNpYuLWK4MtMyw0xTRcYnWdSUfkkG0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUAjhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpcoQ/7BRDWDJgc9lSdBi+QU6MpCoxV4dkueH3DjPMbpSunxnV8SSO8\r\ni6b2GvGhfuF+j49ykjzxtOV8QOmHng22OGH8H/HzNzW67J1Yj4Mh80VK9xGO\r\n7Nlzx8rnxOuUHE47sbuf0OSwMRLYVHeK/MKo0qcxw2GEWFd0vNhLZIOPmo42\r\nESZTMBZsnEt+nMc297z+l5audtW3QMi9xsZf6PtCbatvR7heicGHI5MJ8CHd\r\n0XnbJtFoqr5najhrxL7s97yXAsN6WU1aUsLGfC1PV5ubzitrUjXN+PgyO0zc\r\nICHRyKjf1+A3WnqHgg24d9YD+ikVTOjfau5AbTijcP03H87uzrSC0YdvO2Hr\r\niDx89yDGp90jPcDeEE2FjYh2XwkNmSRq9CK3wzveqB01ZFrKOp849JLClPei\r\n3RwxZ7SSnMUfFA1aMgXwO2DiZ28IW2gge5CgqHWec4FFsUqkZDU2T29V5csk\r\nRiWQJ1GN3pe+Hk84hfDAwD2vHpsGfUzIXCDHjUdru9RNxL8rfnC9m+Mm7zAL\r\n9Kb9Ke81ii+LU/bHTFy64TCnV2kzyEVSDbRdrUFW1ZMoEhHR7xOTu+mCYGBy\r\nyuwBwYoiU+/I2knEUWnIHCXnSePesdPy2S+yoQ1lW1jyss0XQBJs6hlnGq7S\r\n1HveLquvTVEuJ1yVFIp4ruXLxxYTYc9pTFQ=\r\n=chMI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.10_1649412321674_0.061349123989241194"},"_hasShrinkwrap":false},"4.0.0-alpha.11":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.11","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"ed044d59f258f45fa3e155fe6f9b271ce9d39de1","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.11","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-6xvXrpuJxFj7RH/7JDiUtAP7M8dVE4JD9ZwpAdf4GfoMCKgfYkPthZFEV7DcsuZQQ+yau9J9i40N/Y6cPfDowQ==","shasum":"92fcc69282ad075e46eb8fa30508c9c83641948e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.11.tgz","fileCount":12,"unpackedSize":10624620,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDhQEuSgLsv3Cdgsi6tVFhv+O/amVF6kPY9aA6v8oQxCgIgJGZY8UAYHZAn/NNPJ2NbJGyr2a64Kzal+pUQXizLeA8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUDcJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpE7A//bGiVqL1d/23GxloGAaZ3tAmIazO56iFhg/zrJDl+jnfFzuMB\r\nK9VR4Mil8dHcGRjRpMqQXoNyVERag9zM01a9bD7MiMkv7kL4oXBfn9ruuqVO\r\ncafIMfLawADhd13Z3fMe56HjBDubizVa3FZx4JmNEASQ0r+06zHXaXD9Vjpo\r\n7/eJuRrGAYjkHlnG5Ys05mnQTBtBoQ9Th4Pbi8ngW3N1KXJCxk1sfRGbvNdI\r\nWDbjUYqG+dno2pqfHufDJHkC4y6fniaLzLfKdp+ze9oZ0OcqOGQw4Nvr8DaX\r\nzGMnnCgyz2WLPBf9VFW+nRprw1v/MtewgZfwAVHVOemRu+CCVh6I07cqIowu\r\nr6r+tV2JzLyiBnKQ4dOWGztFJ+lTQG8K+OGey/VONtIjpiAkU7w1AlH+XFL2\r\nATj14MgYptySlbz7pKaf9Vbka1uuNhzos+ZkprbSflNtPQIb1JeuzvbW9DqG\r\nvNCpbna5HTAHyvS+Wuka7a9qD6o9rtDH0fovMMtpCtNQhTl6XyntrWztViIT\r\nlwTf00/LORggEA+VJNu7ymmh9RINdqUU7FiWzt7pCNEu4A+SHXhO3mK48ZkN\r\n4DY+1tM3g37bNOuuMOogjM+qtINaCvX5p11M1gccGzKr8jRZJ+xv4r3lP1Le\r\n77naXjROGNWru0OZnPACrFnCr3yAWuBPpT8=\r\n=ESqS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.11_1649424137500_0.4755336613404091"},"_hasShrinkwrap":false},"4.0.0-alpha.12":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.12","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"c63d7943b840e3695179ae9414a7429b63ab86f3","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.12","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-1IGVahwsMhUSVMFBO+6le2HI6nAC72nXAlB/USfoJXVs6CD9n3P11oEdng43jQOePCIVvRPXglBiTRI2+ZhRIA==","shasum":"c88ac9bc58173f5a7de1e6a6d8d20058b8f3e5e1","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.12.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDrCWhdPi7i4x9lG4g6vi8S7AQ3yxSrx0ApXcDG6+kzEAiEA/IJy+toMK4HCQZ+0pgar2IB22jzNEcvjnZAbRU6Wnqg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUDnbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrj+g/8CHCxjmdxOLkcuqL6jeTiP3iqPUCdSAOCNnTanG9x5wB/XFJa\r\nfTjhCP6ERAm7glNwbzlgtqbJo0ZEtBLSxwy7nwdekbS6A0hyVtEvf30kPbwj\r\nl6MSLLEBoxBr/MagB4wJwocqhdeqLo83ow9gwBUpli3rUZiWBu44tHS2kh2c\r\noNXazH5izgeqC30UNmTgTI71N4nYnR08d/u+AjAPD2qlo0L6hBa6enCV3Krt\r\nCoOsdiRgVRoWuhjwQBqd+vYcsImsmHR4zDpvnNYWJ1Kq7A37jLkhiotjBpE1\r\neXgiILrjKIJfPGbdIM+Z+gAPq9pzfjP7DhtVxQJta5zEXpMbai9KbYg0tv3R\r\nm4fTtStv7MYINeZPdegLj18oZw7ChXFb1EONsiakDvkQ8G9k6vwXrkylcKuY\r\nAmVmk8pHsGgRAzsfz1684m7v2WRSVn79qZC8i2ObV/qe58pR0OPrtMZCzKkw\r\n4TzfkJJAdTIw/3kQMsBiQEx7kGvejKzpq9isnlDp5ae0CyPHItrW/k1A+14O\r\n5AojUYShKd5c59p6uSBSGo2Xh3pMgJKsGqpAd3M9KudwrhJiinkAUrb8kTbi\r\n9kxZGay+IbCZcdPYj7g80syj3L53BI3PaMYtKfP2s7BMyQdQFF1CREROK7Wm\r\nnCshEivwKLjz4/x8G5NmgfS6412JwnqB6AE=\r\n=Ej/Q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.12_1649424859672_0.16537248433354046"},"_hasShrinkwrap":false},"4.0.0-alpha.13":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.13","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"fd1ce01affd04e81de568ab2f51bfd0ce0142654","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.13","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-rYp38MpP3Kgl0RpzMfKfVe/dBJYhAuUotTKnDdvBolp98W6MCAhkF4Ge3+9l5Ly2whBdh9BUpXmjVNgl1+zxPQ==","shasum":"6124794dbc00ba0ff91b55379bdeae438e14c17b","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.13.tgz","fileCount":12,"unpackedSize":10624620,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYxRawmzXBO7r8zYnPyR0Pbncyd3bFy6ShdSf5WmZ+2gIhALG2BJ/1R48ic2srdfwZVETNz1Jk8uOg90Tsc7Sx7+mQ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUDt5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoowA/+MOFDGWAip03Y5P4ZjrBQsC5SFYHY08w8ERqQzCeg7atBPcXP\r\nqzOSmuJjMxoM9DY1epuaR0WRDGWaXL7hp7hMQajMwY+YZfnC7SnCigQcspQc\r\n5Mv1THKtOyTtPnVUufAppgKJ62oNQUyCphiKoeaBLL6IPFPq735yZVQblYR5\r\nIC1MYp0vHg0Tmmo9fafq26/hxG1k7oDYHJT2wAodRehVhNV7irmKllgcb8FT\r\nXWUNrhDvMKdJQTnBNGJy01e2v06zA0GXwCYHfS2Wg9fqnePhuAf08e/R4yvY\r\n1Y54NXspmaN9Lj+Sj70q6GIx/1T2fJZ6asGqYlsi256emHkv7k+VwiPTZR3R\r\n1HoS6OfLvVIWgf+JaAyhx+bcLpJRVLcoal0kYdEEt1KTgCK/Ni0OdT/9/+4j\r\ndVLnGzTOsItAoT2VWmT7Uf3tx6ugUEIWLh63AoibsR7VIqISF7AlRPJ3/C/u\r\n2sOzfodCFwMNCsOdtHhf0G8xlTvAGcSG1Esu37dlJcNCBs4VqH7+bbXPyB8Q\r\n1PbHihHMNoTKeuGUFMCtKuTpP9E0P/b/XOnEj5ZuPUwekit6EP1uDRTGv6P6\r\nsNVPJXicG3LENVhMwfhk5NHjOpMXp8GM+U5DERwkPLIKtqXBXNtUzZz7pnCN\r\nyU+T7fZubhzCwfUY5PCuFlwZqQNuvBv4yvE=\r\n=+9Tn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.13_1649425273015_0.46633120592630073"},"_hasShrinkwrap":false},"4.0.0-alpha.14":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.14","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"96210f0ea784ee0adfcdbd53044232b1f0c69e85","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.14","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-J9khG52scdq/UIjUIERZm1+qs3AHn7Yy9M2f6ZHHolED+t1LWhCeQ8SYIBv0ssXq+ytYpGejndMyWBqy/j6N5A==","shasum":"44b9bf6e5317908dd213cddfb708eaf9ca9c72c7","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.14.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8cOTstWI8ZUSsxd2LzFCJ2Iqse5RbyiwOCCioijj9AQIgCuPfRLo9vao/oNCTQnuJJzZrbe2eXQtCcPKQBOZSQcM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUD6YACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoe4A//ejfBoWS//3gKL5hEzxdFDzyCGAUYuzs2PAZ7LW5cTdPt5Cao\r\nv95EtXxbKo65dtLAQl299EEzapqn6KT0gMkaWs40/rvBs2euH0G2db8SKyAV\r\npqSZPnI/7I9ZxAOir2Bvpf1zeP5T2JaHk2zDheSgr3tfv6fTp+hdOGnArlG+\r\nrdFZDkYk5+qQRGRLjEc0RWU+LhhYLbnPlk9+4X1xAVEeGzh5qhsN+kbaFkSw\r\n11l3qGFwA+18OV2JmNE22a44W3PWc/aPn92N6V0OoSHl0ZhkQqH8JE772g3u\r\nNeSyL1OPH9YJYT7vGkyV4YtszskLKUAU9doYEFMKwE35nhZS6cnMX+pTm24D\r\nnEpQQ011VWmQRE40ye7/dX9rOj+JC1bKpOFZ8W2bS+vMhsqjEbFWPcI3mP7f\r\n3cLMklsCiEvw4hywSNbrnuJBgRJ2UMjdb7zVy4t30u9I27b35XsxWqrzgQt7\r\nlMEJ+4fx6Ns5CPT1J/C/QQsbKvdv+1QRb3f9bQmVLmKZbOYt068rYi+zoMLL\r\nsW8HG7KR/oaFn64qTTwC3FZGpGtwIOWXumVg80KD8AhhvZPH+5xsbm/XDG4s\r\nxQ8QkeCNmAABybWsnPDPf1RaphCKdQmc5GF9ohoTvStFnzUmcq6RZKX2CaoZ\r\nwgO8MrnjCMFf14QxUHgDjbyqW1MuQxkdK90=\r\n=SJ7p\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.14_1649426071778_0.5592177461359014"},"_hasShrinkwrap":false},"4.0.0-alpha.15":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.15","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"b94c36999046cdaa28e71ebb47f1a399b336b9d2","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.15","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-GwD5MjXCHbdvztLnSgsCTMyZHd6dIDTTRNT2oVN664ToR9wrlwxgXh783MDl4T2e2bSq7RnqO0cmHEHhkXgpYw==","shasum":"ae590297b2efeeadeffe6dcd2efa499146e57d31","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.15.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEm7MsEyxn68S8NVQQZPUyxGGYVjj+gXZViFfIo6Nh8qAiBhTI2tlEGn1DoubuzqYp2Ao5IdwL1/qms98DuFc4+hDg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUFxlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRSw//QpNzuDx7nXNg49XLZ1VF1XVgroSWy8UEKdTOOQjd/X+Lr/kM\r\nTpLHyXZci4NPmZZlniVxNuc9p4JPM4FKVo0XNYQJYd4rEnQWUKwFmhjV7tEr\r\nLaU+7OW7kyaAXAGbpJGSrU2US7qxgaphcOF+rwzphq1r4M8lhn8wCClMVgsL\r\nN0q0icrjuCoiJ4ukj3/yVZZbGy1AS6tKiZeL7mGQlZFJiz9O1Co4BMzgNwvn\r\nIvs+ru31a9KnPYUDR4RoYJVOyEnJGv922bOscGBFg7NDOw1vX9jaGTfScfai\r\n7Cs7ImMd1w0smUQR7NRstsiDm6H0ud2nt6jNKeOYXWpMO6ItFekqRleIOM+N\r\nIKq0Hh6BEhW4N8AK6etlsh/FFHuxH//cZMGeXFGsCAqbu0FxTH2MS7UCGA3q\r\nND3m679/umJbTD3PqgIRaqZnGAAak9Nk23Y7tySJPaJguFqd0467EzBptV/7\r\nc6qw7oKSoc1pixLMRVkjxkQMMywdvipeUElxTC0ujA6jsqIJTsUxzF6xQlxN\r\nXEylSYeUKgK8JQmXUC7fPzhLOUcJYiKYRDRde3p1dMyH/OUmqff1tLe091js\r\nPXXaNVZC/0jKB6+TC8F90t2FOgO6KsYKpGl1WurAsQ1b+8gG5QCDsEXzQGuh\r\n4hFMQzIndwLRJkU1e8iQY3/oTixjMih+Kis=\r\n=AvlT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.15_1649433701407_0.10720973428111558"},"_hasShrinkwrap":false},"4.0.0-alpha.b94c36":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.b94c36","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"f89ed312e4403bc227a6348df418e87b609e5f21","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.b94c36","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-uNzcYMDjdQ2igT1gomskRiPjM5M7c6JamuA7St4XyLsSmhIhNvV3aJ3lRit/MCIB85NSUec6OMyXoXFmiLRXkA==","shasum":"9658240c89e1cf5c69d5d18462a537a593bbe1f4","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.b94c36.tgz","fileCount":12,"unpackedSize":10624629,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGY5tLY5VceEuD7GezNePfdrNc4vG0svpu7vdzO89bWVAiB+DPo0Bsjah3VXODTTMOqUAq7iKsGpA6vl+SbsUl4W3A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiU/J0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpF0g//SowkpACnOcUONMu6XKqy2zCuGwu7uqLh/zVwW1kt53iefTgb\r\nZfnVxGDYZ1gKHz3am0quoyjhpkUIsX9tvYI+mltr5OU5J01eukZF22yGGPuU\r\nS86BsaEI+P/We4rYDnwajMRrTyD3egskY90VzUnJ7c5NBoR6Pci3cZOlF2O0\r\nbJCjgE/l87GAloLBdghuYzZicbPRo8oMqS/uQ4h2QBUpP3SqvgST27VMq14y\r\nY5NgqjJ1M2eStA7qZK+lZADq9Jz0Liy/QX0RzbG4CmIDg3pfbQHOCJnmNnFe\r\nwFISc/80HLOC0iPoW3aaKXc2bPa/eNf7Pj3aCYcOYMnNuIvAb+fVrovxhj/Y\r\nmL5WSokV9Qri/xYr5aE0iUag+hLS9qbvLjq3LpP14Hnp37+n6dObDZJaOECC\r\nYEAVSmm8mEmrd9c4jYL2j3pmbTC2Ig5Nq7EKc6E54mDqrf+wnkwQLvj3XxBz\r\nNSSpbgFkx4jk3Y2kci1raKOnP4AJ15xA115+0VF6u7ltErHPQiwR1YJyh//O\r\ncTfSOIFNpuadMhRALMewYzi0RgdFxksJYD8gRF8Irt6BWhci5y7PFIbgslUO\r\nceMuLSvWqygSQ4gHKw1SX8/omB7BhOylP+N9ImOxMKcfv0bZEp2EYXpfGf9t\r\nKopb4eR7lfNW7Zj7c7QL1ppYa4AKdSQ/hhI=\r\n=FeOR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.b94c36_1649668724008_0.5702618281734531"},"_hasShrinkwrap":false},"4.0.0-alpha.16":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.16","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"3e41a2ad0efba3dd8820f0d9445ce43434c723f4","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.16","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-uCxpr+x7xD5O+bdrVvEdhZG8lPCQ6zvlU8CgkfSn40ZrwUr48QxhSN1jvG+Og2CwUoinUboSJUoQYeCkQCrfTQ==","shasum":"d2070d16478bf70653582ab34d2b463973a2a0e9","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.16.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp/HiVm69nZwnhE94vaTRRyhHoj0uvvgDrCkjgspjzjwIgRFYZUa1k9u2p7ykoSvfUZFr8qmDrQct/3FINWeGbNIc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVAqQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvxxAAhBwdnA+xbo8YVYIGTl0ZbTw0SVA74uetzoS4CLdMogV0KwXD\r\nBu24iFsZfFiOpiH3/F1qERWHutJ5iNPmGGPGm6mycPh35MFatFMuyIZ9z6Zk\r\nrOarXN3LIL1AqqEWcoekw2LXBrkroPrV6Qve3r4ol2gPP/q3nCp8YWwKlfhT\r\nt5vVvIf8E8n36zNdIZ+vzVSLvrVjp0As516Yu+qliHI411WjgOuCDhJgDL3s\r\nkDW5aDpZxeP1Ga8hE0htiYmC4iAjKbCxWB7235QdQSEd0jszzyYfUCh+Kxns\r\npArnLhWUpsEtag8SLHLBQJi5ouExnmIzbRv4El+hpth4yC6SQQRQp53+4YZU\r\nQ9bjT45JdQNwkmcRsxv/Q94V1x6+JlZ+mSAQLiyF9hwPmv0HQ1Gr1+IwE/1p\r\nkrXAsrMu61waZXvEXJOL7ieq9srF5eRlCPsdMtyep4aYz6e6tSIqGC413wE4\r\njNhbEZFDi9og0C16NxeiGOa92+oHff5hxWO6PeQnbgVi6UdUpGjLt+6VyRw6\r\nbxy/jl1ViZPb9KWcu7kbYeslOPQjUlj7465B8fdoS4eiyLEGPJIhEB3HeY1R\r\n96R1Fe245njr8LkenXT5br7rMfpb2l5jb8GjcYJFgbTMJ/bo0oT4cFNDz6zU\r\nMuWv6L0U5PPuCjqLbtaajheEreOJiRnU1Uc=\r\n=bV3c\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.16_1649674895952_0.2973430681579661"},"_hasShrinkwrap":false},"4.0.0-alpha.17":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.17","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"ffb59e3d7e2f00643a41a0c746b3a5bcd1dc0828","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.17","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-86Ca/XhvxKjs6JwJEMBXdqxJh2wyez4LV7FfOmmZtgRNqBkm5PWybyHmhMFp5sTs+gY59ZXLSvMYxlL5NwveHQ==","shasum":"e21f4de83a6dde13b24a024f9d765ff8f7ec8695","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.17.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGI3FLnyE6LyWsvP7oJ4+jJ9/cUPjaZ7ZPxF3yXJGACAIhAKuL8sGQ7Trm7atXICSADFTROJTXKR/2J56eV8EHfOYd"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVBVHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcgxAAoPZYlBZX47TGIb415KHmOD2H/gUz5ZSK8qPUMXxxBO7ZyCjW\r\nqJz+mJhA+wmBTnsew3YHlGJnKicJGrkq4VzAsHutgGuoI9zhHH2mJ4I6246v\r\nmxMzLzPcCm5/xyh/6I5jh8EYNuk12BLrqiDbquh/RQog0bvkyx1DW0Y0df5h\r\n2oBfiMJUerAuByHsKB3GLlg/VvYBFhi2hMLbq8UNGK9W+Glq+z3Tu9kuhOkq\r\nr/BcvgIIs20tyuBBRkxJBRjpDxqyN7KDs9B2xezMIur8XiKaeVEgqsU+dX1x\r\naOmECD1LRY17tWSNVu1Vq6Vn9ok7p9xdyn6t/6YOPPviODiIuU8A7KCONsKZ\r\nH8wR7CPrXz3oQkhmVWuAhzBFh00F2K5/teBkUQ7PS9Y595pEqdX0l9B0G/c3\r\nE3z5WoJOz2BvAgSHJfPglrytm2fpW6N2C4yEsRJK5LMa+sFUwTQtdG4xNoKC\r\n+xclrypwKaU28OyuLYPCd/Jw5oQM0n7VCA+U7utiLig62oSM4KMNRQgtJrlX\r\nz6VaDq3PP+2k2vB+84SsO8rGcmpY0RpNAkJALu3TLswEwoTR+V4WwRKjlmuU\r\nQ4nGicdQWXJH0GHnWB94A1m1Zb+ijRWYtF3TwSDxHJwY5hQGoXgsO0UAslLT\r\nCx+dVhcVMZ3WI0IEvDRvEf4mBcqpgr4cU/M=\r\n=+8Nc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.17_1649677639089_0.30557810125713036"},"_hasShrinkwrap":false},"4.0.0-alpha.17.4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.17.4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"7efc91f090bdc0170667653e969eb9d41cdd775d","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.17.4","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-SQgAX0GT1jvYLMxC4wXxf8kgEuj2sOldKVsBEoK8a/Xj57u7nrEm81wLuiV8DF5BQS+Gb8/Koiautsgsm7rsWg==","shasum":"a3ed402d761f0ea6e91b4271b648a893f37ff65d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.17.4.tgz","fileCount":12,"unpackedSize":10624625,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyed7DVkuctgdpMwbUI5knLKLPhaK0t2M6WZrlixq41gIgT/ulugPav5tTWsvoIRJqr6Qa1lMwGUKz7cyANmhYtMo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVYpoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroVA/9EkmAnnC2ZyqS0dM6ilxs9wmYzARvavFBKmsRdDMdea68HKY8\r\n35Wog2kko34y1xuYU9ZtLRIzP8JdapKWdsYuP+c9ZohKhNxZEU5nrtHgAHX9\r\nB/CFOP7JK8hj9njA5JEY4pS4nNByjBQI8FWsMm6nHLbmrq5vc1ALixi55Djm\r\nWlckrkBF/tHYMDjPRB0yXYxfmNFmzsZJCFs9zP43jj/LNEUNz7q0VQAPx5+h\r\nz4n4DPWkXzJGn7oU8+BMZhJClN2XnVtA/Pc12R33OPGEAYLEdOERuXnmAjte\r\n+W+eHbcVj7rEC1LnY81gASHFCHUdZYYPW2EzhRZ7pwqmg+ebUa0JLhgU6wUd\r\nJTFLyWI3za4tr/m5r9HVpCPu53pdbNbxProwY2pmo15irCJ51siqr8jxIHvr\r\nNSgDDPoUfo8SG3Z3RyBXIVEJyYEtMcMorJgwdAKHaP6qBGslbqpUQ5JTO3eT\r\nfn/fRCmeK8nQQaEI7i5ptdayYk3SohjAobSzGVzeCiGKgjT6ph3Z5betjNJu\r\ngfm5smwP7ssGFdNySyHX/rKMAt2aZO9Mk5QVWW8PyRxLI4nfpj+6sitqZzWa\r\nDVGgOtDylSoYQZeIDlv7WzAvU5CKAc2HzbDMktKrBFvBu666a1ZU+Rukh+mK\r\nDHMBZuWpY/HjcJfDgMoHVFou6CwkUMncCEk=\r\n=fpxV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.17.4_1649773160262_0.8825590777839549"},"_hasShrinkwrap":false},"4.0.0-alpha.18":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.18","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"workspace:*","@ethereum-waffle/compiler":"workspace:*","solc":"^0.6.3","@ethereum-waffle/provider":"workspace:*","typechain":"^8.0.0"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","gitHead":"bb64c0ab085262441f4106111a6a051e44459f49","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.18","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-0vLzt4EfTGzTQldEfrXyVr5rCuPlKiJx4odSrQ3P0P9aV8/53G8FjXzwqPYjHWfJJCqdcCTDqJ5F+xWHZbPB9Q==","shasum":"940a380fe8904452fda4717fd495d05a2bc85c6a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.18.tgz","fileCount":12,"unpackedSize":10624621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICawgZhccbgQMdiwzg8zf79zqm70uyih1JHa6zPsyF5kAiAlmDHzfeIGGgAJSksIH0i3eoYi+Pqg9SaNLJIjXtwxGQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVqL0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrv4A/9GvkmWIIBEn7m+gxYXhRMIo521t+7lnuhupAXXbEI3Hy14eb+\r\nDw+lT7tjcDuDbQGmCiFTyAApmcOfrEfNOQEmxAhLsyhP4m1sVibitePiZVPK\r\nchqCmRxcgJv6Cx8QKZOU0tCHDE0HES72Nhiy2YZkwIuKMgwD3Ge0wo//4NYw\r\n6ha2oYBOf+/WAR4IJ/0GtjgSd2tSspoC+L4W0aKF61dICX1UxtLsLIdI01ic\r\n1MgeN9qusih3dl5t8zUFPcdgdp4rSOmWxsB4i75LHn2dsXF/i2SnfosfL6T0\r\njwbXCMCsv5iTJAmwoWUvMSxpSeqs9ZBNoCSDd3fgLPsQsyERSALD9W7UC3wA\r\n8FlT7g4NwPa/8MRVPfA5meUNO5rt2/WPUSQ0VgAfgwJBL92FehsP8T7LzAv0\r\nxX7mhYDQAGseFBLrLovwRCX1Te7GRl+YCEPMrVstpSymSvk8BkXzMaM5lSZI\r\nb9xdKhRoM7Qq8NWS8TvT82/e82iSS3lL0r5dIkwOrYxaQYeaTQD9X1RECdn9\r\nRYISzhnKm0crpR/wKcDpGLt6sA0rYVWN0M8s0cQMEb5npHFrexgisZaNibeX\r\nrbIFHThxv42Jdh/l75V3HJ6ePrNcY4n6j1Vjo3u8UXouZujdIvq5QMjKd0lg\r\n1yXJv5FvjRgUi5WPs5Aa8XnTzBltW3qLvlY=\r\n=9uFE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.18_1649844980666_0.842754126856696"},"_hasShrinkwrap":false},"4.0.0-alpha.19":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.19","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.0","ethers":"5.6.1"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.19","@ethereum-waffle/compiler":"4.0.0-alpha.19","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.19","typechain":"^8.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.19","_integrity":"sha512-cysyaUNvIqb8HgcMPvZKfPfpsV2JnwsjOhUmhIdDjuDYD/a2HU7D81bt/k9ZMqd0iF2FrXsVWoPJDD9duaHmIQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.19.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.19.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-cysyaUNvIqb8HgcMPvZKfPfpsV2JnwsjOhUmhIdDjuDYD/a2HU7D81bt/k9ZMqd0iF2FrXsVWoPJDD9duaHmIQ==","shasum":"65962b5b8bcca893543eaeb4c4a88b48e2812355","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.19.tgz","fileCount":5,"unpackedSize":15791,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvI5zMVd+ZowXw9RDGCiFYR0DxNFbf36FAHwJ5N9hkWgIgIjlHc+CJpRtBzISmKsUXwQpPgT7Jm2HMSdcNVUce8tk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVqt6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVkg/+JzjABZh5xfz6QO/4WhuQf5Ui0+1AtuU3+PlV7mUmjTzt/mTm\r\ni1xtii1EbKgD8Rj2TRKYvajp5GD/+SGVZX8RED4CwuAu4+Vk0kMZN2uSMzSt\r\nv0F3oZ5fL78POPNH69Bs09yIF1byppBfRXmHRRcM0phxfx89HKmXrMY/aUWM\r\nfF75uDwECArjB4E/7lcU3sAS10IQxv8KDC8BSGpsVnROLqnyvI7qJa8ynWw0\r\nUM/upPAvgvY3uywA/0v8Ty5Qcu7ZQsyynxYT0/ppXX+pK9htTaWyFMIz581q\r\nEyx3Bnc+go+8fFzDpAP+OEuILhofeNqZ+7/CU8nTxFXXmBvdgHnmFiKeZ1Mb\r\nWTnAXn50Bblx7HIBlqMQjtMGMWc+hi+oUjoY8uk16yERH1HeiuqEDnZ9s7xS\r\nhsGONYHdtdNXrTmlvBKS6qkXaAK4bd2hdjpGo9HjbTemtg+4LZy1sihq71FK\r\n7OVnOsyq6uegVeTpI1E1aVzROiDTU6EMIk96jGzUUMAXX3kNUZ4ayrawAalA\r\ndpPiKBGtN+f3YoS7dHfQ7xMUMUCnH0nGYLJ3HLOiEgYU+NMzhcyKYDRFW9KU\r\n8nXzzyCJhhchQmMbzb46R5ngmQXMHMqRD/lyA+h/TnmY7wg6P2JxhmhAKpTv\r\nIwoFoYYnnszS7J8trLvqKNP2nUDQT6b3u0k=\r\n=gdgJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.19_1649847161921_0.6620564511445111"},"_hasShrinkwrap":false},"4.0.0-alpha.20":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.20","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.20","@ethereum-waffle/compiler":"4.0.0-alpha.20","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.20","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.20","_integrity":"sha512-LRU0U8KPl/ak56LD7wo4mN3MstnAU2MBNazhBekOOHAbFYSBfuioHlPfh/zY6BdF2a78V+uDDyugJJEFzBxAjg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.20.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.20.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-LRU0U8KPl/ak56LD7wo4mN3MstnAU2MBNazhBekOOHAbFYSBfuioHlPfh/zY6BdF2a78V+uDDyugJJEFzBxAjg==","shasum":"6682b7505b26e682638d4564b5c1f8be8901d8bd","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.20.tgz","fileCount":11,"unpackedSize":8343527,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHEgOwcLCbhxFh5KBGwu69nZLrqZJYUT7rFdvN76cI+HAiAwzDHvNxGXm0zg+hT/7HMVML9IUdfV2UEBzmn3UNk8cw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVwC/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr3gg//akeq9sIGNgd0dU6Mp0lgZfPga2F+Cgsw68db6IePBknOYjVh\r\ndvHM1cw187C8USKD1qkxq/RwylRR7B6mL6BjMUWhdiZVf/4Q0PXyad699PeB\r\nSgmjkjUzeGopiEw815WdNRUwAZxVPkIcReIccEC79s7DQlABzZhA+nqqnRKp\r\n6Zmxs4DjFOj+PvkVFDHnccZloGtisgVvm//lOi1Mp9TzRBK7SqRnvOm2Bmcm\r\nfk68yr8f7ceDU1n8Kk/0SliR4uiv8XlhNE1BjH5A2BufeiawjREACP/ie6eF\r\nm0BqJ7MEpE+K2zHkKagXzK5aL/rMsUYeDu5a45PWPIYaz7TIloVPrkQu2HL1\r\nsvjiG72C8iUwHD5tw/xKbE50rKNLiWawJESpRWfbIJUOkQSZqnojU86uD/w5\r\ng4dCeLoATfMejgtRGXXryBba4DS3BZer6ZOhxcZ8wdpzxSAzerByUCNCsJCV\r\ndVLwBFe+8RwG/9nGDDNBmFDZQxPpSf+oUjKsX1/qX/7iTnJuDwwXwzIthAlg\r\nZM3rN84mf9M/2TluWUainULoErsn+YQiXDCS7mTwiqQvlrcWt5Nlqz5CtAB/\r\nPmMq1JAlOF74PiSwGJIBWWyzA1uSVB38RIFawPSVH93nxTMXUPMDCSJgRptc\r\nBn5+ihzKZ0850u4yCeI9ufC97bRL/UZoCnk=\r\n=GfLt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.20_1649868991501_0.043896764107520525"},"_hasShrinkwrap":false},"4.0.0-dev.b82389f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.b82389f","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.b82389f","@ethereum-waffle/compiler":"4.0.0-dev.b82389f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.b82389f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build","version:dev":"../scripts/dev-version.sh"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.b82389f","_integrity":"sha512-jYMLstfQsas0PTznvMwEIZtQA6QX0fuq8fCAO55GIqORbnfTuX4cYijiu3RfUl7DtSqoeIxfivwuoRpbDSkFsw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.b82389f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.b82389f.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-jYMLstfQsas0PTznvMwEIZtQA6QX0fuq8fCAO55GIqORbnfTuX4cYijiu3RfUl7DtSqoeIxfivwuoRpbDSkFsw==","shasum":"25d28f381c07cf51c25006d3ee4c7b09c29c6f93","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.b82389f.tgz","fileCount":11,"unpackedSize":8343587,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGAOnbAwEMfA55hQEkMgukO4Qi3Yktjbf007VU53JPa1AiB4m3AZKs02WH44aNszltIDCeVwOr/5Rui/g7Lqdco+KQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYUNzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmra6A/+O5bvItANbfKPKypUjidVxomClSy1Xel6cMCmCZsOjpmg63vv\r\noFr6euUVJW/d7iLkADj8gL0+XnyLf6Bn0M9mlLPioLew2Gzab/QT4JU/X3Wc\r\nnVtT6JrKNV/UbOMI8kUB2O9nj2LdW6gCpC8JfgRc1kFIOhpf4MDErd4X4aYV\r\ne7VNZBYxskMIWG0aMYieD5x9ruQVd4SfV9mfdGcAprIr+i0lAWN2nm7D/74S\r\nKPyVg8gkxybKcTcyImiR8BKMVWMBxezY+a4liz+Pb8eZRcKqkb/FoNDfFwnf\r\n5IV6U8MJFD+N3fUobLEsXV0L0XBcrbMcIti5Xl07cJN1+iDklQmHpHeuixQ4\r\nWVzhktpATph0MZT1t2gsmgIlkuKm6BxrCKtu23RQZj9kF7iNg/sV/2YQilVM\r\nSfz4iq3VBSL4LqMjAwuJ/Qipgo0aXnQHymlJuANIlowmJ1Qt0f/lcL+u4oGz\r\ngBGiC+HZTyYRc+YWJllxLnOwdOcbdGQ3LvUd7EhT4h95o2os1lgTV7nmDRzW\r\n0vJvvirg6a76pa7ZdezA/jqJ//AnA+d2/F2Yroa/z5GzGxFQ6K22+B0j90AZ\r\nM9Os67Wk+dTlm+ToKKMh5FDxDMgJyQiTs/LzFdJiwoJRUs8E1dfZZ5ymog6B\r\nGaEFEt0aJJllwjTFOHt3nEDXX+250+zMxQc=\r\n=xxOX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.b82389f_1650541426924_0.9848227380698504"},"_hasShrinkwrap":false},"4.0.0-dev.8d4934c":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.8d4934c","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.8d4934c","@ethereum-waffle/compiler":"4.0.0-dev.8d4934c","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.8d4934c","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.8d4934c","_integrity":"sha512-EWNBqKV+RzvLuwqAw+taW5H53ANk0CiXcRp4kaJJ0T4NR4P9fd9VIcbBPKwpP9nglPTr5ekzBmSU+bgkBXZ4QQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.8d4934c.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.8d4934c.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-EWNBqKV+RzvLuwqAw+taW5H53ANk0CiXcRp4kaJJ0T4NR4P9fd9VIcbBPKwpP9nglPTr5ekzBmSU+bgkBXZ4QQ==","shasum":"7a7b0eb8c93d234e09610b9e84502296f480b4c2","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.8d4934c.tgz","fileCount":11,"unpackedSize":8343537,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG2bnCIP2N0e/+wHMeFfHaewrwLYtJo952FcEb5tFfQAAiBQBQd7wQKLZvuSHAZCgFk4ddW+2zLX9aPJTa7CMMwi7Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYUzAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpcqRAAkhIYCSBh2wDVq6c2ZsgC30L7CxxhGbtnubuKb1Da45CoRbYF\r\nUFHsrjW42u27aS83ysaIWN5ipDH/394OqvqCXKLCSYIYkM1V7/BkHc+AaBkd\r\nXiGwvDwv58yhFtjkbCXWrj/klNmZFv2i4BWH8ANSJuImxfnw07YU95MLGF1R\r\nkHKbyL3wzHHE7rdKgJR1Duc0OhTZqkFBrdWMpOUkBGP/p529TwEJ3BCOFdz5\r\nUMLSZRYchfBct3L5Bnoru2o+rjuN/Nai/VI3cTYA0qrPO1h+PLfUDm5HOsdO\r\nforv3TP6UAT9RNWgwCSQkmZkgKY7ehvSiK+OdiUnJNwnjjnPMcguJFSwA4Cy\r\nqHiUtQxXrmmIz7o996VNDVtS5tjAWZdW+DvWEQ3QsD6JlQX2dCw9xHcPapY5\r\n1xGk1DzUIlNlqfVhXjMaq3Ma/hp1jsvLB59f0ergCEznTV9vF621PmCurGeL\r\nQnbPCFwbMfT1sE6mXs6YfQAWIQw53MMC8jWGy5af26fiyTg3WGtXH++pckqG\r\nFyVFbFik9InfgE8O5psEHou4ZQn/NlVelRdViHimOaC2PgB2azuYAzr7rJTU\r\nMb7M6D8tQO3/KniK5XWW/F9Fo3qCCiVNXZxRXIKiomgRZjIqSl+xYQFrNbhH\r\nDFLIG7neDzyJoomt+rrUh5dJeHGlWRkh8JI=\r\n=LfYy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.8d4934c_1650543808218_0.8018453584824636"},"_hasShrinkwrap":false},"4.0.0-dev.baa1b2f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.baa1b2f","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.baa1b2f","@ethereum-waffle/compiler":"4.0.0-dev.baa1b2f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.baa1b2f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.baa1b2f","_integrity":"sha512-ESHOQUqvXW0G6AH6glySr7wEvpT4wG+s/KWzE1ty1e9/d7j4IYsY8NOw5LgujgrLcB7eZ63Wyh9t8YJqlmvhNA==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.baa1b2f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.baa1b2f.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-ESHOQUqvXW0G6AH6glySr7wEvpT4wG+s/KWzE1ty1e9/d7j4IYsY8NOw5LgujgrLcB7eZ63Wyh9t8YJqlmvhNA==","shasum":"565cf284adcdc4b199fad9f36aef0a0bffb062d1","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.baa1b2f.tgz","fileCount":11,"unpackedSize":8343537,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDhl96+/jguonJBNCTqUg1KE5MzBsV5b1hWxW1jIlU1uAiEA9SaBMX2LPpppW9a/I9RmH6QXvrhMmD76W0WIf0urboE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYVKvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmotTBAAnTU9jNTrkGTK4AjN9zzPFDtRHisToJs6nzZkD21uYrRjJl/4\r\nrNMmzsfyU3Th+7IeP/goiwbW4/uGEWO73IZSN7RfxVLp4K5LVkX5b0YuIA2q\r\no7Z1T2KpeGMlu9dBNhS0PFvdKD04UGWZhsOu/ExMVngUGkb7cVET4G0BUfNW\r\nk/9E+m0f9NdkBv8d+DSFo4THjQFiKrRwCbpfhueE/khaX8m9v9HStrBfsYiS\r\nXdV9R14utIhVUS9aNqnGGj6O0FZ5LYlMGpgfO1P+2U1cBC7Iq73/vz2FoS36\r\nH05f5XZG8hxYyRHkFKBNCxcGxWE6F75NVy6vvE7Zh8SDO8XjiWmvnMgJS9XP\r\n5xRpEF84Iauf67WxFXJu1EKsoAk5iEvdxR22anxMMEFdcPFiisKv0nlTFigC\r\nDNIkCLaPLvysHbNIP2F3YpzXFl5jQkLXHhPzJWp5hDPFZeQMrZUEsx509Ugd\r\nPHKN2I2/WhZN47OAAl0hSMm/LA4x1RkhHniv2dJguZMIe/T7M7k5ZQoG7VIr\r\njKGRHMdls0tw3I5yy2SqsndUonQDMDYSnv3Cb2QNbUcIWFbzvx8ZBEmu42Do\r\n8GRscGT3Iu7HT28Su/lxlDDwa0dd+sHR/kr0XYq45n5BrAAyBt8CfKYvOfqX\r\nwNzjwEvSJ1r6oANM6fOtpecBvvqbEuaY3g8=\r\n=PfjK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.baa1b2f_1650545327517_0.9432475913318019"},"_hasShrinkwrap":false},"4.0.0-dev.8f72c9c":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.8f72c9c","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.8f72c9c","@ethereum-waffle/compiler":"4.0.0-dev.8f72c9c","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.8f72c9c","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.8f72c9c","_integrity":"sha512-x0yANDsHwvc/5tkjvmqQS8+EIz1iDXf7toqMi4/ZLQm+4JRrltpwepev8QY2zotzaZNo8eRzz4ZmMUZX2tiYgQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.8f72c9c.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.8f72c9c.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-x0yANDsHwvc/5tkjvmqQS8+EIz1iDXf7toqMi4/ZLQm+4JRrltpwepev8QY2zotzaZNo8eRzz4ZmMUZX2tiYgQ==","shasum":"b9702a620bfd294a9ef7002d9d618ecdf5fdebea","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.8f72c9c.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHumGJWqZsR1wucaAJggBGS3ghDPZ0+HNM4Kgu3P0EDkAiEAxafvkhcQXIO/f/ySlsyDO4pxkxJSd19c5FIm+ZAMzak="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYWACACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrZsw//ThWUF5Bkm9wFFZrFAg0L0h2bNf0TOysoo/PmTyxlJ24Rujuv\r\nvhjtAdhpxUK4UACUjr/GyTDwpG5QvtbXieaP8WDWekRV+ZLXdjjlBAYjp0Bb\r\nKA7eHjE1Ev8hVO9bgcVoOEhyk/SuowCwVUy3j7Hbu0Fee+ztebSiZcDDbrj9\r\nd7P9zCb1keKw83kid/ZcaXN9C/B2EKpInbND8j6v5e9Fffqi3vmNqwMQPCu+\r\nxr02SHBpt6SXGzxZQkFqmM7MrpyNSiNlWPm/Rqrv8N8stm0HlQadr/0du9Mf\r\nmDMmg/tSu6LuBKIdxtWo0pZUMxR9ZEoSoOFuH6r3C/6ArW1ZEMe0fGMzgLqd\r\n7q43nIh1RRSSxHQvSDiVmQTfMMVnRhe2shNFFYSstePX4bCty2pDavTa0FrT\r\n6MT/rVD8k5uy/mokebsc+rN3fRGWPujNoWviQWTmKGcj3x6wspnJZPidM8D6\r\nlak6NgaU/fihQOP1g0T7MbdL1iPQmXdZWaHJsvQ2Zvy8lSwEJtbzTmVUpU7G\r\nh0sXkW5v8J3+74plveF4WvtQfxXzNVo4rb8pRgrkkoh0mtVNVLXH27a70lcB\r\n4rT4vrDNjmo542XTGMRwYHcopE+ngG/I73Ac/EWXNcYfsd7vRcB/g4v9f89W\r\nsNaJcxDZps6SALhtCAbwmhfEBh/DqG0Jg+M=\r\n=J0rP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.8f72c9c_1650548738054_0.24204631990666647"},"_hasShrinkwrap":false},"4.0.0-alpha.21":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-alpha.21","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-alpha.22","@ethereum-waffle/compiler":"4.0.0-alpha.21","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-alpha.21","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-alpha.21","_integrity":"sha512-7St9+K+dYlIwagZlkE7ry4Au9wuEh9AH/tpMQ6wfy92lpyBUsrzG1rft+lD/6oUJ7MpN8VI/xYAoU8tdjPkWJw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-alpha.21.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-alpha.21.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-7St9+K+dYlIwagZlkE7ry4Au9wuEh9AH/tpMQ6wfy92lpyBUsrzG1rft+lD/6oUJ7MpN8VI/xYAoU8tdjPkWJw==","shasum":"3d688a9645dc5382028cb740873d4912f68ec17a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-alpha.21.tgz","fileCount":11,"unpackedSize":230679,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1aR6yP3Y3lU9WJq6MAvGazsv/IwSaRiBsHc9hQyuxIAiEAkvDDnHPUoFusIp01jb3oGihsweojTlXDw5ZrxeEsWBY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYWLXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRhg//a5sAmC75WhUXCsIx6GxHeDa+4oSaQUJ1x1AxJTzYKNFL23aT\r\nRaYuHLJssr6yOFA8/s4gAiFPP4LD8awylr/10fQzBfcBf8qSU7Szt+yirj+M\r\nidQPseiMxzVI6uiiLJZIT8X8PiyZHqgBWsZPt9BXu4ejhkVVjYSAfTAatvhD\r\njBH5TUXrEZcOo2+XzeBjwvelunYpOL69VarZ+84zZP9zH6WeE9pR4VJeaFFA\r\nkgb2s3I+rjBwj40xKj6u8ANBEYEtVZpPQBfyjkWi7sRrj2EBjTMuUhlZ3ThN\r\ntDombywFiixo6AuFCNHJgToF3hoAa2nqGfTNgnPBgkAXEUyjFrN4TNgs4dtY\r\nRIWANF963vDscmEBJLqwpvYZOhQ9Upjjk/DnGaGAkrkrUb9x4n0eSIdcFNO/\r\nBYnTjQRuZT4ujaRm1uOr9yRKKGOAOyg5zWCF1hRab9tKe0G1KIZiQk9W1vvo\r\nXFFEV1sLfTlqPx3gT0zENb5rSlMn8lV2DwwBeb6fEjzsjetbIXv2las3gMLK\r\nfFQE8wWWxgfD6hm5xWTzlhyzdAas+kI1IfzvKAFjAb9+Uhl7clJJGNtyXXS5\r\nXUvb6V9/0XIuDM3sg2AqaACflAxEiqJNg/p5RRmFhyMoePWEZZg8z+Ppjcit\r\nj7yXtJYTnI8Zy3wE4gpcxFR/SPQt1HbHMMc=\r\n=ijkw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-alpha.21_1650549463046_0.4107637396620567"},"_hasShrinkwrap":false},"4.0.0-dev.51e05d8":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.51e05d8","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.51e05d8","@ethereum-waffle/compiler":"4.0.0-dev.51e05d8","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.51e05d8","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.51e05d8","_integrity":"sha512-B9on2HfwoWWbyrDrnzx5zlmVWQITBhUU0m3A6WEU0LbClyXG/kVWaAv4mMfML0xTlRiWITGzp07ryJsJAygVoQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.51e05d8.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.51e05d8.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-B9on2HfwoWWbyrDrnzx5zlmVWQITBhUU0m3A6WEU0LbClyXG/kVWaAv4mMfML0xTlRiWITGzp07ryJsJAygVoQ==","shasum":"1e9bf1c54d08cf9362a42a461b558e33c9ebf401","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.51e05d8.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjqW4WpT/Q++G0t0J2NuebugWnxm/LUoT6IKc1EF45xAIgQw7RaJloAqfsbe16hGtzRTWGYi1GE7A8KADJdcmcYxs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYWNsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDeA//bCCzbMtv4al8QZU6gzqyf1fpConbeFKCeZ14iLJJoD9JEhhA\r\n1bffysAwzZLSoLW0pFqokJcFPiyAxHaYYqeSdYuyY0b9u3whaGCa8NdKctRo\r\nTyClX0lgk2kF26v/goYWq0O/mUPajOfGTlZ8D4C9gPhk+scezDvN5r65pqik\r\naL6HpdwajogKjAJgUeh1OAiCvYyxtiwsT53Bdiki4LX5rNfEGQUIB25esGTL\r\nBu41Jg96Q0k6QAd+UngyiD+5gWPUA4jxNSDzVq6p2ZdfKW7v3Q4isZoRdw4F\r\nLwxxjiGBUVSkS/yz3oQ3NFF2PGgx2oFw7yuR08w31KlmtAK7ylaZX5Ws0tr0\r\nfjNPmlBbIK0VimuZQTGbjhzpogGGQh9SUKFJCbqEKk3k4ZPb/+HPlwHxr9Zt\r\n3ed4ct0KP0SEqMZs5/dTw8yNAVPTHodOBLhyN87Ivg5QelXjFLaXB2974DwZ\r\n4xWSvnT6JhJpXdF0OQ3RpyRNzFt8WGbF6tNyKs1YR14BHrTRyO/AGbzuqU7c\r\n+DZV5Z0UxoWadkvKfhdW8LkYX86hy45CNDxKKfCfVbh29mLZX5lKq8FklXpJ\r\nh5VYhtm0y7IGzaABCxAB/28YSjWyNEIbZwvCE8mfCnBMZGHqto4V8cP3G1Bg\r\niVLET3hRTaf7s42kiJRldDg/ocbX9BS8Z6c=\r\n=dO12\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.51e05d8_1650549612444_0.4237136786844935"},"_hasShrinkwrap":false},"4.0.0-dev.498bffb":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.498bffb","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.498bffb","@ethereum-waffle/compiler":"4.0.0-dev.498bffb","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.498bffb","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.498bffb","_integrity":"sha512-I0y4XPl5FCrbsWWaDP9+nzSOqn6El8+rU064SuM9Jqqmvp11SWpzNg7Q6AHFBWrhLqLjX9vMlmHjBSnzj7v3eQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.498bffb.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.498bffb.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-I0y4XPl5FCrbsWWaDP9+nzSOqn6El8+rU064SuM9Jqqmvp11SWpzNg7Q6AHFBWrhLqLjX9vMlmHjBSnzj7v3eQ==","shasum":"48b81c1ad765dce74e75a335e8c1fac47c5301ac","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.498bffb.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQXz7nGBvg61CmXVg24XTKl/wyJKy6ZH+NL5YR42U6fAIhAJg29Y7UcPftFe+WLdqubs8fNx99P10iMWAo6A6mjt3C"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaVOXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjVQ/9EnOhsul8TYGJxkfZgzMdbifpfv9UCdZvNExfJat/VS5I6YQk\r\n1CHEMpztom5XXmia22D2mSDqd7hMhgXfkyrFOXsES/mrq0I8dHhGxnHwPrjX\r\nRYQ2KC8cwDF7YUky+KCAUA6LwktOpDsVO9tb48y+Is49wwytGsuwBYTvgz/Z\r\nWAHyQACNijyjtL8D5+jjbEnoBEhJD538PX9Mq/m0+rXIkBUVvOvD9nFpu6ek\r\n866anS9aSh9fxdVpaNUQpNA2aOkGy5S88tsRt4qf5ryt9oPlbDCMnN2/KnEv\r\nouRlymOAmqSsucOSkDLhG6bJJutL/BAnKQV2A68VYgzVLK2VpPuAkhiHSBRZ\r\nA9z7D3p81++HsLduDeodkmiKU0eYgv2c0eUzg/ESVlJ2nFFMJQcsknmbeD2+\r\nxSY+u/pQByEb98Ju4jSsA2Ohf8w0owxbRH27sUD1RoqZoW75aCc+Cd/WHvxT\r\np1DpdXnBoUNZgGXg8YyWGb+jzOWNVgTvDRc4EaMCe7N9OmF6PDotJRQObJ2k\r\nlMjGs1vjVDHueG9i5tQyrZFEOHMSKsjqvfiuEnWVJweGIX5lMZkj2ZYvFOD5\r\np/FeAXs/dTOOnV9OEH6nqdOyh0ChIaMSkZvpVB3yNQpWsmIbYSJcZecWqkiX\r\nECGVVl2WdoHRdAJ74aDlFDi193rIkZuIBoE=\r\n=sNtJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.498bffb_1651069846908_0.9015699005535083"},"_hasShrinkwrap":false},"4.0.0-dev.de3905f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.de3905f","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.de3905f","@ethereum-waffle/compiler":"4.0.0-dev.de3905f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.de3905f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.de3905f","_integrity":"sha512-Wkyg6I8ppwDBk3/u1x2+E1kWw77mQT3jbFyBFZdfGfRw3fpYD0HpAzqNBgYtEpEynoTUMFthr01e/2AICOEaTw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.de3905f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.de3905f.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-Wkyg6I8ppwDBk3/u1x2+E1kWw77mQT3jbFyBFZdfGfRw3fpYD0HpAzqNBgYtEpEynoTUMFthr01e/2AICOEaTw==","shasum":"92a086e5d94bb37772eb8ef445c3d9635227b73e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.de3905f.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4RWwpbdhOhFtkX9M5ASK/+PEa1U0GlZCfpA5Hz4kPDAiEA2pQlA8XsixQWF9ZOyfzxKoxLyZS+Ve6NNUm+apXmzJk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaVZxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoKuQ/5AbIWd27514Ed3Wt42HSSWI4JaG9YxXQJmy37IhQb6QpgDxah\r\nCUOD6hZ3pTmI351Icq21UQL1eXWFVFnA0PDifb7rVh5VekF8fnFrP4OZf0MZ\r\nhzZNi9DzBUlNmMMTh5zXgmNyqwTKSk5q6cYS85lu+y4KMEnJW6/OY88gXOc2\r\nTWIdmgW75CvNHnp7TE75WeZFdgSQjaZlyFVi9hBVfEzPnaXvgJl/TWV3nG7T\r\nf0Zzsnxd+uKRI0RUUSdZhtYy+avvUFtyinTbmPWmHMj5UioPq+0s4Gu3QQ4F\r\naLfdHHTpi4QpSIHpIhU8mREosD6jBlFUHEORrvTJB9tgWrCBgJD0TcfAkxEL\r\ne5RUsA2MR33uNloq5L+zLcvL074U5GHu1FQr7G4y3MnyNa9WDuJN+IBdGwe9\r\n0Ai5/wgtzB/8ptEy3nqMgKfmcJExdrvUuhc606Rd0D62UaDGdKuxbfLybLgH\r\nht9nfAfMZibc/yncuMGn245y7rtQGEunT4KKZm43k/AQU+uay1oqEoSbV007\r\ngok3dg2Hin0tR9cTRfE+qVXAVAbeJwSc0pRKg6fqqNHPHTfziWGgRtajpa5I\r\n1Tb6nRtVmOwcS/rtR7+1Jr6+i5VcICDh7aBQdFSVBqEUBafjeABwz+hCaMHS\r\nRwholNshGVVGW289p9op97oGES7dQzl9Aos=\r\n=3+OR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.de3905f_1651070577256_0.8834246797268985"},"_hasShrinkwrap":false},"4.0.0-dev.0e1e2e5":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.0e1e2e5","author":"Marek Kirejczyk <account@ethworks.io> (http://ethworks.io)","repository":"git@github.com:EthWorks/Waffle.git","private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.0e1e2e5","@ethereum-waffle/compiler":"4.0.0-dev.0e1e2e5","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.0e1e2e5","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.0e1e2e5","_integrity":"sha512-gJt4MrC5F+YFc7zEog4oA2Ad/ZzsOQzaS0b/2N5Mr+X+TrmYR58LuNxlNWm1O2F3VQuTsP1NneShGjLAs+0MMw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.0e1e2e5.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.0e1e2e5.tgz","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-gJt4MrC5F+YFc7zEog4oA2Ad/ZzsOQzaS0b/2N5Mr+X+TrmYR58LuNxlNWm1O2F3VQuTsP1NneShGjLAs+0MMw==","shasum":"67cf981103e75e24c46aaae09e72efff0788ac90","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.0e1e2e5.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDXVaRKH3nI85/HZfFSn8FtiiBKgD9GB8usWOyq8CS8tAiABIV0dsn8s2eg60j6e9J+QHUyqZgb/EUIlMjFTmgEfqQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiclI/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoRVA/8CABbG9A+ftzP5FrvK/ElqRLJ06QQuvDFt/PcoZLRclRiL1Xt\r\nO1FY7lF6bq0WCF3jjOue/SdUFj8heQ6+1zdbu/39XyqelwVDcH2gwEBuQugj\r\n6CjcKJGrLRcBULbRYISOISTvcPLiyW9Lw+EiSvVJEmrrJaLXNQBflDceunp0\r\nVopouMbheHjp/qE5m9jWp2oJWqDwnTkVXSiVIS8+rMeE4W2dM52s2/9KwP8u\r\n+nPENoQviTCnmGS/TRyDe7EDk1yLaRoD7L3qn/OAkk0QtyyPyrmtnA05Bic4\r\niEkqLwfjstDQzbbnS8kqfr64E2oVjVw2vOStcmuhzhKUH9pHot3xpdEe7qnv\r\nbn3jSCoTXV5z8g/q8XXu/lh4XC98KrltXGwl/XmSO3Cu3RzeoUkhywaYmrQB\r\nWUuQpHn+CHfTD+81CB1LMkta35BIbx8Ho1RDsMoBztFUSRTndZzWI4cxTQyU\r\nwxl1y7V4KvJb3tF60sY6BFD5LxBoAas6Yy6LkP+Iu+QORUTSbmVH43zbcxYp\r\nuJTk0BycRXHOiYRu/rrAmEmsI+9kpHoVLyZxLwLa6s1dFouaRMS7hcMjAXBm\r\nhPi1K1oiW+alG2yfTHZiCRwTGv+XVP+XLn+jaoEbdju1blQQMgGG0WuhEFAY\r\nkEnRKbpA0c8WiHUUprd4ruHyhuOXG3OaXjE=\r\n=IdHk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.0e1e2e5_1651659326870_0.24264639844106917"},"_hasShrinkwrap":false},"4.0.0-dev.b7bb3ba":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.b7bb3ba","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.b7bb3ba","@ethereum-waffle/compiler":"4.0.0-dev.b7bb3ba","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.b7bb3ba","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.b7bb3ba","_integrity":"sha512-dZIEQa/Rm5TigPqljlbkBYZWaecbagwc0sxkAuxpgj3gM+hy7gR/kWiJk39HUGLtxnNo7BgxeW4GJiLNF9WUgw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.b7bb3ba.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.b7bb3ba.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-dZIEQa/Rm5TigPqljlbkBYZWaecbagwc0sxkAuxpgj3gM+hy7gR/kWiJk39HUGLtxnNo7BgxeW4GJiLNF9WUgw==","shasum":"0bbb6770cd7087c6a0beba28ad26bf713fd24662","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.b7bb3ba.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEX9FIaRiziVTu9s/zC3RcT6qhH0+Wz6sO7z3jnVGKfwIhALtgILxFRdsbekhLZLafwRVLT6Aa2qUvlCdeYm7Eh4Op"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJic7R0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmphmhAAjZDu7Oia9h4G5BsXDfrFletzKI/c2ppTbn+8OQx3l09lcMm6\r\nF0RrZswR6oOVmG6rTpjUGJrNU+7fT/cc504END8wfxjHrdikWc6Pf2o31Vws\r\nNvuRxHKWlqoqOJaENs8djp8Dq50wsW5WbIzsUbM8QEicANe9ReM+Ik5aHCSO\r\nmQl6R0OtuyB1/1eZdrHSSMsyhJUoWdTFl9KZIP/Hjw18sJCP3YmSE1gchLQI\r\nWpIPdm2ShFnk50DygL8dWyJUNk+kV3HcwjkOt4vPYAhMOwUBz9ZOGMd39Kj8\r\n88fDRBzEdjsbYOZlnNyLO/i8SLFI2CKRoBS42edkjaQGECy1sYbXyDrEyA9R\r\n2vhTjOoJz1rrEgpHpji34eeVYvlem2gTEqxVzGecZ15kB/KPxz7D+eOq9N5p\r\nsKwXwsvnJpXBCarFAVsu6OXIuv08ID5q1i3IrqOj5vokkeNDqwXJT+Gf4gUF\r\nGiOU5mtVdfW9Hfh0Lp5KhCM6uCZlgxcenzq3mgGj/K5FvFJf8smJMpJzLi7r\r\nCiU/1gH5h9ldC04S5/o3TCkCQYAnMx2dn0V6q6EU+gZqkl6QUi8kliMjtaMl\r\nrizmYKAQM+Yu5vXUKusKDPscdXEQxbOzgxqslLPNL+qaTteqrR0JbvDaMOYJ\r\nqNbbiEg41lebDfVbCIbh2RGsgP85zEwpTf0=\r\n=4w3e\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.b7bb3ba_1651750004331_0.28872296844979584"},"_hasShrinkwrap":false},"4.0.0-dev.c694a2a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.c694a2a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.c694a2a","@ethereum-waffle/compiler":"4.0.0-dev.c694a2a","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.c694a2a","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.c694a2a","_integrity":"sha512-wjk0vkbb6rchsSJSHtHrD1LPD9SojB7SivNNbzyo7UIDfF/CZrIRVvMTv0gfj7XljTqZJi13lerGGg1ROlKnFQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.c694a2a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.c694a2a.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-wjk0vkbb6rchsSJSHtHrD1LPD9SojB7SivNNbzyo7UIDfF/CZrIRVvMTv0gfj7XljTqZJi13lerGGg1ROlKnFQ==","shasum":"095a2d2b507400d8c8de98cef4725994f13ebf13","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.c694a2a.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHQYUOqhgJEaiJZK144BukIuLz0NnT+SzBAsO2hqPgldAiEAk9tkBwX6Y8rJy5nzXbwyOLGxq759gReno4OVzpAtZXg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidOOPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6ZRAAgl2S3cXcknnCUkF1a7KqfLMO6YfLq7EgwmZI2hGP3ZNO71Ag\r\nKT07dTXNB1TcIfaUUx6UlMn8HtHFpQjZZvOgLz93iCYjU4HzLoDtv75JUC61\r\nCoqf5Pu5+KLm4CqaCvaOVlAvGRm8tmR6JPxt0ILA4GD7Ex9b1AGaVFwljSAv\r\nYDcOHZnmswoczvLAhc3HH6xzlxQTHr2TogG2ZLilpXZ+7EiZZOh+zSdM0TKU\r\n9MvvqllDkt0bwsp+yz0lHRveXMlto1bcpIZ+PEdg+IvJx+7F89sQT4CB/ukk\r\nKwII/H0J2vRQ+t8+tRYWlPLhSCOlFay8PcqEJkYD0oIXsps4DAbNF680ZVLJ\r\n55/RALxIkwKvsNwzb523VuXNSZzvlyokOeyABv43IXcsJ7em8uhdkYUnmc/S\r\n6mUp7dn+tytWk8B6waipS7OQk1BwufO6GgrcxaK46T/at82YZ5QOsOp0ZofQ\r\nf4F0ndTYX3KrH2KWTanVtZda3JiVEnEJcrM7e0D5bwdWKzxvcFRExuJfc04n\r\ndKTNc/TI0hAI9viYxsMrK3sFzNGxGiD7D22352PV9QDw6C+rJzKjBJHizIlH\r\nDX+hlEw3AH+wvEDrdM5/1wFmuZi1eV/iB7ZnYyjrEHOaCnkn3GXGtjW0uY5U\r\nwuNl6kfhfZrYrudRK5PCggvvh44kUuVHVJA=\r\n=04Vn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.c694a2a_1651827599691_0.8301606599122318"},"_hasShrinkwrap":false},"4.0.0-dev.ba7033f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.ba7033f","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.ba7033f","@ethereum-waffle/compiler":"4.0.0-dev.ba7033f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.ba7033f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.ba7033f","_integrity":"sha512-+Yo0A3SNbh98DXgLvI66fFBMTFE13p0hfBBjUletnqlul3vowznlE8bxoNsSzCssqeDTWVDL3Xc1BrkwL7Qggw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.ba7033f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.ba7033f.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-+Yo0A3SNbh98DXgLvI66fFBMTFE13p0hfBBjUletnqlul3vowznlE8bxoNsSzCssqeDTWVDL3Xc1BrkwL7Qggw==","shasum":"b54221268679507f67ed7a67fa76696406efe2c2","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.ba7033f.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCWCOQ2RpNRaBDQCYqCCyb7J+S3TS+DhUNnpSn+DeDmRgIgaacZ+FshDAV3iqnr3+0RocfJHzIrLpJVnE5w73pxrXw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidOglACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpy6Q//QBLyJIiVe/5As4PwcgH5f5g90K8mPSwcuWth6VvfI87gWJUG\r\nUI89VZ+GsoklrDoxkqpSaVn6EuJpnMCubU1bagABoOHBLK3CJhkRqo7TSqKX\r\n60P9y5zuupELcKHHTWW9j1GmEOmX4KfDJyllZlVAGkgKIT+3vl4GyS/sAjME\r\nzpG1jymujPzD2ZK1BV329B6ruMXanP0fz3y1Go9a55bq9v61sx1q/FG5lp3K\r\nFbLds54qVjXkHzErsJE01OE2ajC4Dony1ypKzeY1DTFelUVm6ez98Xb2VhSZ\r\ng8wHu0jcbhwvfCqwtJn5h+vRiKGqblTTtszK0F8rnsW+VQw8WqNxLf1P2vxD\r\nt7sdDLMSU35WJ7SDuFFt+tjf+jcF2rZzWz7ZN59pVe5NCF6ekfsN3l997nii\r\nT/qH2CS4vb3UXdOevh4u58rWXeNI3JyrfZf4XPTaxXQpQ4proyML8ThKLrSQ\r\nGeMy9gdfZrsCNBQroan72MxsHBxdHx6zZ7SMSAvuCPc8LSmXujvIC9OE9Om2\r\nIHaqyFR8cGw8uHP267vj5BIiEt7AaZAvS+saPjqPGwn+k9YDNKWtbNsoim68\r\ngM3ZXMbg9u/dHAbWVwPWv1N6ybKLdXzapTqqFFDnZcYE9F23gjB/zbo1ENif\r\n/Onxd1Z4noVIpMI4dCBpKKd/VXLPvieAU7g=\r\n=Ibye\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.ba7033f_1651828773286_0.5049693031924918"},"_hasShrinkwrap":false},"4.0.0-dev.bc0a5b5":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.bc0a5b5","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.bc0a5b5","@ethereum-waffle/compiler":"4.0.0-dev.bc0a5b5","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.bc0a5b5","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.bc0a5b5","_integrity":"sha512-MtOyRflP8U/5F5LxgDC8YF+oIM6Vo3s1lbnSw9bkCkunLhcHHLeKmxbQPia1i++MOAgJ4SDqJg3PduzjSSjG0A==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.bc0a5b5.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.bc0a5b5.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-MtOyRflP8U/5F5LxgDC8YF+oIM6Vo3s1lbnSw9bkCkunLhcHHLeKmxbQPia1i++MOAgJ4SDqJg3PduzjSSjG0A==","shasum":"53536edc2bca6c62c0562be9a73ffbdb134fccfc","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.bc0a5b5.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZwr/LmsoKnDHmHnzRPrMoqj/nR2F8tzkdlvPJ2HCqLAIgMoGFQdpPfycsEbfAR5DPhZpTN1mM56LnePJffwP0pEk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidRYfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo57A/9Gxhyt2OvvUC+z+Dskxs6E9t7KCIysYCMHvkjRK5KPljgbP8O\r\ndAv8pUjBOVIzIb7Ff4EKifFWX036nUpct2acp2sWtClnc9IFEdmBW06RcdsX\r\n8ydwIaCpY/9YfbwUvJ1vVHpF2WKYsJlLSWJaknorYKH2FY6tFX+LF83xpPDT\r\nkegHN9LOXXtU08Y1mqEQBhxV/3TTdcmxcApdZ2I5XLMWOWc2K+Tach4iJjDX\r\nPCY5m8EaiOTud1RDem8M27qIkqI7sMYeaNAzH3U2xUJhh4/L2kR7BBxRBKCY\r\nunUjP/VMRyrV1qofhm2rTeCP166wcrlBEF1SBWaP6B7jTqgqbebYi/vqZwoH\r\n2pjAqAQzbpzHHyO/J8v5lkP3XLNr3pXZPfXtLOQvsTisbfwaF2Fy8DU2yiAa\r\n37aOAbFIMgY3o/123992PiXd6vgTckvGQ8lxbEr2MLFAEKDXoyXBfzJR/qoi\r\n4Z5AB8nLIItot5su56aQryV+0QOpx9nVLgsRnqrjdAhmd+fco6W5LgyxeCGi\r\nJKVBEYTZLWRtHn7j+rhzuc9iD41P7j2Wc0aiC7DAUPEFInk2I1HQJr3IcWvC\r\nGOvT+JQc2DWjGvg/jjY7jOrztZHPin5sqhQQlZPtSIiAW5rM5sefJpPxaGCS\r\n1YhovUhGM4SAZeur1UA6vuCKCSr15cERszM=\r\n=p/08\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.bc0a5b5_1651840543442_0.5769950706847238"},"_hasShrinkwrap":false},"4.0.0-dev.900b71d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.900b71d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.900b71d","@ethereum-waffle/compiler":"4.0.0-dev.900b71d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.900b71d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.900b71d","_integrity":"sha512-w4aHw0FzwLVyJsczxHGiDGCBKobhtAocdQ27OUau2DIML39KsC/YbGXakI1I2jR0lHGxdpAJEpJrGWkXRxa+Fg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.900b71d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.900b71d.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-w4aHw0FzwLVyJsczxHGiDGCBKobhtAocdQ27OUau2DIML39KsC/YbGXakI1I2jR0lHGxdpAJEpJrGWkXRxa+Fg==","shasum":"61e57363dadbb9efa9b1b4db879c59e610c4af35","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.900b71d.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFxv5B+Au2vA42XwqocGV+LvC+ep93FvHPbwxn5oNdVnAiAHo+lg2ii4zST4CssoaL25qL8/Do4nCE/woz4isfX9zA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidSvAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCcw//dSbBrYI0CcntU88kEK7C0claSMcUikcrgom27Wd9xjXTg4aU\r\nL03x17Qgf+GEr+S5V7L5BSaEFzawMXg5F1vYT/zUfBrnbSKokLu2DyqhI5wG\r\nFpAff8QuOvJYWtUTn5HRMz5+ZQhpp2BpDNMtPOHtgSykgrbpV3kja4K+45ei\r\ndEcqAnn0TOKMRJvG5T3W4GxfumouXqwcB/KRKYQDmSSexeQZeVGlv8BAWh8g\r\n0tKtHouPm7AKjRJT9m16ekeAROQR2Uea6YAPIQsEwc60bvKlH04oxpGwCzdp\r\nqvLCphHc66HdQzL85XtH1GP4KYVrHFq0S7mSsjDDW47SqCt8GpFXdjvbbygz\r\n3gQQ1oSOcSxBMI2xOY3CzRfqWNuGL2Sp9kgMgh/xppCJ014nRA7fnwrnHmQm\r\nzWZ3JKsZvRuTLDx8YPOA6hAPSOCJKrLEewzu/qy+SohY9O2ACCWw5qsRGt+9\r\nF8t5wDaB7hqt0HywFWFhVk09b2vf8AngrzUaFBTTmHFzS6mA5zrSjGDZsZz4\r\nCliy2tstiMDXDTVddfj8xZVmI7KloVVl53nHYwcCgs66BiDZVzlYX/8hfLot\r\nH7/FbhlGK0ATWm5/r28DE4DmIEBr/g6zm14ng4UDz6+zfFj4wCEetGlismn8\r\nWmfTJNRrrJUhTwVD8jBV9SHhNKSXLUI1XJw=\r\n=lJEb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.900b71d_1651846079849_0.45736219138003165"},"_hasShrinkwrap":false},"4.0.0-dev.ba8cde5":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.ba8cde5","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.ba8cde5","@ethereum-waffle/compiler":"4.0.0-dev.ba8cde5","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.ba8cde5","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.ba8cde5","_integrity":"sha512-R8vO+d66UPFv6sbHtb/4zY0I4brBE2A8bDacsmcgZLf3EaGaJ3rys4dXltG6OsEgzQySuttCszxHpCrPcvQlBQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.ba8cde5.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.ba8cde5.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-R8vO+d66UPFv6sbHtb/4zY0I4brBE2A8bDacsmcgZLf3EaGaJ3rys4dXltG6OsEgzQySuttCszxHpCrPcvQlBQ==","shasum":"d28bf88a43e288746104326b05b4a5ef9aba32f4","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.ba8cde5.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDmGLGzxu0trD/yvqM9k9xkZW+rmP5yYqvHEBJ5oNavwAiAwyCm1nHp99Y8lOA3RderNyU2+M8j6R1O9lH2XF3ZUoQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifh9VACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoKEQ//bt0X3x6k7DchjaTyAkOgF96vM4L39Mwn5cgPngtd0HBrkZkP\r\nvi5JhL/KLCXwoDInnFXMi5MQgDCNZ3KmBSwqT70ms3xZvlhKSZSk/+Wk87RN\r\nYYW43kNePUULq1FycD/dCerNWYnlflO7e+9WqiFM3PiXNgItmC/lXGWz7CXB\r\nL+SA7iKABX6NAdCInRCjeQdNKBpqp23SpMYKgesWV3nb9r7raDt/O3++aQwj\r\nzFy80fy2BVbEGBoms/LxzkoIZLL27WFab7ooRfzDTCpcjPj2ci5sOMk+/WK9\r\nXvU7XAplf+SKX5b98y/7k7d5omk6n+SstT5poVqYxY09Qtx7Le8C4Yla4sMy\r\nbMEJobyM+0OEtufXb64OmI/C54E9Ttj9Zy9bW94gm62gtxal2HSX4ZCWARRE\r\nAOzcQTGlGp9SZ6U8wEC8swzu/wQAsNQjCkNBXo64qCnIWmFAKIsbolJTLjo0\r\nET/35E8E1H4AP8Lw8jYFmdIT87CczbDKJmHlOqKWTSPpaMZrra8J+0dVssgT\r\n9R7mKdnvRp3Pp5Hj2erjkVj9rx4+X4KOBo0v6+efkUFIv5kemA70KJfmK2Bx\r\nAawudC1Ur44bCOmUZnxWzR+QEQxvQu2LStRL84EmemDW0Ux+ulWuNIZQD677\r\nphhcDANk9n1xSXsrAiZRPfhSPpne8QsQsTw=\r\n=7Mub\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.ba8cde5_1652432725370_0.09816267140405599"},"_hasShrinkwrap":false},"4.0.0-dev.104f4a3":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.104f4a3","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.104f4a3","@ethereum-waffle/compiler":"4.0.0-dev.104f4a3","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.104f4a3","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.104f4a3","_integrity":"sha512-HFnphH3XiPylbw9lxT6WfRxu3ho/URGu79St31Cvhm9u7jBXC1H2zSHs/aoqKYFfW3u28nztq2o1zMNbFnUioA==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.104f4a3.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.104f4a3.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-HFnphH3XiPylbw9lxT6WfRxu3ho/URGu79St31Cvhm9u7jBXC1H2zSHs/aoqKYFfW3u28nztq2o1zMNbFnUioA==","shasum":"bb3fdf8701f5ada19f9110342671ab3f55c9ed27","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.104f4a3.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHg82HYeXv8QAu3K2UcnN657RjEST23hosV3AsbwPlK/AiBfWzxPYuHvqCr+9xcfLBU2uTKZmzijSPBTc86Qp2gVcQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJignjgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpC7A/+I2v039F+R2K2jqqdDKV5VQTaswTBa3oxbYrASsIgg3ckJcqx\r\nF088wZKg98LHhoquq8klUTcr8FzYbeekqmBOTiD1zVfq/67e60Sm51vRVB+3\r\nkNp/PWV90E0afkQuYyOCa6KMzlXUCiL+h1HtVD4xP1c1TqAKf1QDfG6qL/NY\r\n0Qt7yvyX3oDiOzTL5eqbViIFpytixWB5Y8mUicQh6wgUVo1k8zYa2AwkljqF\r\nV8XmJXYkjp3VekTRXDoic90/Fu4+vgKpnQluxygLsgFY4LFsmCpYMsQsmxoc\r\naRRNiSMTUPhZFGvSZu4J9O3azdgetxDhJARc470vdSVuavLe8ChTl0suVnhB\r\nzbqjuO5goc4NbopIH63DNUvP2UZenxm6A1yPP5W6LwSJdMq/1tixoaZUGo33\r\nsMt/PYNWcoOKMh60fFfr0O7DMo1pwSEjvIgvj3aHadmwAX/T/+5EUNomv36e\r\nxAv86GxpD3ij0c5xntbU4v9Y90pHxpHf0GL5Rn9JVCEpDARzMM87kgPiBJ44\r\nq9edWiqamww1Giy/GL9RSYUIqho2N7PHPoMHzEOXkPoA9siz6ZERRnQy1/eZ\r\nPvdtLlvBEvz20wBiIXAq/kS4HAzxulERevm96yfzMts2i/w+m7efaVSLo+pG\r\nqgvl2xiyPZQXYUgRinras9/NjbLZMkN0ER0=\r\n=jeTE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.104f4a3_1652717792392_0.6854852319377676"},"_hasShrinkwrap":false},"4.0.0-dev.e3fa452":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.e3fa452","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.e3fa452","@ethereum-waffle/compiler":"4.0.0-dev.e3fa452","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.e3fa452","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.e3fa452","_integrity":"sha512-P3Q7oe6jIA7n7xUky7Is//JdnXJ2eFfHce5Rhn62qeyQsfvugAFJY7Tgw8aewH4LtBLJB2ZdB0eGJSVKXpfynw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.e3fa452.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.e3fa452.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-P3Q7oe6jIA7n7xUky7Is//JdnXJ2eFfHce5Rhn62qeyQsfvugAFJY7Tgw8aewH4LtBLJB2ZdB0eGJSVKXpfynw==","shasum":"428f9bb4fc7c9e00682b86343e9241043d95a754","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.e3fa452.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeVuROb+HNThIJlv740jCI5T5PbiBJodgGwHRX0O2B6gIgXvrwyBU8PxxbZinGtieGkcMu54SWwuTP3EL157uPgwY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJign0QACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrjug/8DvudmXJhZa+KvxV70W77fAz5yY6ftX63gXC2CMiuEPEd1ugC\r\nUcMZmg+9r7xRgqfzuJnHaZj4eN5wDuIniEJVGcjljTUsJS1torjVEXGX3355\r\n+2uKpIcrIKo3Vne13LTmZtvyzfZSbeYmxvt5dSrwgAnPMwFZ2Jg8OgS6cbOr\r\nWMlFWqoAg/52v0l3l8Y/V10bs9N85GTbdP02Xzh5fL7+gEIMLKdqQZ6HkfaV\r\nseUaeXnUZ0Tm1ggYaMAWNR9RY2v07bDquvJBDYRG3jFxo5xOcMmZPkvJMgW8\r\n89rfsKou8QPmA7A/KDeLazb9vH5Dzj8EnxdDRQXhIi7e1tLgmVoiS1QoMxvb\r\n8EtKxCvKfQvoQz9FAYIzX8mKgKek7bUbA2+Zd7806CQqBCdiaVqYSBajE9Jk\r\nQ8DZNjLMnJPZMjdh2JrlBCrfZQvTGlD60hV9tpokHKUIQy99LfAYbeseS+uS\r\ngXtPJ7L8/DjbAk9odRAPhIudcq4SzkDEcysFAmQC+7es4LJJO7dkB5QS3wuW\r\n5ujIAt5M5oZpT1gc+WqZP84CQbiGTkBTVKoh5vJByzGLEa5hZtkQTi7plORp\r\nnenZlArsQvw4czIG4+Krffm1uwjCeWpfj/n2eHKvS8PBzibFc/EFRwHJpKT/\r\nmgkx8I+3S+Qz6TbFNCPqg07mA8SSmlg73UU=\r\n=fOF/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.e3fa452_1652718864394_0.3553572238947986"},"_hasShrinkwrap":false},"4.0.0-dev.9e7c3d6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.9e7c3d6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.9e7c3d6","@ethereum-waffle/compiler":"4.0.0-dev.9e7c3d6","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.9e7c3d6","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.9e7c3d6","_integrity":"sha512-sosOI31izzjdeC625odzpOue868IRuG9HxKFOGL+yYU9gUXRUU4Cdf3z/S9TP8FvJ1kYOteXidMFTcDOEHl7hg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.9e7c3d6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.9e7c3d6.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-sosOI31izzjdeC625odzpOue868IRuG9HxKFOGL+yYU9gUXRUU4Cdf3z/S9TP8FvJ1kYOteXidMFTcDOEHl7hg==","shasum":"b4c9ea958f61a9e0d077cbf024886debe495cefe","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.9e7c3d6.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG/GCvEPKS+dGlcoSaUoNGwpVFpH+9mVAmcFUIFnmO2kAiAsg9Kw++vVTfoUFospH9af/WX6pnU9iBdiTYyeeMhZAg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig5rqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpqNg//RVCjdrqUKsSn1SaQ4/eqRtA+BmoZMcSAbtvdIDE1ydfYzofi\r\nX5Hq51/jbmzEEI0OlkMwxzeYFATbOdtGhLZqlfpwSaq7oPoa+o9/9t6tyMNv\r\nhnP9jA9O97NSpHba3VmGv17ktCEQVBk9UreEmwmCcnk2mCkotyLHETfaiZoa\r\nxfbuhkR69kcXSIsky9p4nebDWBy34Z23m05fKhGrD9La4CqTusG9R801+PsC\r\ngPbvUpuPjhZS+ThivrL1eGVvOBiZP74EyjAboFzVatpsaNMgiWaPek/cUlnq\r\nT+8ZPg6OP0ErwWfUgIHyXlk6TP7hgZLNL/2S6bREuOnf/ULh8s/MG/BcyNn/\r\nM72gpp84caPdSPy9aFA9y/fcMkKO6gAZfq9p08stENasBAjBe4hy1B/aqYwb\r\nmS/84MjB3j7nzBsSu0CbIIpoEMwxYCyTJ83J2Mu5aRa6xb4O3pDyYhzbEpDC\r\n1ug68OYZqL03K/0GJ5jhdiTn0q31+6Lap2OIxvckiEePlWIoCED6yGzokxYg\r\nODbKV42gvpbpLET8q1bJfwzvJzWCBVGNOIIjEUR4Ze9Gi9JC7pDvY7cBxled\r\nqlR15S4/mxwyAXRJRhLR7vcsZugD0MMeTTzqhjEx+cOop1Sa1+esc+mviRwc\r\nhHS2GK7kkveZOr32CHsuYSe/N/tqwsXS97E=\r\n=7WFU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.9e7c3d6_1652792042006_0.44365138672623683"},"_hasShrinkwrap":false},"4.0.0-dev.d9a8ab2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.d9a8ab2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.d9a8ab2","@ethereum-waffle/compiler":"4.0.0-dev.d9a8ab2","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.d9a8ab2","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.d9a8ab2","_integrity":"sha512-ztICmFTiLSrbhCoBTnoDRTjRxfHCOMXWsensSPUaSX9uoO/xcTlOwWfFqrDFXhc+HBgYpFCEwfd0rzqnRG37Dg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.d9a8ab2.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.d9a8ab2.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-ztICmFTiLSrbhCoBTnoDRTjRxfHCOMXWsensSPUaSX9uoO/xcTlOwWfFqrDFXhc+HBgYpFCEwfd0rzqnRG37Dg==","shasum":"1d111cec38772c073167c1c2e892183c70554f1c","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.d9a8ab2.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFgF9WkPRJStjq6pkNfzZuarF7XViTd0K7k0MrSgmcX+AiEAnToq8/etgVh9xeXZhqJ6qB5fH3nOr99E+8GxWSqa0oc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig52VACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoikg//ZbAPcgmjuzUTMBhRpp9Y61DCxrLyoMX28smT4nh37rfXR5ga\r\naavDqkJEjuEYBKNPfzIJP2Nh3tkg9Tb20F2NV//t0XhiSnS/VjaDKGbO5MaS\r\nlTEEoJGYBtr3IqlDjL6/uJtNVcASh9jZXQk6lvICNjFa1CXh55MQtsrH9e25\r\nKyuj6LCTT7MZJvTU2CnofKgvDvM8mC729cYJo88gn5A/2ebOvOL1qwDUpIMv\r\nRI+L6g7RJ01VAMyqa0UdvWMAVBLTrTFravAAPv5bNY5nIe8J7qNLXuKzmcRm\r\nEUOJaMHnvHAJ2eoB+pb4NlHPDFAFgrJmmft86KuqGwVH/G1PKZ23JRlwFw+r\r\nszXMtvaa+FmAanN+Yz2jErrJVJsNahLpJx1CrTqUPUU2I4OPWrwhP6a9JMEG\r\n3W47O/5XlLpab1XIH36GdgH/lZLUpNOYOdqoVJXOF5P8cikMUQcrqCf4zNX0\r\npg/d+NwvFturvB6BwJvoru3Jhc8Nwx56uYPy6UDWD/HskgBs68rEuqB8QyDv\r\nvzbYf6nA8LuUKa3pdMPPWwmhBZ9J/Yb7TU7mFdjroIAa1y1w/rVCf+COy3sD\r\nATsKArkCkqsVLnAHo0EEM91WaYQaXPMdVagUd0/nryHJI1rOm6NXk8WUu4P6\r\nDaj27ebf73YV9APW/g9qWJLnRp/36BVc3r4=\r\n=aiYy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.d9a8ab2_1652792725599_0.1427396014859812"},"_hasShrinkwrap":false},"4.0.0-dev.e275a26":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.e275a26","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.e275a26","@ethereum-waffle/compiler":"4.0.0-dev.e275a26","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.e275a26","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.e275a26","_integrity":"sha512-aBKlR2go2S9aA4QFeU3mAwrsqfxG2xk5yqZNwhY3xTyxXO3x6/a73nKRAeA2g/dL66hLh7lQ6nzJoKlXxdwHHw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.e275a26.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.e275a26.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-aBKlR2go2S9aA4QFeU3mAwrsqfxG2xk5yqZNwhY3xTyxXO3x6/a73nKRAeA2g/dL66hLh7lQ6nzJoKlXxdwHHw==","shasum":"4604a7c181e311b3e7a690bf52d3f5a906e74f2a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.e275a26.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVzLqghKSRBvYQGKg1AdJcaf7UwBUwDAf6GtcKPTt0wgIhAIW3DSfTLUUAFBMWB2KBeNeyMjDHQAXOTx+fjtDJXocW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig551ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYfw//REQqFlVAlCxzl5PaCSv8Dzh35EH3j/hrsJXzEXnQ9kz+BBVU\r\nTbypg5d/0VzsTFnzECAr5KZQrI/41Zl343jBgaPXaBDVPu2YRBfMguBZ59hc\r\n7X/WbWOLRZ2Ei9/csf0UBLskK66XMu5YA1HI9wunPk4DYLTIMZ2X/bkc6jvk\r\ngkGTCX6Sp4IBxksYdvshy7LoCphuE8ZU2uV452AeZIMXKocf+/lTDS5oY0rt\r\n+sd7mTzgct3rtkE5EpgmiLc6/uCYc2LVW9wi4eEa1rkSmwKpLxr3VPHQUIz8\r\nIBKuORfbRpaXkA/+Beoy1BG2yioxDbIr4LgwtFFbgAL+WFsZp1IVNpF38Q5O\r\n4keaOls6FLEMXYff861TWs+oy8p4oQvjJgB9mXzseAw9JcAyYYkJVBHYb3JP\r\nnt4KrdB09g3FYE0F9P68oK5uO4Blj7RwfekX4yVIYLAspA6rjnw/3r4JKxMo\r\nbKII4cX5Cb0y6Fdk1SH/veNHrS32GaAfjYYL6d8zPbY2MhDTlTHXr/vcsCwW\r\nL+34YHItbmlwVQvZxE0ng/2Ggl2IobyBv+A+8bVzG+Wu+92ddeTw/WquiLT0\r\nUlyITz5KYjujUAFwLSvgDmTT98itFCguTiUqmqtYY9+FhveFJw3IQ5mm5GrC\r\nZuojjJ/VIjTJjhSHCtZldjMflY+PQ3c+GgQ=\r\n=AXoY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.e275a26_1652792949561_0.8704464400823215"},"_hasShrinkwrap":false},"4.0.0-dev.8aa0bc2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.8aa0bc2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.8aa0bc2","@ethereum-waffle/compiler":"4.0.0-dev.8aa0bc2","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.8aa0bc2","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.8aa0bc2","_integrity":"sha512-RhhKAyTjKKeZCrFU0oAeNjqQdu0CaEmoaSy1nLv6jlJ8rVbrvae4yQwRRmQMwqTxAyo09q+77WJtJWIwf5irMA==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.8aa0bc2.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.8aa0bc2.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-RhhKAyTjKKeZCrFU0oAeNjqQdu0CaEmoaSy1nLv6jlJ8rVbrvae4yQwRRmQMwqTxAyo09q+77WJtJWIwf5irMA==","shasum":"527dd14ac12ac0558bbc91294a9e5b72d2e5ce13","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.8aa0bc2.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+ZvpCrpnyScUJKsAb4fsysOVkc0xeFhN50LhxINgcFgIgYIekDJbxK+oHeLf1yrnKWOvuBPe5UOi1DkqaZ6rA2V8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig6CIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqmcQ//eugXct9cDTgExYKAStZxBpwZcPjtzNHuA9NXSUjPcJd0J303\r\n+DkMpHTOLTTCge0pWUXtqJtQIbcgwjQzNRZ9XAMyfB4Th1kr7/Vua3+v7abq\r\nPJ5RqdvbJRJPvD9dXioLL54MyssBzAculOppnWOFU134KWqpMbzUX/ZXAixx\r\n3lo/9HEeX42zji7mGtohhSo3aujwveKs/WfrhqJNsFeY94sg+N0JYIaSIWGD\r\nq9E08HlaGGNqCstLqBY3vHNrA0m7JltZFGaYoccfdCtclesiyvoc/ho+n4KG\r\nKneBL1HbOCWXThxunHa030PNeh6IzUR7V0tpe6EQRy5E63kPY9fDmCwr/bvi\r\nobU1MHVmBnPK4o6BOf7Nl22uUD8HzH09sHgGQYlz2r4ANeephHz4C+6nAAKU\r\nc0XpsVvClitzITzXyAoBhTmNa1zx1xzHMdkRKlLd/RX6I136Aewz6PUayvFy\r\n28x6BZAS47H+OKlItDwxrDjJkX9HQ5bGD7SByFTipftVttU5nuyqPYWqJxYT\r\nd/2on9UXeuh2zNuTvUfzmd2FJQS3LfAIaaqr8aB4aZ9+GenZUkSBfrEaHtA1\r\nDbWtxAugYFFIX4kBlfkRPyIHAPxxOENGuwImmIblXC0BcJje3QZKtGFE7SB4\r\n4zly1bFJAwsn7sepkL4PbKSlUftQOD7MNe0=\r\n=jlP6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.8aa0bc2_1652793480642_0.5958461379379585"},"_hasShrinkwrap":false},"4.0.0-dev.219fe4f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.219fe4f","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.219fe4f","@ethereum-waffle/compiler":"4.0.0-dev.219fe4f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.219fe4f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.219fe4f","_integrity":"sha512-Iqz9TSiZ25lPCNIf3xwPOQsno5AiUD5KRpJbX9TPH8VeZaURMKaxLd9qxtOvxAHVkZFbZ+XYyaStSHd+ERP6Uw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.219fe4f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.219fe4f.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-Iqz9TSiZ25lPCNIf3xwPOQsno5AiUD5KRpJbX9TPH8VeZaURMKaxLd9qxtOvxAHVkZFbZ+XYyaStSHd+ERP6Uw==","shasum":"d5e6395051228bde857e3639e8a4a5e91dc720eb","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.219fe4f.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDStVyIEZT65w9oGBllg66b/sgAv7ddhG1MUOdyQw3aiAIhAPTbQm7Ybq3sqJrvfIDU5QL7xsPa38Um/QP9fkPFXoY4"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig6UeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoK7Q//cvTqzmUKsaPwkoFS59aJ+TCYzc+vPqJpyA7JE69CNxdxnoFr\r\nX8fGk8omq8V11/h4V92azaOQyCI9zg8HCfn5jDShaOALEHkqjzw0jozemwST\r\nkcChjHLGwitHd51Ll5fTWK+fiqznxNZa6LM+gKCetdejb1KLzr9jjbbJvf5V\r\nrybKOQ/6LxmD8NuaSAPg98ezwZSJIpesJ2LmtBTWucJtRYhrFgWDq1rNSJsC\r\nFhKmywe96cHyNT1IL4NuEahN8FpwnWPvJ1XwJoDX24ifDNnUWdAZlXxry2Ud\r\nMAYclsq3A+qchc9yge9luwDGt1f6EsrSeRmnjWOZXnQTR8L2p6k3F6InP+la\r\njQBOcIy4VMg3oSb/ZrrNmzB6pE7WUyWbtu7Cb0Pz3j0dbQIibX77p67bT2cL\r\n4guUAJQZNO4XS9BMOL8zi98pxdEy9dnVW/OL9nUzWrEAXwPlPOa50f7xvpVK\r\nutzPQdMA/kluq2dVuqcRBMkZMPDS/hOguppzjv743aNU23UcDDB1lkL15wy4\r\nA9rYeSW28Td4or7AmWdE17lXzzddUGCSY2W7Suvm1kWZAm4/QGSJUnNiQx91\r\nb4PxXVe1FsFH0fKroUAAGkGfLlifWF1wBgpR2B3f/v5NeDi1UATjZq8ma5eG\r\n1QMc9Hoe1xhvcB+6R34RYUP5dl8+87jjEzc=\r\n=MUnA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.219fe4f_1652794654612_0.7686793898610622"},"_hasShrinkwrap":false},"4.0.0-dev.7e092e8":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.7e092e8","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.7e092e8","@ethereum-waffle/compiler":"4.0.0-dev.7e092e8","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.7e092e8","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.7e092e8","_integrity":"sha512-ujnqSxIEQ4GNbcL1SYsaRwyydZl9IccMMqF3HNcPEhaewiTaRP4WTEMaa7rqtxw8ofSvfiSf18EuQ98gWULVsQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.7e092e8.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.7e092e8.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-ujnqSxIEQ4GNbcL1SYsaRwyydZl9IccMMqF3HNcPEhaewiTaRP4WTEMaa7rqtxw8ofSvfiSf18EuQ98gWULVsQ==","shasum":"d2c3cf4280982b50a63485e28af4f0570b7fac83","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.7e092e8.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqIgDXinhqmP/hvJ9Nflq0Seny6iDZsuwHwz0GOQG9oQIgXjP8cU7vRcKuNF2GeI/JYhJa/t98oX20FXxJ4uwBA70="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig7GFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooMRAAixJrp5nGvpUZaEklKuoK1ud3wJpCDN8wXK+CCUA7LyWp3lxu\r\nP1w/+sxpRF8DwGzp3FzqHGuJOF2Qb2ozGybUknSNavbradcVOw37xHnIqzbH\r\nXcvLf6TLAkyjkSYHdAa/vSSN2pISD7q2q06ZO3BbhxGyUqcSG9pdXGsa0ujW\r\n8CRtFTZGkYnbxSIS16MY4VfcuiGfEfs31Wz3AHJChD1oco0UEYHRzhGYQnmR\r\nnXuGUHdXInSpVZyHnmKN6SkhHmXhZnHMZ6kpMDcD4ScrKVGzG6OHrpod9dYQ\r\n4CAFL7lqKHpNkYOjIGIZ2GS7rbpAb/9TQFSQF3BDNpTOlC8VKfhhSYeoV+CY\r\n8rfsamiN8Pv6EAC9QIkcZMo30pcOIXTCikdZD+fizbDEVordc0BZEjkanBJX\r\nmb8cc7VUd3JLhkEp0Y+zFMxd3RXtvN4Z7ewadXOTVZJLQ1IcGLaPsAk5AxNS\r\n98hzkwz7bAPIjSSMc+Mly685SNWVH2c0ytTz5zx2rbk97wKxK4YYNm8AB5jL\r\nySUCQYy8DCWB5nkvyZyFJJHLiQkgMAaz59geYuK09Ov5xmMIV/q22EAU1cCM\r\n/8hxHrQia438bTecIAw73T1Xw94AKdxSj3ecu8OqKC5ZzUrp/p4p9MfynC3n\r\nDHruy6kJEi5Wv9lEIrxuKOCulCxBJ44/DDc=\r\n=825b\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.7e092e8_1652797829367_0.22484220603540028"},"_hasShrinkwrap":false},"4.0.0-dev.2ef3d81":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.2ef3d81","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.2ef3d81","@ethereum-waffle/compiler":"4.0.0-dev.2ef3d81","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.2ef3d81","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.2ef3d81","_integrity":"sha512-L5uXjnemTCv70+7P5i73/dHAjVawiSp1YcaV8XbicKWF9fbGbAvWYUUSCQJYJ8puS4Ywt62dAGmrcL+4CkK2dg==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.2ef3d81.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.2ef3d81.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-L5uXjnemTCv70+7P5i73/dHAjVawiSp1YcaV8XbicKWF9fbGbAvWYUUSCQJYJ8puS4Ywt62dAGmrcL+4CkK2dg==","shasum":"0621c205524fee2d799107aeb03ea069c685d83f","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.2ef3d81.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA443bh84fWFSVSmikaFpdnYQnQSXgZKiANHfCxuTeTQAiBXCYawh6U2ZL2n9NL8Bml50fL4Lc2wnDofdRJVOluvDA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig7TVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5Sw//fGV3KHKycEMukSeyl8V9k6JQs4zSwqhvgzgK0UPb0Muky2KO\r\n2es7Zbn2Z78y9+lQTHfPJvwDIogE+lVfmL11LO+CG6mtT9DGzUFl6rxGBSw6\r\naa5+cCkgXFDkUgJQObhkX9hnH417lbEl9f57oqz1ao08J4i682Y+j44Vqqi8\r\nShR3FPkqjFeDl0uMDTzxqlQvu+mX0PYpZwz80fR6T/kSqKAIoxJrrBj1xOiZ\r\nQUPDzaHunbAwkNuAbNw2QooGjV3dyHal6NXBAO+fbHFCIWGrXbCEoPQJnMPp\r\nEAQpPlFyQnrWGILRiY/Qul9DiC5evu5/UgVuuYDOJfGlwayJ6RP9ev0oAcna\r\nUgn+wv9mM1TuRpmzRzy80yh5XoplAO8ku476dXMsT3egnvDlk29tN8ZtwaXZ\r\njCu7Pt7BlCb0GKz4AgnD5L20HP5OYAB5hE2ok1bvCA79jiTU4gigZtqNGXho\r\nBlZJkw16bVROa+mZ8maPlZCqKzcbChhgDFxVVCrj9r5Gi9WE06x+odcx7DLQ\r\nhyMB/Fc6uTzNdLRfDUV3TjqTnQJH2BiZZn2sQaYcQGAb0UUWe6v1OKeXctw/\r\nRjoLba+UijqsKoiJvJUmWAgP6K4aFKrDPXoHwEtmfYSi/9ptfZWx+sDvsz6e\r\n2WZpHiMhf82+WNc+IL0IPsiOTyR0GnSI67w=\r\n=19sG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.2ef3d81_1652798677093_0.08625210120371674"},"_hasShrinkwrap":false},"4.0.0-dev.539c432":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.539c432","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.539c432","@ethereum-waffle/compiler":"4.0.0-dev.539c432","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.539c432","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.539c432","_integrity":"sha512-VZN3qoUA4AvpE/nkaDjX8dRbuYqNMhP1bVlBeTjYz3E7eCR2U8MDHCJtaAshfAjza9hEIWFROIm9wFaOxxGbFw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.539c432.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.539c432.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-VZN3qoUA4AvpE/nkaDjX8dRbuYqNMhP1bVlBeTjYz3E7eCR2U8MDHCJtaAshfAjza9hEIWFROIm9wFaOxxGbFw==","shasum":"62b249608f014adbcb6cef003bab3657f65288c9","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.539c432.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDmBoDqBWaVbrZkZsI9U5G4sD4gsuqdIBdJV/Vb6/mWvAiEA6Iu7UTwtvY/XLn05SQyLcnQIYfwMEvWUmtN2LdtgGv8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinvgFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocBg//R4WFSw3viLc8lW3sTvh9Tsc4lmvDZ7bsC9IYblWXxeXgMZKy\r\nEK+gMpecpGsOdLDuUpIRSPil2YXUZb1sQfuFsd2mWbHkPDLgycS+eV/xj/YP\r\nCf+ZOtpIvmn2RRaTjVUdsGqLBHpjCQPYFXjqhIsPaKsq8Tvpb0N/Y5fH5RFl\r\nJivSn680L7qx2Dr4MRRcL1mera8snCyTFSPtb0B4KyM7xnQE3hdJTGfgTe92\r\n6ZE7IBOswPyS5UCaYb4zzViniLy3g6AeGE2/lGXjBLWPnGhj3A9ZmBz1hOTm\r\nMTnhSNpfPRKS0K1lsl9ZF9piPghEN47ofIwZ3W+GWo5Jh+quGsBHArLmsqQs\r\nXi6KFBppn+xDfdvluhTY1STtyj6MZseBYLYwwN5DPD6xKpl7m38/0IgGMbkG\r\nTcYanKRG5s7fatqXBUIw/fgOyVCfwGTX5D28ggIQm+IRyASQuajPjyLKCno4\r\nlmWEV8ptOZ2kyJnvP3lq679WRRQJ+O3hjH2HAST/MbI/3peRoyoQIfKjqavl\r\nK2hsO/5+dDVe4jkHzDQSOOnVig3d4mmU3XqngNz9PfuyzJaf4QBPbKzexmad\r\nP1FtHdEKmnA3p03X5QgKhz4kF7B6NL3s36rLJdeFwKEPCzrVYANhwiHGGTgj\r\nWKobLwdpEWPcEjnOB2RSAPQO+6mjwT0rTR0=\r\n=BdfE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.539c432_1654585348796_0.09480433656994047"},"_hasShrinkwrap":false},"4.0.0-dev.2fe3f15":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.2fe3f15","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.2fe3f15","@ethereum-waffle/compiler":"4.0.0-dev.2fe3f15","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.2fe3f15","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.2fe3f15","_integrity":"sha512-85SR26wyWdMeRMwAYqNL1nXuXzFsEOm9NwpovI2rY/sTiXSYPI0UXOB4GBp5z3AipgA0yzEKMmEQZI1T++LGVw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.2fe3f15.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.2fe3f15.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-85SR26wyWdMeRMwAYqNL1nXuXzFsEOm9NwpovI2rY/sTiXSYPI0UXOB4GBp5z3AipgA0yzEKMmEQZI1T++LGVw==","shasum":"60e2c4a5d1bd3b522aa4587400e4fd24052442a9","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.2fe3f15.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEAhcS/t+CAOXeE4fZEAKTcp/Xoo0jvrtTbQMcArtCebAiEAmYAIm5FUJN9O/Ms7E4B/X4fc0b/8CWb2J3u3K8gYWHQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinx5FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmor6w//fJf2XNK6zQ9k0gOigt0a5ZAlL6pG0tZXknaEYdW4X6cp5BbT\r\nwp9V0SQLD2pwcQ/iKutxlkR9DjBuGFNutIpEglSH2WOMb3VLUXio2gVsIbir\r\n6KrZ+osM6Q1Rx++TTVGB8Jtd542XMmCokMV/mQDW9adZbwjxgZfmqugtaFfj\r\nuiTc7ugQLGfKTtnexoFpuPiB/AI6C26oItgstowx4YftpuG+z1cJ5cGpJA+E\r\nDCEGdiKwjvizs9WZ1dhRQiyg0SlNThCFGGe6QTFdLkmaE2FEzUcmxbgmtLC7\r\nsPluqZOavu08XaVujdbeKyO9mhfidkO7FbW0t4/jRJ6eitnS42NBQ1xil2AG\r\n0XiF5Q2+XgFu3vYBRGeFEOUrgErEmPO7u7jbBD8O7VcxGpGWHKaQpz1MfOZG\r\nI6o8GqtDWF1xnjey4zKIYdm5oXlkR+SYZMDyuL6md/7MywWzqv9Gli2PsPdz\r\nblGBZzQljZxeYiijjsuuoiz+raGlWp1zt5gtR0RvbzKN3O+0BBDnxzLiOaV9\r\nAIr0AE5QOfbV9F8UL3+vv9BMVs0n+W8hHY9/cIzSDWuX8d4WllDylAmk/vW+\r\npThDQV61IUttaGrBY1mu2NjTuWG4tTd+04/EQmGAJibhBh6tfd9I7Ny52shg\r\nFG7GT1/RF2z5C/p5Pteqb50QihkrftqlHrE=\r\n=TJcU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.2fe3f15_1654595141517_0.33472287804967515"},"_hasShrinkwrap":false},"4.0.0-dev.b2ee4d0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.b2ee4d0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.b2ee4d0","@ethereum-waffle/compiler":"4.0.0-dev.b2ee4d0","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.b2ee4d0","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.b2ee4d0","_integrity":"sha512-ydDaoaJPxEJhsH6RXR5IxAk6LxzNmGVMFCVlLr5PKhdE9JXHOy1No/VDz0jsNfo6EPDwlSeD0laU5uiNdF5/BQ==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.b2ee4d0.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.b2ee4d0.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-ydDaoaJPxEJhsH6RXR5IxAk6LxzNmGVMFCVlLr5PKhdE9JXHOy1No/VDz0jsNfo6EPDwlSeD0laU5uiNdF5/BQ==","shasum":"013bdec50c2d4d29c7474308d697c869fa3ec77d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.b2ee4d0.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDbXlpYOXjAKOUfrFeOtnepCk3MOzA4mePvt0VyYSIWwIhAJSpzU5LcsaTlKSXtXvjsXjGgzg2agFhxQX6ZFYDUcnT"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinyFVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqpBQ/9HVRud/9iD+17sRpRp818nt11ac0Elwo3ctWAsR3Q8ea4CLy+\r\n4Q+LmlopkMaq7ggbswClzyf4FdrlsHPqy+frDEspWlUpG8MGlJ+Dhktgn5jz\r\nPn0oLptNNF3DFssWsVr75CRvs8PsC/Dl4f+c7u/d/baRFOSDQxWvIaZRNkEt\r\n0A9ZSquIN9G1WnxMyROevigM7SuTZfViJKTrV4gUZxWhv78tBFPxs1W9PhEs\r\nqCJXRSCunZauUf9aKDGCu8DygyCS6cFPOvDoGRzyZ/opywzuoGNeorndUuS3\r\n+nRGNZR4Jp/Z5nwHm9kEJE60UeL7gw5jvWYfQuQx8jTtvdxvNibJkDlcsCj6\r\npwKLgvZDHf6eyXtQQfjsoN3Q2uvbtv+a72+2yeyZJbqN/mvWFJSnVrgSHqYr\r\nEH0Db/nPuVcBUyYUZxgsL867wi+LGMc+cWCYsfQPKKrXSVowEao+PuM41q4M\r\no0YF6oIK/IcNSKQqUxKJd8XFDX0avlvoPP8rDw2QTFQdRZxroHHCUywNIaE7\r\n00haCGz/9sWcCDbQGwT8Ey4d4eIpJFDPcl97+Z96it2jkawZTu7jrT8KxgOq\r\nx0mSsT0AZZ7nGK0FuOF7bhx/06L335x4L81M8YFrhXwiQBFNFcdggEgX6nY0\r\nVdvw9ZY9ww+YRlYFp+BarpFRZHEKFgJ4FVI=\r\n=OaqN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.b2ee4d0_1654595925460_0.10051571066579368"},"_hasShrinkwrap":false},"4.0.0-dev.4fd670d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.4fd670d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.4fd670d","@ethereum-waffle/compiler":"4.0.0-dev.4fd670d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.4fd670d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.4fd670d","_integrity":"sha512-gAA3GXOBpvy9diy3sE/bsbH+jbjVGRfNE82sSIJBpO0FyyB4hK8ZYbaHzp1MHwvyjDn8/N0D2+VSa2LslL84Ag==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.4fd670d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.4fd670d.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-gAA3GXOBpvy9diy3sE/bsbH+jbjVGRfNE82sSIJBpO0FyyB4hK8ZYbaHzp1MHwvyjDn8/N0D2+VSa2LslL84Ag==","shasum":"7619b601cfba053c9e3e4f02cd874d8650e21a21","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.4fd670d.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGCiexDfJj17RGSRnjVIo5kOz5+dO4pU4VzpSpVIP4lPAiBWYiz/foFk8iH2fPapFnWbIe8mzizhPyfMPJFqQtnN5Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinzYTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwyxAAjzBHVXXalNVqwN3tRriGTnNxJhUzCL7Lm8iJOx3Y1iJukSQ/\r\n8ZuYWJ7mcVk8OTQM+3mxgbsse9DQd3VPBXhsZfAyQqGHeIU3rTJnk9yIc85l\r\nN5k8l8CvUKEAr5bavzlEtwNEYixcqSqxTM5GuZQCIIItZS/ONEIKOW/9JSgp\r\nUOXPyRZpAz+wd9M997xxqAjVEXByKKRGlpnuS/rgbbo6CabjMrzEh3o02H1Y\r\nXGrZckHEIFDgh88OmPobmmoi7/jn8B3bFROOcV9bTgquDDJkBrJJNwT2Etf5\r\nFO1sApfC9X1SmhqP/f6/U0NHGe0Msu/uQpAz/csUd3Nk1V0r0liDLthnvRo6\r\njxYYkQUsephnRDGboPAqNtrtCHPHeSkG0MHpVY+t1rBX3Y2x1PjvuB8382qV\r\nUic9rQ2MTqCWdNN6e/0fuLQTa3IfX052N2wSGK+AB1G84Hum0gwlAy2aC5E1\r\nX3nyJupJD+7uYMFeaxRdIaXCdeTqBqXpHvmkeGtZf/aEgkSjOH2mhqAfkD8J\r\nLHX85W74VuxAIRJOULTmzSbF0m0ZaULaURfZOcu9SpoPbUp+5RpbGkLcV1/X\r\nBxQU9Rs490lJ27EXCwGNC/bK8kvWzToORk4A0Y4aQ6SUxTlzKUuqfLMl21Qu\r\nmBAtvztHNvbshC1EXjYRQ4rg1X6rKGiW9NM=\r\n=P3i1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.4fd670d_1654601234835_0.7902300723154498"},"_hasShrinkwrap":false},"4.0.0-dev.0f1b253":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.0f1b253","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.0f1b253","@ethereum-waffle/compiler":"4.0.0-dev.0f1b253","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.0f1b253","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.0f1b253","_integrity":"sha512-/GUL4G/2LaVo/MVgL175W93KqI8yMP7EyeGf67d0aOlQnzAD8w4ydkn5xPztHqnUehgJkjPNFIVPGuqnol4qCw==","_resolved":"/home/runner/work/Waffle/Waffle/waffle-mock-contract/ethereum-waffle-mock-contract-4.0.0-dev.0f1b253.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.0f1b253.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-/GUL4G/2LaVo/MVgL175W93KqI8yMP7EyeGf67d0aOlQnzAD8w4ydkn5xPztHqnUehgJkjPNFIVPGuqnol4qCw==","shasum":"465b981e5ff61b9128e14bb6a0596aa31617ead8","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.0f1b253.tgz","fileCount":11,"unpackedSize":230689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB8883/44ZihI3JpFWh95TNI70ppOql34t7WMNv3LKZpAiA64ophpdTQ3qJ/L2eZgmtp34m7fnVKqJBv62CfIUJz+A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinzjoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrwzw//f8RskWQeM/hHxwbC33HljMcLKSKgvhOZ8x7CXMFh4KRolULW\r\nA8h25N4DZdu1Urmaiyygx4VLjaaARzQ1ZyhJ9BPJk2cr0NziYZwsYVXt3M22\r\nxCZLPkW9XkoiRolsL/MetzKqr1WDo8zpcJZCurGy2Fewxr//tWhgE13UttpY\r\nM1BwYMHXf577vfEgrIf/Dqr6ybzSnIELJyA6HUdUskw48toXyjbMeDieUndk\r\n63dJsxEdrR5Wx/zVeLESZ0Pl8ZGPdFJfrDmN/1nF1kUG3T8H6iqP0toJ9W4F\r\npSAcF/FwGj9WSsIz+bR+Dld31agNwuDZqZQ3B5P1/0d8YEXvW0teMkRFoGtg\r\nIzDiB/LAIgavsdBgVBiKplJ8VBk0ShwsAjRyIWWADi5rHlfIm9DxR9arsWYZ\r\np3XpM2Nw+E3MqLrMBIxNY/rFlxAK1tknUnMxlAn8LEMxONzWYTNrl/bLpWGk\r\nEyGAs/WOgIMYodV86ZxGIUc6Jk1vxx7LulGu62tEebSsUonAc5YkhpMIm9AI\r\nbHA0j/1MfS/v1WGA2QYijSQX0BWAfpjGR7q14BbBYydelwtYpN1PPUjuVdDS\r\nJvQAa93QDZ4gvWriLnmpAXSc00H5jjbo/RFuPJno7o+6g7Knf4ydFmPx8B/h\r\npHbDD6O8x3uEvwGbKZNauxaios1Hembh2zQ=\r\n=a9/7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.0f1b253_1654601960745_0.0116251257393023"},"_hasShrinkwrap":false},"4.0.0-dev.b21809a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.b21809a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.b21809a","@ethereum-waffle/compiler":"4.0.0-dev.b21809a","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.b21809a","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.b21809a","_integrity":"sha512-tDjivEiZsXr50rc/tiZtHpGpFkl2AkOIvLdIHXJJb96fwb1/zxJF/R41How6EAWgmcP+mTFEoDabpNvu9CmW5A==","_resolved":"/tmp/fdf753fcf8b61469404e911091267f99/ethereum-waffle-mock-contract-4.0.0-dev.b21809a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.b21809a.tgz","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-tDjivEiZsXr50rc/tiZtHpGpFkl2AkOIvLdIHXJJb96fwb1/zxJF/R41How6EAWgmcP+mTFEoDabpNvu9CmW5A==","shasum":"3c1f21b61c885a4880ae93b0f48b48b844c4e14f","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.b21809a.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDgS5IkVVCXXLxhguTi8lDLAMS/C286jqcA2/OuKAxCTAiBlyndkx8Ao7bgK6UMY+Rifu9wFh4hchcsOvJoBcMzYbA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioMUEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmphqg//UAqlkTdZu5Jah3CSpOTkE5IqR++wj7j64zm0KVaByK0xR9gv\r\n85KxgJmi2aLyE8nmV26otcXITvTcOMPBPe7H18We82O5fz0G+KacN+ce4HxD\r\nlKpa92r2cCUMb0dGhq2WmgueBHQtxK1rwGfVk4//d81QfezB3sjXYSs30JV7\r\nFkAmcim8m/P7qv2FcfUGlSR7dy+7ywprzvERjotF6Zt7dXBmNPfDbN7fz4xV\r\nj/UM4EuROn0IyIm9INwolfSWzDaf3t5rxl5drd9KT0TnVVe0Cc08l8QoXeSi\r\nTt/bZEaEvpSNIlqsecOXGf3oThZM0tg6xGKxo8Igmu3KYbk0HaSUxg0m1M0Q\r\n4c9NvZKIFAuO8zbO0o4OIWvZc1QNkBWucM/afD5ztcN6vHeWVaZJtLtJXb1H\r\n0e/ynh0pWw9Ccv8p6UpRlk5ukOUOVzOY6zCE5xjS3g/7snfr/W2PatZMg6Qg\r\nfIez3pGuBLBScEA0GsXpSaBfIG5FZOFOrsMNcvt0KTa9lbDfP1xS1XKpPAPm\r\nw6Vl3WqFIrYcpRhFaP2hBD1jTGaUYV9K0rHOlweELerg6lsMBjUbuEc2+cJX\r\n7soCMmNY/j9Y1SuBNCn14OWaTL71tzwjCzXioYY21zUKhASmhUjuynP+Ml0w\r\n8LbDVhYjQ5kVK1OrJ7CSeLdfH+ZvBWf4p00=\r\n=mDf6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.b21809a_1654703363898_0.2317973193488525"},"_hasShrinkwrap":false},"4.0.0-dev.1c384e6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.1c384e6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.1c384e6","@ethereum-waffle/compiler":"4.0.0-dev.1c384e6","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.1c384e6","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.1c384e6","_integrity":"sha512-8LMEjJLLZhUsB046phQkfEci2THqbW1JIZQ0ZAoMpEZ+87egqI3BhFy8rH+oROjFCFD7vXDSRFwMK2tfahPRnQ==","_resolved":"/tmp/34f3fd1e35dea0f834bec3f27c4f286d/ethereum-waffle-mock-contract-4.0.0-dev.1c384e6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.1c384e6.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-8LMEjJLLZhUsB046phQkfEci2THqbW1JIZQ0ZAoMpEZ+87egqI3BhFy8rH+oROjFCFD7vXDSRFwMK2tfahPRnQ==","shasum":"675b2c8cb90bd016b3dc4baba8ba7dfc6649fcef","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.1c384e6.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHhYh4gx9fn3z6oG5blKQyDDYdNchh7A2Ir4FgiG9QEQAiAX1/66iNCEUY3jJZp+/vAhD76L8xDvk7Am5/xl3F9t6g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqcM3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqj5Q/+PlMvAQOaFMMXAXDId3HQ5jMcOPrzpZdRcbetBkJ2K2inoUmE\r\nvTPscUvHdFIt41qwCmS0/6pZh5npTERlHZ+Dww1C2l8XFgzRp4WGPdNT+ViU\r\n7eSGKztXBkFfca4ZCi0LR103Im2gEqseBUYU2/z+m/ClzcveAjVrsvwqLTrF\r\nyjQa/P+RcbWc42HvPNbhPOwMvz31iRp924EGOW4I+Q+yWAyoT+oTsugq6kVG\r\nqmCHm7rTkvF1F2mK2UtYtbTzg1I0zXBo+CRVo6ISUJRCEuyIiitmYHvMxBe/\r\nQBrR/O/Ov3LfHt5tGj9r+UUPtjDe5wW4aFtgFMSgToPeDniwyfGUm6Idch6N\r\nEqv4CsfIkjuyc4cWOESrRYmGT9nLaf/uLR+Q9tOIyGwMlYEax+wZ2I9MBXzZ\r\njUQidOc+8vXQvK9Tmk5k8LQno4ncOuEjQY42YbXyK0MzNu+OcWuRRqP+shU5\r\nZ8YljO+3hQHUyRFjXVIwYNyh5ugO5AvuMeswPdP29nLxEUVeTy9zmS71RlPg\r\nySQVtgJ5ET2h4OqtoZM7dsUTljp1koPzCIOfD/ut6lIcfAV3X1XUDYry9KYi\r\n3FDXEueko23cNKCiRLlx7UrAWHy6TjLc0VwXrHlINmefPAl2XocexTefW7yg\r\ngxzhez48gr64weFRe+P2WinyH1dhAsv+JLo=\r\n=B76R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.1c384e6_1655292727275_0.021766101535052318"},"_hasShrinkwrap":false},"4.0.0-dev.d8521e6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.d8521e6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.d8521e6","@ethereum-waffle/compiler":"4.0.0-dev.d8521e6","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.d8521e6","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.d8521e6","_integrity":"sha512-3RGrQJ+KC618ZmACy4zhpGlgHMXiucL8BArTNCC1llvhdaUjSU5AyXT5xUu2LYGFgHQstGoRYzVIjBMEY3jR6Q==","_resolved":"/tmp/b3392a8e0ef495faea309acf179ef345/ethereum-waffle-mock-contract-4.0.0-dev.d8521e6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.d8521e6.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-3RGrQJ+KC618ZmACy4zhpGlgHMXiucL8BArTNCC1llvhdaUjSU5AyXT5xUu2LYGFgHQstGoRYzVIjBMEY3jR6Q==","shasum":"4ebd033ff3a662077d2cb5c39896817e12728db0","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.d8521e6.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8r+N6WeQ6g6q+LEcx0eL40uHNWUSuBvT1CqzckCs6UgIgXXnDN47nwtgSYZTDu2uxDFEW/iW7xDnPnTA3lzo8Jlg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivZBGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmrA/9HTQjMC+noanJQGBawOifT9JgdhiTwE99idyf0TMzc9un8ICZ\r\nlySfkZ7I+fKKv/f5jNeDzkI9e96XUuCAZ/CSI3aTPkNkSuKUZfAQW0V90JF/\r\nN5bsZzjbb7RT1o2dTXKtawQKSEG0ynPaN15t8IILeKkEFbOn4DFMyv4mQ3h0\r\nlERjPSkK2vmUHMBgdgYeV6BKIK3ZMhM1pEDxeNZTrUa3O4eTO4RwhWm8X12X\r\n+pMAfU7oqkjN0gcEBCSVaTKmOnQkGHqfLARNQP21JGhKuUXDRJfZvN6dydcZ\r\nCqOpANzYiCsCYVR6fRvqTYFkJR0PNIPL/A992kkZBbj/uVhJxfjC73KFAGGX\r\ngq9iOV8KYR1up/4MjvWz6PZJIppw8TJGfJludvNmJeO2HrFoDFcBoqW+iSaj\r\n3ASlQK0vm8w1CV64ff6aORhXhc3PRxWIp5CsEteq2Io4a+u3bS4Ch+khrCjS\r\nw+pZscBb6BJJPc4Lvudk4bod6Qb905uzq6d7Fs0gNbNjHUg+QPk2mST5UV/n\r\nuwWYCE0CPbrCpVBUlU4vBZFIa+y80suXBnRhYV5tctRqy0rjdnnNLZgncRa1\r\n947lpW3eA1szs2qVWIXLMgvm5WA/DqSENTP1ihaT2dngAuSfPtoF1cUF9h6k\r\nHj1JcxaC4gn/AcYP5G+w37OGh11LpcmP7Eg=\r\n=RfkK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.d8521e6_1656590406411_0.0808466521683826"},"_hasShrinkwrap":false},"4.0.0-dev.4867133":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.4867133","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.4867133","@ethereum-waffle/compiler":"4.0.0-dev.4867133","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.4867133","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.4867133","_integrity":"sha512-JkTN892/65eBSE9T31fELaRdosyJP713XrMBscFILjJjhdRQ+oofDPtakYbQNvfM+w+FVmpct56HlHntL4K41w==","_resolved":"/tmp/05fddd152afa7c122f8001228b45bfef/ethereum-waffle-mock-contract-4.0.0-dev.4867133.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.4867133.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-JkTN892/65eBSE9T31fELaRdosyJP713XrMBscFILjJjhdRQ+oofDPtakYbQNvfM+w+FVmpct56HlHntL4K41w==","shasum":"1d207c41872b274c7a5b6ead576906a7a12171ea","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.4867133.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwXqhq5s588JSeMGq/HViOr5x3o8YVbClKYFcBPPX4DQIhAIRXqIIeDXGKBOI6zhfTFdwyE3FToZ88BsXjKEDliNQD"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixuIsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpIvQ//RB7Igazen/0zgukOtzY2tqxj5WNmCyFDaA16TF3TlXG52fhl\r\n9fISgZBcUfkXlamk1CRPjuw84nMuJWtF82NfEuYzpG0C0lvPxbibWXJ8aLEP\r\nx8Mj7CimMFUzZBPKXB5DxJSJy5acQqq93ZdI/dbZAzi2LZPOWcxEiOlG/5Fy\r\nBSwgu9vBoPO81qd5eaeWF4J+Zzqaaz8/XLOSMOFU+i4SWEBpJn5Al6/Uj1O7\r\n4poUTVV+55YiELkscnBDNDxvjMy5j6DRldHN/8NLw/ETe6QXBfA/euGOFA5q\r\nlt2Qvs6tqqDKOmVWiDvmsb9rGjlfLMqyBGAVK9v6OLZ0xdZfEEKtDWGiILKr\r\nUd4hWHEtSyMqV6054ylN23XV56UyDEKahlwqikCRJC5QzrLMeIjmTzCcU6HK\r\nSFtfKy559p9QGpz9p4YZ1W0dF3PIdnMuXBJIxDwc39Y58QcmWZQ6lB2A/KYN\r\n/nkswfMcP+uiVYRzxipXQfCVzJByPShVS+4vkpglBJLH9AaQwfM/dyaQcKzM\r\nxOJaqouXg9FSgjRnYQDAm/dOiIKfkA4OSRdmH5wka64EsLKxSeJk1G8u715w\r\nIbjZxOsGztF/UuAbtrZO5aUdM3XDt9OxfYslLsbQOkqV8U0bo4+/dztGSVix\r\n31YqokX29vAWNXtyPsVkqmyu5zS5oOpfXkE=\r\n=6laM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.4867133_1657201195938_0.04001942022611149"},"_hasShrinkwrap":false},"4.0.0-dev.838cf4d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.838cf4d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.838cf4d","@ethereum-waffle/compiler":"4.0.0-dev.838cf4d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.838cf4d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.838cf4d","_integrity":"sha512-/D1gSZ69878sn9WyGsUfJ+95vydwZNMvapa5TpimcUbbD+LFza4Q2aTGUVF5BoVx7DTA9nQFgbA7o8iBWjQQfg==","_resolved":"/tmp/6094d58f3e21439227edd8a85e11c771/ethereum-waffle-mock-contract-4.0.0-dev.838cf4d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.838cf4d.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-/D1gSZ69878sn9WyGsUfJ+95vydwZNMvapa5TpimcUbbD+LFza4Q2aTGUVF5BoVx7DTA9nQFgbA7o8iBWjQQfg==","shasum":"fbdc4563b389e10da611e4ec2f5ff05a52f94f24","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.838cf4d.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbX41H/50szbKe7YxL3riB17AGxqhTLM6ju6wiT+KdLQIgC1j/NlNslBJ2eAbL+WQsFLlqMH+WTd/X5TA9QUJXyy4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyAF1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrMEg//VlWuIfcP3lEeuZsfquQfgPj939wpoArTC4MslYNlucNtmJXe\r\nbFIAnuKWF0HzmaPwQf38uELwx/pfpH1WdFwNZ2KhE/mM9DiQspbqM02EPj1G\r\nbj6sbb5el/cDRHhk3IAxYbrriugTVzGgwWuNe+l2tJ0w+KKagJSwdgRomPRH\r\nu0XooBNaE9AG6cwk+icISuHvqmlHVRdlRLcA2dy/tq1uW3Swv0PiWEURyGBx\r\nk8rHZh82DRyPRrhMUgggEmlYfKRvzyDzy2qNuaR1YfZTL6RVd6vmIm0xmJzF\r\ngVDlj2mWxibQUPBdjCn8g3k/L2uKHoo2411ZQrlxaTNVAreDaDvGNt/fgbY6\r\n7XLyRoXfddr6N30cecw1inc9rvUZhALBKVJMuUWWrpKjUETaM4RCezbSvkgr\r\nfDLkZ8FYcYjuzqYqATnISm9pWygvKDUTRoMMoseciiQk3kTYpShKehZ8BHYn\r\nRekdvW7lg7h2ex704rv5VTVa1/FljFPG0Aqn1q9nxphfqPXeVFvKcJN2dJGc\r\nzXRddb9VqvitIFpK32sDPyU2dOV17jcQHUyfwnqwAcDNLWkF1PpsjDOKLAMK\r\nREI8VVG61DPSinWHCoouyON6B1DV5xmKicXzDhEdmGCg2B7eNmKQEZ6x63o6\r\n4kdMBO/oKlGQrx26it9gLWVvHJkHt5tRHkY=\r\n=WVSG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.838cf4d_1657274741518_0.12725534415199746"},"_hasShrinkwrap":false},"4.0.0-dev.06401c4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.06401c4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.06401c4","@ethereum-waffle/compiler":"4.0.0-dev.06401c4","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.06401c4","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.06401c4","_integrity":"sha512-pc9PQeTaia7/DL9hsOYk1744kNcyTQenC6ayl9s5LfpONRxt6nCiBRsS+Hr+TM249j17AfE5k6robCPlzfx0RA==","_resolved":"/tmp/9d37f513c35201cc95774bf5318b29b7/ethereum-waffle-mock-contract-4.0.0-dev.06401c4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.06401c4.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-pc9PQeTaia7/DL9hsOYk1744kNcyTQenC6ayl9s5LfpONRxt6nCiBRsS+Hr+TM249j17AfE5k6robCPlzfx0RA==","shasum":"3702a40d9dccf4f1c92fb8a963fa64d3b91f10c9","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.06401c4.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDX1ugz3baiH8TJtgJH7QWRZ9OzWQgP20RK1MK/kHFB1wIhAN0BRNX0jDKt/Hps3Xmijnq4x2Fi31LSXqZcIsBbr3yb"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJizYC6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrboA//VMxEeNujinxsSzaKcQsoIjNg3AbzmfhUZDGN5peEFOPJjBRs\r\nwJRxiH2CUj81aXDb4pksBT95koRtL5Uuybifh/3UL4QFr1+C9rTYWfOnqQq8\r\nygIWxeLpRUoT+3y+Vil/ysJWMZH2jn4wFCmrQGStSr+q7ku8eFA/4C6alCEA\r\nXZbA3mTB9As46gImdFtSzOhT6Gi8zHjqVY8mk79r/x1GouqNZb38EcjKLxiW\r\nhrvoRL6H7CFAjbchviwah/4fcSaDmCMb8T5LucJu3wUXvP+wIpJrnA1JEzer\r\nbgFcPj3WcMmq++EwWUC63a4Wmr7SyD9wEEXHuREo4n9QW3OdIwixLCzWi4y1\r\nXMDA9C0LjDaiayh8nqOnzeHkZEzKPpEO6sObduxHBUH9FzLEPPvucKcxZyZw\r\ntsZwfuxS6+gP9o/I0KnQ+dwX6j5t/9p0hQzVuxSOK175i72r7iduUnNgtXar\r\nW8T0g4Na45/w2b4WVtx/xQc5qjp1aFyS28+dOUX1C9VV4EPQpEcArmMqDXsI\r\nrHsgZB9eyU1wcY8u5kIJfrFaAqC26Tp8u9DOSRLPqpBXtDRb2t0Smrvg/2ny\r\nhXQHM9q/D5EchSNux/GzITN5PNVsmaNVz/c8CwclG7XXCtpEMw7IDFV4xoYu\r\nvjkdQmAIcQctqj2udHuNqHN/b4eoXrJAh10=\r\n=PAn1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.06401c4_1657635001773_0.15441188647399717"},"_hasShrinkwrap":false},"4.0.0-dev.79d1c7b":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.79d1c7b","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.79d1c7b","@ethereum-waffle/compiler":"4.0.0-dev.79d1c7b","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.79d1c7b","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.79d1c7b","_integrity":"sha512-Ba4pUNcHpcY353uhs24kxsE02hU7py0rAVNqRp4x1ee115W2esQR/a59TKR62eMbJzG91EXKgKKSu7qqeG4BYw==","_resolved":"/tmp/fece90209368cbd19e9d2722e3f664e4/ethereum-waffle-mock-contract-4.0.0-dev.79d1c7b.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.79d1c7b.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Ba4pUNcHpcY353uhs24kxsE02hU7py0rAVNqRp4x1ee115W2esQR/a59TKR62eMbJzG91EXKgKKSu7qqeG4BYw==","shasum":"ab55093f291528a7e1d23d497759da4ae1f95f32","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.79d1c7b.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIL3DNxu5U2cnjJf0UpZ8xaS16bWb6JmedVlbOmuDmyAIgQYqIgil9lZ0glbKd/KCr5z4nKkA49mwH69mJK9jC/gM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiztRGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpdPRAAo3XfH5km70lW5ss0YRARXesfipAnQwXp5OMZGdCCkc48+jXu\r\nP1cN2qqBMlXYZtB/AJX0Os61SLneRTHwMzcyRWtPRlMs0DAmer9W3nZU8a6C\r\nsMMrtaLPao7q1ZH9PfikfVsdahiWSSjcwFHMjYoexHJ9Uc90zExtNWdwaFQO\r\nPij9WmtqhIHNuy+TkMUCsRoU6AEDVKng/6flvEDIkWcv/0gdoJYNxSFlM78z\r\nwgiNj9HPFEAjLE+j2SJtRbAxstZ6hWOViWB0vipz7HNNS5zyw3UxmiCzzAg/\r\nrhBhOG1i3v6eM/wLQBGqdgY4h2+M99ykCog6toGbG5fqEte1AvMVY9FCrpe9\r\nqj4RFiTsY5hBsvZls7B/KHGM9kxV2j0HkFY3JlmnMhiMzHJS6CTk1XJUSR0I\r\nqAMHAE6z6XKXa0V0honFmx3YtXwYhzl+NvJf33SVA7xv8Lih1R6nrWLvx4Pe\r\n+BlkU0uMs6flklyiA4MGz2w/MgMU6wepiOJq+SqQx3M/clM6oPKZqc1Pfesd\r\ndSfXx++D8h07R/7zRpiIwouLWkKgr003KKLpvJOyYgOpKR+QKBVsCI5yJ03h\r\nSVuZv+2SZ0OolDiBjXDevP4FCqobaG4Y8ib1Y67aED9+03N/fsd0MzeNMraN\r\nqzQiJG0U6VhWuL6eF7iH9fWPMpx5PTJS+mA=\r\n=tNWy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.79d1c7b_1657721925672_0.8360638402417484"},"_hasShrinkwrap":false},"4.0.0-dev.5587e09":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.5587e09","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.5587e09","@ethereum-waffle/compiler":"4.0.0-dev.5587e09","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.5587e09","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.5587e09","_integrity":"sha512-/34T4d7l5Wscfy0nkpeGZqiZkdbYciKue5Mlv5DAR6REB6m2+7nGNu80Uljz4GHacsp5hvQkgOwf+Wccp5+ykQ==","_resolved":"/tmp/8fa40ceb62ceee90c9b4dadc64376271/ethereum-waffle-mock-contract-4.0.0-dev.5587e09.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.5587e09.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-/34T4d7l5Wscfy0nkpeGZqiZkdbYciKue5Mlv5DAR6REB6m2+7nGNu80Uljz4GHacsp5hvQkgOwf+Wccp5+ykQ==","shasum":"10a6588a5663e53a5edb962b62b3650c32e9a18f","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.5587e09.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICAAlnXJZJHCKQG4VC/NkfbKqaAotu7PpMqc3Dg7+O2bAiEAyw7arqpxEtBFvhdMEyzsCriJ+wF3aRp+B/SRBcZjnOE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1oJkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmql3w//Te1A8Acdwxtwid/SDtRlaRDzj576ryp0M2TyZUqf65P1165q\r\nMQRFwsL/clYOJ7Oc6N5HjOBJeipPJprPzJ1Kr669c/CCDEDJv7z74WXZO1WW\r\na1U8TO+bh/UsWfyDmSAXQXp1uSyozHnxXmDm0zlQBpP7U4ct0+JMm0Jrp2Oj\r\nBN2h8DrbLxUZLhcme7z2n9maW6M3WtaDXYq5XfR1JUbtU2rfNT2YHh28dhNp\r\nhr4eo0txUkDOM/wNVCXtmiTPeEpQB1uA+zjfuuCnh/m+sDgn2ZwmDQ+p5XBe\r\nSMr0j/nvK/lEgKch4W6TXR/xuSyWESUkBM483+6qNKTmpVflMQWl7kZ1ZZ0o\r\n8uBkDtkB1+2IIneMewVqeqQ5HhjBQmWUDtSgYO4Zl1T3EQKOxbBg6jPr1ouL\r\nOoorro6CHDdap07m8lKcEgpJ2yUIH/wbhf5OBkjlWBbj+YQeBip90UqK1J3h\r\nRiZ05A+NrmfwzENqp178CcxkB21IrsW63pIcmWo+FDddTw977RLJlW9B0nC/\r\nMB0/1l+lJvcqDl8TzvCN1hkke7k6fFUmaa+tPyrEgStXWF94MBmseJakFvrf\r\n9jeivsBX6GgzNR9YP0frLRq+80Sx16mbWI3NvZmEPYzmyLvJVMbCmPz9ThdE\r\nS6bUNi8ostz9SJVSg/aedfZIWtMzqTcdG8U=\r\n=sVch\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.5587e09_1658225252522_0.7306570263560237"},"_hasShrinkwrap":false},"4.0.0-dev.5c29ca4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.5c29ca4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.5c29ca4","@ethereum-waffle/compiler":"4.0.0-dev.5c29ca4","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.5c29ca4","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.5c29ca4","_integrity":"sha512-Up1Z+vtVddZwsyGxqhPDrEiClVltwO3X2WmVPgu97LaxeAectu6f64cs+dBn38PvxvQ+x2K3dUIc7ssXax+PXw==","_resolved":"/tmp/ee10a6ff1e70bf5218bd279dd0edf8a1/ethereum-waffle-mock-contract-4.0.0-dev.5c29ca4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.5c29ca4.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Up1Z+vtVddZwsyGxqhPDrEiClVltwO3X2WmVPgu97LaxeAectu6f64cs+dBn38PvxvQ+x2K3dUIc7ssXax+PXw==","shasum":"91519bd1fb672a60650e8c799a2e53f430d0a6ad","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.5c29ca4.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWfTkRzJl4Z5ADjp9NAkQTaTWIpaVssHRF7qMXEv8ngQIhANTgvZUUSdUEfNkvHuIbjoL5HoZXvKjlk0DXNHfNfWnz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1oZJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqhow//eXBy98lm9nnFqN2TKqUTqCBq+IbhVoVAmNb6vKA/z+khjpPf\r\nydCl44K0LQg+AVj5SDclVP/ECWsLXeNsFY+IxzVLnTdQ1okqVTTbw1rMLeZ7\r\nZAAdnLZcY12tHIajrSVjY53lAyKalnKW+lP3nkssG4+0OIWx69Sb/w0oju5s\r\nQsbrvTKVEtUmnTa1ast0qccOZjBFnOTBGTrpozu3SsVfex3c8V1e9UXGnO5y\r\nHmGUKoVzFCzoWNuIrmV9n4NEN9f/907iZoJQaqUYwq1ctwojPfIKDUw5ElEC\r\nc+4rPGhHkY9HKr24hLgk164ZeV7VeguHmM3yuvZpZqxi1iJ3TQ+R2klQCxL/\r\n9RZUMlwXtUbSgDZUEW3GtdnJtNjccO2Hn+NjWMYnWxRlABK9ninKlk6DreNg\r\n5ep5hkYZ4dJwlSlPHiZPAV2ocpL9F2vO/j2PBwWhYyO1ZdB/D18thrNZ6PBQ\r\nVFLI1xhXcxuy7oW26KqpIh+i8mAVx/ttxVK7/AA+RWd0O9UQYkazD9WSd0p6\r\ndasGBuQDOnqw945hP7mtkwednAHqP0KaSf1esj5RvOuDr2OQRdk0hMZKyTct\r\no/o5WE/bKT4xLHjGbGPZrocv3LgYbJN+qp4WeuODlCOEcZ7ttoYQdWobgLyD\r\n7YrFhDaif2XKlPzpcn/BIQH/657QIaNGCf8=\r\n=IraM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.5c29ca4_1658226248850_0.24183425618004617"},"_hasShrinkwrap":false},"4.0.0-dev.4ce739d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.4ce739d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.4ce739d","@ethereum-waffle/compiler":"4.0.0-dev.4ce739d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.4ce739d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.4ce739d","_integrity":"sha512-MbElmyr8rmKA5ODSWXHgOVjnZ3klkcSiHTIQMSRXNfHh/uj2n/bVRMIte2d8qJTfi6cC4Uj69/unPhTj9QQ3Fg==","_resolved":"/tmp/c938744ef82dc46682d6060159eff8ca/ethereum-waffle-mock-contract-4.0.0-dev.4ce739d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.4ce739d.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-MbElmyr8rmKA5ODSWXHgOVjnZ3klkcSiHTIQMSRXNfHh/uj2n/bVRMIte2d8qJTfi6cC4Uj69/unPhTj9QQ3Fg==","shasum":"6654b47577455a8db9833e0d7a154b9ea63cbdad","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.4ce739d.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIEXdXIDyJrJeRRcYavf1ZPJKImLTDvuKrqKpNY/7Ks7kAh8a7ffFJM6t+IYdkChjfybERgbGQG+M7T8QpnXiP7ue"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2VKFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHpg/+Jc3CAZRGxWWAZO4VIhOZU9znQlZWFobxd615sYuaEQKXbHLs\r\nq/QHZD/kAer+YLsPvUCYyQzJZFKToFITHVvkv+1WvpygOJg8km85Jgdx8a8h\r\nb6l3oEeGsseH8LWbT/TSdxCTUt6+nfUFOkjBb6rlAihEzS3nHm9RHONJ653c\r\nxl4Ul0PVEFRU2+CtepGtIOiUlhxtSZ3HmCK8HCz7tqdLJPq6LZdEem1YCMzj\r\n70Hs8LdT6w52xzB/JV61rhRYlouXYJQTY9IpuCAQyGi07PzESNGCmucEkJsM\r\noUKolsu9+cwDqjm9SnLjXlVQEu+AW5gSVCKGStWbi3wl44AMQse254D0D1oM\r\nWXjjYuuZAv0lskDphnXonkGa61Eye4RcIGuHgrc6cIzHxU7jw1LCr+ewKBXi\r\nMrt3ci0MP9jL1aGOFsHSDZc0B4mgKfnhPfRLbGh9sjPRuFGIVISgE4aZ02JO\r\nQuaNvQReQZQ9bFgH4Hs5DbCJGJcuHlQvt3LzvlYwf19wIwIJsxRLYewEpbce\r\nTprqn0CGTRG1Jb7/mV8yAvpLkBsTe1blJqtYSDQG04VhY53+ih10P0Zti8sc\r\nEcbvLCnBrcEFbJ8uMUSP3iF6Kf5aWCMcpeDi5EB44ZFIHcCUghLh5pZ9rqXF\r\n1xLs2YQGymCjs1f6mPLtbGwDlqWSQsy9YIc=\r\n=p2Vz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.4ce739d_1658409605208_0.9074784568913814"},"_hasShrinkwrap":false},"4.0.0-dev.c98112a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.c98112a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.c98112a","@ethereum-waffle/compiler":"4.0.0-dev.c98112a","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.c98112a","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.c98112a","_integrity":"sha512-G77693SiXqSgnGkGNP2f7kkHGZYPtzu3Rmq2HR2PWrGVm+eRd5lTW26LVXFBWl6WSTI5Dh0Zr39HDcwqTr5Mog==","_resolved":"/tmp/646c6ef39c0819b99902d9f8abd0ca74/ethereum-waffle-mock-contract-4.0.0-dev.c98112a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.c98112a.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-G77693SiXqSgnGkGNP2f7kkHGZYPtzu3Rmq2HR2PWrGVm+eRd5lTW26LVXFBWl6WSTI5Dh0Zr39HDcwqTr5Mog==","shasum":"ada62a23d45f4366dd718dea42d1894a754ff101","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.c98112a.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/RQXutkET8Y4zm9xeeWK4n/qdKP44/KZhpGcwICkekgIhAKz8QDmrsnohsWW6vFA85TUdLDw6WIlLNsSN0GTpChr8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2WA1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqozA/+LJGnsgJCJb9FstrTqhEpeeRLlVloN9WFGirol9q4bRtjkRRr\r\nJBdv4fawkKvqCv4XuXp3WhLhyb93rfWcXXSlOGieXb6g3uyDNPe1P4kDvPCG\r\nwgCC4IvGCBHibwwRYrAubEbiR/me6R6WHPoJ6N36zvozW2DMifBrwbGAlHcV\r\n8LldtAp6gToszWtYgGLz9iF/wfjBV+d3+X6cDehE2CGQKtUPaI5/3DWIms1/\r\ngTQ3jRdzI6ypeb/Dqyz129cRLtUtdYykcaiOCG/dGx4BFe9k7y5FL+K2aPvp\r\n8iglNJJRxy19s0iVH4IP1Bs7F27IM3Q+EH8xSooAWH/7Vvm4cWMS7qiVaXtF\r\nPu18p/k4O0DzaYiAsvU/NppDU3dWk29aTkjd27RV15JO1vHFYcPcCD3cnMWz\r\nMqmbOeWffmSjWxu7+xP2Uq3Bsc3+m7iqNbPx5PFxE8CsLoS5QI+jQxHb4O8U\r\n2OkpSwxguX9q8RsO/60W3sbiCgWV7up3LI2ImvustOa1z3cLnZpprWAZ6llp\r\nhO35rhAgFZITizJr5Lupk1Crg8X5Ci1YJU+J7ylhMUk8ooXMj8M52SpQo6IM\r\nPB3w8ynyPEMRPyXJZE85p3oEPfKY1VKhtj8qFFXLn37JcLX9Qpb71sLZBMb7\r\ndODJJMw2dA5b0jXqi3gGaoI+FSIB8W4l34s=\r\n=ik+D\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.c98112a_1658413108921_0.3604119182830836"},"_hasShrinkwrap":false},"4.0.0-dev.b028d7f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.0-dev.b028d7f","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.0-dev.b028d7f","@ethereum-waffle/compiler":"4.0.0-dev.b028d7f","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.0-dev.b028d7f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.0-dev.b028d7f","_integrity":"sha512-EsOqoW/KjSBKlJm0oTADC7+dTPRtRmix/MXuKfpRkTIWhXnxaSxn8JhTxZd6UvfPqb/k2Cc6q7SCuqMdE1WKCw==","_resolved":"/tmp/b1cef516d1abb6f230852d931944708a/ethereum-waffle-mock-contract-4.0.0-dev.b028d7f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.0-dev.b028d7f.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-EsOqoW/KjSBKlJm0oTADC7+dTPRtRmix/MXuKfpRkTIWhXnxaSxn8JhTxZd6UvfPqb/k2Cc6q7SCuqMdE1WKCw==","shasum":"66ad155154743f6cb33824d0f72ebc4b40c59a96","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.0-dev.b028d7f.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDtXrOhksWW70WXxzvcU/3Wnb3JsSAV6WL9ATHhRUwfmAiAHGSbJBjP3kCsIsYT9DYN5wpFSy473e6H/H9P8Pb/pAw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2XiRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIIQ//cKRDkwzOTo6Xqb2DGVdmwuGt3BruTveJkLh9xN+yK4e4vGai\r\nDKLyJ8ES3bICjOQMUs8EGsDD8VkY+1xFcuMEaboE95aun1Er9mE5+bj+w7Sj\r\nPCiRHQ22wB2w1S8smBA6GkKxuOa51CqQ1j7ePIOam+pHXxLPrCHrSn6HiaAA\r\ncVa7iUzL4UuscVWPCPNkcKumDmOxVFmOMwHDHx1tYPuPo+WW/JRPu9P+ePov\r\nIOIPtzIJlAHgERE5S+FoyeJ24NbxI9ooKXMT3hjFF2rG9JP9FxmCIWz0Q4kT\r\n0yRujkV7fUTO/UzLYXGJBshxN6wW7ABtXQP6113EACgINI/QvodqVBLNQ//+\r\nlKSYtaMZAEKbwXnF32F5ImvY9JbyUiDa50tCqeaVS4q05JzumC8FwRq5fRB2\r\nyphqcuh6vZBl7W03x3l1qIAJ3vdmVfOE+mn/zZq6IQt3AHsqkabVjdgnkplf\r\n2WJVTKtK3hhnb2h63CatJ4VAsv/Z3XHOnhM+1lLbrBaw9+hck4wqs7u7FGFi\r\noAwdgrJinxV/huLp8TOQu+TVIT2wAvOEDV5wg6VkiKfRlhGjhCaw1SNT5Y8G\r\nSc0/tpKTjefpCU5NmqTP9ipyYRjaECPEkMvLwRUkwI46BJatNHhE/DCLOAfu\r\nXMusbSz6ykrl7F4o1SfM+ZoeQGtasqxuyIc=\r\n=PRFN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.0-dev.b028d7f_1658419345001_0.04795908925888348"},"_hasShrinkwrap":false},"4.0.1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.1","@ethereum-waffle/compiler":"4.0.1","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.1","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1","_integrity":"sha512-KvS/xq2Ig0Rbz0m7p6UafqdEt1fv3S9u+oRqyvPagu4JuId7QlB42U7VdW3js5xjHLiMNseU3nN539laEn3YEQ==","_resolved":"/tmp/62185e96cf8e043915ecd416fc1d319b/ethereum-waffle-mock-contract-4.0.1.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-KvS/xq2Ig0Rbz0m7p6UafqdEt1fv3S9u+oRqyvPagu4JuId7QlB42U7VdW3js5xjHLiMNseU3nN539laEn3YEQ==","shasum":"d819d835c2f8d2a0972e94729964f465961ee08c","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1.tgz","fileCount":11,"unpackedSize":224326,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCiGPy1X8yFwb1vyHd7xtgBv18XB0KlaRskOnwKmk+htAIgPr6B27Sm8gyCz/DMeKluizzkLER/4P8HecrS6PIwMV4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2m2uACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqklA//YppJNXF1gE5cPaD4eeopp7d1BhumyyLPJy0B9QZ6dB3ob3xT\r\n9V0HEW0FDL2M2rGNEmjapm1LaE7C8Zx/KeU2YF9QuXa4Z/TUP3162t6e0Ba/\r\nUOfFoxEecwQYctrVfChPEqnyGkXbcfOr6GqLp4GnLi0ShSrA/B7wQFmAUU18\r\nqVim7RGpEbfv0MWd9gTf/4hFqM3As6hLAXBFtFi1KQ3loZsOmLEtpL9S7w12\r\nuX3V2610XLqbBNUPItrcGAXSJVLSikZjsh3GtP3G92tTlhMOG2kLRUbq6B92\r\n02L72p51fHF9CvXZs5IKa9TSuqp5aNo7CJgzX8R2p2tCpRZ0K9b8/i0anMKw\r\naukf71xLJ4n6tLzZs5Ksm/e+eZ/zgf21BukAZ4GiAjZ3LxMKLWU6daPHqmdn\r\nkwWISr/xeLsqNEo+/jNpVdPAHUtm0nRfO+fq9kpf+dVuh62selcUvQOZoN4i\r\n04dDfjvFWgJvzFg7HaoUVJfsJmH7hqaORCr6dnTw9d3z3R9tFVefPso4U3ko\r\nMt0jwTOAM7AVxz1dO8IPBkWiSCpRbVW7GhIDwFVkVycMeGBQiJ32sodsqVc6\r\n7ZPD6+L5ulEWB/VdpV4/klRS0DgQAEFS+CvK5glXPWEhuJVwVr0KjH0Ab+ip\r\nYnbKHoI0AZ0oY4vtCQYKoJ2p9hPhcN+bxiU=\r\n=8O1J\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1_1658482094254_0.5385199416459765"},"_hasShrinkwrap":false},"4.0.1-dev.37f589d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.37f589d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.1-dev.37f589d","@ethereum-waffle/compiler":"4.0.1-dev.37f589d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.1-dev.37f589d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.37f589d","_integrity":"sha512-ve+wWdbHmebMx267PI0M4AINZa0WVdJ7T5POLZx/7iF8EHFKJfAlBxx11xnwO0jgZowHJ+FnWIt0ypPbe7Ls3A==","_resolved":"/tmp/dbd858435e0ad67c0ebe66dd2a47f6e6/ethereum-waffle-mock-contract-4.0.1-dev.37f589d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.37f589d.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-ve+wWdbHmebMx267PI0M4AINZa0WVdJ7T5POLZx/7iF8EHFKJfAlBxx11xnwO0jgZowHJ+FnWIt0ypPbe7Ls3A==","shasum":"bd689487a90f7af2107181961d09abf8ef75785d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.37f589d.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC+dharY64YgFgC6XxBQ9lt2klkiFj4cHOJ+jFZiSfbvAiEA6KcrW5WIiCKFRWaOMw/N13aveO53WgRxsL/s8ndY/QU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2m5DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNIA//VAB39l7bb3/1W0qEmZrO3FLhxuJGXwlGP89znrzLh0Us2xSF\r\n4M4EK/OyA7oK9GTlhrAn+9cktCj6SFV/WU1RXnsT1Rw2lQ0bEbBjtoIar18N\r\ndjwdSWYJC1y7+/eCAxbVKcpAVwRiOYnttMPgraUIkSSJgiZI8/5nQWCpYCPv\r\nVDnlJjjs4/6JNT66SHAqm0wtods0uUawxRFuj116aKRP1pBZplp5pBDD7Yz6\r\nOuB+wLhVRfubKYRe/6nwQn7G0OYIszKqjghG0r0Nvcz/R+DxjJQJWrm/AezH\r\nyKTlRBhmHVj7/RsKy9RUrRyts/2RPP++u+KivnQ55wEKjn2Jg2GgqIbkYO9p\r\nHrxvcdXD3MLcTY0L9QFk9whLWxwuTUoGX+r7WcLJZyYy3JSxboaC99IWuk0E\r\nbl3hjjDS7xk3wL4MQZC66lVSuL6Dp4qDlv2sgHNXOee2pfjdNz0LX8/c89Tl\r\n+Gl5plLDzwe7RM3IV33LkPJkOqQG8PJJ3wswIIOdN4GMaPKbOPYArxYKAeiQ\r\n7Xrm7gLhWCkBPYIXLqVWzxW/jG81TFjQHbbN7R+QUmdMymS9Wxj82TE/ujeI\r\n0X9KUp/aAX529ELkp8noDcAOsR1Fo7Kx0fxtTpSjdxg5TOs4xmp7RgnM3pH3\r\nURny1drMQQ29+CncNxGnnYL5lHQlJTYoOJI=\r\n=yLQl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.37f589d_1658482243383_0.5441843775208481"},"_hasShrinkwrap":false},"4.0.1-dev.2e1837c":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.2e1837c","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.1-dev.2e1837c","@ethereum-waffle/compiler":"4.0.1-dev.2e1837c","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.1-dev.2e1837c","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.2e1837c","_integrity":"sha512-pI1BmJUv4erAHPFBgXsczdl7C187KoCMVeFyGU45T+7TZEQ32J3QsXpKVVmjGOikLsrHg3/junOXelQY/ATn9Q==","_resolved":"/tmp/9ed618c0fa1f620c72f0423c1ca868be/ethereum-waffle-mock-contract-4.0.1-dev.2e1837c.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.2e1837c.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-pI1BmJUv4erAHPFBgXsczdl7C187KoCMVeFyGU45T+7TZEQ32J3QsXpKVVmjGOikLsrHg3/junOXelQY/ATn9Q==","shasum":"8a68a7532b42450669f6e19e3c54f57596c3dd5c","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.2e1837c.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAcwdl1fRoIRc6e8rERxQvjs390lalUhXwdat2+66ZTDAiA863xGgBGzdvvZtllWgwjn5ReLOawh5EvOzquLBrB1eg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3pgbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTCA//Xpo/tL05V8d5Vxus1rRVMSaeJGseT6aqzd9YaT3xeRccCaoe\r\nDjHWmn4hc9lvpRgjmBc8pk/QiTqlinNl5hBqA1N9OJ9jaZJvYpxMj8OuND2u\r\nzJUVczSymTs5kI3xdeEcvN0Fp+ehRg0OaTrxYZmXKPPFWBCRj9vdlA2Ch4FF\r\nitoYj+tpY30oI7rba3T1rbd1fyO3jSlUL0EY7A5hLhbY7SBfhB52WwQwnlu0\r\n1IxZz7AcQ6i9kfW9M2tNJeyqOeOlC0aUI9UY2fuaW4TdZzGQLhFFNDTc2m1G\r\nMaAaJbOPqjKa03Zk21HJftg0H66DHWFzdcVcpVGgbbe+6v0YH5Fs6p6tWRNx\r\nNLEB4C4zVAlyIf2dS9Qsugv3swBZJ+iNtSiEFvUst9whwOewsjlRc6f3COA2\r\nbnJcCnSaPOogpvlr7Fh16Fx36MKLcF6m4AApXAAnmKOF2pPb6FzElNSZ9b2+\r\nFxHRilV8/RVtXSUdV8jIFfB5STn5HwRe6LeJBQrqkR0Z4PR++ATViKohDlc6\r\nd/sDcAvOncCI4ktv0cO1GxOXEvS70Q70WQhJvaoVr7cw3sYKDCaRGFUGp5s/\r\ng8ToLC5Ju9rm+UOMw3TxgHLozZ0CfZw/sTqd9MFiQC/Y1y9XzsBLaUpkylQi\r\nvFwCbH6fuszQK7cVpHZpzNpT8qW3dTXIkXw=\r\n=rUz1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.2e1837c_1658755099021_0.2698208174130936"},"_hasShrinkwrap":false},"4.0.1-dev.0a87072":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.0a87072","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.0a87072","@ethereum-waffle/compiler":"4.0.1-dev.0a87072","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.0a87072","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.0a87072","_integrity":"sha512-brdKf1oLnAU8aShmhPl1tBkuD2bhMX5nX20+fE8PivYbJdDFfPjK2JlMHZyMbFrJRMAoziLY3jLOvrOPJcvk1Q==","_resolved":"/tmp/a241ce532c6dc9dd06679d8e607ce775/ethereum-waffle-mock-contract-4.0.1-dev.0a87072.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.0a87072.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-brdKf1oLnAU8aShmhPl1tBkuD2bhMX5nX20+fE8PivYbJdDFfPjK2JlMHZyMbFrJRMAoziLY3jLOvrOPJcvk1Q==","shasum":"04b70a4d21e08e1bc78e10c9c3c81907c2bc55c7","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.0a87072.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZ1I9/PD9X82ni659fZe38NvPA1SXMUk6i2drHkLd+5wIgWWItMyBWQQpd7efKYxz9kFKsP5NcfsAmqaHc5UnLS5c="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3/A0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpBOw/9GXVzJPO3oDZdKWaJ5/vbF3aGH1TQUx3YD/uyZxTKaY/rQ8+k\r\nIowYiZPcoQcEKDGr8rFwiFuvK/X9bSa1UkIvC7TWRGEvEFgTzzwLNQMDGVhy\r\nwtMwDIc/Wn381kgLgdA56wDh/O0Tr2YNUdF9eV6y6Qkj5b4avnDC0e0S5/sw\r\nlrlZcjItuZbDzfXxFrPZ4D6swh6R/rw9h1hmzsOVCPaMarvSl4lsYB6/f/dl\r\nvzV/qxLvE7dA0/IrCSGjR3rGv8/vJ8C6czCSbhFrIvhdmiejR6tjNQWvMGVb\r\nl4sIeCXwbA9gkrwTLRQUBGmoTZEMw4zkLmRbvdSE4RcEiM78O9Lgzk/SWsHr\r\nD1dZsYy/dvMPwwgcQwqrZ3EKbh+Su4yh8Zg7ImjgqBaBA+PPBpgXre1lFOPP\r\nBqGM8O516jOWPlXIsxqsbRc6dqdLAa7R/F4h6UeqH1Y7JzQ0h9Iq9A6W4Y7x\r\nQ1cPkB9X1N+d4TeKJ2gLuGEb3nuB4cbp3HiorZTDAUPlGlGd7MjBKnvOai/3\r\neIy5p5WBv8W+UVnDgKp63Dlkm8/uYwtEfQRGcMiE7fhZ7S1wpfGhCNz8ifG4\r\nzcAmKueHs0i6tYI2CNEGCTeNomhZwRQ6UgKJ7oLbKpqKxeOY9VUfxCI3ELqG\r\nUBbwobgLycCUDsCVBn69MUb2sgZxd52ZC/k=\r\n=UXuQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.0a87072_1658843188318_0.802579399553669"},"_hasShrinkwrap":false},"4.0.1-dev.b329845":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.b329845","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.b329845","@ethereum-waffle/compiler":"4.0.1-dev.b329845","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.b329845","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.b329845","_integrity":"sha512-h2mMxo6OFJzrn7Vx0HJzCjAeHJPz+MWZSRROb20DZNUU9mgIpyshT9UrXCw0UkD9MBPwcS4fjNOHiFMCUcE+tw==","_resolved":"/tmp/aeeb62f23b986d25ec75b8e29fb6c9a1/ethereum-waffle-mock-contract-4.0.1-dev.b329845.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.b329845.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-h2mMxo6OFJzrn7Vx0HJzCjAeHJPz+MWZSRROb20DZNUU9mgIpyshT9UrXCw0UkD9MBPwcS4fjNOHiFMCUcE+tw==","shasum":"cb5daba04b99dc19193f81c58f7cde908d0f2d7d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.b329845.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBFN0e8+i5cWPKQeFEAzqi4L9IITED5MxchNKs0n0YhHAiEA+2esrukT1CES49ON/zWc1MR4FtpBNfBPvd7lhXCOmps="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3/boACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrq6g//fbImD87k8/5EFFp4wdnE3JA4ARkrDT6C2tPAhqMGUT6ewQy5\r\nWPqET/UYGbWdXeFfwV7lrldJ8XtggVD+slBpSJvVhT7v7jUwuujAD7JvBlyJ\r\n5Hghh9WkGYg9MaJkvTAH+jaMa+tSTFen2nkb5uesGMtXbKPcT0/EgOGJICNv\r\nyz99QjPwoPNCgiZhEAH9FnGi+tpPCBQ7LQDhMAZo3IH4voqdEknv1zNYKObQ\r\naGwf+P2ovAW3HQaOYIWHqUohrvMCEtD4bs4sOpcsSNUAM7OKE5EMwUB8m6OU\r\nxo1PlRnmYu+KOvDwORIQ8AGCRVvS/RnIkpQCDhvBHcFh7uq+oqw/p6IdA95t\r\nlRDi2DTxHcxG2CcQBBVkSi19/Bhm0hLUffaDUhivaLsNmZ2rJ9shVhIf6XCy\r\nEuL7QuCFDTUCBpUUFHIn5ndkvW1FALJSZOu/aYnfhwTt9HXyqmraXy3x4jHo\r\nD1AP3GxVEY5Iodai2XY5CFWA1vHSiOoQqsH+oSgLK5NYVfPEKHx4ByGsjqHV\r\n+ev5+c+KMbzeL8YCFhIq21I6IoWU1I1EMWwbjqJNrqS9za6Ve6CFHWFHa+Vw\r\nrASMtFwSjJol6o0t8qKSv6Ya1119AzznzW8BJ8pi2r7oxZJke/eWOi7iUt28\r\nqTEHaPt5wd8VIRiCQwX6hyqZzHpeTIZx2qw=\r\n=rQQP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.b329845_1658844904022_0.035330899778102776"},"_hasShrinkwrap":false},"4.0.1-dev.c513a49":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.c513a49","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.c513a49","@ethereum-waffle/compiler":"4.0.1-dev.c513a49","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.c513a49","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.c513a49","_integrity":"sha512-XPA4jaUkDkzBJkhCbyRL9ayILdetLoyJK5hmqbfUXAPx+8BTcMFDOBiLnLRY4O6D4cLK+M2xpdEsAO62jqauaw==","_resolved":"/tmp/38805ec2f6f5881db48325cd7c1a9674/ethereum-waffle-mock-contract-4.0.1-dev.c513a49.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.c513a49.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-XPA4jaUkDkzBJkhCbyRL9ayILdetLoyJK5hmqbfUXAPx+8BTcMFDOBiLnLRY4O6D4cLK+M2xpdEsAO62jqauaw==","shasum":"d49f6759ccf07e301d7757fc2135517a67394dce","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.c513a49.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgnM8ly/yWD5SN9phHOgQqRIwRU9PR1CfWo+m7FlBEIgIgbo37GknLM/19C9ZHx2fUCrA7hZQg77d+S7qmnNxRyDI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4oMSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoqrg//ZCasI0oYnsQ9aQ1crbWDhj6/QefnvrZlCeX7WHqQdqGwDT1I\r\nE6/U6Qxj7gcKbrFlYJyIWBBnVTF9uuJcSy5zNczjBRJe1TjWDCiiNKlGzVZK\r\nUl9SkimvGtKx8f6IQ2ew4qVBmn+41LBn9rssxXO4zZ1YoLJHg/OP9jMyU/+Y\r\nfjzXxre1anT2bA+vxzYgIOuEKBDlbUSr405xLLn5JlQQE52MOO4huxnsPO+D\r\nQ1MWmjxlHw+9GkBVAdz1uLbMON6IRyMWvXPnCRryk07DhLHaTcBizSUPZ43t\r\n6Kw0lMqmhB4RMVh9ox5mNyorDzMWCxoAKyeyz5kZ6xRzBqbKgKbMlZ94MP6h\r\noll1vjPU3So30KAFrghIwRIBprnlvoYhy52dNB/wQ92g5CHXuUbpAsN5QF8G\r\naNH3pokghn1MBq0f95EZ3sWD2UJ20tWKFoz8LjTBj9WjwewiecaCGkwJvgyJ\r\nYEWddWQWZ0LXYSgpWdDBGH+CWPikcS2+eDOSAwFMSx/ONWtKjuhIl4nLbL8w\r\nHv+m0KZJm/eNyXd+4n7QOZHyFaYcQTcLyNXKfzBmeQTktI6pXMUEwOT6GIhr\r\nXCoDHCUweZq19MihHJcLD8ax4ViJXFbfCB6U07TyQJ1DlQNxCT+pGabhMisn\r\n4fxcGDozvWlSv2jouUoBa7ccp25is8lBjQ0=\r\n=OZ6C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.c513a49_1659011858411_0.9276867670740969"},"_hasShrinkwrap":false},"4.0.1-dev.382de5b":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.382de5b","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.382de5b","@ethereum-waffle/compiler":"4.0.1-dev.382de5b","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.382de5b","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.382de5b","_integrity":"sha512-GYtlxaKyCEqCwjO6X6jUSBt+3ta7MX1L2caD+2Yu3pwSnPPehRD9uUZf+nNjnguTVeOJhopqIdmwWtdNSjowxg==","_resolved":"/tmp/ff82d322571aa20ae4424640b347af72/ethereum-waffle-mock-contract-4.0.1-dev.382de5b.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.382de5b.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-GYtlxaKyCEqCwjO6X6jUSBt+3ta7MX1L2caD+2Yu3pwSnPPehRD9uUZf+nNjnguTVeOJhopqIdmwWtdNSjowxg==","shasum":"71137a9f89ad0287f6b2f6da336ee6501334e273","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.382de5b.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDE7199B7DUfZ0PR+QIMxYZvflDu1Py1HuXDr9jnwe7cAIgEp7/Evalypq4tBiMp5h/4kHxlSKjd3aYeeueI0CrqPs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4pyTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr3hxAAnGoPGCbCYznum1THD9yo6LqDaLCRIc8SCzJ8i+Rq9ixdgbOZ\r\nH94+OP8pZtADKsJTnfMzt9M/QHrNCTb+2yxG84c6rx79XgFJI/Bbg5fmZiNV\r\n+bTv6xZFIo1e8suDOv/R8cL/nqjL3mrDFvX2NCw+SjfxwZm4ayozJZYpGJOA\r\niQ7OKlqDoOXswpXSfPPUpWBRPtlQXsb1sX6gBbx6av3ptS2LPIvU/4MKyq5l\r\ns2pa7x2e/T8qbdgeX08a6O5/iryWh6DoMlPhDeWbgO3JqliHKUPL32XlDdVG\r\nE/u8V6YkxWO7Zn6KCAoTnU2o8oepu5qBmdB3JNDii+E/NZDs+/DP5iWR4/Kh\r\nm+FL9Qoh4eWj+DGCpCEUo/+WzEir06rsES9FsP/pgD0u5TE+FyDJwJ/34xK4\r\noA/ncEt680GYbNgtaV0DFR5x+scVUT2fNBnRIwQyhUm31OM6y4Vc2mmr4x8V\r\n6rAAub45yd5da2nIkHL6ggAULydbLGUccnGjXjkmSdM/Ne+d6kf5ll9nAziz\r\nLBC7KXYa9ZF+u5EJf7slNF+En13XstY/vHbgVAmW6tERse4eHH5lEMwg9acK\r\nOY+GTLyp+//dNMWNkWrYtS8rvaVloMe1Dg1QzWtSseYddQE8yfcVWaR7dcwX\r\nInXgXt+qA8s0B4dqpjbKokR/43pewcxM9I4=\r\n=Hz50\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.382de5b_1659018386897_0.6380683208903881"},"_hasShrinkwrap":false},"4.0.1-dev.4e0598e":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.4e0598e","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.4e0598e","@ethereum-waffle/compiler":"4.0.1-dev.4e0598e","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.4e0598e","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.4e0598e","_integrity":"sha512-jpS0jzgY4VcPBO0hy4N2kkx1G8YoKbJcUqOWiWZ/TOtwIp0gc/n3ICUqZAQuOjSVx8FZ5LtwfQrTq48xEZLdzA==","_resolved":"/tmp/0813a2fd229ce5fadeed645d832f583c/ethereum-waffle-mock-contract-4.0.1-dev.4e0598e.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.4e0598e.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-jpS0jzgY4VcPBO0hy4N2kkx1G8YoKbJcUqOWiWZ/TOtwIp0gc/n3ICUqZAQuOjSVx8FZ5LtwfQrTq48xEZLdzA==","shasum":"078b9b91bbd3446b20285932846e816dee4b821e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.4e0598e.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfXxlKGDWJFrundh3CxvcR4PZic6vrca6iEsrr4zuu5wIhAOMUEIOg0OPtdTIXtGtP7MLIbA0zcI6GNiV9NApe0fvO"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4qq5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3gRAAjiVoF8mmR+skBor/04JLNj0ny8W8Hof6Kd5E+vdrq9j9voaK\r\n3XMaCzOpB/HVPamdMRrQB+9/N+69GvP5ioj1MJ+4dhoseg2fwJ38hgxHacL8\r\nCllsrdmuZgZ1MdHur9vvsDV1tuZNB5OjQ6Fn60vRZc5Iy3qMTSIGY1vT5d4B\r\nJC7iSQ2cXRQ0b3z2j6R7Yed3tQqz6RmkEZNY4prNdv0PUE+82X5bieYNNMyF\r\ny6o2CC3cwvJRG4+zQqUWvIS0V+rEKd2AXkarJKgg76AvzD956B+VaEEiR+nk\r\no7x2ub8QOJh7OpD+LhZz/vEV6l2RE3bV1zza2F7SCwTWCL5I2zjy0KhACCM9\r\n329ANb7dPdaNL5ZZjXr6tGYIZ5sOh77HgfUzVglQtozxM3oY2YyrDMjVK9D8\r\n+A6AUYYWzzfm9BCBF2g/OAAtHNeiqrEFlOCAiBd5iFmIj0sHSUA5jZIHVEDM\r\nbT04fE2FNKBEdw55mYxFb95zxqJK5NJOgLpS4bIQjZ0KXSmPNofOMCJDhd1S\r\nxlx3kdmklXCiF9rPrFsobwj16tD+0KqfTYs84fCyvnc15V1Zuvj3uisTrzpc\r\n0lfIEd9zEt2FgZEN5NsHqyyxvyrRk+BCDY900NRHofzMY6T0p+qTVVETPGrX\r\nFUkyJ/huQLlrb0jnoWUaAs+auxoPCBhR/Dk=\r\n=uwHZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.4e0598e_1659022008902_0.7263616435530336"},"_hasShrinkwrap":false},"4.0.1-dev.1fe07bb":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.1fe07bb","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.2-dev.1fe07bb","@ethereum-waffle/compiler":"4.0.1-dev.1fe07bb","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.2-dev.1fe07bb","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.1fe07bb","_integrity":"sha512-UfZTn113Un5ja6zVEB5hlf2YZpJnh3cgC35n+gqbG+2ceIO/XXIngV057kgqsMoaEF1qCrBdulq8ZsZwHKgK+g==","_resolved":"/tmp/6b54034a3253e78918f07a6c798d6409/ethereum-waffle-mock-contract-4.0.1-dev.1fe07bb.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.1fe07bb.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-UfZTn113Un5ja6zVEB5hlf2YZpJnh3cgC35n+gqbG+2ceIO/XXIngV057kgqsMoaEF1qCrBdulq8ZsZwHKgK+g==","shasum":"272153267f292afffd58cb19544d4cfdd919a940","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.1fe07bb.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICmeHZc3RgPbQJHe7f0rsB8DIxhTKgf28nPvoZI1j2LNAiEArV5F2zJHKygiiMhM4Yf5sraJL7k5D2hWGR4vCeHh7Os="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi48irACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHtQ//UeLV8ABjiPtmFkc5G2bBkeeFZc2FLL52iB7JHUldCMpKYW6G\r\njKdY4L7fq5fSRGQuGzXAtfGkD/FgFIyiPAFMRn8A4egkpOk5QZ+CK4pZ2Pzz\r\nGu4k1+QCWLeG/vQq3tCDfdjoXYNtmHqS5lv0F4p53fJASw73mdayVetmlERj\r\nxYMhTai+6GSF9qwNBHEfV2bih2t3GKrMjl5Or7+Be0N0/bU0K7aGGBPVrsFY\r\n2WKc6g7tM1seRG17ujYrfUCIrgpPH8zAG0PgdjwFfywEO3+Pk0I60YFam5kR\r\nB9u/B/t3hbf+9RdTwG1RZxZFdi1vlnHwxqA2BnIq9mzgCPNwxmYIuaGwiYGr\r\nve8DiZYy9OUFFAXK2cd4HZBgxBx4m3Bw8Odbiohw3Mdnfu/IJNK+OTz6RiyZ\r\nYiM3xMbVtzJ5w+8+X19QRxW4V9Co0IdY04MjpKy7iXIdnj8DXF+HVuGC11YY\r\n/Irq+zpy3LphsoO8UM/9vWK87gmLFKEoxkiFLdSR0Olv6+bt2mV0XLE/4NrN\r\nGgMUIj/wwEMj0L7Jvc3qWBevVT8Gkxg4ikZhvdZAYWyywCIKtzEPBGUvsOkU\r\nnF7vjwuHPrZ8X4sl/Wg5IdTfcSgdlS0tHJnSWG+36mrl84RLC/mOpqDplnnz\r\nAtzmpasG+zerFrQUe/kGudOuOnQCFHxgJxg=\r\n=hsGB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.1fe07bb_1659095211580_0.43916572584698677"},"_hasShrinkwrap":false},"4.0.1-dev.bd741a4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.bd741a4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.bd741a4","@ethereum-waffle/compiler":"4.0.1-dev.bd741a4","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.3-dev.bd741a4","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.bd741a4","_integrity":"sha512-eugYYZilsvsC3fQvn2o1/zli8PHabPSRpoFpl4Fo4pLdNs5ittEq6t/TywtNImHC1XV7WRloJADXEp1YLjB7FQ==","_resolved":"/tmp/8f9f9344177c3b187cc8292b8cd31628/ethereum-waffle-mock-contract-4.0.1-dev.bd741a4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.bd741a4.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-eugYYZilsvsC3fQvn2o1/zli8PHabPSRpoFpl4Fo4pLdNs5ittEq6t/TywtNImHC1XV7WRloJADXEp1YLjB7FQ==","shasum":"6374f48bf610257303a24ddf47ad390a10441497","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.bd741a4.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgeEIsmtSWgFUC5FrFUOFHuilh5OGjEyAa1sz02BExcgIgYcJxw9o4TRTQt5W6EKK0Osf29M9LRBguShCwJrxGi34="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4+aGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+Xw//SVbCdt7iYt+aGqKyl9j/ZD0rVNY7OLEyw/R6SXHpP91dYlzp\r\nkv3vTcqsiI9RL2crofcpTcUx/xmYZhOCYVZAwVOXYNImO9Nb+fH4SYatjTJ0\r\nNGSW7c+X85NcSbRzIAsHOtKHZrgM3X6eKpSaCwy7loZQadbg9ehbsKTlQWaa\r\nvu85jqBI54zJJ//vRr5AMAMmTBtPMvhgI6r7Hm/zlnY3sTxV/bdRcRykH2kM\r\nirGKiXekFBtBiPX6mDCdMqTxJL2c7JgqXDls+ZMtPNIYWfC+7RWkb69nGea5\r\n+ODwEAVICc7umveWtzvqxDN2fbT5ExVqCGBAr3WT5NHp6QtOtHuwPCQhlQMa\r\njC0jF8hw55VFgTUTooPF6SP+XG/1Lir6BfFtKjb3OgRj0SQ+tr8WQ0Hz5VEL\r\nPcgQnIXYQSwP5pDBILoz6GqeWAJaQLovTq8KTf8sCtt5+WiTU5qC/y5IuCny\r\n8saazSBdOlkyvRsF9h/brtb02G/tSRY145J1dfHcV2m7OFwVBY2YOmJO7QMT\r\nI7Sm+r3/kQKo3GInjBDuzlz6sKOv0+oxXmllqCx15pKz5AUxwlTqh2IWt0sp\r\noWpLio6XpDjIkAPmjKmjTjCKTaQ0JIn2veTN+QjETmYWfxe2n1QEwkuyZiqB\r\nif5MeVSM6Ey0+WL9tsqOXmBlT83JxNqMHxY=\r\n=+8lF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.bd741a4_1659102854294_0.553306765370305"},"_hasShrinkwrap":false},"4.0.1-dev.3b7020d":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.1-dev.3b7020d","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.3b7020d","@ethereum-waffle/compiler":"4.0.1-dev.3b7020d","solc":"^0.6.3","@ethereum-waffle/provider":"4.0.3-dev.3b7020d","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.1-dev.3b7020d","_integrity":"sha512-0x5UE8l4+HlisgpWS4ZthSLOfQisH70yDEfqS3zsKW6gkO6P6wfS1uadLmJ9kwhcDgvGZD88f3VL0wSa8EQZXA==","_resolved":"/tmp/1cb18cc3411d91781b95b8e586f9bd6c/ethereum-waffle-mock-contract-4.0.1-dev.3b7020d.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.1-dev.3b7020d.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-0x5UE8l4+HlisgpWS4ZthSLOfQisH70yDEfqS3zsKW6gkO6P6wfS1uadLmJ9kwhcDgvGZD88f3VL0wSa8EQZXA==","shasum":"7ea08b6d9d6848e378f495f1ea70475f120531a1","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.1-dev.3b7020d.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCx+2UBfzUatyqNQRciKFG82RO0peutubQ6/EMqpPYJhwIgFU8J2nErQ0fHVHaP8+Y9/9mrJ3etP/vF9HQL5qOrnZI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi546NACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBGw//ZyuqQNNHxJCHAqW75EJDbEMjYeVo+a0Nphn5NPo+vyPdmy3e\r\n4xDixNMI4hUdKema+WyDOckv5aqz7gxxo5WMs2TkL3rcIuSSo2HzPb5Bc9jI\r\nqE5Q/28luJqBp+zrY3VKjdChDJ8VO34/1dzuaEC8QXW1xV27Ybb8S30Wwe94\r\nuwiM7xdZCAcKvG6MP8i9IHkW887ftDsP12O8cdqdogh7cRs4Hbq3UygSq1K8\r\nyL4DMvUVXoXT0QE2u8yLiVAxhegNbJjmzir3GHT1WqjVvEeHZtiWoL9XIR8E\r\nmCdHjqvPdiJ/J09z0mj+cLfV44JqexLt4Ol3WsiMzJnfX6t0nLFfruaj+3I7\r\nAh/V1U5zUHLrNIQwMk7pVwIdoUJWK7X76hMQFcvz2M458yF074rvEtR7RCGi\r\nBBQ6sC1R6iaiLBrBaRKM6v3f3S4JNz/DXZGD0w5i/fszy7TSLcYL+u50w5Tb\r\nKrvlgxB/y76pjNHksY+hsL6TvKnH4tPYiby02q1f6Fu/NfsqAiNtZsel+UQb\r\nnXbzSzG9i1GBnaP1Ze19Jl94Ecb+q1mAfIlKedowhj/ZyVbTReOGVFpWcjsW\r\nibBbwpVRmYQ3p1GGbXruTpRxGrOCkdFN5E499rG7xTqqdwYbOvRP7Hb1Avho\r\nGPWrHh+m7yVPSRRWV2P/gyDejsR0iA9wASg=\r\n=rbby\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.1-dev.3b7020d_1659342477023_0.43844060950088215"},"_hasShrinkwrap":false},"4.0.2-dev.0c13fb9":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.0c13fb9","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.0c13fb9","@ethereum-waffle/compiler":"4.0.2-dev.0c13fb9","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.0c13fb9","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.0c13fb9","_integrity":"sha512-sSqDd0Hjjfs4iz8s1wAdanxWc/em0yMRHy268aes/jRnlM5Zti7fcZAmV/Uh17fjobcBy/ZFF04R3eXZuH01Gw==","_resolved":"/tmp/061805d84ca0ea262ce64af7125e7c64/ethereum-waffle-mock-contract-4.0.2-dev.0c13fb9.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.0c13fb9.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-sSqDd0Hjjfs4iz8s1wAdanxWc/em0yMRHy268aes/jRnlM5Zti7fcZAmV/Uh17fjobcBy/ZFF04R3eXZuH01Gw==","shasum":"24360f792eaadaef9512618526ecb1ab4946d793","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.0c13fb9.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMGbPrOCqhyHP+X1XnkF49cU7xLeK4YhUcdkFcKyuwFQIgG/6H4wfD72C6wueR8obMnN0rxpq1zL/rt1b1TVgTVSQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi55KxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqH8w/8CZeJDHtmGEQxePAkuE5O/b9k4a65nEVYfPUVFcUl5JUaGu/I\r\nxLth7QIpIcN1fIYEMdZG9bZsTZj9MCu93EDQR5spzqP3vxJtNnkQH3Iuvr78\r\nH086M9p27pViGUj26zYC2+1Nx473lqPoz/kDCs/d6VDq3XaPdDFv0oBjQc27\r\nee+tI8psyWQ51WElhRIskpeGaOlLNlsisltW8qBn/kTC/bnzHzl8eYlPnILs\r\nTatRLJaQqtdKEEiFe1T5md08mD4KrfixVeX8pGB+Y+/v1GegyfYPGhwMWONG\r\nCbrt3uFz0ecbCpZEpbYFMqLdFMiLLpJnJgehnqQ/YmSnYOIs7PmP4soThUGN\r\nEx6f93ENFxZx6MoEAYZKjuJNbJle+IdZoqmnrsjCdFfhTtFoz2/aJbV0kZEk\r\nonW96guuJXD51Xr27J1giN9ekyjzL21f3kLGBg4FER++77r//yIg3nDAfXar\r\n8S6OjKB4Emte7UmaRHhQrii8SNFtyoWh2MrHxwhAOxQ3Ft0QW3E8jgDzEsw8\r\ngHM0iGlBIeAsctBWL616xjpebYeaQ75wE8CI0dYF7/fkzXHFgJ2qN0rTc6b7\r\ntSLnh+gYbby6xP2HCkYN1Ymq7iFid7gf8+r6yo3skVb1qw42sKaKcq94ubCl\r\nH0ksSoYWIhN5eKZv/GVF26WYFXYKcWuFt8w=\r\n=6Yxl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.0c13fb9_1659343537368_0.5723704756343764"},"_hasShrinkwrap":false},"4.0.2-dev.0f5af9a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.0f5af9a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.0f5af9a","@ethereum-waffle/compiler":"4.0.2-dev.0f5af9a","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.0f5af9a","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.0f5af9a","_integrity":"sha512-S6RxQR6r10j+BqJ6WbTe6lGbOgkeNzm3jbFRpI7/GX3SW4ikvtgANZJnSMjNGcfOst8ymVXH+W/iLhKkrDPvkA==","_resolved":"/tmp/a3b0f3cb3006f5c3a4edbc4229c15cda/ethereum-waffle-mock-contract-4.0.2-dev.0f5af9a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.0f5af9a.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-S6RxQR6r10j+BqJ6WbTe6lGbOgkeNzm3jbFRpI7/GX3SW4ikvtgANZJnSMjNGcfOst8ymVXH+W/iLhKkrDPvkA==","shasum":"a6f54948aaafae456feab6083cf02c61305b1284","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.0f5af9a.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBB2eRH6w1yRcAPs/ggg83JnBn5WaKqNG9nTZRjqaKFwIgCHXdAdghPQeAbBpZFRIPyrHxNvidZv2+5i8McoqrfJA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi55rJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYqxAAjpoWYfiwPt5h+uXNfcAJByfQ/yz1PM7JcwEJCu1AkpdRT6CB\r\n7L27D6YWhQQeKYwQiQ0/5lXT+70QzIDUXhUSu4BEYpz5Wqh6epD+g8YSjaMU\r\nGw3PbJi94aNH3Pvqt0AAzhGQp5Q2jgViJT0tQ9a8r1q/X0JRqoqD9iGLw7ZE\r\nz70i3rt0NHqH3W3SZhHvTqhZ4H4OOznCcfBQIYdwDgqEP1NGD6XtRt75tas1\r\na5wPA2s5JrBr16JrbbVDIKyc4KiFyOcVqbBcxu1xCeGWzpSjXi/zMi63rg6+\r\nCviFwEPiR2wVSNzx8OlqMF4nC2MyrbUgFNmKSw/DOfL7zN9uySY+6s2U8ILc\r\nsZ3B+v8o9UWdFmy7seFE2+swHM6xZlzwLEgYrTsBoTeDB4+YKTTUUHyT/PFN\r\n3KA+EA05VKl1tLt8abpU3yaB0XMXjbM2/5fuUN4h6GGpZKNx/TFWp3KbzGJr\r\nMrpmWHWonJaJ3bqOHzdFJ7reCZqS2d9NvCIUHKnbkl9mh78URgx5o9Doxw05\r\npvRaj1krXK/oOCILPStLVGY5od5IyrMzxGO7O/gfnxy2jFf9Nf38rxtfjhjE\r\nk+9MbBETKhAogI2DLubp55jkpy+MSB/0XMtzZoPCjQnH6eqfhlZefqfYSAxu\r\nwHBpXibd1QGyG2R4Z8sPbySfE33MSgBfxWs=\r\n=wzQR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.0f5af9a_1659345609425_0.7717871846640527"},"_hasShrinkwrap":false},"4.0.2-dev.d1f8ca7":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.d1f8ca7","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.d1f8ca7","@ethereum-waffle/compiler":"4.0.2-dev.d1f8ca7","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.d1f8ca7","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.d1f8ca7","_integrity":"sha512-fzCLGlDIqJ7xgvEfyhAefyPYptPSeyqyxTP3+TfICW0j2B12/ZZDN/o30C8ofyXP3cHfWYWETX1VcECiDjKj7w==","_resolved":"/tmp/29d299c3876f9cfe6d42de8e17902ec0/ethereum-waffle-mock-contract-4.0.2-dev.d1f8ca7.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.d1f8ca7.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-fzCLGlDIqJ7xgvEfyhAefyPYptPSeyqyxTP3+TfICW0j2B12/ZZDN/o30C8ofyXP3cHfWYWETX1VcECiDjKj7w==","shasum":"0a4b249c68e5d4ee55114660841f94f0ade3067d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.d1f8ca7.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+quZxaMrDlJzH9HfIfvgjzxuyRaGJ8LJG8DPRmCYE0QIgQP92NsCA6T/zTP053meFf++zaGcFaRjqMQAPwD4tKDY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi59tJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmphcw/+PbOWTN+lbn4XufFjQEFNcyr8YC3jAyNtUKramZf9Px81j3Rw\r\n2Qo+Bqi7zHfjluhcRA/UyIYxRGODcq+UhvejwraFFDYGqoLcV437jwSIb3M+\r\n9cJKbOYI+hm3CENoSbpRPrzcbaSxqQ6MiWz16caaBP0oGOBEJegeK5wmAqy3\r\nYR0lY6Q5MwCrfzUSYXzG76YViyBe9M8A/o3w7R6J2jVXUzhVCSQMNI/RJQb0\r\n5uBHIBLlonEyMi05jl7Yck5NaQHgmmHK2BzrRjVTVgfc6+SI+JEoz5SGQUgW\r\nvcznN+9abwFgrcqGPvtN9sRsGbhgLiRUEMTQWNPjgpS/gDo9BaOE5Gi2L/ed\r\n6FcdvoLPANsntUfBoFsb9jwrhRlORSGAcL4IeKDKJAPJgVXn4eNMXFNKi4Qt\r\nPbLbJBSnEtVkxfgHvQZzFndOdOavSucC7OXfrBrKb99H56dO6FdKDh8J+DuX\r\n8DYFjEvPLJLBsdYLeSZqT/s9ZTK2RZQEcy5uPmAkLlFp3ljzT5VKb6gPk7NW\r\no7rZEn+9umaEHNDxXKUbpPirYvqpqgBOx3RWHCHfBU8qr78DX9/PbDYafrOC\r\nZ7Vc3D7srQFpn/JsJ4GcS7dRdhuRmYqFpronfy1DMONq+C+UeG/Frw4WNPjK\r\njXYZmhOF3X569fYelE4nzkgRwmNKCT0B5TI=\r\n=zKaz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.d1f8ca7_1659362121604_0.4675192562737345"},"_hasShrinkwrap":false},"4.0.2":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"alpha"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3","@ethereum-waffle/compiler":"4.0.2","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2","_integrity":"sha512-5TpyZ81pWbBx+OPXqnTfXqKEsggihIxIlCubICYgndWIHOZ5pBYhRXD6oYREx9+tdJK0+KB06u2g77lBIslbrQ==","_resolved":"/tmp/e521a1c949443ef585fbd603f7a1f3c0/ethereum-waffle-mock-contract-4.0.2.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-5TpyZ81pWbBx+OPXqnTfXqKEsggihIxIlCubICYgndWIHOZ5pBYhRXD6oYREx9+tdJK0+KB06u2g77lBIslbrQ==","shasum":"7e0b614d51acd48c71a8073a0ebdd177a999566d","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2.tgz","fileCount":11,"unpackedSize":224326,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUYHwhUfKD+MKYjfpxELT0XE6b8ehBvrbxIRHaAFiXvAIgHsiiZ0CMzExt1NCrxjaHWk9Kj8DlBafj5D60G/9+eJM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6N9dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoW8g/7BNEjpQpb3/zIi+vwfBcmgeBwCT231eFiXU1DRJolOJyFeyZe\r\ndfC+54V4XkD1497ONNEY43RCEmA0zdR1YQU5NiIPlyJEOfkfIG0jrjw5iA2H\r\nZkgBcQwMzSMiy5YPCo9AKj4TiNxuUw+As7fXQbOpNTJwux5icewuN1tf+4nE\r\nkdk7NUC/YVX8F/VAGC/n/+jH+GcTdedgfHQvmg/CHnSvlfvBC1FahAME1R/U\r\n/Ng+mPHW4k8Df23fX1vfVJI0ITTDTLrRuZEfMfbmd448YYK0dEaFcexL+FK3\r\ndTZ54xw6L5M790fpHsrdGkdV+Bpydu7PCcRDlXadvXE40xyj0Nw9CrWj44fo\r\nliIV8B+By4sgUVgvl4db6NWRTxnw3zS70Bf9Qx22nINzJenjzxUB6EzgSsYI\r\nuHtCcMgA001ENawE2oAkiBXlhHCbfy1VZFw8OPLwEeW36m1OUCp7MweXMnQw\r\nHIy9eK5HveYJzMoOcuPKOA/+/z5Pgo3Puizru1LWbs3FNkXBGsWEEWX45sMP\r\nigflFb/PQx3A6hJXyZeD9mqECiweWtuXuiADw9mIaB+bLwKQel6P4LBTnPCU\r\nHZNFS6tDa3kqO0VFw0AA+2cA4WUjlDn0WHCPmOsg8Y78wFAW2qLMBQbU96PR\r\nzgw9YBaBIr2P+QuQO8mGnoZtFFyRP5/TP1E=\r\n=JAxZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2_1659428701256_0.7912366536551925"},"_hasShrinkwrap":false},"4.0.2-dev.cae5bac":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.cae5bac","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.cae5bac","@ethereum-waffle/compiler":"4.0.2-dev.cae5bac","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.cae5bac","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.cae5bac","_integrity":"sha512-gnPLn1UMlAz9gQZvqLqSga+1YabErda5ChADYuuL1WuOSu+9Qv5LfBs4Y9472+YXzCC6O2naCZuYRRYpV2lP8Q==","_resolved":"/tmp/2cb5578f2b4626ed19e39fbc7361b4a5/ethereum-waffle-mock-contract-4.0.2-dev.cae5bac.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.cae5bac.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-gnPLn1UMlAz9gQZvqLqSga+1YabErda5ChADYuuL1WuOSu+9Qv5LfBs4Y9472+YXzCC6O2naCZuYRRYpV2lP8Q==","shasum":"00cf94d4f7594abf7043c351614817f5652188a1","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.cae5bac.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2S/9u5J7913ttmzHYTmnIFF2WrkXqV9q3j7CR/GCVrwIhAJaBwYbpvzUNRM+iV8orSCZ9OxhVkhpBLVTL5UB/kEQ6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6OAdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo49g//YJDqoFZsaCSwqkarc03kiRfEzvb7IdleYpZH1QPxQoy5/QHV\r\nTtY0sa/vKCAjy04MRLPuNr7+8VAmBQh1nqCmf2PB3WKIVB8jWPkVBfOzf5gn\r\nzTkv6787lc9UoQa0PWteauhl0X/h3nUywwU/pRjGksU/46a7emHESDv8V9AV\r\necc1xMGrsM95AFllhuPS14A3VViogNC33NBGrWKPyAGzCkvhyxXSIDXeFGRU\r\nwSMPlEWilSqvWRIov/IAMJTEseGlPQQ68W4/9cQE5RyAItW8TaKLsOJCLVFp\r\n+T1pauyzuNGkGoCMmczqbosvRC0cUTXXKfZPzzS5JyX8qvNKHxq0Wie9Nm7w\r\nnpAppG+5wM+NZzRbX0vzgWiJzgnUGL9nThDxVvAzOaL0TOy3NWrLLp7POSX9\r\nnynx48f7HoU42MSVDN+TPjdiB54iNYYmxDS7N3TrLBEdKgjE26SWL2ukeUlx\r\nY8AjqZThH1J/3WomfYoSVaTM2HPkZZEl5hCaIQN3ihMis5XDOJe+kMEiI1Qs\r\nAJFQ0Eygw7w+LCdIf+gxa+WEWOPBjrPCh+xGtSQdaNZZk16TusjLcogNhNCJ\r\n9v9kRkLq1GSiAKgifwWqqHk6JxRLWWtDamP5FgjtvABBVON5yuRkHQ1CmBTm\r\nKcZuKvKBTtlH/Aig8/inFJ0nvpFL9LZRKM0=\r\n=gTbY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.cae5bac_1659428893478_0.15188087769237968"},"_hasShrinkwrap":false},"4.0.2-dev.41bc646":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.41bc646","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.3-dev.41bc646","@ethereum-waffle/compiler":"4.0.2-dev.41bc646","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.41bc646","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.41bc646","_integrity":"sha512-02jvUUPX+rtUogueT7Wr8lu7jcucFbtAZUzMKG0sy+Wx8hJJsnrHh/TxN3uNNfiA8FDBSkX38bVJpjsT6boj4w==","_resolved":"/tmp/9dc340cf7299ca0e9f74c78a105fbd95/ethereum-waffle-mock-contract-4.0.2-dev.41bc646.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.41bc646.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-02jvUUPX+rtUogueT7Wr8lu7jcucFbtAZUzMKG0sy+Wx8hJJsnrHh/TxN3uNNfiA8FDBSkX38bVJpjsT6boj4w==","shasum":"45fee667253892cca56a34d0d4516cceba02f228","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.41bc646.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDL4Xb9oO2JgWsTOB2UEIEFPCdrTr4T7Gt0VvgdQmWwLAIgcfoN8y5Olkt0nDCHj6kpwBE/+GBohWa2J+65mmvR+O0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6kMwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoLOA/+NKws/wdYdOO7yehmEkgGI47p+yAS2ZcRkiWraEC6Ld03eKKn\r\n0WEPD7lfwwx0zqiMyVuaCqJos0HSdViUmT0Kpk0hEi9ytalLVv//NzTb03PE\r\nneuZcFB/eFHf1S8/Mf4Km/j0VYGnBh6zuwCpS/FQwPNaTBvGt+rZkU3jPOAc\r\nk9y+9q3ozbfVFj0OQckoAOQIQnEAdXg5m/qk7Pv2qMGvcWUA+NtcewvRtptT\r\n5nHKD/uTmgsTCf9dDHsXoAb65KI+fBDiitKl3Mu+1hhMldz7sWq5yCCQ8ymg\r\nkvPsdscz0spk+TtunDsTE4fm3F9MaWoCEusMUWnVH+lgno4aJAuXnw7DrG3K\r\njFeGjrlp4VfSraIjfzJ7LxYwKCf/edewbuJ/eKPcXth30S86njrvN71ZCjwr\r\nE1oGUI6P3Z9q+AaNEvC2mXI4zxuVbB+nemqI8ltBb5PPzEn6a2CB7cmgR1ZD\r\nvLpDKRLI+6bDG/k4nFM1PJJaHBWGQX6j1y7/kBu3p9ZUXpdJqHRRq+JpSBaz\r\nW4LjXWdZCR9A3tu6IMsULaQML4dgjLOHZp0N7IEC7G+6nSNToLJ6Lg9yyaxC\r\nIjFtd5Tz7LJJ5N88sluLOVZmCW0+TCVwD0c51J7kVmTdIb3EXLFJ0XC6BkIm\r\nBRuCFu0kje73f1sqGMmRZUj0c9uua6u9os8=\r\n=YFh2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.41bc646_1659519792182_0.963941679703787"},"_hasShrinkwrap":false},"4.0.2-dev.18b219e":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.18b219e","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.4-dev.18b219e","@ethereum-waffle/compiler":"4.0.2-dev.18b219e","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.18b219e","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.18b219e","_integrity":"sha512-k04UKg6kMo+CrrzJcxn+hJbc23PE7UAhFtYUaHfGsN2GEjE+rWIcLGxNreGZjXcGA96vLlgkGoNq2oH3kOkf6A==","_resolved":"/tmp/0d5d7b10864a7515abcdf8d95dcbd31a/ethereum-waffle-mock-contract-4.0.2-dev.18b219e.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.18b219e.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-k04UKg6kMo+CrrzJcxn+hJbc23PE7UAhFtYUaHfGsN2GEjE+rWIcLGxNreGZjXcGA96vLlgkGoNq2oH3kOkf6A==","shasum":"7390f31f8942db5e022d06bfd894ea27fb92abc2","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.18b219e.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDCeeGdsIJkaN2ajXzwRxRSB93rs8Md7Jg5QeCnj3F32AiBwd2P/oJOt3iNZrNpNQiicnXTaPcW9pmuWzw/EsqhNyQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6kR6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrDwA/9HCiHA7iPN6IKgmAxtHnxULjWFszfwUPqn27up7JMIVpbIPVq\r\nzQtmsS9qRH9cTnIyGgxoSPTxyIoOh2njlVtK6N73RXrM9O4YJ7Cj7KTJ4Bb5\r\nLjbu7YFVo8uT40Xm2O3S1EMYUuA0sOK4bOfykCQCngi86Trd/hrI0oBR2lz4\r\nruviN3Y/Lk29Xxg639LXL4SDW6eMp0pr5z6nd39P4S56MisdI3KfIgyG+hd2\r\nwChhFa0WIxF6Kl2UosQOaU01i4CtBYD7sok5cTUj3P9hh9nXn3KD9LMhl1SI\r\nnP8efbq3l7SARveag2pOmDiGLkR6534/+eI3rdQQHNEL8sVENbwGjiUkpxG0\r\n21FJBnWG9RyPv5PhTFSuaj89FIqd07/myf+TjQNJEMMHc9X0Kfz46RU+Wh2p\r\n1WG8O6Zk7nGUXxHZzaSY9SSnHQBv8H7NwG0RqlmPyK7hqZ9d4LT6vAC5WNqh\r\nEfPTIGjWrBSR8a1g+Opjf3MR64hxoJkLFp4UkymNO28ylf6IR439wnJVuchL\r\ntF9E5m+NR7EZO1dfDuNwYgsackS6CeLbIi0bJFBr4JKY5CNC0Q9plaN2wUom\r\nKSNgYgkXyzcvuXL70zr6Lrva8/gYCNosTiJ+5rzzDizR1u6QvtoKNYrRND9P\r\na2q1XUzSOAK+qHsCVE9IUZBA7jrERQZ3+2k=\r\n=PSKm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.18b219e_1659520121831_0.5383005852944314"},"_hasShrinkwrap":false},"4.0.2-dev.e7e18f6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.e7e18f6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.4-dev.e7e18f6","@ethereum-waffle/compiler":"4.0.2-dev.e7e18f6","solc":"0.8.15","@ethereum-waffle/provider":"4.0.3-dev.e7e18f6","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.e7e18f6","_integrity":"sha512-BiWvsnnzavl11CPINbRzIvEv/J2e0QyV/Fq7e//aDx5vSUxE0PuK2M2LF/Bu04oZeu7BCVjNgSU+9kZdVhyjhw==","_resolved":"/tmp/00ab366fc70c33f92a477236a2939a7c/ethereum-waffle-mock-contract-4.0.2-dev.e7e18f6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.e7e18f6.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-BiWvsnnzavl11CPINbRzIvEv/J2e0QyV/Fq7e//aDx5vSUxE0PuK2M2LF/Bu04oZeu7BCVjNgSU+9kZdVhyjhw==","shasum":"82643f51cf80786e6606e647bfc115a21dfe02b2","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.e7e18f6.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBkeQlXDxDK7Di+zAdsO0LBgUTAy3hKApG67aEnX7jHOAiEAmE/eKGjM+NjXCmfroI9GhvpQOsrR7VMc03hC81g/87w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6kfkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCcxAAgb/xuCwmTKajhQfTPTUBnoSH93+2yQ8uQPbkJgALcZqTWsgU\r\nvg7QppXZ5D5KqIpbblY5Bs8QDkMvPq1kb2cldl07oXN2aRIklx5Qn3VwEuL1\r\nX1SfhchK1g7w469/094b8+/wFluArtLx5hwN1ghCGLUAjLWmh/C0/ZDOfBvh\r\nrRFpIU7dck66e/vg/CME/L5dNWoGW0Ee+gOUs/uUFRStz2qNCJpKi8ULWEZV\r\na7uHHImhvyI8lUl+lFHe+sg52EPNMknMHszCjsGm00XllgvS1Y2yiB5036N2\r\nb6cQGDdFGgYnBh2u34lpxltgvNNOEtNOi/nHQo6t3idComH32omfHNDNFHf0\r\nyQRTSKXLiR0jnRZ8JLHiuDLIdCn+YlpDwQ+vVOU3cK7FXM6uteZxk/HrArf7\r\n9YARRNUQB88w8vLcIaxAhRl3HzqlZ90WmE5gPKE8vCmEzNYiKKOF27PI17Vl\r\n7KPQxxwUoWOcOMiAMNnuor6QcC9/5jpw9tpFPO6B1grMtXlnhXxQwGjgLI4R\r\nhY7nafdVbyHYYXcvP3sow/MxokMLbDml+cd91dXDi6UTY8pBSJpbnFckxrWF\r\nU4/0HZMuF8twfkoGt86ZLswUzo9aFr0FFPTccY4Mf2rrLr21s0F3ulvL1Bsg\r\nt8TTm3R17GlBOGft6XNGk9ReLzimEihYyZ8=\r\n=+VdX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.e7e18f6_1659520995847_0.9615749578802391"},"_hasShrinkwrap":false},"4.0.2-dev.8eb1578":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.8eb1578","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.8eb1578","@ethereum-waffle/compiler":"4.0.2-dev.8eb1578","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.8eb1578","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.8eb1578","_integrity":"sha512-soX/ZcgBDH8lM7wRPp3I1Rs29bkvLsm1pQPoDLII6/pV9JqfhsVhHFrUhuqejttyvHXU2zB8zQsIT0M4Z5tBng==","_resolved":"/tmp/7885da7d321149d820e4e5f3191e54cf/ethereum-waffle-mock-contract-4.0.2-dev.8eb1578.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.8eb1578.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-soX/ZcgBDH8lM7wRPp3I1Rs29bkvLsm1pQPoDLII6/pV9JqfhsVhHFrUhuqejttyvHXU2zB8zQsIT0M4Z5tBng==","shasum":"00651821c5954d4aa7d9e4464be26176887529e5","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.8eb1578.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAN266zakrL35/U1S9+DL3gk8s96hygmUkai9upDMBFXAiAxUw5j2WBdzsQKZAMp1eEkREGTexLr/g9lp5FHXKq58w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7PbCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpTkRAAogLcufYJNe9x0ngNEIArCqmEspXVp7UEKDJz++zqJ6pbEy4T\r\nXKcwyI7bsQUfoZTXiMAJxerJ9cCNWuu+ZK7g8xQV9Lm4vra4/Cth0KleYK0w\r\nv/cJwEqconhxJ7XGM3t/JKY3kLZivgd7erXh6srlAyL+ez6N6Pvf4j4oeu8/\r\n8lpPbmO+sj3PcEH/p0hNUq7Ud0xYY/860tTXWWvOLbEHe6nEjRQAwop/sSMA\r\nujvfmlXriQwUPwaG36VIiYTHaHwfzSK/8CqSNABQlV5gJ9J5C/eizybgLfsf\r\nT6A+lZhXeGTR7EE+tfxjmQj3uGclQiln6OGlQjwz7V5FEemE0Fe0rRadtu0n\r\nSntYn1CdBsSadKas62xozr1DpNVb/SZP0UpWP+EirVhk/v1KTHFQPB7kuZKq\r\nvWHoKy3jBoA18nVYiAEAbzLwtDfFzUIi7+lUjjixMhcabX2sOtGWacuA9uoR\r\nkenkcnXQCuWeo/yk21bWNWVtQaeCaKeTvtgzDihcv9xIZ8fhycY2RN7sU7ZZ\r\n0ppR+BYlxXj3T86dwxrQBb2cHsTZjlrGmlurIRlAoVzMknseSxarDm9crHaJ\r\nRSt1sUpV7jof/TkcZglLQNhFq68SJ5esE7me0YDvNtAY9HZrMouBexuQpY2e\r\nJVJV3UbcYSfQIZhSa8HnSuNbjYm2XlYNJ+g=\r\n=F8YI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.8eb1578_1659696833822_0.3347808140151747"},"_hasShrinkwrap":false},"4.0.2-dev.e22c4e6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.e22c4e6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.e22c4e6","@ethereum-waffle/compiler":"4.0.2-dev.e22c4e6","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.e22c4e6","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.e22c4e6","_integrity":"sha512-pwt5R+Rg6aM/rjBGZsMJg0wjj7JAwNg9c2qilvOTsCxsRqxHDkb0EoCcC+2rbEaVbMyY7gq+a6PBc4fkbcQGJw==","_resolved":"/tmp/b3255b1953e6f9e1915b7205afe310b8/ethereum-waffle-mock-contract-4.0.2-dev.e22c4e6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.e22c4e6.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-pwt5R+Rg6aM/rjBGZsMJg0wjj7JAwNg9c2qilvOTsCxsRqxHDkb0EoCcC+2rbEaVbMyY7gq+a6PBc4fkbcQGJw==","shasum":"62842fb1b76f15e3c958237085c6f1b8a9fec63b","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.e22c4e6.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCe9Jnou/r4vj6s/HWoWOm8TvMtqBYS7oR1z8tomCtWdwIgFT7zd/+aV0zxFwVRVImgyfgCrVWgYWoGNLBo3M6DhN4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7RXnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrpBg//f0B7ZXJtlnRyzM4rqanxtmmToxn9d6ZIY8haTg6kPuYuhsOX\r\nEKJAWjPlu2GnIzuFtjZiJLnN5uVahAgyrmFwSvegYFuo+9XNyy4NwUTx/J45\r\n07A4ctrWkK/qypoSFjUnvVLnHmEmkuW2Dxmjs8bOU2gBFp7qQ/g7GVK6VjWg\r\nPiKLbsAOMQvdQyytBytVLDhRz23mj9ovwqDJmdqgjXzL6qQNQIsTrM/oAv4c\r\nXFqtyZ5wIdD5QyJuBAJU+vgis1pg6NC4x77rzTqbNhIxCbaquxkyJ+I5NQUu\r\nIazPoUsMlrL7sFR9oM6eYunblOFiPaOaxqLs7TuilghCJPCiB2Q69eMo8ACX\r\ngZp894vOiHFcGgT8ioBB6x5Yoo7B5aoa0X21V7peYHSvMjayJXqIpdaIj/Dn\r\nesO2kbUWV4ysbhkZnuH6hFh0FzPVjMxuaRJgB/a1/Hj09BNOgrBCzVNekmhx\r\nFVzHIDEglslthI8D1HWYNJ/Ntcn8uAfqJSP4CmtqhxpFbWi77HJ2pfjakJEF\r\n7hwfNa5xnLTBtYKdoCP5mHb6SKMt3NX++hKsZJRkWuZpVQpE/Gl8aRvyJ0tv\r\nsXxF/AW9GYVawkmP5OjU5HaIJX2JsAXaX6LhEK2mIUjVNrRT7IsFlfL/QR48\r\nxwBPmGPC3+RT/UQTWb1KrUdGa0Ae2f8hw7I=\r\n=gUT+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.e22c4e6_1659704806827_0.4959456415005634"},"_hasShrinkwrap":false},"4.0.2-dev.89498ae":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.89498ae","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.89498ae","@ethereum-waffle/compiler":"4.0.2-dev.89498ae","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.89498ae","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.89498ae","_integrity":"sha512-9Jp+iVQ+kzoBcAGcaeZ1O7E2OlmHYngArhQ3KeXnmJK6N3ybd1gj7cvT+ufdKv2TzNIzlBlPKNvY4Ov+ZhzlUw==","_resolved":"/tmp/1ffd9b0f6af2674db8db4b3c81c78a05/ethereum-waffle-mock-contract-4.0.2-dev.89498ae.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.89498ae.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-9Jp+iVQ+kzoBcAGcaeZ1O7E2OlmHYngArhQ3KeXnmJK6N3ybd1gj7cvT+ufdKv2TzNIzlBlPKNvY4Ov+ZhzlUw==","shasum":"873fb4102d80522b089740602aa9f1aae4cc3bee","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.89498ae.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDiVBlLBhkdqUVGr3Kj3aDg15HedGNfO4yuD+YYpmHGegIgRXei4N5vmdcy4eAQB2w39VH2EfKMZpfgWgbaiTbfwZY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi84abACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq5wQ//XdpEi+0q6+IXUxDaZUm4ogeFC0gBet7985RABBjtqwzG/TvW\r\nYpk4GpQaQ3Q0zdCeF2x3PSG0fSGrqBSsk3J1e0epxFa2BLd/Z+u8qKix0Nsr\r\nbgIwPt+y1HXBYzz9tWcJt4bAu8c2PYy6qzAl949RIs7mN3H1OI8hDOB1pqiI\r\niEFXjs5fItl9AbXYrFLWqyUPGGvtMQuroI1ANKdyPpKQyVQg97IkyiddugUZ\r\nOLc6rgp6eduDZWSUV76SN5Cju/9dn238asoq2o2UvJytVKRPsLVK2hi030mw\r\nen7hkUOwx+hrsLgz4TWtE3IxHskXBC2mZFPT63LHdwbep5r7HzU/BLRAJkWs\r\nrD+aoMiM71seuqh+oT6JixFnbRuzykVXLh/sYPA8C86AqY6wGBze1hm4QXFY\r\nNmreOVR2lcwoFOi6NiCfw0fPOPuG/FbkGRqK42DmqN3OuSWzxG/vR5lu0mWN\r\ng+nBZeHYSojz4tzyT1trogdVsH2KKMWSqEyB9m1QuJmpREStGSHdC/TMJHZD\r\nEoeilXrN7IEtfYcPNu52oeJIefCSlMpTGfBSS7kdMvOvTF8RQG3dUrkOVLJg\r\n+dRuwO3xkoHZqsZfgbkRZnmxkBpbget69O5XM7qLqiPpZWPOvd1eAypm6grs\r\nXioCqnIERZ01C1+eKcne0UXPoIeuSVVmmkc=\r\n=zmVd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.89498ae_1660126874921_0.6250721320669332"},"_hasShrinkwrap":false},"4.0.2-dev.71e4b73":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.71e4b73","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.71e4b73","@ethereum-waffle/compiler":"4.0.2-dev.71e4b73","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.71e4b73","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.71e4b73","_integrity":"sha512-TiAn+bIiwmwq2JQyv5F/5AnEOYZQVOH/FpmJ2zBSIhizFPDYTBtWDuaJypWbekgLyw/+9QPzuGY6fyMbY6j08w==","_resolved":"/tmp/a173ff549f6bebe9b2b85ec86016f333/ethereum-waffle-mock-contract-4.0.2-dev.71e4b73.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.71e4b73.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-TiAn+bIiwmwq2JQyv5F/5AnEOYZQVOH/FpmJ2zBSIhizFPDYTBtWDuaJypWbekgLyw/+9QPzuGY6fyMbY6j08w==","shasum":"c5ced568e81b7384deda265985129edd016a6888","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.71e4b73.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGmXHd0kkeODkDFGEElU0+rK1QZECVvIDUrcWj1CYcu7AiEA0pwF9fTuq/r0D8NyB1qwrtHDYe+Sfr44tgkO1lit/wg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/2aFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpYoBAAjNFiDT5YnJ3B9ohBoHw0Co9/dh513aAb4YhxzJtlu87HITAH\r\nmoQv+1M7/IrOdrwNg2c7M9BRvegFWTfy6gptlOuPGLSMDkNiLktXABgQW3uD\r\n+3k1CqSGq8McDBgFKUHJufgM2uvk/qiGYcjU+0RIGYLm91nnXRCZITkqXSzr\r\nKk8gEetWcIHF1PXI3dXfaJaJcv+humnfqgRpo2kS48Wq+7bk+yb0D1PuQTr2\r\nBRuyNgSXEpRUpcjhfLpc7chGdeQipr8ztX8ant5R9CRf9d1ymyy5eGLG4P9D\r\nr0dEZkDQWYrwYCnhxQOYrzdVQCwzjUqspm8LsIZxNKL0uWMDnTJ4iHk+300U\r\nvXp0uIVwoBGpObdYPQJHONzWuhraIBlbXQY2AVFgjPPG9ooLZx9SBrcTqXKr\r\nIr9aEnRNhuYljzZJYBAKVmymU2ly7TiTECSdaIaGsP/cFk6foPbGS4rmKXG6\r\nBrZe6XXJDoB5YN8fahnllWPnXWOXgbaiO8uflztGjeP1SPsFknl7eIETT08/\r\n9ZtwU5mYMD3Qa0s9qIrKBlNARl6sZDnBHNg7HJhSOlBMwXpnF9uwRMC1wxtp\r\naM+K9iT0AkKQ1m3r86/XiAyuhIZZhDcqe7ExpD7fh+gTgpUQxhjB2Ozt7GhZ\r\nerRbzFLSXBiN/4afnDJkuNhkQXEdPcK2Alk=\r\n=dWPb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.71e4b73_1660905093714_0.8412229277566305"},"_hasShrinkwrap":false},"4.0.2-dev.2f8bbd1":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.2f8bbd1","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.2f8bbd1","@ethereum-waffle/compiler":"4.0.2-dev.2f8bbd1","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.2f8bbd1","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.2f8bbd1","_integrity":"sha512-yENDoECNhhwS0qKKTGyUebE5A+Ae2oSdLPDWAumgs6dFq+ab7kQWIx0sOzbhZZ31jAVC6F4zyHFfniToxGm3Aw==","_resolved":"/tmp/ed292f61826e1fa4b0fbab1d35ffb3dc/ethereum-waffle-mock-contract-4.0.2-dev.2f8bbd1.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.2f8bbd1.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-yENDoECNhhwS0qKKTGyUebE5A+Ae2oSdLPDWAumgs6dFq+ab7kQWIx0sOzbhZZ31jAVC6F4zyHFfniToxGm3Aw==","shasum":"0169e6c1c5dafda70d0c398471be18a1092e84cc","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.2f8bbd1.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEXf+DJmZDzbKmq3VmGRjtIAHWIAO/v++6XcvAMFuUJgIhAPCnlTHxBO7Z7gOHzhAn7JMtwKXBRmYEbQ62HV/SWE/o"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/3inACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2nQ//TCBQ7aUkneNmVgQzh+64ttiExbFhPNk8CYaAMGEIWSn8DFZo\r\nlzcq5GatZVPSiEOtzp1TlX0TesOtFSzP28i6qoYBhoJJoHklsJx3BTaIt0gl\r\ntJxpE7gdmvHEbbMvguewA8EmWGOAhFKoKK46p877JH2NZaxAGa7ldSM1ud3l\r\nCyQca2RyEaJBY3O1B35xl9rO1twTbX7rjP3YjxF5rfkuZbD1RiuPPHdUgc2K\r\nubri2SNHSePfPwyEASEunNEREnSoQ9XRh+gWm8unmy4vN49SzQGXoicrA4D5\r\nhSZvVkLo0t7mb84nYZHmDCscnhCoAW9YwP0fGuTbj3jRy6XPLzjSAM8Hw5c+\r\n/6mkWT+0Bbl6KMn3vuX9HM5mTnahBq/CaRkv/OBh9qxsliU2UtcTymkohWxt\r\n5/yutCqzpPhfXNu18Woq2WQtnfOr32A6yydxB8Ijn1ckPH03uwntdgGI3m4r\r\nWjg3BXoUv2IFBHEunkxaM7TRfYP13BIIxGfEKjviUPjGU8Fq0AjHhDyf0LEp\r\nMKIwJDGxYNMu/7RnDQ7WH1tOU2Ekl7c70W56pjdjrFCjN171SimKZCnbEwPC\r\nNfOXanRrfp+Lr4x4awGXtjQY4zzw5FGKxtDprk/cC7Igx0ubfZeKyWYlKgQ9\r\nwxhoq/ddW8jI4K9ejCNHKyNl+Ew73wGntu4=\r\n=LSVe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.2f8bbd1_1660909734796_0.7882198175370838"},"_hasShrinkwrap":false},"4.0.2-dev.b96f0af":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.b96f0af","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.5-dev.b96f0af","@ethereum-waffle/compiler":"4.0.2-dev.b96f0af","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.b96f0af","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.b96f0af","_integrity":"sha512-CuorLg9gANBblrVBMxo170J3g0xesphcjkZwqX9NBZq58ivfTpZWIfHh4fipCTU4MeDnSDgHJk1hxViv2YxIyA==","_resolved":"/tmp/c6bb75926e81796fc01405e088c8d3c8/ethereum-waffle-mock-contract-4.0.2-dev.b96f0af.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.b96f0af.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-CuorLg9gANBblrVBMxo170J3g0xesphcjkZwqX9NBZq58ivfTpZWIfHh4fipCTU4MeDnSDgHJk1hxViv2YxIyA==","shasum":"8808a5fd0d79ce3f987189b6f1e3f2c6fd0e1554","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.b96f0af.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFjUY6EELfluIbFSEWQBp9G2diXz1kxBaMO5HhWkyTsLAiEA5wbBDnUiR3bkQTCTGq5l6fzIGHWqNQopXZnjQ20Fbr4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDcn3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrR9hAAgRAH9Xbl20+yU5vnJwJHRS870HDEGt/0dYDzWgtA4ouBCrgL\r\nOukCRrflGc86narZv7UN/ruY5pfk0J7FehoEPl4tWKqPCVlhHZkpNhWYY8Uf\r\nnFrqsBM2WK3JwJljLNGzckWiIMohluB0Ajze5fKz9Y1ExHTTBXVBRDqL6YeW\r\ndOuK+LCXKKAjog99DjbITWSpDofFMMl2bY2brLQe+c5vmOiARlVjM1XWdxU6\r\n+Yppb45BmHlbZW6602xxACrdhg+7tYrWzsLMcL9apzBTOY4pE0+zlDXETyRB\r\nTB1BJVpjiHJGVMeMPrXTlb8jSXV/aCDLBfXGC9S1oqMaNnEB9UqY++gsV/hn\r\n4MM+01/jdiJTEiq8Ykff/V6vkTpWHXOemi70ugi+CtQWi7JpN1IUZ+DJrEAw\r\n+gUfnnrUHgbkcJX1Jj89iteXb1tpZybhsJINnL09sI4cPsXOmSJM/4gNVKog\r\nJLPt6mL+tlvS07EwOwdKyf2GbuT6imBTlwLpcSSbWgNecN05MgQON4sRyAzY\r\nIK53KLODYKrjLA/TPMNWrBZrj96LhNsNCmZOsxLmFSbuNL+3OpXrfFVv1kTi\r\n9KXkzvuBrHrIGbc8murlWP6P4bbNo9Iw1QUdrpEt1377hHsZ06JG6/uWWauA\r\nNuzH3/BVpHjNbK6kJnx/UoOi0vGhWglKig0=\r\n=RJZE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.b96f0af_1661848055247_0.4907062000939588"},"_hasShrinkwrap":false},"4.0.2-dev.f0bea18":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.f0bea18","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.6-dev.f0bea18","@ethereum-waffle/compiler":"4.0.2-dev.f0bea18","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.f0bea18","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.f0bea18","_integrity":"sha512-2CipqD/S5rav5xV7zL23SjqmZq3hlWFqCrTfh7Mb0varbonDhdZnwR/YOObSzpttWEV+9EPI0aEoxQ2/60He0g==","_resolved":"/tmp/62e730a78a30194262111b08b9a17889/ethereum-waffle-mock-contract-4.0.2-dev.f0bea18.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.f0bea18.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-2CipqD/S5rav5xV7zL23SjqmZq3hlWFqCrTfh7Mb0varbonDhdZnwR/YOObSzpttWEV+9EPI0aEoxQ2/60He0g==","shasum":"cab8ee75f473efe744f626504cf88e43aaaa2d8b","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.f0bea18.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE5yK4YQLkhnckf5TngW6mVvTVp/Z91sGekfyBC52WlFAiEAh261vgBmtou/GrotZCOVmRAeuZuIhkeZUhIcu/BvF/w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDfBsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoqag//YB57OC7zYLm0TyF2wGyI9hQL1cgwuJLzwobIR3Ym9SNm/1RA\r\nLW0K5EMPLWclUuaqGHWfDLGEg1c5VR52jUriF9/1B7zVeGzmenhd4i6GvNJ2\r\n4m0ZumIfMzTmz8gi2X5I1Bi1mIIKpMxPdtO9MDG0HeCJSaKqHUhKDNsqMFpX\r\nvUY4GfhNgVM9yKJ+MNjXmsCTReaQzKqvDLW60svXxUAV4hcFfomEFvx4VRpp\r\nvl8A3slqxjTbxt2MM0n+wKANFBxGUQ7PnS2I7Xdse+Z8eOlcK0yGt6TTARUr\r\n7h2kpdbL2TZMr9JRTtbzzdHpaMK85Mi08Ao8rBX6BCf1pPO/heK77pZHZTQp\r\nyLlEM+awyNgZ6k0mQ+qXeC1ypbiQWJtO9u/qywIvLqNDbcVcQdYAUsp15MOG\r\nfIywU5xKaHjUEyEomVbGvfGyIvVulq2OhG4o4un8rCV2FrLO73+c65o/OLmr\r\nwnawpUsJg3ds/0Ld9REh5zY5aQbRuvjAGtisk2sc78qZXl+GJ5YuWvWRoume\r\naFAMLHsuo5fakIDGbeQm9UZeQ1aVUrvsGqMYQoeFqgqrRxTvqu4qtJb+IwEX\r\nWjeHetVlUf9O5btHwsQTjT4t3yQMOYD0czC7YhBfzv9GZnZJMzd7g+bmo3n7\r\na3rLFsTaW6JWRWYt5BdlEoo1rW7+4rcltEU=\r\n=T/Bm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.f0bea18_1661857900395_0.7836158223650571"},"_hasShrinkwrap":false},"4.0.2-dev.6f16299":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.6f16299","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.6-dev.6f16299","@ethereum-waffle/compiler":"4.0.2-dev.6f16299","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.6f16299","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.6f16299","_integrity":"sha512-KjGswhUH5gVw9KHwi1sF1Nl85FngsNg5HS2i+oQOB44RotpXYKlWN7vrqJDGFB8TnG1j7hvnbOVKIbjonXhMNw==","_resolved":"/tmp/b7367fe8b90df089a02d2bcc270bc91b/ethereum-waffle-mock-contract-4.0.2-dev.6f16299.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.6f16299.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-KjGswhUH5gVw9KHwi1sF1Nl85FngsNg5HS2i+oQOB44RotpXYKlWN7vrqJDGFB8TnG1j7hvnbOVKIbjonXhMNw==","shasum":"602ec7758febabcdf9e583138a7b8147815cf708","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.6f16299.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB0+gLDDBXk/eheEzkztghzfwuVGcZD3Dv5MbG+mADDSAiAfD/3byPU6lrimdWiseI2s405uE1oTNPx2Sz+7wlt96w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDfXVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoawA//boHfJODWbl6+fipQzRBgrD8D/FM61Q/WvGhPzxiQLGSQ5Vnz\r\nXjMSzS1q+M5JmrSwXxMGwoKzQLpp1SNxe+LnH5MGuhRq/IEQfl4frxZnVwr2\r\nNJ3mjmRV7jrTwlb0qUCrJNg/h1mnbMj/yxC1s7fjKF9WW0jDnzoBSFZjDHFa\r\nqGCo3UmrIS/aZ3NHnJk551hj4AXPS02JqWDiYOy60YgDp9z3DRVNN2UnFil3\r\n3CSBwXhMaJqEUrPcKLqtW1tRFFcEa9BElF9djhB9BC4+2X7kKJQIL+JFcIp9\r\n9S50ZePzvB1v0BaCeaZlSWboPw7gMJHyjxmbZbFxM7wbpGlzZVYWB/vs7np0\r\njogZVGyL/xN8HHtAe+6DeUx8XMEB22mu7CumJhkbJExDaeSaj6yeCGo5kpXS\r\nJvMLVrfKPhY0wD4K1xT5wwqmDipKKq6imGxI6Nc7MInQaQ91SMaFXvwRKaa7\r\nvZalcfSg0sEF2gMSBFim7ij2otuIDV2srEEplCNqLF5305AAZojKX4D+myGl\r\nvMuHmUp5Xwxbm9N88ioF8C93FiKk9fimGKawWPFzFwwwewPitFFWdsYhCRNF\r\ngtJWF3PkdJlFda9Cb/YpLpb4hyYEvMxcPwetGYMJ90iMwk+Bk0kH6FGM30c2\r\n5kDD/TVoJepn03EozJdy+wuOpHRwCAkLJz4=\r\n=9O+4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.6f16299_1661859285010_0.021161819082988087"},"_hasShrinkwrap":false},"4.0.2-dev.60ae4b4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.60ae4b4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.7-dev.60ae4b4","@ethereum-waffle/compiler":"4.0.2-dev.60ae4b4","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.60ae4b4","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.60ae4b4","_integrity":"sha512-XZccdhyVNR56aZf14yN42/KHzlLvUn4C8IQvj9nLm6U7ah3RP2FG/Z0vLs3yLC9cOTeiQl9He7ufNol8w4Pcwg==","_resolved":"/tmp/02ba77c6d52aaab48dceb93363bf829a/ethereum-waffle-mock-contract-4.0.2-dev.60ae4b4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.60ae4b4.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-XZccdhyVNR56aZf14yN42/KHzlLvUn4C8IQvj9nLm6U7ah3RP2FG/Z0vLs3yLC9cOTeiQl9He7ufNol8w4Pcwg==","shasum":"4546dec15cf720ce88725947c0326438566376b6","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.60ae4b4.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBLpMFvGK3IdJAvw1U+2drjINR4mi/5a8CEMVHJMi/OqAiArAWrpvIeXyWASJ8G4KyAXbzda2zyA9p4Spio13RPSMg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJHzkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpS9Q/9GMngnNStCqDFp4zwTnbpd5UBdtyJC1DGCH9qmBaer0IwisPI\r\nKTfFZ/6H7lxsF5ne28hC6aLhZCOhB7sFox4BaDFvxNGQn+8b8nvClG3XukiT\r\nSyO+aVD2l2/t00npLWlpoo6ZlvQwjKsj3hQzKyrr9F6upvQe8aFSFBMHLmdt\r\nacsK5eUh/QAqjEXVRdf6JJjNgEne+gmmsNWEWVA10oJsAuEx8PeZBJNQoYTv\r\nyV+gz1c7D84N2Qr/PA3xT0pWH3Sx9tJTZoCf8szk7W2WWrLYlwC1JGLmctHO\r\nuKQmYIJnTrAsfX3XD97fq2URj1RZ1TxT+Wlheifl+ObWJRobrpUatbM8KuY8\r\nDu/0VwxCWIUN9r60WOXFRR4gtY0ncrirmT7pDQwhfmcJH6hE/k3fVtLVvYPg\r\n9RoozCqCmMJI0a9PnEUIfZrwh8eUaQ3Yp82pkCfzgD06IRaGeJb5YQJB7hNC\r\nNn5flyPkbrxPk+1i8zSyvIFfjk+w0lWGX9SbhdCwR6GpcS1A1ml3QSHJSha0\r\nVnPEbgsshRyj5B5N01DT+3JUcsH8ZtkMwX+vunXJa8bIo2GQG9Ntm0dZJBzz\r\nesB7Knv+ZJJF2/zQRZ58Xwk3SHPju2Q45/4717LXxy97RigVqjqYjoGTATQ7\r\nhy68HkTCSv0+k9CRxTwU2IuXjz+i4XXwriw=\r\n=GMCA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.60ae4b4_1663335651962_0.8550036086591228"},"_hasShrinkwrap":false},"4.0.2-dev.2d19dde":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.2d19dde","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.7-dev.2d19dde","@ethereum-waffle/compiler":"4.0.2-dev.2d19dde","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.2d19dde","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.2d19dde","_integrity":"sha512-FOQhsU6Mm3bYaj2LLnk+r4aR/9lkEJYtuCBFJ3ZdOVvDD1fZyGqRnDrSZn8RsohTj1BXUbSTt/9SAmZESRNhJA==","_resolved":"/tmp/97ba0a864e3f60bec193db41b1f884f0/ethereum-waffle-mock-contract-4.0.2-dev.2d19dde.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.2d19dde.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-FOQhsU6Mm3bYaj2LLnk+r4aR/9lkEJYtuCBFJ3ZdOVvDD1fZyGqRnDrSZn8RsohTj1BXUbSTt/9SAmZESRNhJA==","shasum":"be542b62e2855cabba5c5bc1080b1fba56a93dfc","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.2d19dde.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDNh2C7i8XlPyvzpUfvDBGliNxcnAL5pffBFHmpDzqc6AiBt2Ojx040Q6O0TjqT6Arpx4TR0W+HSraZh0k7U34UnJg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJH3vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQGA//U4ZPSYWb5QdAmC3uASA7m7LMZ5XZSBl8pHcJFxZm23fE1hxV\r\nordbJDJQbjFvWRCgz+/FYi1GCE91f1smyF4yg9ANUnkMTgy37nuua0GOPW7M\r\nf9Mu0HH+t3M3j5slcZqOtA2iVo9Zwts4eB1thUe9dq0RdKY/sNzFamIW/2Kq\r\nfWzTJHsG6EEtYNtOxQpZ9UmL1lvU8+zpzKRvKX7RS3DRD+hI4PnKuRvkirrR\r\nXqyuxe0lWdOD4n42nKHH1U+Xxgfy9mCxUtmYENy3sGHsTZtnOnjTXay9pbZK\r\niMpAA2Z665n7gDOjCrhP4itk9WM8717BfzWccse4nieIHh4+gyyylyK8nQ8D\r\nHRuscugPiR8xkMtuV7vZFLL0Cv/33EmTlaDoof9/WuEFi9EkxrMtKQjlsCc1\r\nOXm3dHomUkunK7J1HtNvpNO0oDoC4+q+7y+aOFd+jWJnxRyIEo5czquLi5t3\r\np+BB9/D74Z1dE4hmsxs4ULn9SG7/5vCdeeOs53SdXJrlRIsKQZqTs2z4PdmP\r\ndANZFzCZfF5i4uzZeXVgcaXiGdhXOWN/lX1SKNNcQMj6u0QrcC+KAJANWl7E\r\n2YFayE9OhUojfyEb+ZdP6gSv4tJHhUQI1OcuV9ntzmYdZ9R1LFpvgOzp+iQM\r\nKGV+dc/jaNQccbNo/+qDHsx4XWobQjd4Awk=\r\n=myK5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.2d19dde_1663335919526_0.49147951523830313"},"_hasShrinkwrap":false},"4.0.2-dev.dd21fb0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.dd21fb0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.7-dev.dd21fb0","@ethereum-waffle/compiler":"4.0.2-dev.dd21fb0","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.dd21fb0","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.dd21fb0","_integrity":"sha512-9+BUEpL4jh03v+slPnVyXuLk4MUjzOYZyBfyGzZ5Goh1H9JoG5+siFjoNHxFJ8i2+we7w1fBZ/Xd/JFMKD38Kw==","_resolved":"/tmp/7adcabeb74ef891918bf290c67af6a61/ethereum-waffle-mock-contract-4.0.2-dev.dd21fb0.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.dd21fb0.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-9+BUEpL4jh03v+slPnVyXuLk4MUjzOYZyBfyGzZ5Goh1H9JoG5+siFjoNHxFJ8i2+we7w1fBZ/Xd/JFMKD38Kw==","shasum":"e88a71670c157b6f3ee4e7a5aeef454706536ea6","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.dd21fb0.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHwUTghV/bq+ZrkPTVtX+I5X03/CjADJMycOhXrez01pAiEA4NnzLk//m75zNCeoDqIhfHmz2KTvQPWhwEzmbJWenfo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJJeYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLEQ/9Gqq9AOUwegnO5zQeegaeggdaKaPsx3/opzoxaXCECKY0a2dY\r\nYYbvTB4sCRjnKd5iKdkpi02ql1Wi5wIbY+22N+okCu4KZz3zQzqW54lomkrF\r\nunPvloNcj4J1CVyfN0bMXPvbhpRE+pLpyDYA5msp0Qk5/EhdOgOTmVujW5nF\r\n0/8yO+38DXEbfhdUg2sLSdvyKps8TAdFO1OJiiVw/460ZCUsVcGuBRej8arT\r\nieFdT+BAJv+tu2jMkwjkH1xRf2bdrMetjY8Yr/uwTzKd1oqAwpuzpFgvx+7R\r\nHEa2bF63PpK1gEbmJqH9h9BX0/zN5abBuk23tTqjtcTCyFgh8Zg88/js+0di\r\n9X/vVQILsp89qcWlaF6vHD5AJ/apJoK0DjzW7N+zgIBb97ztRpgeLvBsAuvN\r\nLZ22SBNpWhoLNmX2mdZQ2nqeFugwegJnV4UZet8LlWoqhTBw/hxv1nTzABVw\r\nCUJXr5aUsTjpgw/xxCKcZYYKzub/2xc53bHyrsExca5TmmNles9divnlsYSa\r\npk4SIzp2hT71nhll8rhDzWWVsMu9uF2gFXivmONwr6le0k0xgpH/YirXdleD\r\n7baHIDwudKTRX+CshTe9O/p88F0dmy3gKql6F4NgMwICDNyCotlYfdD4ggTC\r\nLIy9Z1eQsp1kRhPTEFDPnhy74VGLw07Nscs=\r\n=XMm5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.dd21fb0_1663342488677_0.11995124546067992"},"_hasShrinkwrap":false},"4.0.2-dev.cc2dc55":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.cc2dc55","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/index.js","module":"dist/esm/index.ts","types":"dist/esm/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.cc2dc55","@ethereum-waffle/compiler":"4.0.2-dev.cc2dc55","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.cc2dc55","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.cc2dc55","_integrity":"sha512-HUu9vbYSF3wW6u6gtbUvzb7GfbS2CFiVYFzOAHJSkbe/nStiPLkVgVZW1PkRiH35T44rZ3vS7UrUcXPFfKDSpw==","_resolved":"/tmp/020ec7d3972ef73caaae4a40be21557e/ethereum-waffle-mock-contract-4.0.2-dev.cc2dc55.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.cc2dc55.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-HUu9vbYSF3wW6u6gtbUvzb7GfbS2CFiVYFzOAHJSkbe/nStiPLkVgVZW1PkRiH35T44rZ3vS7UrUcXPFfKDSpw==","shasum":"49d33e3b00314b3072bc606763aa09be66e0da04","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.cc2dc55.tgz","fileCount":11,"unpackedSize":224372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH8hUv+2A5xSjUhOaE1v5jQbDTq5ktTQfG+qlIK7QgyBAiBVm8kg9ZAhdFTX4AwzQcljVdqZbFS2XSI8POeGVesurg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJJ5qACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9UBAAlK/LWU9pW1hcBA4DrxOTyNqB5kEIPcbSLNGxDFirrAmqVUBd\r\nYbppmWT6RLQwFEZmKMCU1fo8P4pkH+LJhkNB2tcB2i8cjwK9FfU84UzEFOAJ\r\nA/yu87BXG2IUpEeNWKieozgbExTrz1TCZicTZcvLcmfRBATXAK+hmmu/hldL\r\ncD0R5UVh6+AQF1IaZhaLXaLSjR+cbin9p9Vtwn8nRgcWf5DqFt1w/M4bMJbK\r\n3M3V2i8ao8Bv5Koyt1NkgO0TJ4/4zviSOxM4kRBGrx9lEOuvawPLEN1NHavt\r\nRtdcc7NdRUkpjzTrynGvDOuaMLKFO3cXsqKE2l0qRMhBVnAH2gxB4SNCFbs/\r\n0FIVCtWGOPKtXFR8k5ZL2C41gdr58lgVRnchhwqYD5klzCZesaoNx8wkNczn\r\n+VB7e/Tetd9/hZDGo82FmmZX0oMxkGGy7Y0OB1jQrHK+8dll7cZspMiOFa5s\r\nUMWd8AwZMySJrYRnyULqUbXFYoW55g72oMrVByx/fsix67JeWHdKIWsG8hFi\r\nPgDV41k0I23SrGCUtMmA5f4P1f+DbUMtbpy8Z6qUzs218VBL09nwWl9WJcaT\r\nRzikr+XAVpJbRBTGDu0T2qG+eNdVv0bxeTxdpcwkBJ84CoNb37AUJpO4XJi6\r\nioyFiJTiZ8DGJGw6wxu3069K4RIn056W+sk=\r\n=UvGI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.cc2dc55_1663344233847_0.5671084572285343"},"_hasShrinkwrap":false},"4.0.2-dev.cf5427e":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.2-dev.cf5427e","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"dependencies":{"@ethersproject/abi":"^5.6.1","ethers":"5.6.2"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.cf5427e","@ethereum-waffle/compiler":"4.0.2-dev.cf5427e","solc":"0.8.15","@ethereum-waffle/provider":"4.0.4-dev.cf5427e","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.2-dev.cf5427e","_integrity":"sha512-v5CbcMg1pnYPY8v2YnegX0kQmByLtmQ4JjOaG0k7y+aNaVa6cHEFLfOHn+PRp5QpfjBGqyrhVBpjhjoICYtUVA==","_resolved":"/tmp/a92f9ef85368a6d21c18463e346c6d02/ethereum-waffle-mock-contract-4.0.2-dev.cf5427e.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.2-dev.cf5427e.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-v5CbcMg1pnYPY8v2YnegX0kQmByLtmQ4JjOaG0k7y+aNaVa6cHEFLfOHn+PRp5QpfjBGqyrhVBpjhjoICYtUVA==","shasum":"54085ea32113dedb8e73dbc68782b2761811ebd6","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.2-dev.cf5427e.tgz","fileCount":18,"unpackedSize":310942,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCp1p72fxHx/pMaRXvpcb9NUUafGzSd5UCpBFP9GpSDXQIhAL9Nl59eMF/+BxSwAFUz91S0q87UwkWEdBVTsMTY4Mcl"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJKn5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmobUg/9Fq/P/hqFRjzzdMNjYIiLQaA95c6b5HteQVC2924UtKw+TuoZ\r\nhUKjE4ME8dxb6zDvPof7EwYwrEmVUSnce7QxPDXjWLOi0/KKJbqOSANItXyv\r\nIBNrJXt4ll2ID42kJr1GCaiuxN7J3XyeCktQOxc0yWLBAoEpk8GO5AC/iPD0\r\nA7O+c41icIxeh0O1Gtgr3ZuiKNy6OfuBwqfvTI7YKQSwEuqLNGgXT6Z3tI+f\r\nB1tIeVceA4SVrG0Wch3sLY3pUIf0eBo5+tbgyoRMDl2dzTCRLfBskEwiCSA/\r\n105aRk74mXduGIjTcuZMfNf/XSSITDFGVSXuGt0k/rMRnKsSSo6yAKPWlGxN\r\n9U5uUarC02isTAUK45byS+wk3LqpMKRFVnmFybRzCjBLIgibMWWRR7KCQ9N0\r\n8OckfZt0xyCXYx9+8sCmoFTo0LYFih1SgowQFHdxYC4r5VLnX+Fgnf4WqW/c\r\n6NyWVASSo6Ip6PvcMuH+WMwju6x1KiWDDZrKiycjKDrMINhjvpe1Og5T/YBa\r\nWKi2SgPabY66wsG02+kyiPBh38XmwpQDq1/bceli3dLXvo+6lePQGuo15x0T\r\nUynIW5aPbC/9NJOV1cDScxywRk+8mlourik91u+UGz5YU6yVV5EiQJYC9Ixj\r\nHgfCXIcX7lGgEGdDzDbBH1Hej6fEBN+OFQU=\r\n=D8Rc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.2-dev.cf5427e_1663347192979_0.07302057279963314"},"_hasShrinkwrap":false},"4.0.3-dev.d863d0a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.d863d0a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.d863d0a","@ethereum-waffle/compiler":"4.0.3-dev.d863d0a","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.d863d0a","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.d863d0a","_integrity":"sha512-Q/oIVHA/HK9IoLyzUxaoYSKg8Tvr+L6SDc+BuyYY+SN43W+fuyAUkVG4QG3wR5O1upwwUwyTB1VsBCfX6Q4OVg==","_resolved":"/tmp/d63e1c3f04d9913592f77f83fdd6ad5b/ethereum-waffle-mock-contract-4.0.3-dev.d863d0a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.d863d0a.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-Q/oIVHA/HK9IoLyzUxaoYSKg8Tvr+L6SDc+BuyYY+SN43W+fuyAUkVG4QG3wR5O1upwwUwyTB1VsBCfX6Q4OVg==","shasum":"7df83391766119295a5a9f70e60d378e429f631b","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.d863d0a.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDb/WvGomZGOnUb192n0ZpMAvLsylQTejmbTuHT2XIQkwIgAINeTJrsw9mj9eYynhNpqi7DN0xE0FdA+JaXyXrl7yc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjKEe7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpssw//TG9L1zYlU+31kqNCbx9gQe6q/Rmwq3I0++Ka34OgFea8oK/Y\r\nMXMtNARjqkv0sHtbkSlQRI05O2l6ZfTFyuB4ousrbWc4k5qKOHxna4qj+/E+\r\neFcvGnrepaVgM27MFgiYQOz3lX/IeMEXdv5PgOZfIvI2Z5VQbhz75QsgIoc6\r\nXAq3idSpPd9J9P5vSRALxz7U0uT/g2L9Ksy5qJaSeYP/BBLS8wU3ikGEO/m4\r\nzZUWvxwIvpb345iw2mzaLYJK5JPl9JRYR25a0bqsjM+BqwZZ8Kgxozc2moC1\r\nOdPO8oDnQtn3Kwm68WitswfVNsxJP8fWhq6QEV5g0G9RimWe43JaBipCU6Wp\r\nExBfM7wULE/AUYQCdVH10u/7eMcg8baNM4PRkBuAKlPqYsljLilslC1X/brg\r\nXctijf38Gun9Qs1HTBCYctR2wwC9XiJfWmeN8Tnm/PmK+uFOgZ3uwNvnIn7b\r\nWCmw2QhB2kJw2YeHVhhFKib6d7XZE0fmry8nI/h5cSY9DMiZRPS3/zTocJkh\r\nFZXjH2BNUQ196iSPKcGylCvrUi33Sx4a3R5/rucjHfwIY6Q4sF1bUE8NMjhf\r\nae4WusgEfvWi0X2CtOIo9UCyTnAE//JrcJGbnA03Tf71wL1VEoDWNX2ZASrS\r\ngXR3aDNdJyRwCdvVbO8l198bGYqERyLYbwE=\r\n=u6rx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.d863d0a_1663584187243_0.9519084441701737"},"_hasShrinkwrap":false},"4.0.3-dev.0c72c63":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.0c72c63","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.0c72c63","@ethereum-waffle/compiler":"4.0.3-dev.0c72c63","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.0c72c63","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.0c72c63","_integrity":"sha512-DZ5+i2kODSvPNCVlQGmv3dvtAHj22F6P+k51OGi+n+MZRkAunSAf44hG0idi/nYiHdgFndP7UttAoIbbGKuglQ==","_resolved":"/tmp/034394f2e88905599adf3bee16aad00b/ethereum-waffle-mock-contract-4.0.3-dev.0c72c63.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.0c72c63.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-DZ5+i2kODSvPNCVlQGmv3dvtAHj22F6P+k51OGi+n+MZRkAunSAf44hG0idi/nYiHdgFndP7UttAoIbbGKuglQ==","shasum":"e4f9f0c14b6b25b94090dae91e2fae051316e465","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.0c72c63.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD17U6qhq8mKbhHudgMNDlvYn9wjin+f62kJ3A7Raaz/QIhAKC8KyXRT7bg2w9xLDM4AT083rvP7NpUXJbMi1zMgngi"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMYpcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrMwhAAj5ZzjG5NgkCN+rneSsuRqMnecrnhhvi46Ue5JwMoE7AzeIrL\r\nizylMoFkeDb2AkZOZDQwmAFcVWjnxcfwbOMuOtmXuboY7Gt9/+6Bgl3eqEae\r\nXn6b8xjJJbpp7PpJfEB6d8LdVZElt7S2JzhV7sbXrRyFD7iA5RPHKLThOWt1\r\n1wH0LhE9uLEvA1Ts45IVhymTYDjh+/501iTei5dpnjYqK2FiJIgEFSRCZvlu\r\nZWP+r4yy3meuCNL3a/RkOy6kQyDzzllbUSxOVNwGQMSpSvOFGJ9CsCKOSWGe\r\nBc3LOiGThcXA3sDbPbgu5Q41G0QN44c13Z5xixRTHIAMUXAhNPAXoSJbvq4h\r\nflpqDDfkpiXei3sh32tesPZZ3ISUmmwG0QsHbn7QHUML2C7/40T5YI05MW94\r\nHl08m8wF9o/0avshm1/cid59AOUcbqHJ6B5xGIgUOSp9BbMw+ZesMisqNQcK\r\n+isOAQCL4ABPZiIy0WYUFNoQI3f96Q52qr3ZP5/nHSwh+Q1LOHcG390V5/qr\r\nzy1h3M6yfHd/AzYUpqe7jFL4/hXZU4wR+2irn/MJM/ygnEmyTREv+ERp3jcw\r\ngIO8fpptE3LplloxaKipXCFcjQBQtXViY1/yh1VG0lVlmSDVpKAsEovPVBIi\r\nirmwjXmO7pgKk7qG254XYCgkxi8B8leeYaQ=\r\n=WH69\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.0c72c63_1664191068739_0.09347615563852774"},"_hasShrinkwrap":false},"4.0.3-dev.f3d5029":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.f3d5029","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.f3d5029","@ethereum-waffle/compiler":"4.0.3-dev.f3d5029","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.f3d5029","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.f3d5029","_integrity":"sha512-GtHFtRDColG+GhOVEV+PN/MkigB4tNE/YYZCgReMBjTRI37Q8wTxN68qaS26AW8t8jBqi3bDU8dKMX9C7cRKfQ==","_resolved":"/tmp/88710485c9d5da33fc8cd0755ac4df42/ethereum-waffle-mock-contract-4.0.3-dev.f3d5029.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.f3d5029.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-GtHFtRDColG+GhOVEV+PN/MkigB4tNE/YYZCgReMBjTRI37Q8wTxN68qaS26AW8t8jBqi3bDU8dKMX9C7cRKfQ==","shasum":"4678c6c8edb81c04b00c4a4f21a8a68edd06eb73","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.f3d5029.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyEouL4e2uEez5a0FrovnQiorMjqSy/GJfW8XjEVCROwIgFuoWO27dfzNRfqx8ZUMvInjSj99YpkEkHeY9vpPi2hM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMsVAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpWPA/+KpszOwsBwzasEDMfqUSmuf3ZyXahQiGzlHhwx24w3yz9d6r2\r\naRV1+1I3F1/YsXybKCN6zvO1CHHGQkcNzJU0xjtpljjA7n02aLB6+OI7Xfyk\r\nRyopturVj6uKMap1AL4kyjo71YIN3ur1WNK4jw2wf7ebxxfAldfZS3X92s+i\r\n0lfS1rlIS1f0FZZ6i2fnOLPYNVg8tK8QvyBtINcYhlUNyLhx+vKZ1LOvMy5T\r\np8XKXZQssN6Or9crYku9xkGvrqnnJua18dvDZhCric/m1DNpY10o0KJuEnSC\r\n7iIICdCp9Udxqs/c0sRMArndHyZDmYDKohZr+8EvYNHD2VGX1xg/5gd2PTU+\r\nMRUDen1aP8friNlMPZ5J7UnNMoEIBc1yPBpHWEjMFzM+ZRjLxiUKRmlOSOd9\r\npTWwOx1DCWuS3tG9BSkpyOYBPECZuJBqg3w92tQf9w6tLRo36MqNRRq+E85Z\r\nPB9vZKmN5Vf2K27hQD8vzdJJ+Aj+1btIIobeLsp6EVnTgYRIS5vm4IQyn+a5\r\nlwOhlQ2/Cmtw7PaxPIfVwb8GbnxwRqsEI2NpPwiiiJajOrv+MBlpjFbFydpD\r\nQyVbDDZmME67jNa2sYwySmz98PScIPLZWpI0IAumJi5xVvWTtyEBBd2gr36Z\r\nw+cKgaaKhG+vV+J0x+Tl2J/Bb/1ZlhisdeM=\r\n=dCE3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.f3d5029_1664271680262_0.10535917333606837"},"_hasShrinkwrap":false},"4.0.3-dev.379ba2f":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.379ba2f","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.379ba2f","@ethereum-waffle/compiler":"4.0.3-dev.379ba2f","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.379ba2f","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.379ba2f","_integrity":"sha512-/6Wo7Y/w2FPLH2FKP42JRU1eJ+Xqz0SrhNMc9vrIvfY93tfB//87kL82qAOjUmwgj5WVx4qaoTNQIQ+yPAreXg==","_resolved":"/tmp/81865f48ef09969b05af46d138621b7d/ethereum-waffle-mock-contract-4.0.3-dev.379ba2f.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.379ba2f.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-/6Wo7Y/w2FPLH2FKP42JRU1eJ+Xqz0SrhNMc9vrIvfY93tfB//87kL82qAOjUmwgj5WVx4qaoTNQIQ+yPAreXg==","shasum":"a67585d0c5f2c6a707c58027f1814993932d7f49","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.379ba2f.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9jMX/ctu3XglmQV9TVTAvsO+0xLnvYbbepzvjMKmnQAIgaDvpQ1SE1/ufZ8MwI8QwSAO1sKr/YAlpVLXgyt+niSM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMsxzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnYw/5AQtMTyfpWkVA9hmyzeqODjqeHZYHBNq2EAin/DB9aYyBKshm\r\n14BtxWtdpP5ZuCrVsg0xH7UPRl6gB+ZdqRHBOq+wWvpl20qVXvikxBDS5oXY\r\nAUHerFfUX/WahLYuMdwo89uJRuo14XrhHkXUqPQZT1box82AzraYjm5H2Wh+\r\niTw+U9TcM3Odr1C3uKsPr0X4lewbGSsYbjdtXAsiuhancHA8GMh8tFmFP1O9\r\nRYhgclTNoMJDixviy+v6IX9bvL2sLUO/DsHHCPxdr7CQ734q9Kzvb/81NqfN\r\noH/ySPDtzGDsoQ3GkLCH/xostwqmjtGm0OsVP2w2Xv7ByI7MzYSFB2LsnUXe\r\nfIrnFlP5X9livQqhopiZgp80TgB8EqmdE4Tz1p1nBKS8ONIFbubWWeTIXnpw\r\nG5AzftSrN/ZFImZES+qyBv+89LJO1bxIOF9SWF18gpBHIyrrAlMtTk6Y8zIr\r\neuaAlW0TK5/zdqKT2gorLkngeWeTbVR1/+ow1uksBqaHbU+5ozPBUtRE2xRx\r\n4LloNISeIvAG/nOK85p0l4C8oThSDvGQ365r+I6nO6cc0TTxq9/JQWH1errw\r\nNrTXv0U6XVk17WcGUbACfSixIlvh1+uL+yXFKQwKtmBoc9GglRtYSGmywJIT\r\nHcUZ2hvD0w1HG4uzQz1XdI3B14+TOt2E0+k=\r\n=XOjP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.379ba2f_1664273523743_0.8791609065853996"},"_hasShrinkwrap":false},"4.0.3-dev.9bdd800":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.9bdd800","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.9bdd800","@ethereum-waffle/compiler":"4.0.3-dev.9bdd800","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.9bdd800","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.9bdd800","_integrity":"sha512-f9cxJQPmMb/8eZmYhHaubPvu884j6x2EoHq11vZl1fq2lqvkd+uqROGIgVn8vYQgvRKQw2udcrAUhB14ZicEhA==","_resolved":"/tmp/d8a435d54c9c33f44a4d537f7b7f89d9/ethereum-waffle-mock-contract-4.0.3-dev.9bdd800.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.9bdd800.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-f9cxJQPmMb/8eZmYhHaubPvu884j6x2EoHq11vZl1fq2lqvkd+uqROGIgVn8vYQgvRKQw2udcrAUhB14ZicEhA==","shasum":"c9b33dcfa9270df0eb34878dd0676f76a4c9cfb7","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.9bdd800.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAjE1n9Tfxzj8EYCVt3uI7zVhmeZTBvGQ6DsEobmEqsGAiEA2+0DRKOghrJuh1fex/rGVBT5U9GyIiwHP1IVXvSLO08="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjOtPhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmovshAAj/e9QYPeb2uKtXA0cmXnxnjy3gh/c21uHEGUd8wr89RhAAm2\r\nQlhHsjA1Br4jdTYDecu6kOTNGvAecUOovxZILD+G4vdU//4b/nDw8zRWmmfD\r\nUA6Qvum3/YHcDawLmKozg2RzhFghphMUNxsK1sRL5CWyQGqsgZ/fp4+4+0IN\r\ncCK9jVAXmro88h2wrdzf7umeSdVS5dYc7GhymEjdnzYrEu+QOuSiy1b7Ee1Y\r\n9bG8LASTAknBXOJatL2zT/B1LGpH3HZFZZWwiqCGkUbIpKsNNmN721Y1blUz\r\n7QbkM5xmxBqAgEz8jMtz7UgWGRs7sbNYZYkgRuoT+lF2zIHzPcFcaJyMWBji\r\nprVcKv4qN16LHxP2bXRMTZoFwxxYxvbmPq2PNwFzQNDofIhuLvnLPb/yU271\r\nE3SZ6BzvEvOG8fnGvhQYe/2+enS4GFHpfBM6HxttpeaSnCQKHlG2Ce6eFDIJ\r\nBQxaz7/Bekq9LmcQktkMfzj1UjvDw65CBRizS1tz8Y4wEQO39DoTkyQ37LRU\r\nnB3sIDvnIJz+ILsLQi6RiQ31pNjKG4wFCExkypXnInZAOGD4tfMkv/U79VK1\r\n0FGG8EDfo/pSNaREeZd1mxGCOXQlNC0ipBmgGbExBnCLO9mjEPaNiRQQao1w\r\nuEKBG/uE72rhrVE3ippf5DCE8hAFZhJserU=\r\n=uIQW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.9bdd800_1664799713119_0.2095015006041414"},"_hasShrinkwrap":false},"4.0.3-dev.06c4b26":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.06c4b26","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.06c4b26","@ethereum-waffle/compiler":"4.0.3-dev.06c4b26","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.06c4b26","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.06c4b26","_integrity":"sha512-DLFHHc6heWS6hCQpzeZ2zepCt/QtmhJYKh5i5eIqq+qanW5/M55/EQik5JtRUfLXU60xgcMKEO67UlkhVAKbyg==","_resolved":"/tmp/7365c4c47e1f67f7a5668299263e7543/ethereum-waffle-mock-contract-4.0.3-dev.06c4b26.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.06c4b26.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-DLFHHc6heWS6hCQpzeZ2zepCt/QtmhJYKh5i5eIqq+qanW5/M55/EQik5JtRUfLXU60xgcMKEO67UlkhVAKbyg==","shasum":"8728d02f7e846c085058c6916b320586cc8e664a","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.06c4b26.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDha5Ls2uitLGZjr8Eb8Cc4YY8Jcd8MyHj8S9/qPpW6uwIgI5l7KcDRhdvwuZi1+FJsNlEwo0IDqR+dwS1vlTBX4X4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPB+0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohfA//S17nqi9nFcv3ujKCfLgl7lCo7i+/7VXeQFaMGd5loruIUyqi\r\nNXLP7ORTCGY9RV/+VvFx+jWps/rRxiIJFCk1zU6sUmLT6usi8oqxxflku2QK\r\ns4+8EJjLVHrpuRlw4/z1jppd9//3MA7kHwP18G3RqHItMKd2KIsSzEDJE/vo\r\nsMKpzakOR41/CKhD2oNRng/frLffOGUzetbtDqT1orTPmd6goM0LijIC0VtH\r\n1kQ2izvxL+HxaEft1NOwG/o63Ll7Eravnam9m1emDEcEJUzw1wkoQmOIllC0\r\nTjnhuBmikKBTvyc4eoociakpJbSif+BSHU/k3S6VvnK3aaVSsRnXefHzzt0e\r\nqbseP0pB5nbeyUMSYk5wlAx1+se0MvXXoeH1XXyt427yBWSnSjEyRS5cROa5\r\nc1ozVMAx40oGGn0x4byXw0kLAsHM83Y0gV4m5jHn0f/s9e/+QeHGohlg5vU5\r\nBEzLLiTMYH/n6tu/tT+cSIecJ3EfbDUQLp0ueVxhzF39x/AIVsV/ktjeJ247\r\nto37NUNM71//l49gd+ZSVTtCkodOW1kClz+9MZIlKvIkL1zTpE+XEJmkMPga\r\nVxGjwPw+SmeKUvfT4odxdAQ5+gFNkASYG6l7W1Cjz6bEFkozJYhdJPMTlciL\r\nTc3UwJB6jdZ3xwPnBooV2nMw4gqvkxnBzVQ=\r\n=g7rc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.06c4b26_1664884660603_0.33367229282318234"},"_hasShrinkwrap":false},"4.0.3-dev.90390a9":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.90390a9","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.90390a9","@ethereum-waffle/compiler":"4.0.3-dev.90390a9","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.90390a9","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.90390a9","_integrity":"sha512-lX5zx38ufcn5gPRSg/LE97OBQJBDgoliHGdZIP1lng5xPWF+h2zg11smjs1meWBnJh82WKsWOU6gQZukN6yYLw==","_resolved":"/tmp/772f004a012e55a1173c54209d5463d9/ethereum-waffle-mock-contract-4.0.3-dev.90390a9.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.90390a9.tgz","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-lX5zx38ufcn5gPRSg/LE97OBQJBDgoliHGdZIP1lng5xPWF+h2zg11smjs1meWBnJh82WKsWOU6gQZukN6yYLw==","shasum":"13052864e7947008fb186a118bb5dbce9cf31d3c","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.90390a9.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGr048iNHoIrMal7NhyyGJ9j5F/4s0GhFHfFNpjipHlaAiEAj9GI+xkJfm2d4/mX1dDFPRFWGmfALOpYd5HlfO7Lq4k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPFNhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqW5xAAjlXzg+buQ+7Fg8W0L8c1J3JXUagAL3ffwZ65OFiWSfvZNPvh\r\nN61bi3AL1avp5EvtJwpF4+50Rukq30D4u77zISS2ZXRADdM/a1K8OX0zZxCp\r\n19SLsPaNJaAMvjXhuZBTv5M8wdhqP8sqXHK4S5KsFgsGMXIdajFJT7FvDe1Y\r\ngJWTSyi1TkHtTa9pH5eCapBU8Qpa62ezSh3rnfF5nZMlZF5UMJYSkVj8+4pR\r\nnYTkEvgfp/9Quv9xum0mOnF+nQ8f5g3AtYmkNp50/pDU+Qa1aCKmsNafwFNd\r\neihmpZ7bhSAoisL4XH51NdNyZHWyKlSgyNiyMdNCDR++wS8nRSauv8C5IJfx\r\nqAtH1SR2WkXsgP8qWIaleeJwGdgv0HqEaaMo0Ax8pvM8XTXD5xE/KqHAw3G6\r\nVUmMdhVTTqSX0wBD3Wed5OpgqBu7rDPPx8eJh7/sTWn/+cBRpmOKy8/s4DKe\r\njvYC7CvqgHeVsGIHeqwya57sdIiXkPZguX2onAYPD1Xq7qHuubhqZkyNEuMt\r\ncyUwAM7/jQ2P9McLMUL//FEhl33Fu3YxGJ1ohKooYr5zdPAaWqxr3bE3VucG\r\ne/D1al5YcAZGeo28gDMs+o9jRJd3FV3ZUscIZJJt/+ZvLjwj9C+rBdI13pSr\r\nuT8y9CuQSvfQpLYlMgEgZ6V30s65Cs6/Kjw=\r\n=4ZgF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.90390a9_1664897889254_0.5826549012166438"},"_hasShrinkwrap":false},"4.0.3-dev.cf42065":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.cf42065","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.cf42065","@ethereum-waffle/compiler":"4.0.3-dev.cf42065","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.cf42065","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.cf42065","_integrity":"sha512-vKxWf4Kj8uRV8iyAX9iC14tc6+ZyXNdeG9Zw+0E7FI4Rj5vt3yl1wI1RhU7pbJjxBaEzPFQXYaXiCl7kpSybHg==","_resolved":"/tmp/f5318c9c2a3d54ae351fddb2f7b19adf/ethereum-waffle-mock-contract-4.0.3-dev.cf42065.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.cf42065.tgz","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-vKxWf4Kj8uRV8iyAX9iC14tc6+ZyXNdeG9Zw+0E7FI4Rj5vt3yl1wI1RhU7pbJjxBaEzPFQXYaXiCl7kpSybHg==","shasum":"47bafa94f235f1a2716e609a61555bf0430449ed","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.cf42065.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFGlOVc5GulVwY2haVEDyKg52PguCBtzfQWuKMTsna2QIgLcBiIeYYdqx3XDQUjKR1+QVv4Yv5b/Z/pWrf8yEER4E="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX6bjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjihAAg+r7NVbi+4NlvuIJw6rsHlMeKoeEkNul6xRqWBc9BjlSMUVy\r\nkdiIze4YTnzbcr3QBtY334wBAFikPbKZ1t78t8VtF5UN81uQsLiXXhEF1akI\r\n9G5JEeO5lVTvcFG+VPxf2DhBWVqTJguuGBSAprMl2rnOSyok9G+8dBsOZfy4\r\noxv/dJ8vLAlGEk9UJaffAwBNVfBot05CvIAkxnJfA8tE10dZAuzPWLoqJvy0\r\nyF7rKqao0TPlh6JzaSu2N4aVU6RXekbZR4vIvVie02enOl/DLtJZQWZ4fvuu\r\nKcgxPbwARAt5JW0NAcxn0U5K7KymoNtMAh/BKUc9evcGbyRCFxy9RRHabJUN\r\nqH5x57TwEI2Jcj2zKAr19VpCIezDsZYmg/AxDLpRVB7RLLT8iJVwUxaewbXv\r\n1hQ28mcFOZgECFXMKR09DZfAxkpn1G0gGAWbJwCxRNRbu/Sw/JtUA1NqytDr\r\naxFk5FYGG6EMYK+OXPalqkYGX3vuCAJ91EM+S0cNmMjmh801t+wIY0gKvMUL\r\n3vbncn8+XIUgP1YB21VG3oIn55n/C38RG84XRAOpD6o9hgY2iDCk7LpQMez5\r\nIopJpI+KRGNGnzVmdj0/P0xULXUWfPlvXqEmYNoZ/nZY7u0IQp8Y7Ka6TOSz\r\nqDxmeTCq5K4GuLygnlNTFS6SwxmrvK7clV0=\r\n=SU3b\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.cf42065_1667213027471_0.5161781728416333"},"_hasShrinkwrap":false},"4.0.3-dev.8671be4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.8671be4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.8671be4","@ethereum-waffle/compiler":"4.0.3-dev.8671be4","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.8671be4","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.8671be4","_integrity":"sha512-A9ND1gSDglB2ghvdoxST9FZitreUZSGGfPkcWQEjAi0CZ265aOhg5ZCk9FyfiLnzugrXKeuySNaJf8we1PWLNw==","_resolved":"/tmp/235a95db58aaa454f08789d9b1ddfa38/ethereum-waffle-mock-contract-4.0.3-dev.8671be4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.8671be4.tgz","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-A9ND1gSDglB2ghvdoxST9FZitreUZSGGfPkcWQEjAi0CZ265aOhg5ZCk9FyfiLnzugrXKeuySNaJf8we1PWLNw==","shasum":"8468fbd8c8f5b78c207e47d82f7ad2457d09e74f","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.8671be4.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPlPpO6Z78nnazTtPJvZPlXF1jrdAKGHe+5gGycSyywQIhAKkNuL/wB2FmPDsfLUtdLpXnt/n+i/OXSp7HR5CRW7tZ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX9xyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpEzA/+NBA54SaidB48G0csMTXcEME6g0iAE8n0xJeUQVUuHKLOthhr\r\ntB76AB9lVBUhYWWAyoyNtV5Vl+HDr9MbhAM5aIC5mtJvHNEus//jNghvcC/7\r\nnDTT8QUivYgADzZnzmT7749aNXjqtqm48GXO22+uFxY2KTRL23pA/7YG+Lsj\r\n7By4cjG6dS1Qzpdnt7O4pnkF0Q+nr18b8myACpoDJFkVBgKFGjjAzw5esWem\r\n5P6nQ2YQhgN3aQ/sLhAZXa2nSPR3vRFcVV1wkMCicZTIIZEx/OBouCXtbpzg\r\nREfNpVPkckALgegPmj4x7M7R6QNAF7QZYEse+TJ4Cjs6PR/Ks35WCKAhn28u\r\nX1ysv/NUQ6x7ifAOrTOyfI3erv9VXd2VIMqDiq84Ej0pCByTIJErDPBYy/Sk\r\nf+KD9Kl2TTlmRQZq/pKRz9F1D6j9WoxCmvQOLLC9GQhz3JYMzmwILxA8jaef\r\nPAXmjIqFQjC+45p0adXfXCvsAKu+rNad30J9E8GLr8dLyX7Stj6pw4SSdyyJ\r\ndohMrp+EBnxYjIycz+Wf1cKIxpL4L65OsmYrev+7sbV673A7r9ZdQsI8VO5G\r\nBT5IJtKQcSK3quOOmCWNzZq4mmZQWfJft/DMybSJFmxJTBUz2tKlcEKnilpV\r\nm7MPApEAl7tKFMVQO+S+atHMxgGHt/Az1xA=\r\n=hzhe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.8671be4_1667226738121_0.7326319185011643"},"_hasShrinkwrap":false},"4.0.3-dev.4541f86":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.4541f86","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.4541f86","@ethereum-waffle/compiler":"4.0.3-dev.4541f86","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.4541f86","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.4541f86","_integrity":"sha512-7F4JjrYpAntbDu5kvPMXBWlwvnFghxmPBaoNY0awQFIzhafO0INDo7kiY/jpysEkNlui/9IUzdC3ZGjlypr3+A==","_resolved":"/tmp/c70ae1bd49d97af241ad829f028b7148/ethereum-waffle-mock-contract-4.0.3-dev.4541f86.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.4541f86.tgz","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-7F4JjrYpAntbDu5kvPMXBWlwvnFghxmPBaoNY0awQFIzhafO0INDo7kiY/jpysEkNlui/9IUzdC3ZGjlypr3+A==","shasum":"08fa3ed90cc94a21d60543c8a0589e16d9e7f4cf","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.4541f86.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9DrWDhafvSmS1ppXkcHqL1QYHWmmM5PZKr6bEDKAJkwIgGAyoutK0GQHtKeS3uP07yA54p2myWDV+fwBWMQaBEDw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX+2cACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmptWA/8DClDMwWHm+LJc3+YqhaVc+tVDSfn7E3L6dnpZ6w+Mj8dIOMJ\r\nR3awDIr2k44UsnQe2sNZ3ArjvJmE4FnE2rB6uTRM1S2UcxpIS6U9UDExVFlV\r\nJ5wB/x71EUblnCCb4QbXmhGbH83VQDi7vP1WOhrvqu8J+mVLOcF3ceVgjsg3\r\n0hklrTIs/y7h4j8SMgIRjq00MkA+5OuXWm/YBd1Fr3UD7mMyAUZNTcfnn6cC\r\nYiitZMQhULJ9oITtw/xmRhTCQj2iFOEWWhR6WZfGztPZ+D/elUeMMx5oTPsw\r\nDAVmmpMVnecmmil3Xlx35tLJDR5ICq+/0X9oJgBLVx4hmDeHWv6ObCbVl+mZ\r\nflc7XRmJ40baX4L0zueAtV5SCAgpsTE+6A8vKKVn/bOQ00vpvmRNio+4MLWg\r\nX30c8rNXBb5zdk9EEQso+ByeoWEqwZ5x50UasgGa5s7vegPAr03QrHumJBpB\r\n0O1hIn4Agcjd8pFfgmNv6BRHPKzlVwzE/jGGKyvThvn9NZ2Gl2UprNkwoBvG\r\nkTteEL0H8tU9PVoasDoEoGJCQM2gg1Fd1Is2i1UtF1EBjlGoqKsOEN4BF46N\r\n78tTgb+ahLRUncShBYYJ7vl6CL8rkxePU0VGUBy+zghHPRRKOkSj1jaPuofa\r\n6IFCL/GGCXxwPe8p6MrRj0w80P6QEpzmIC0=\r\n=49bQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.4541f86_1667231132462_0.8989846566046522"},"_hasShrinkwrap":false},"4.0.3-dev.4946c9b":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.4946c9b","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.4946c9b","@ethereum-waffle/compiler":"4.0.3-dev.4946c9b","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.4946c9b","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.4946c9b","_integrity":"sha512-pfanPlMJ8rRxduDuXOK2QZUX09ed9u0eCmtwoUt2sy1Z/RJeA2O2QliVb5zBlp0PqoQzn07YluAqwXti6qK+HA==","_resolved":"/tmp/7b935692608cea41d610abfaf861690f/ethereum-waffle-mock-contract-4.0.3-dev.4946c9b.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.4946c9b.tgz","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pfanPlMJ8rRxduDuXOK2QZUX09ed9u0eCmtwoUt2sy1Z/RJeA2O2QliVb5zBlp0PqoQzn07YluAqwXti6qK+HA==","shasum":"265347a7ea8f15d6d121fe8b74cab2b26ef53b74","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.4946c9b.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAnOSuMZ10kIkHVsT4xvepllzulDPO9l8jMknOji1f3yAiEA/CfALYSa3Lw+tXi5XCChxqZylpYLXlVIno4qXlDQjmc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbRIGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGVA/9GFvvBQIVY5du9fymF5ML2qt+Vla2LgtjCyqgk8+TpDwuqSig\r\n4mdApyP6bo9gaRrFnv6HH0mcqeA1uKVcEaW/MUG5H3LJG5kHGjlEsQmeffAk\r\nZ43XNDyhj69f71HJMXenO5KsK1ZHVJ+IyB2S9nO/S5rEllz9mpeRkOtiVoF8\r\nIW8sfv8S5f5k+a7YYqgaCwCiONGZb2mh7C0CAm10mtJqhHYptf3mU4MI5zuz\r\nEcCdi5X0iGfvfuu+jRVi6vAgkPuIr+n85Ef6L673eDTqYJk7+jMX+8jFGpcK\r\nK2mQpgYD1fUh4llmeCCSJfdMNZsn9SonFB1+ZpBbXuCGBQMSZWwq4xG5ZVb0\r\nFzbDb6iwI8AXV0vGFXHxIVs37NZEJcf54npBFdfyV2lHkGnGJ+DdgrZcjDIH\r\n94O3iE1HEaPNP1A4NbnuLFpqN25gXh0EfnK62mMo0qbaNLBfaXnvr1bEjUNT\r\nCpNib3vV5CN3d+2/e1k5/ejhqFkZ3pnKPKThH7N5mTFQQjXvQROZTye25ldo\r\nvAeWcD3x67zwl2Y7uie6uSIZUkHbiyj/wQPKVqstevYyY9datNBIHelm/O1c\r\nAhE/3iX1KqHvhd5mgsCONYX2BkBRZz5SAtp+6C0bsl8CBdij2eO0vQQs78k9\r\nQ+sWp0TMvuVIPAWzv1uwMZtMjXT1ntPNYec=\r\n=zF2S\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.4946c9b_1668092421972_0.5033017314530064"},"_hasShrinkwrap":false},"4.0.3-dev.edcb2d5":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.edcb2d5","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.edcb2d5","@ethereum-waffle/compiler":"4.0.3-dev.edcb2d5","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.edcb2d5","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.edcb2d5","_integrity":"sha512-cvb5N7/6oxef4FjCxnmLHUM0qz8zUbh1yvSI4V94DyseuNV9BSFMr5nv2aMDx0K/0sY6IHtVtjCRzj71GZTWRg==","_resolved":"/tmp/7006ea562c01e2a96d04acd269fd56ce/ethereum-waffle-mock-contract-4.0.3-dev.edcb2d5.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.edcb2d5.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-cvb5N7/6oxef4FjCxnmLHUM0qz8zUbh1yvSI4V94DyseuNV9BSFMr5nv2aMDx0K/0sY6IHtVtjCRzj71GZTWRg==","shasum":"4ef4d5e057d1d6dcbed852ef9c96f54287592dff","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.edcb2d5.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpXQ6sxV9nufRw9Enw2XwdxwCVzUoZgZ78tB2ttBXDKAIhAMMXFkhQMFzL8SX+GBi6jCzNIz5IkmX1zo9yu+6PTLAP"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjhMCtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbQg//ch6qDq6wLwJXpI3Zxx7RpxCUJA/yWpIeq+LGcJadCDYZwWBD\r\n7JxDH0qiJKc507kUD/Zz/0O0XlSxn65yvA/ISxfxjVAOFEqboIxcPxkcbMOx\r\nm6XpJzTeHH73uDpGKAhGeXQzt+T4+7bMDPnjbswBuxLmh/8v7hcF9QFmABod\r\nIkf+0KjsYGS2rGjDP0SXcAkToMef0w+Kf9fVw3C1DH/t0jUPKi4IWMB5IdGK\r\nRbjPt9RL8vWig6xpNItjWDdKi3/Zo8uuw+dHV9qWYEApguoofg46i11NqXwU\r\nQQ4h8F5C2mTcIL8BIT1x3zK2e0hsJEzWn7SvhXHVnxG9gmvr1trO1279mudh\r\nQinFuM01mwFhz59XEmxf1+I6EKXQSunTS1Qp5EVv5oEkNtRGg9RdPXWWIrLH\r\nTJzJe3Z67yQZCIZHGNjjlD4DGXbcxaD0YReZh2WyB7egZkamAfasvfNOanCo\r\n6u0LC9WSGg1aGAaLrVzTFh8ZYSpwVee/KK851gXwK1+mNu8uJiD2YWCZTCFO\r\nxAx2jbWUKQx7jccPhdN1Ql5gRQuqeuSGPrrNTWKij6UNtiKlX6JnDjPKw8zA\r\nfahgrIvUQTrbHl1dSbFYqQly8pj5KCCmcRE0AYY0HA5Wb08QEsWHlJpftCmn\r\nj+ch55QiuxE+DEtt0HYvzKJWiuEQFwm3knI=\r\n=IT1c\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.edcb2d5_1669644461639_0.2073571610596865"},"_hasShrinkwrap":false},"4.0.3-dev.4557ff9":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.4557ff9","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"ethers":"5.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.4557ff9","@ethereum-waffle/compiler":"4.0.3-dev.4557ff9","solc":"0.8.15","@ethereum-waffle/provider":"4.0.5-dev.4557ff9","typechain":"^8.0.0","mocha":"^8.2.1","rimraf":"^3.0.2","typescript":"^4.6.2","eslint":"^7.14.0","ts-node":"^9.0.0"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && yarn test:build && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","test:build":"ts-node ./test/helpers/buildTestContracts.ts","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.4557ff9","_integrity":"sha512-AdgZEzqX73B/ezMT9d9ID1rGNVYxz9wY5f6fGv2Yc6ghsKGJkucZ7TYXWuaKTn0/aEz5St+ZmqgXFWGx1U61lQ==","_resolved":"/tmp/156f6db925cd71f45eaa4a28dce62c20/ethereum-waffle-mock-contract-4.0.3-dev.4557ff9.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.4557ff9.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-AdgZEzqX73B/ezMT9d9ID1rGNVYxz9wY5f6fGv2Yc6ghsKGJkucZ7TYXWuaKTn0/aEz5St+ZmqgXFWGx1U61lQ==","shasum":"79948f402de4202e8624d7e79061c1645955653e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.4557ff9.tgz","fileCount":18,"unpackedSize":310964,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8eXayiLHc07eBdfA+bzwUjkDiFLKvh6lpQTPkVuJsiAiEA/mg7gG8E0F4zU5OXDG5qMT0YspWK1ffvGqfKrjVSKXo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtE8dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrL0Q/+JF+JXFK5XlhFFTQgkVmhju+auVCCrbirTK0hx3yNt+vs4U8k\r\nS8iAV3NIJcUqnXOHOcs0EN4dg6DbrO/N9PugIdXq0OByfm144W13TvMWu3a9\r\nTPFTLATThA/WeJPmknxjLoB2AKcbjtjgxmXZ5X76zBz00lP/uC8cKndI/QIA\r\nqZupu1GU1fIH8CG2dDsHgq/Nw3tg8GMnJJPsgyLFsaFxJmNYoI31pO8eWFSc\r\nUQOodTzVEj8Ja6KSXP2RRRiYUZ/ditg2hDa1+xUTWBwmldq57lijrIcS4sSr\r\ntZoXmqpe2UJBgBiiaOjRHO9PNZfXNDm3wfQOR+TkwQ5ZckzYdBMgJt2jLiIJ\r\nwlqshT9GAirtu3xwnJ7BBmbHkXmfGmJu04zN4imM30q4bOyQxJhtCQNwLe2s\r\n7ecg1AsB7b257eKR/cSBx8EQiOMgFe33qf0YJGgDuEUH286FtQy3dAz+1xcL\r\n6RGKqcBHD6kcosNqwHq8annsfxfZHPbB9KMNZhaxQvGPwlWMquVWcGCl4gK6\r\nZYbmIIbFikBbU4Xxv4zp3AZl1iDOMrzD5MDtThzDOC7soHUENG4A/XWhDHxi\r\nSO5JGnnwuZMKHSVjbEI8FwMg7WrzyA9dSIOiXwyF+84Yhe4Lv6PNU17qn8jU\r\n912VRsSd3+Z8VLLyB2uk+pSuqBdXpeZs2h8=\r\n=yX1q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.4557ff9_1672761117449_0.136990513008465"},"_hasShrinkwrap":false},"4.0.3-dev.d4cc0eb":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.d4cc0eb","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.d4cc0eb","@ethereum-waffle/compiler":"4.0.3-dev.d4cc0eb","@ethereum-waffle/provider":"4.0.5-dev.d4cc0eb","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.d4cc0eb","_integrity":"sha512-D0/omlXcFMUbzV9MOKoCsA40wFF6fC5+vinVY99OxzIybm2E4LOqytEGKTAItz0pLEi4UWPadc44XCVcrYS6Fw==","_resolved":"/tmp/3d2e6a6ff07fc67111a680e9cdd99420/ethereum-waffle-mock-contract-4.0.3-dev.d4cc0eb.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.d4cc0eb.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-D0/omlXcFMUbzV9MOKoCsA40wFF6fC5+vinVY99OxzIybm2E4LOqytEGKTAItz0pLEi4UWPadc44XCVcrYS6Fw==","shasum":"b08525c3aa0dcd8dae924fae2be613824d3ce7d5","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.d4cc0eb.tgz","fileCount":18,"unpackedSize":316646,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHcBgNX1sKGDesmq1ovB8kDvoeJ6Vdm+g7vILTkNacJNAiEAuGBF8TfOIcC2JM7sV4IitKIftIJPEVLkHHzrXuYrxMc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvV3DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqySw//Qm3DdZ/Y4VQI+WLxWC4pmh0/iU1UamYPp9d+37NdWSVaTaB6\r\n6gqAVBx940p73haRCqIlqPYEadcswl+Nu4aPKlZKOoKDmL3mb1zftj9noXes\r\n7FPjovSJzaLL9B7Wcfaqzw5SYVpSs6WRJUROqKpJAZXxAIWKt0lFlGW7UkYq\r\nYWOs09B307Kf4MfMbllekXdiGhfGY3MIK+1juoDVF0FbUGW+VUjA7UGsGjrU\r\n5nIt3m3p6eQ+1qCxhPBMW7vJMQePvq3ZssJnOqNEb3nxn1qmiJebouUxTnzq\r\nE27bW3LiwDksEKkZF+LaKw4ZBwbWezaM04lw/AFT2M465NLbiz039N9PhLtt\r\nZ7zBi2wSfVsxl03nzvp6lLegqOOf/QIPxWF+q9C9Fl5uYYaYrK5FaE2HMZz8\r\nIqxi76Ncs/PkDj/vgcUZuCfHc9h0PABJtFxsKjrN/8Oh8+x5ryAtqV1vUVJ6\r\niAgiTIdFScM4Xl6do5DjXbU5ewi8qj5QUDJYVFkAqYbvwRPDcksaw4WOr+MG\r\nJWJvis54YuyWwDRKZZr5YZ438VevhQw7+d4rNuW8Rn2YLWzejVFcCA5KIKJm\r\nQ3qnhnq3rOmHDg/J4Hrmg2WZvj8rzvbOk7KuudVxxARR61t7GOtYknk7Q9xW\r\nA+omDfDDj66whCIf5pwiOAdkcEf9jVPRHfE=\r\n=DYwT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.d4cc0eb_1673354691334_0.7978911382348166"},"_hasShrinkwrap":false},"4.0.3-dev.e1d3ccd":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.e1d3ccd","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.e1d3ccd","@ethereum-waffle/compiler":"4.0.3-dev.e1d3ccd","@ethereum-waffle/provider":"4.0.5-dev.e1d3ccd","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.e1d3ccd","_integrity":"sha512-1IclDw3gt6NTDk1MZLo9iOEhb4E6NnkmTtgfyI190+NCYsLeFNGYunr8nTDikfZ6/YK2P74KhBXaXLzHG2Zclw==","_resolved":"/tmp/ce4ac69a9e227a74da2e7cfcd802ed27/ethereum-waffle-mock-contract-4.0.3-dev.e1d3ccd.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.e1d3ccd.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-1IclDw3gt6NTDk1MZLo9iOEhb4E6NnkmTtgfyI190+NCYsLeFNGYunr8nTDikfZ6/YK2P74KhBXaXLzHG2Zclw==","shasum":"7739f59d93660f36e3eab21b5c28b9c1d07aba7f","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.e1d3ccd.tgz","fileCount":18,"unpackedSize":352229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+sMJMo/v6vHovwngN0qMrt0tbG++O7GLU2A3VGXE6mAiAznaWzqGL8RlQYwbeF+Mueunz9tT/Wl4pCYNENc5b5/g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvp+DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrrtw//WfvINZu3bKefK3WpgmPui2XA5tlckv8nlAa3I4SpJoon6e+m\r\n79uPorY5Hvvz/gAuoOVIIg7WWMlT3yW1lBuV/9d7ZAKWabMsGLtyS0lJKhyo\r\n2PW2MXiYoSILbTsmwbJeSmfS2W02sJFIutnFXW6RJcNzrgQc2hs6Ev2SQVMJ\r\n74yYIy10LBPscQzYpIFKG9GS/FxlX/zICxuFLqE3EOJ4X1IsZkJWGUSww9P8\r\nNQvNFWq2oUG7ti+kvwUML3oM6XMEJUwdcogh+tAdk+yhgkY0CP2eYXOLR2Zu\r\naktjQMrseIs9iwlaw8vzmzq5NQ8tij5WkVDRHiIQILukIAQHrvuNiALVHR+E\r\n4/aWpfPerlkRjhfjeJO5rqvZ6HV/HGBnhiRDwoE1Fub9npw31kx+Z5FqD13K\r\n8ohL5aPUNvQI94kIjMZPm8pBe+cc6lxjxXQL9m/pTcOIJ5XCxTbCrmN7xx/8\r\nianM5xlTgg1DKWop0SaWLhtF2uMyFRNSwHZ+YGsYumHSbMZMZvB/6tobgTNb\r\nKlGwcadOkzNGp+3AgiCqM736ChjB1Z827VNrwSHYAA0JXMQRopk0riGNTl8Y\r\nc7gWqWOPhz4l2W6GHEo4J1OYcjtPB2IZWWK25SiRJiijBVsbC+yF5lU6HkV7\r\n2nWV6k0OPmKOXX+naM5Q5HKa4rpbUHOTkxE=\r\n=ldNF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.e1d3ccd_1673437058975_0.1309961793936103"},"_hasShrinkwrap":false},"4.0.3-dev.4d27a34":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.4d27a34","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.4d27a34","@ethereum-waffle/compiler":"4.0.3-dev.4d27a34","@ethereum-waffle/provider":"4.0.5-dev.4d27a34","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.4d27a34","_integrity":"sha512-2+B/614Qm+fcM11wD+Fn5xQpDOE6vO8OlIpUU8DGggFBQJip30yDErbFKU2TFGQhQ6lqwNfhu5ghBfjTV1sDFg==","_resolved":"/tmp/1b1e60f572bbfbc61ff48f29862d3367/ethereum-waffle-mock-contract-4.0.3-dev.4d27a34.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.4d27a34.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-2+B/614Qm+fcM11wD+Fn5xQpDOE6vO8OlIpUU8DGggFBQJip30yDErbFKU2TFGQhQ6lqwNfhu5ghBfjTV1sDFg==","shasum":"b7d34c008241d56d27bd7b0de544490847354851","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.4d27a34.tgz","fileCount":18,"unpackedSize":515225,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBo+xPfLidd6TxsKUVJsACjpZV6YIksB/wWD1gmgdUiwAiBxfJJJesSDdu4UMUtPgcj6P3rlqDtzvAQtJyPUi7KiKg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzqcJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmohtg//YtYY5LMFqgcqB+JePH1vkO3R6ai5ctC8FT9yJLggcKcA+/Rm\r\nL0+F9AylD/hDSQ4anznUYhXrw26iN8SWnhbL6Ge8dY0kMjkBhG1MHH2ERC6E\r\nrKdC+Re7XZFCTPC/nFnFscV/1LZptBAtpcpAdQKsbTGbiyZTmMVqbgxuA9wS\r\njCIEF9fYGeGp+wsUZm92qQlfFHiJkEwy1vPvJ+TdrtHvdae1fJh+k38/3S/k\r\n+tbY9PNJ2JrfTdWpTXL+HBcchsIw8hrpNWOnQB3hY5KLvawg2XTNmiHXb2oM\r\n9o08OyE/xpSw2cdCKOX12mQdtH9joex5qxACxsDJBG7QAHarYGFxOX35tPS8\r\neAEUvSu35r5FL3pY9EYAMmk1rCFKaqnPySEpTVh5GVcrmmQMfzj+A/nO1k7/\r\nNW6gUl3bJmSSTbgWKwWdTXtDKdCh7ZfN+EJseVRpu3kB8TZbIzTGZHcZxltK\r\nfYbgan8Dj0lkUFG1nz+v3yKFbSn5TaZuYIxoQBWXuWCg77XaCo15QUlqQBs1\r\nnh5WPCO9dgQ4t0oxYvrzEJ0ayG6qC3rw5wtzhFp1DCHbu4UjvyJc7mOSva85\r\ne79QEcul+8XM/g3JEHeFJeXD+kHwfrxISj/7TBOcAgzpuRvUkXbtSOM0m5zr\r\nBkQ6VAGeLUfME0WtuYBgqdw2Mh6l5pP8tuc=\r\n=oRjp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.4d27a34_1674487561355_0.12642487359934096"},"_hasShrinkwrap":false},"4.0.3-dev.a50814e":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.a50814e","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.a50814e","@ethereum-waffle/compiler":"4.0.3-dev.a50814e","@ethereum-waffle/provider":"4.0.5-dev.a50814e","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.a50814e","_integrity":"sha512-4GGHfh5KnRH0eytBPt+FZSPYCKq8zny15NWEgizReK0hUcSdjht9sHVIY4kvbbX6/UrnsyqnhV06IViQaHT1Uw==","_resolved":"/tmp/f08a94d5b0eef0757d0cc3ad14aa0df7/ethereum-waffle-mock-contract-4.0.3-dev.a50814e.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.a50814e.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-4GGHfh5KnRH0eytBPt+FZSPYCKq8zny15NWEgizReK0hUcSdjht9sHVIY4kvbbX6/UrnsyqnhV06IViQaHT1Uw==","shasum":"89dc237b7990e0b95caee3a3a62637debb90ea87","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.a50814e.tgz","fileCount":18,"unpackedSize":515225,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTqo2yrS749/o7VQu8oHClbhuUcbsrPozqY8wLDtwHvgIhAMuu7dyY/GS6bFzE+eDYIR7PqI6QffJjzkhKyaItxnCt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz/pBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjNA//Sj2+UwdgpU2uoIohhqn7yggvDwcgLyC5I+O9JtiwstePM3+1\r\nydjfPkVf2tJIvzfYroyTS2UzBJbUVUG2oPnU1T0beFP1assMAP+5kx5k++9S\r\n50PqO8YsH+Ht1K0CCpK+iGQ2Vq9ZYVByEdBct3NbVnTy4g7KiAxYSmVRtxPq\r\nhWLMM6oFnaz2MCmI+XO4SL796tlKHwymmnNNIOIEceFolM881huA0twXD3S3\r\nRPfbUQCuAOnJqXUAlmW2iZzakUkq7mXC40V1Lg1vEy9RcV8o43X4TUGvCn/f\r\nFiqT9DK8TY3848WJCp5MhSMw2Nsh62bhlv870caZ55v2tcpND0fHHCIRsfut\r\n3+FTR9mihUEvEgIyYx949Z1MHQGPXei63583e/gionQSHQSe39IJghU42Y9x\r\nB190oeEp/4zoYwNC5lZTpoev1e4dm7lKFWLzhCRKCYKF+ZRDbhnGkaW4r1FZ\r\n3OQz0m+74oEyiRnNOPFkzov8W64O+ptrRbIXHWb8VHBU4InsIniMs3zBhdAr\r\niZNd1YQ8pa7IHvKfjDAWXeR+8MV7SqCIA02qFG+etLcPyX0BLvaJq8jZWGEs\r\nAinB4BhBW/CMiMfibDnCOxtGFr8w8iALOSgIXmu2g+W05H2r2JQjxmwLZpsq\r\n76GJHpQILV2HQuZm0TnKhzxM+0xl0RZwWoc=\r\n=4BKR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.a50814e_1674574401180_0.1924211838872827"},"_hasShrinkwrap":false},"4.0.3-dev.166b72c":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.166b72c","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.166b72c","@ethereum-waffle/compiler":"4.0.3-dev.166b72c","@ethereum-waffle/provider":"4.0.5-dev.166b72c","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.166b72c","_integrity":"sha512-Eo+oF/ZPLQD+oDaKONsAWr7Wi02eIcq3wepe77wsWUv1q7CxF0owVMleAOHDPL9Pq5wVJ858Fglolw/aBFpA+g==","_resolved":"/tmp/425deea015b9fb22570034fb31718ee2/ethereum-waffle-mock-contract-4.0.3-dev.166b72c.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.166b72c.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Eo+oF/ZPLQD+oDaKONsAWr7Wi02eIcq3wepe77wsWUv1q7CxF0owVMleAOHDPL9Pq5wVJ858Fglolw/aBFpA+g==","shasum":"87e29a89a075bd210c42616230aacd360751d939","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.166b72c.tgz","fileCount":18,"unpackedSize":515951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBZFdWdKqhfI3OVuhiKcEBLet0V9fGIOEIwjTLKj3tm8AiEAjsuhBMrzOt4B/bX2/TdDoxC46SDWFB2yAlmRutwptMg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0l4GACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxUA//RGryc0D62Cp7O0r1Sjc+ZB+2aPnCBMIIpJGBh9Xhowx8yiGe\r\nsBAUqexo2SfuZCel9SPvJCraZoY/155khWjgJNFA94P83025RoYebA4vCFT9\r\nToHDnu4jvQGQ5NUwT8NutohEc1Af9QjYBwu2ShbLNeL0wXJLTBVZiCu/312a\r\nRhewLSC5IlcOdXkZc4Rf+4Gaqfz6bewr5gLIRArrJuhwAQHoEpFAhP+NZX2N\r\nSAyxJ6jq2A+IEOhTFK/kQthJuxf1d1Z7aXtSt1Q3DS7f5Mxqybs2gWdsUdRD\r\n2rJeYNIVgzw7wZIPE1JEoFvwRgKPsNPhcnRwErqzRRflIt6v7RbrGtlz9SVP\r\najFPvPTTjwtN9KSV83vhYQUhbIAIAYOP8/5WSJauSmgpo8ZX9TXFYFB42T/j\r\neoLuCBWGQKWOvh3gln77LyX7AWCE2aLRTjTygxXuv4RrjNxWp1zTCqCN4iWb\r\nWNbuYWXpPlvyZToeYikP2HdoaAUZiMmBNihNE0dN4UUBNVtcUmGrjKjhesx8\r\nq7GH9ACzJ4BEveBszBkl6YmyckkjPb84nI4/9Ujz8Aq1rMmT6G/jq1xTaTEu\r\n9k6CTgj0oDQ3U07FvNzoZm7Xcf+A47A47qxPRPojsl1k5UB5iEZk676LNqtT\r\nzPHsEl5NGgQtnRVIHKQQ2YI19QUtaqhWeTM=\r\n=sYeD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.166b72c_1674731013877_0.10493785418138168"},"_hasShrinkwrap":false},"4.0.3-dev.0bc9af4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.0bc9af4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.0bc9af4","@ethereum-waffle/compiler":"4.0.3-dev.0bc9af4","@ethereum-waffle/provider":"4.0.5-dev.0bc9af4","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.0bc9af4","_integrity":"sha512-yr473RA+ZRlJcHYQARiabBWTqnot8YWMwIquJGgQ26qxS4+5mgaGau9hDEwzcu59OVkFGZLiL4fH7YkrHDL7mw==","_resolved":"/tmp/970dc8c752e8cdc1acba33393c80c8d1/ethereum-waffle-mock-contract-4.0.3-dev.0bc9af4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.0bc9af4.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-yr473RA+ZRlJcHYQARiabBWTqnot8YWMwIquJGgQ26qxS4+5mgaGau9hDEwzcu59OVkFGZLiL4fH7YkrHDL7mw==","shasum":"51017419518c57718c4bc77a658d16874bb284f9","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.0bc9af4.tgz","fileCount":18,"unpackedSize":515951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGBrmNU1drBibb6ixTrCPrl1+dCuuBe68vg0pURLyMBbAiEAmTOM6ALfBDJq5DZFTJqI/ULnw18JQjJw63gefQmJRYo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0nnGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr64Q/9FfygLiJgtOt/bcLxkfp4tSJP3pnlcv2Hf6DN62a68i/sKqU8\r\nzwoA7aBBbUIrLIyB38Ix6/RT27F+Sqdp7ZuwCAhMB69pzgsBFneC1il2nSvB\r\nX9kJa41oszmY7ejHOtw/iYqOdQOpVEhuB8OW8IUvfmtiT1YlMYEWmVDYBEmv\r\nib+yaZeWgCzpEhjBtyfZAR175zhipB2dMreNIhMWls5b32xTlGxPofrN0HaN\r\nyC/kVHf/zqDgeblE+3usa9qHuMufqstHoTaH5VNF/RgmUYlBBXCDy6NHWf3b\r\nN4xOgzzKsn3+Lh7aUUOeyms6K+WXiDCOzlJ78/xz1ObYykrRgcZrzCJJPCj9\r\nwLJTURy8Vppn14L3+WxOm0u8aXrxySl2aGsWm9akmfaTxKSJRJENwFZAD0Xt\r\nn4THg0guPzAHh/IHmV2ZlcUdJHJ+n4C0cf4fMvKOQ2HD8RiwcIVUj7VzD/si\r\nHGuWlSGsumLsxl41PF7G3ltFQtbkSjCUA4RVPhdH+i0KYDP1Rs69Q44Z6F1S\r\nK5FanlKlAx1k5BGE4ShuvM+CU64mL9PrwEJOIiJnoe4S2Ad780+p2O84z8PN\r\n6TMom+tAGibAazS2UdVYXp18XmNOWF2fF1gvQB7DFiW7i4c2i3VaQEc0RMg0\r\ns07dGAo+xFfvM6jzPnbTvmlc28iRgoXun7Y=\r\n=CmDS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.0bc9af4_1674738118092_0.8958608243874044"},"_hasShrinkwrap":false},"4.0.3":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8","@ethereum-waffle/compiler":"4.0.3","@ethereum-waffle/provider":"4.0.5","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.3","_integrity":"sha512-CcqTfP/CqtIFdTVtmv+ZGJOLAvI2Q1n+XML//cjkAMr03eFDdKHR8Sxe/ytjgQg/FpnTdtaHNr0j0zBHhZjAbQ==","_resolved":"/tmp/70ef9edd85114e87374066cdb90f5869/ethereum-waffle-mock-contract-4.0.3.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-CcqTfP/CqtIFdTVtmv+ZGJOLAvI2Q1n+XML//cjkAMr03eFDdKHR8Sxe/ytjgQg/FpnTdtaHNr0j0zBHhZjAbQ==","shasum":"3cdd0954f310de55068c6b1315322e18adb5854e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3.tgz","fileCount":18,"unpackedSize":515885,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF5N+EXIQ0OMQNb7Xp00JbB+mgs0ys3+4KAfgXtnabfIAiEAywPPH7n6R8RdbWtqGitQiJsVAZzy/4/o6q6EgETpaE0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0oLRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqFsw/9F54YKQOlFwJ3Lh402dYXhHCIdj9VKDGTcwMnNSZkdSFGaKd0\r\nH8EGyEkG0THmu697x5ReJrf6liMpHCtWyZpw/WHbE5isQW5FFmbtyHM0H5SP\r\nwCDo+ikT8zi0lddGwPHoKLnm+743XLNIX43s3+UIKmWbJOe9ZHq0ttw5Zka5\r\neORzAAkHxIpIakgxZSYe6xu+UBABvCc12AYttv496K7hWfhyiQkZOy7U8f+X\r\nm5q6UwVbw3pt+HnjS8nIo50VqMl+gqyPGzyAZW3JGTfobh6UJWE25KVg9H3A\r\nZclm/LHX1TbMQoGxNvovfZu7fWBa/DQU9+8L7AQkQELRjf5iW/GHDh3Fe6+v\r\n4KDYsUoqzUglEaJ8X0zYGfGdXMeHR9oF5Gm4D9i4CZyNSi8rAhXMs3YXuBi7\r\nH1KUa1+iq4Xfqsyq/QsJLyzcGDLpd6eTkpC6bzAvbAu5FzMQuWS97E83VtcW\r\n8+H6Ar3N41yiX6J3v3TevACq5o0TMEwfEu8ttN+VjthS52cLFuFNhhYY+uT9\r\n27+75W/Ng5pLuXyYBI7XYuyQiYfYhKe+M4yrzYiHq1wrc7SgiyI5Q1aFPyI7\r\nNmq5+Vmu0P21t2DQYL+05EBaD3AJlt8edTks9QrEHogIAtQBwJlCdfNpFYNY\r\naWM4fYsROQZzm1McJ2QXGv0I4FDj5SWWsoQ=\r\n=soPF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3_1674740433203_0.5052950268431802"},"_hasShrinkwrap":false},"4.0.3-dev.13d1af0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.13d1af0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.8-dev.13d1af0","@ethereum-waffle/compiler":"4.0.3-dev.13d1af0","@ethereum-waffle/provider":"4.0.5-dev.13d1af0","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.13d1af0","_integrity":"sha512-cferjrbCuHFhLFzL0zsxJT/BqUpT9xoCAYRB9qkWTsgsz1j1hiHicKR8WU4c4JFD3B0onXAZ02/AaJvJtajLyA==","_resolved":"/tmp/45b70372f408bfe3cff99537444dd45d/ethereum-waffle-mock-contract-4.0.3-dev.13d1af0.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.13d1af0.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cferjrbCuHFhLFzL0zsxJT/BqUpT9xoCAYRB9qkWTsgsz1j1hiHicKR8WU4c4JFD3B0onXAZ02/AaJvJtajLyA==","shasum":"5113ca71be2f965240305f10b8edefa9dfc07f75","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.13d1af0.tgz","fileCount":18,"unpackedSize":515951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH9iH8Z0i+gh9MGrXh5QRHo/Kkj4ElIqAc45Tw526bznAiAhAULChAoXw/nqF4w2pnZrq1kzgR5zpHeE7Rf7gP944w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0oO9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+0w/9HfvFQ3ZEooVRJKw3ulCNXdAPeO2c9xUEE+TV4kfDds1sAiRa\r\nElP71/TfPap1XXHx+elbFaaRn0LTaX1yZeO14Og+840Ai1cE1KvCZ0oC94S0\r\nGTBJM0U+Nh0HMeDQYj1qTjzzhiyv1FXdpiPqluzaETdCqEKKY99GHWXOnggu\r\nYoumAvTrwg6nylGzHSB25/+u6upRkA0lXAGs7FJtPkyT0omb5ECHLYZkF8rD\r\ns+Jv714vXKNhWpRs0PHZEUuI2exSEbLHPQL/bC/wwrURGTje8Lp3uLBICRGu\r\naWBWgl4M8xSFiph1P4gdov/zRaXKBXQt6LtSmqObT38x7zqII72okOJhrt2q\r\nyVWckUYqRpI1jGsjL6RW0MkWv/J92PmzBjA4vw/lmVwqhiA09r4wkyknRaBe\r\nyDDRsuzGmjl34/slNUYnfFxYY6HPPJZAy4LwA3wxuyz5VruxS5vdvJpNlcMv\r\ngiQ27wyUhkLX0zCzv+mN/axWZ5zZR9OtMf6cVIN2q6M7SLcQLzk4WeSeIDtW\r\n8zJHMK15quK5iy7HTwCmupER9LSwn3Di4eqUOJKgVc7hiQ/JwUfocTBQknrM\r\nKKXHRARko6f7cUEwV1Qae1iFZrOYK2h8cc5YmEtFn/IZJhMoWKLUEmLctbgD\r\nyGp50yGVzdgyn2HjwOdyEL+seo16lJGynrY=\r\n=6tq0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.13d1af0_1674740668780_0.3969978421575049"},"_hasShrinkwrap":false},"4.0.3-dev.f8ca718":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.f8ca718","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.9-dev.f8ca718","@ethereum-waffle/compiler":"4.0.3-dev.f8ca718","@ethereum-waffle/provider":"4.0.5-dev.f8ca718","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.f8ca718","_integrity":"sha512-wB9Qxr/o4ZEjnWqSobN2d87K7AlhSghmzm0700RtaVGbT5byj6oHLTDFjXfVDrZiuyRo32GYuSLGCC3TChahBQ==","_resolved":"/tmp/2a5d6d5afb79a1a921a5bc70f33af3e7/ethereum-waffle-mock-contract-4.0.3-dev.f8ca718.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.f8ca718.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-wB9Qxr/o4ZEjnWqSobN2d87K7AlhSghmzm0700RtaVGbT5byj6oHLTDFjXfVDrZiuyRo32GYuSLGCC3TChahBQ==","shasum":"3da540cdc2b18d06f3b73888bde2662218c4f3ef","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.f8ca718.tgz","fileCount":18,"unpackedSize":515951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHH6OJL0ybOJ84OEhlGWMQab56pXdKC/7KCVCgDBQkeVAiEAlwNirabKXeAQJSelX/PzX6L8zaLObSquU6OtvemT+zY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0sN2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoEsRAAhr8bV0VkPqHKC3xVs764BgZMQzG9ZSTCzX/VEim71AnlqSXi\r\nolFUE48yMbtdNZg8xIP+1O11/7YY1XVeaYw6JsLTWzXXgZ4UWcP7cTbEKCTc\r\nIJZnBSiiioRlqVPxMM1rdITnPAWCPL5oOrAV34W5iuXRUUs4A93ze2lu1PvR\r\n5/nud+XB3SA17fS16aoxGTZMVBZ7HL64m9VGMq87CYhp3ZSURvNPp0WV9D/D\r\nkHyPPym1y68CkQUjNyTdgWNRHwyxrGA7JVY9SglTC1U8o97EomjYKiPn6aKy\r\n40f4VRMveTx6QmYmJbt2gjg76Q5b4DzB7iDKiGIjwZAeCiH+8qpjwYfMgTmv\r\nt8xP28hbVcVJngO6JP2YDDoQychMMYpr84CP5URPbhnudMEfMDbKDzxQC7WI\r\nuNPXjU2h7kDMtTanB6Te074RllVBWc6FqhyiU8dZAs7M/rCjg2x+Xo5JSfd9\r\n1eYegtC4i3Ju13czSmJoBv4h9IVAnAIcdhrrZlWDJP/2FSwb8DQYY7eWoa0B\r\nPYH5Hs/2lU4s7gzZbrn/i1zkwwv+8lo4NEDmVuowifeQVKx5Ch07DfulAYN4\r\nVk5puuYvrURkogPOSYognInhd6v9Qqjmsn9jrxMdjIjrevZ8Yva/4sKwzVUU\r\nD38cSRcau1kjHOsabp6WvctS+JqBxvvIe2w=\r\n=GY6o\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.f8ca718_1674756982283_0.80739167083863"},"_hasShrinkwrap":false},"4.0.3-dev.a1d89d0":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.3-dev.a1d89d0","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.9-dev.a1d89d0","@ethereum-waffle/compiler":"4.0.3-dev.a1d89d0","@ethereum-waffle/provider":"4.0.5-dev.a1d89d0","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.3-dev.a1d89d0","_integrity":"sha512-HVlaKiYYxXSEfiVOcJ5yKNq1HCH41Ss1YcZeMSvXOzS8j89wQ7FKu+T69tZcio2CfFLujjZrBlVS/GuMLeiTnA==","_resolved":"/tmp/d0fa39bb7793a4b1f83ebb86201f3f11/ethereum-waffle-mock-contract-4.0.3-dev.a1d89d0.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.a1d89d0.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-HVlaKiYYxXSEfiVOcJ5yKNq1HCH41Ss1YcZeMSvXOzS8j89wQ7FKu+T69tZcio2CfFLujjZrBlVS/GuMLeiTnA==","shasum":"8928ca8fa1f9f6c2db7698b4de9a10dd1362dbc4","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.a1d89d0.tgz","fileCount":18,"unpackedSize":515951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDXItPVlkMCjGSN9AG+bx4k5/Eja9VERlG2/xxAtkHEMAiBWh2Vn4H+6Q0Hnhz1PK64+6/E5ATHWbIC7Hz4WPnjeYA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj09MwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmogyA//cYgQOk7GENxS8vXD65OnkCQFhfPfvpvyhtrTTh5268sDMkki\r\nd2c4O22T99vdE9wsiQX6mh+AaqDbaqeO07P6wGk9pCeABgf7uWp6aqHgETVD\r\neAnyNHYqbcyfFpiA84/OfKXYquc1s2tewWga2yrjwHYgKVuIz+7Pqqf9mZx4\r\nKMQwZ4q2jl18zI4tjNgMH9eppgsOjCeKJiebCrBj2NQgla55rh1acCJyhW5E\r\np+0jsqJNT5EOeGApmrO8Li6f4gTG/m8iommuzWKArJYrjMXtenHud8tCpCAF\r\nTWfvtaH/ndWmSf13BuVQcnRyddHFNacu9aiDF4/KNcEs60yygGXYldONakro\r\nUCRuDLxsZsM8p3j5GQVM+2V7tAklctVycwwsA1C7fi5m7swlG8lOZHQBJDM4\r\nHRC+UBVObWfcE0vVC9UyFEpDNfbADhykHt8gMSg85JUWybemwcDoRtsA5NaJ\r\ntHpH+2JB0rDMEUFLp3cFe6mkaAWXOKn3qbLClFUNm1wHcRrb5E9ojZnLzk/F\r\nQ2DsCHaAITZofyBkq/1KZAMLTZVZb5HHvn5QJN2xyqDobk+WsOYhWXwzuAxq\r\nQhpJB8A6EWjBf9oJk0t05s+OIi8gROQpy8tNMM8P9GU+7UyT2AHNAC4+hXNu\r\nAljWfQCprHN3VIkY2IU/aZVEC7BB6JDtrGA=\r\n=ZNOx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.3-dev.a1d89d0_1674826544326_0.2661403701774292"},"_hasShrinkwrap":false},"4.0.4-dev.4740ec6":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.4-dev.4740ec6","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.10-dev.4740ec6","@ethereum-waffle/compiler":"4.0.3-dev.4740ec6","@ethereum-waffle/provider":"4.0.5-dev.4740ec6","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.4-dev.4740ec6","_integrity":"sha512-cI8xiz6bXyM7sgnGAM8ueJKxS43giy+BEPsY2PjnQuE0cvyocsIiio9MI2vc0sP6ZqZKdhuSys9Naq60vt22uw==","_resolved":"/tmp/9f114b0f336f8983e7a465b3d37d84f6/ethereum-waffle-mock-contract-4.0.4-dev.4740ec6.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.4-dev.4740ec6.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cI8xiz6bXyM7sgnGAM8ueJKxS43giy+BEPsY2PjnQuE0cvyocsIiio9MI2vc0sP6ZqZKdhuSys9Naq60vt22uw==","shasum":"f90559b74cb881a8291a6f7e7eeae9f7e4d31249","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4-dev.4740ec6.tgz","fileCount":18,"unpackedSize":515952,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8Uix8LTbQfZX9YREsqroTeN3gzJiY5lCIYWiffYfgEAIhAJE31fkNB2lKM+3d+KKSDpQrW7SI2PJm8kyo1KoLJlQo"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4OcXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrFNQ//cuGBRw+8SVGvLbIeSpFFxLWZnyAp16hlopBvgzk2H6rMfEpS\r\nH9Li37bHibRSezKqJXL1aMmEeVl/GTCwhpzOJgK9TUto+SFbU9ybakAsSto5\r\niiCUWe3d0oBPkRbscLir3rCcccp3xfJdU1/SoscabAHecZqr249cMulDpNM5\r\nk/uRf8LkSSYtWqKY8abu3JuToMDi0SXL/FvNJopJxZHw/BYp185+COWANU+7\r\nruIX+F49hXcRxTFFI/ss0P1L5UzH3haHgM0/uXTyy/D/VH0Gzmj14t/uY3Jk\r\nrsuj5cQr2mOF4Tnu6MK4rf5HlxJj3rVxAnMst/eL/+aZP/WWZuyT9pMASCxR\r\nVo5X5uYTvP1qbGGfVy1XP6K4l6HcqtBlu/8qih8/u2S7Ik5B4VgEo/h6VJda\r\nDpHts6OYp3uVHIHnQZiKgUbNAaVQ4H9rlYinOOg5KQPQnbo5izr7h2WKufDW\r\nPVl8NdJydQ2mpsyyM46JNdHTrq4Fl6iSE6Pxksz1o6ewsZDRgPWNgrqXXgga\r\n4nbAHv2sbyaRjR9YdY7DToesmuRvApUpQNdavBx9fpex5O8oBxrsWrIoGfkL\r\nYIuum2Fs2OcEhLVUE6YtZ5UdwzQoUZM6f3Vb9GjVeyJ+hT9zrF5lEJAjhi+/\r\nrORsHUf8of/hRbSUe+o+RrqRP3/3r9pvuAc=\r\n=K8Xb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.4-dev.4740ec6_1675683607783_0.47670663018285464"},"_hasShrinkwrap":false},"4.0.4":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.4","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.10","@ethereum-waffle/compiler":"4.0.3","@ethereum-waffle/provider":"4.0.5","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"_id":"@ethereum-waffle/mock-contract@4.0.4","_integrity":"sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==","_resolved":"/tmp/f7215c5f96dd62ac409fddb538beea00/ethereum-waffle-mock-contract-4.0.4.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.4.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==","shasum":"f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz","fileCount":18,"unpackedSize":515886,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGcFMoPBqtjqLTAvgFLaUQTpahD7L1gtql1s5F69CIjCAiEA27TeU4uNkWHwB0tUS+ziuTHhyNtxg32pLycpoQ0zrO4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7QpXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpM5w//fhpEzgmZafi17O3du5kP5vhMMeuAJfJA29veXAxyCO5Rz/hx\r\n5336Qz13fZdpmDJRnri8ulCEq8sZxqZDzysPdzY97+gCerbx41dbNgnjv/pV\r\nTrssV8fDGtFlHyPhczgB61HtfNEGvZCahfp1/la2MnxPwZULUM2LC3LSnYJO\r\nwqaLmDGlHJmTDXXHMMXgjB0dyCQfTNq7G97pUzeAGSvf9gi5PWf2qmg7XyaL\r\n5IFcxd627zw3Y68GaGJ1AF8KtoJOMyjDGpcffTcGGKul6lZzjF7b/DncIiJ5\r\nEoVKh6tWHyc8Hs15lNIR9vXC8nfRp60qf1XBwwkbkD75a9R6AORxl3NeKBXH\r\n+QRQXXYvXgv1KPfMBS76zhfjlPUXxWzuMNmrBxteBP7R9Ecq1WvnUKuJKg7u\r\n1OBjkvpriifhBoSQn4Twjaq3ZovNCXeIVFDEz0SxBp8Wtvw9xrxRdz23CRQ+\r\nPznwq+Uko6fnoKBGLwkdCuhBOFGsx2pbFkXRBoDfIZSPjX6o9k4R81klgjHj\r\npsB3K1KTFxCpP36AwbHj/AlqQhdPd9E5a7DvskqoeOCBWGatoZE1yZwG0lYF\r\nU0z8Zp2rah5e7cuJvsvpf8MolKXcEtC5oBDPaX/YxsYvdVrjH5Ytg1EuZ6/G\r\nU1k3nwqRuboFnIVW7z8+PERzltWvc7brC1U=\r\n=KBLw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.4_1676479063600_0.5338308376963015"},"_hasShrinkwrap":false},"4.0.4-dev.0915e72":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.4-dev.0915e72","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.10-dev.0915e72","@ethereum-waffle/compiler":"4.0.3-dev.0915e72","@ethereum-waffle/provider":"4.0.5-dev.0915e72","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.4-dev.0915e72","_integrity":"sha512-dVbo0a1trk6A+ibnfbZMa0/PnmNQ0qwuxB6EcS5ZfPrSE/RN6f+D5kS4Ie9hLQXbEhkuldWMZadORDTrY61tjQ==","_resolved":"/tmp/90675ae324aa3910506539281fe1276c/ethereum-waffle-mock-contract-4.0.4-dev.0915e72.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.4-dev.0915e72.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-dVbo0a1trk6A+ibnfbZMa0/PnmNQ0qwuxB6EcS5ZfPrSE/RN6f+D5kS4Ie9hLQXbEhkuldWMZadORDTrY61tjQ==","shasum":"576a870e5d5ef3efb8d499e45ec449de03dfe7da","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4-dev.0915e72.tgz","fileCount":18,"unpackedSize":515952,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGHPqFsH7mkoY8PixB1aAbJ1y22xeAB+YPqkDV+O2D7BAiAs9RJfJPPUt9vN3RkoTj0vRax7giqxnPyNXm7XbjFA5w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7QsmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpd/BAAnU3QSRYzBur/3KPb98WGQyDBeYIqTuChjVoOqcfulAIUAJU2\r\ntetYPrj4gb7I2cTZdz2I5Q8Cyzto9SX84c+Mc06sfB8mKxYjGpm2xLlxiysD\r\nJHFbh1DWM132itKnz7JJLyw4D5cXcNxsxBerD8hQplzkT6MwM/2I9eHFpqmf\r\nbFKVEVFYt3JVq40LRj9D3JQYexyNt3XKIzWt37WpoRiYSk23btwJ07t8F1Pw\r\nStOeX209ZqIPHajz4Xui/hETwzf/t/a/ThlCFD9ozYTI8eImz7Txu3SsmjVP\r\nRXI1kWnwFKPtCT1XImoOarBYkGRbZ5IMJaOhg8bRvGB1ehtXb/fhSnYwy1Gs\r\nxHrtV5U2RGV8hPHMZuH9BxNQMv42MdzmzSD7760/5sWq9ys/IwFiJRgFU4i7\r\nz6VtAkCZrfqK+8l6DQWj8sifdtDdFwuJ4Qcze6FmhHyKlr17LjCY4Ga5pShK\r\njHftCm7juhfxz+uJf+uGrSrRasdL+Q7uU/vR7hWTn+1ByQh0Uk22rAVBRz9X\r\n1FWTumuugbAZUvWaLPhxR+Ck09Mm5gC3CFLExYwSJflwxK38BpJGRoOHixR/\r\npuEH5FwBUs3OoH6NgpxjB0+VWu9aQZXah1qCI2ysvrF5lckRG0Z13POGTZ5t\r\nx5t0iRBf3EyjjTmwDZNJoVRCNsyhoEgo8o0=\r\n=3fER\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.4-dev.0915e72_1676479270186_0.9280775889600852"},"_hasShrinkwrap":false},"4.0.4-dev.efd5f2a":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.4-dev.efd5f2a","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.10-dev.efd5f2a","@ethereum-waffle/compiler":"4.0.3-dev.efd5f2a","@ethereum-waffle/provider":"4.0.5-dev.efd5f2a","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.4-dev.efd5f2a","_integrity":"sha512-UFdsM1fzzlvmMWsZMrsMclusTyqvAsB5fYx/yZAaOlpje1AbtHdrXqaL1WTB4cv+k+gF3WNOa0/I75U6uKzZhA==","_resolved":"/tmp/7e3bb144c3fc5a6425684c7103675e74/ethereum-waffle-mock-contract-4.0.4-dev.efd5f2a.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.4-dev.efd5f2a.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-UFdsM1fzzlvmMWsZMrsMclusTyqvAsB5fYx/yZAaOlpje1AbtHdrXqaL1WTB4cv+k+gF3WNOa0/I75U6uKzZhA==","shasum":"ba9be062bf2bfe47fc90fae510e35b847fff1168","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4-dev.efd5f2a.tgz","fileCount":18,"unpackedSize":515952,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTz5yYwHOl2Q2j6PrL71vgiYC0hfp+9wACKndX/codZAIhALidAM+8XHJVd5hPkBCilBdFInigiESh7IB/f48uyl0b"}]},"_npmUser":{"name":"ethworks","email":"eng-services@wallfacer.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"eng-services@wallfacer.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.4-dev.efd5f2a_1697111508653_0.7417096187291854"},"_hasShrinkwrap":false},"4.0.4-dev.238c11c":{"name":"@ethereum-waffle/mock-contract","description":"Mock smart contracts in a smart way.","version":"4.0.4-dev.238c11c","author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"private":false,"license":"MIT","publishConfig":{"access":"public","tag":"dev"},"keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"homepage":"https://github.com/EthWorks/Waffle","bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"main":"dist/cjs/src/index.js","module":"dist/esm/src/index.ts","types":"dist/esm/src/index.d.ts","engines":{"node":">=10.0"},"devDependencies":{"@ethereum-waffle/chai":"4.0.10-dev.238c11c","@ethereum-waffle/compiler":"4.0.3-dev.238c11c","@ethereum-waffle/provider":"4.0.5-dev.238c11c","@ethersproject/abi":"^5.6.1","@ethersproject/providers":"5.6.2","eslint":"^7.14.0","ethers":"5.6.2","mocha":"^8.2.1","rimraf":"^3.0.2","solc":"0.8.15","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2"},"peerDependencies":{"ethers":"*"},"scripts":{"test":"ts-node ./test/helpers/buildTestContracts.ts && export NODE_ENV=test && mocha","lint":"eslint '{src,test}/**/*.ts'","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build":"rimraf ./dist && pnpm build:sol && pnpm build:esm && pnpm build:cjs && ts-node ./test/helpers/buildTestContracts.ts","build:sol":"ts-node compile.ts","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs","clean":"rimraf ./dist ./test/example/build"},"readme":"![Ethereum Waffle](https://raw.githubusercontent.com/EthWorks/Waffle/master/docs/source/logo.png)\n\n![CI](https://github.com/EthWorks/Waffle/workflows/CI/badge.svg)\n[![](https://img.shields.io/npm/v/@ethereum-waffle/mock-contract.svg)](https://www.npmjs.com/package/@ethereum-waffle/mock-contract)\n\n# @ethereum-waffle/mock-contract\n\nLibrary for mocking smart contract dependencies during unit testing.\n\n## Installation\nIn the current version of waffle (v3.x.x) you will install this package as a dependency of the main waffle package - `ethereum-waffle`.\n\n```\nyarn add --dev ethereum-waffle\nnpm install --save-dev ethereum-waffle\n```\n\nIf you want to use this package directly please install it via:\n```\nyarn add --dev @ethereum-waffle/mock-contract\nnpm install --save-dev @ethereum-waffle/mock-contract\n```\n\n## Usage\n\nCreate an instance of a mock contract providing the ABI/interface of the smart contract you want to mock:\n\n```js\nconst {deployMockContract} = require('@ethereum-waffle/mock-contract');\n\n...\n\nconst mockContract = await deployMockContract(wallet, contractAbi);\n```\n\nMock contract can now be passed into other contracts by using the `address` attribute.\n\nReturn values for mocked functions can be set using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.returns(<value>)\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).returns(<value>)\n```\n\nMethods can also be set up to be reverted using:\n\n```js\nawait mockContract.mock.<nameOfMethod>.reverts()\nawait mockContract.mock.<nameOfMethod>.withArgs(<arguments>).reverts()\n```\n\nSometimes you may have an overloaded function name:\n\n```solidity\ncontract OverloadedFunctions is Ownable {\n  function burn(uint256 amount) external returns (bool) {\n    // ...\n  }\n\n  function burn(address user, uint256 amount) external onlyOwner returns (bool) {\n    // ...\n  }\n}\n```\n\nYou may choose which function to call by using its signature:\n\n```js\nawait mockContract.mock['burn(uint256)'].returns(true)\nawait mockContract.mock['burn(address,uint256)'].withArgs('0x1234...', 1000).reverts()\n```\n\nYou may wish to execute another contract through a mock.  Given the \"AmIRichAlready\" code below, you could call constant functions using `staticcall`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.staticcall(amIRich, 'check()')\n// you may also just use the function name\nresult = await mockERC20.staticcall(amIRich, 'check')\nexpect(result).to.equal(true) // result will be true if you have enough tokens\n```\n\nYou may also execute transactions through the mock, using `call`:\n\n```js\nconst contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\nconst amIRich = await contractFactory.deploy()\nconst mockERC20 = await deployMockContract(sender, IERC20.abi);\n\nlet result = await mockERC20.call(amIRich, 'setRichness(uint256)', 1000)\n// you may also just use the function name\nresult = await mockERC20.call(amIRich, 'setRichness', 1000)\nexpect(await amIRich.richness()).to.equal('1000') // richness was updated\n```\n\n## Example\n\nThe example below illustrates how `mock-contract` can be used to test the very simple `AmIRichAlready` contract.\n\n```Solidity\npragma solidity ^0.6.0;\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AmIRichAlready {\n    IERC20 private tokenContract;\n    uint public richness = 1000000 * 10 ** 18;\n\n    constructor (IERC20 _tokenContract) public {\n        tokenContract = _tokenContract;\n    }\n\n    function check() public view returns (bool) {\n        uint balance = tokenContract.balanceOf(msg.sender);\n        return balance > richness;\n    }\n\n    function setRichness(uint256 _richness) public {\n      richness = _richness;\n    }\n}\n```\n\nWe are mostly interested in the `tokenContract.balanceOf` call. Mock contract will be used to mock exactly this call with values that are significant for the return of the `check()` method.\n\n```js\nimport {use, expect} from 'chai';\nimport {Contract, ContractFactory, utils, Wallet} from 'ethers';\nimport {MockProvider} from '@ethereum-waffle/provider';\nimport {waffleChai} from '@ethereum-waffle/chai';\nimport {deployMockContract} from '@ethereum-waffle/mock-contract';\n\nimport IERC20 from './helpers/interfaces/IERC20.json';\nimport AmIRichAlready from './helpers/interfaces/AmIRichAlready.json';\n\nuse(waffleChai);\n\ndescribe('Am I Rich Already', () => {\n  let contractFactory: ContractFactory;\n  let sender: Wallet;\n  let receiver: Wallet;\n  let mockERC20: Contract;\n  let contract: Contract;\n\n  beforeEach(async () => {\n    [sender, receiver] = new MockProvider().getWallets();\n    mockERC20 = await deployMockContract(sender, IERC20.abi);\n    contractFactory = new ContractFactory(AmIRichAlready.abi, AmIRichAlready.bytecode, sender);\n    contract = await contractFactory.deploy(mockERC20.address);\n  });\n\n  it('returns false if the wallet has less then 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('999999'));\n    expect(await contract.check()).to.be.equal(false);\n  });\n\n  it('returns true if the wallet has at least 1000000 coins', async () => {\n    await mockERC20.mock.balanceOf.returns(utils.parseEther('1000001'));\n    expect(await contract.check()).to.equal(true);\n  });\n\n  it('reverts if the ERC20 reverts', async () => {\n    await mockERC20.mock.balanceOf.reverts();\n    await expect(contract.check()).to.be.revertedWith('Mock revert');\n  });\n\n  it('returns 1000001 coins for my address and 0 otherwise', async () => {\n    await mockERC20.mock.balanceOf.returns('0');\n    await mockERC20.mock.balanceOf.withArgs(sender.address).returns(utils.parseEther('1000001'));\n\n    expect(await contract.check()).to.equal(true);\n    expect(await contract.connect(receiver.address).check()).to.equal(false);\n  });\n});\n```\n\n# Special thanks\n\nSpecial thanks to @spherefoundry for creating the original [Doppelganger](https://github.com/EthWorks/Doppelganger) project.\n","readmeFilename":"README.md","_id":"@ethereum-waffle/mock-contract@4.0.4-dev.238c11c","_integrity":"sha512-WUh6/f3qy/830T6ezdev6MxRlgcguqFqU3eqLl1FiKMZVHhKKK5b774otwtZ2To/gg26dC0ZT0Phg7G/tmXIng==","_resolved":"/tmp/a3bb687ddb0f6c59a411bb958c52f962/ethereum-waffle-mock-contract-4.0.4-dev.238c11c.tgz","_from":"file:ethereum-waffle-mock-contract-4.0.4-dev.238c11c.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-WUh6/f3qy/830T6ezdev6MxRlgcguqFqU3eqLl1FiKMZVHhKKK5b774otwtZ2To/gg26dC0ZT0Phg7G/tmXIng==","shasum":"b9392e5b047d808a6b49627fbaeb7cdfd2474823","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4-dev.238c11c.tgz","fileCount":18,"unpackedSize":515952,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEN045jIzWjAsoeTByfjnoj3dKWnUsSRl8g3VNYCgqdEAiEAqZyfo1yDVA3OfvjMs11KU9VKvynrAcXTKTqJb3sxoKQ="}]},"_npmUser":{"name":"ethworks","email":"eng-services@wallfacer.io"},"directories":{},"maintainers":[{"name":"ethworks","email":"eng-services@wallfacer.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mock-contract_4.0.4-dev.238c11c_1697112531281_0.8470483099697741"},"_hasShrinkwrap":false}},"time":{"created":"2020-05-02T06:18:16.152Z","2.4.1":"2020-05-02T06:18:16.532Z","modified":"2023-10-12T12:08:51.727Z","2.5.0":"2020-05-05T14:20:49.241Z","3.0.0-beta.1":"2020-05-05T18:34:12.478Z","2.5.1":"2020-05-20T15:47:48.418Z","3.0.0-beta.2":"2020-05-25T18:22:35.632Z","3.0.0-beta.3":"2020-06-12T12:02:57.001Z","3.0.0":"2020-06-13T05:49:45.312Z","3.0.1":"2020-07-05T10:24:24.215Z","3.0.2":"2020-07-11T09:10:11.254Z","3.0.3":"2020-08-31T15:49:56.110Z","3.1.0":"2020-09-02T08:18:53.148Z","3.1.1":"2020-09-26T12:25:01.643Z","3.1.2":"2020-10-23T12:58:46.356Z","3.2.0":"2020-10-31T07:20:04.947Z","3.2.1":"2020-11-24T15:53:56.494Z","3.2.2":"2021-01-23T17:23:00.125Z","3.3.0":"2021-06-17T12:59:29.498Z","3.3.1":"2021-12-24T20:40:05.533Z","4.0.0-alpha.0":"2022-03-10T14:08:47.323Z","4.0.0-alpha.1":"2022-03-23T10:35:20.138Z","3.4.4":"2022-03-23T12:43:29.450Z","4.0.0-alpha.2":"2022-03-24T15:07:30.328Z","4.0.0-alpha.3":"2022-03-25T11:21:39.362Z","4.0.0-alpha.4":"2022-03-25T14:01:27.033Z","4.0.0-alpha.5":"2022-03-25T15:50:57.697Z","4.0.0-alpha.6":"2022-03-28T14:45:28.174Z","4.0.0-alpha.7":"2022-03-28T16:10:19.925Z","4.0.0-alpha.8":"2022-03-29T14:25:24.283Z","4.0.0-alpha.9":"2022-04-05T15:28:24.626Z","4.0.0-alpha.10":"2022-04-08T10:05:21.908Z","4.0.0-alpha.11":"2022-04-08T13:22:17.723Z","4.0.0-alpha.12":"2022-04-08T13:34:19.878Z","4.0.0-alpha.13":"2022-04-08T13:41:13.265Z","4.0.0-alpha.14":"2022-04-08T13:54:31.992Z","4.0.0-alpha.15":"2022-04-08T16:01:41.667Z","4.0.0-alpha.b94c36":"2022-04-11T09:18:44.239Z","4.0.0-alpha.16":"2022-04-11T11:01:36.149Z","4.0.0-alpha.17":"2022-04-11T11:47:19.262Z","4.0.0-alpha.17.4":"2022-04-12T14:19:20.479Z","4.0.0-alpha.18":"2022-04-13T10:16:20.970Z","4.0.0-alpha.19":"2022-04-13T10:52:42.074Z","4.0.0-alpha.20":"2022-04-13T16:56:31.707Z","4.0.0-dev.b82389f":"2022-04-21T11:43:47.257Z","4.0.0-dev.8d4934c":"2022-04-21T12:23:28.449Z","4.0.0-dev.baa1b2f":"2022-04-21T12:48:47.813Z","4.0.0-dev.8f72c9c":"2022-04-21T13:45:38.230Z","4.0.0-alpha.21":"2022-04-21T13:57:43.247Z","4.0.0-dev.51e05d8":"2022-04-21T14:00:12.598Z","4.0.0-dev.498bffb":"2022-04-27T14:30:47.241Z","4.0.0-dev.de3905f":"2022-04-27T14:42:57.459Z","4.0.0-dev.0e1e2e5":"2022-05-04T10:15:27.047Z","4.0.0-dev.b7bb3ba":"2022-05-05T11:26:44.481Z","4.0.0-dev.c694a2a":"2022-05-06T08:59:59.921Z","4.0.0-dev.ba7033f":"2022-05-06T09:19:33.552Z","4.0.0-dev.bc0a5b5":"2022-05-06T12:35:43.611Z","4.0.0-dev.900b71d":"2022-05-06T14:08:00.041Z","4.0.0-dev.ba8cde5":"2022-05-13T09:05:25.524Z","4.0.0-dev.104f4a3":"2022-05-16T16:16:32.593Z","4.0.0-dev.e3fa452":"2022-05-16T16:34:24.556Z","4.0.0-dev.9e7c3d6":"2022-05-17T12:54:02.168Z","4.0.0-dev.d9a8ab2":"2022-05-17T13:05:25.763Z","4.0.0-dev.e275a26":"2022-05-17T13:09:09.782Z","4.0.0-dev.8aa0bc2":"2022-05-17T13:18:00.745Z","4.0.0-dev.219fe4f":"2022-05-17T13:37:34.779Z","4.0.0-dev.7e092e8":"2022-05-17T14:30:29.566Z","4.0.0-dev.2ef3d81":"2022-05-17T14:44:37.297Z","4.0.0-dev.539c432":"2022-06-07T07:02:29.089Z","4.0.0-dev.2fe3f15":"2022-06-07T09:45:41.829Z","4.0.0-dev.b2ee4d0":"2022-06-07T09:58:45.605Z","4.0.0-dev.4fd670d":"2022-06-07T11:27:15.015Z","4.0.0-dev.0f1b253":"2022-06-07T11:39:20.888Z","4.0.0-dev.b21809a":"2022-06-08T15:49:24.143Z","4.0.0-dev.1c384e6":"2022-06-15T11:32:07.486Z","4.0.0-dev.d8521e6":"2022-06-30T12:00:06.598Z","4.0.0-dev.4867133":"2022-07-07T13:39:56.186Z","4.0.0-dev.838cf4d":"2022-07-08T10:05:41.695Z","4.0.0-dev.06401c4":"2022-07-12T14:10:02.033Z","4.0.0-dev.79d1c7b":"2022-07-13T14:18:46.144Z","4.0.0-dev.5587e09":"2022-07-19T10:07:32.668Z","4.0.0-dev.5c29ca4":"2022-07-19T10:24:08.991Z","4.0.0-dev.4ce739d":"2022-07-21T13:20:05.367Z","4.0.0-dev.c98112a":"2022-07-21T14:18:29.148Z","4.0.0-dev.b028d7f":"2022-07-21T16:02:25.208Z","4.0.1":"2022-07-22T09:28:14.444Z","4.0.1-dev.37f589d":"2022-07-22T09:30:43.474Z","4.0.1-dev.2e1837c":"2022-07-25T13:18:19.190Z","4.0.1-dev.0a87072":"2022-07-26T13:46:28.479Z","4.0.1-dev.b329845":"2022-07-26T14:15:04.355Z","4.0.1-dev.c513a49":"2022-07-28T12:37:38.563Z","4.0.1-dev.382de5b":"2022-07-28T14:26:27.037Z","4.0.1-dev.4e0598e":"2022-07-28T15:26:49.115Z","4.0.1-dev.1fe07bb":"2022-07-29T11:46:51.710Z","4.0.1-dev.bd741a4":"2022-07-29T13:54:14.493Z","4.0.1-dev.3b7020d":"2022-08-01T08:27:57.171Z","4.0.2-dev.0c13fb9":"2022-08-01T08:45:37.501Z","4.0.2-dev.0f5af9a":"2022-08-01T09:20:09.652Z","4.0.2-dev.d1f8ca7":"2022-08-01T13:55:21.795Z","4.0.2":"2022-08-02T08:25:01.484Z","4.0.2-dev.cae5bac":"2022-08-02T08:28:13.640Z","4.0.2-dev.41bc646":"2022-08-03T09:43:12.341Z","4.0.2-dev.18b219e":"2022-08-03T09:48:41.974Z","4.0.2-dev.e7e18f6":"2022-08-03T10:03:16.020Z","4.0.2-dev.8eb1578":"2022-08-05T10:53:54.053Z","4.0.2-dev.e22c4e6":"2022-08-05T13:06:46.990Z","4.0.2-dev.89498ae":"2022-08-10T10:21:15.137Z","4.0.2-dev.71e4b73":"2022-08-19T10:31:33.928Z","4.0.2-dev.2f8bbd1":"2022-08-19T11:48:55.066Z","4.0.2-dev.b96f0af":"2022-08-30T08:27:35.482Z","4.0.2-dev.f0bea18":"2022-08-30T11:11:40.552Z","4.0.2-dev.6f16299":"2022-08-30T11:34:45.189Z","4.0.2-dev.60ae4b4":"2022-09-16T13:40:52.240Z","4.0.2-dev.2d19dde":"2022-09-16T13:45:19.678Z","4.0.2-dev.dd21fb0":"2022-09-16T15:34:48.915Z","4.0.2-dev.cc2dc55":"2022-09-16T16:03:54.207Z","4.0.2-dev.cf5427e":"2022-09-16T16:53:13.131Z","4.0.3-dev.d863d0a":"2022-09-19T10:43:07.422Z","4.0.3-dev.0c72c63":"2022-09-26T11:17:48.963Z","4.0.3-dev.f3d5029":"2022-09-27T09:41:20.476Z","4.0.3-dev.379ba2f":"2022-09-27T10:12:03.958Z","4.0.3-dev.9bdd800":"2022-10-03T12:21:53.271Z","4.0.3-dev.06c4b26":"2022-10-04T11:57:40.785Z","4.0.3-dev.90390a9":"2022-10-04T15:38:09.481Z","4.0.3-dev.cf42065":"2022-10-31T10:43:47.613Z","4.0.3-dev.8671be4":"2022-10-31T14:32:18.313Z","4.0.3-dev.4541f86":"2022-10-31T15:45:32.675Z","4.0.3-dev.4946c9b":"2022-11-10T15:00:22.176Z","4.0.3-dev.edcb2d5":"2022-11-28T14:07:41.824Z","4.0.3-dev.4557ff9":"2023-01-03T15:51:57.607Z","4.0.3-dev.d4cc0eb":"2023-01-10T12:44:51.501Z","4.0.3-dev.e1d3ccd":"2023-01-11T11:37:39.139Z","4.0.3-dev.4d27a34":"2023-01-23T15:26:01.503Z","4.0.3-dev.a50814e":"2023-01-24T15:33:21.341Z","4.0.3-dev.166b72c":"2023-01-26T11:03:34.045Z","4.0.3-dev.0bc9af4":"2023-01-26T13:01:58.253Z","4.0.3":"2023-01-26T13:40:33.498Z","4.0.3-dev.13d1af0":"2023-01-26T13:44:29.013Z","4.0.3-dev.f8ca718":"2023-01-26T18:16:22.456Z","4.0.3-dev.a1d89d0":"2023-01-27T13:35:44.487Z","4.0.4-dev.4740ec6":"2023-02-06T11:40:07.969Z","4.0.4":"2023-02-15T16:37:43.773Z","4.0.4-dev.0915e72":"2023-02-15T16:41:10.421Z","4.0.4-dev.efd5f2a":"2023-10-12T11:51:48.945Z","4.0.4-dev.238c11c":"2023-10-12T12:08:51.514Z"},"maintainers":[{"name":"ethworks","email":"eng-services@wallfacer.io"}],"description":"Mock smart contracts in a smart way.","homepage":"https://github.com/EthWorks/Waffle","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"repository":{"type":"git","url":"git+ssh://git@github.com/EthWorks/Waffle.git"},"author":{"name":"Marek Kirejczyk","email":"account@ethworks.io","url":"http://ethworks.io"},"bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"license":"MIT","readme":"","readmeFilename":""}