{"bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"dist":{"shasum":"8d4f02fd19e054f5acb6a1d0d65c0c07b9f3dd0e","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.0.0-beta.3.tgz","fileCount":12,"integrity":"sha512-mxyJUGR/RBHwtoz1vh34Yu0k1vetStUZppztu22ai432PkDf3YevqeU/qUPf2WgWEHsOWUNCU9cDtdn9G9wU5w==","signatures":[{"sig":"MEUCICc0CCRvLokcAIQoCQGqWcsyyae6CvsGucMZTBXtaw0HAiEA4YUu4Z1+xMDOKloSoRv5uIKyxuj7DcllfZpB8ltKmvY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"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"},"main":"dist/cjs/index.js","name":"@ethereum-waffle/mock-contract","types":"dist/esm/index.d.ts","author":{"url":"http://ethworks.io","name":"Marek Kirejczyk","email":"account@ethworks.io"},"module":"dist/esm/index.ts","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","engines":{"node":">=10.0"},"license":"MIT","private":false,"scripts":{"lint":"eslint '{src,test}/**/*.ts'","test":"export NODE_ENV=test && yarn test:build && mocha","build":"rimraf ./dist && yarn build:sol && yarn build:esm && yarn build:cjs","clean":"rimraf ./dist ./test/example/build","lint:fix":"eslint --fix '{src,test}/**/*.ts'","build:cjs":"tsc -p tsconfig.build.json --outDir dist/cjs --declaration false","build:esm":"tsc -p tsconfig.build.json --outDir dist/esm --module ES6","build:sol":"ts-node compile.ts","test:build":"ts-node ./test/helpers/buildTestContracts.ts","prepublishOnly":"yarn build"},"_npmUser":{"name":"ethworks","email":"account@ethworks.io"},"homepage":"https://github.com/EthWorks/Waffle","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"repository":{"url":"git@github.com:EthWorks/Waffle.git","type":"git"},"description":"Mock smart contracts in a smart way.","directories":{},"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","maintainers":[{"name":"ethworks","email":"account@ethworks.io"}],"dependencies":{"ethers":"^5.0.0-beta.184","@ethersproject/abi":"^5.0.0-beta.137"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","mocha":"^7.1.2","eslint":"^6.8.0","rimraf":"^3.0.0","ts-node":"^8.9.1","typescript":"^3.8.3","@types/chai":"^4.2.3","@types/mocha":"^5.2.7","chai-as-promised":"^7.1.1","eslint-plugin-import":"^2.20.2","@ethereum-waffle/chai":"^3.0.0-beta.3","@types/chai-as-promised":"^7.1.2","@ethereum-waffle/compiler":"^3.0.0-beta.3","@ethereum-waffle/provider":"^3.0.0-beta.3","@typescript-eslint/parser":"^2.30.0","@typescript-eslint/eslint-plugin":"^2.30.0"},"_npmOperationalInternal":{"tmp":"tmp/mock-contract_3.0.0-beta.3_1591963376881_0.2897068069979849","host":"s3://npm-registry-packages"},"_id":"@ethereum-waffle/mock-contract@3.0.0-beta.3","version":"3.0.0-beta.3"}