{"bugs":{"url":"https://github.com/EthWorks/Waffle/issues"},"dist":{"shasum":"47bafa94f235f1a2716e609a61555bf0430449ed","tarball":"https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.3-dev.cf42065.tgz","fileCount":18,"integrity":"sha512-vKxWf4Kj8uRV8iyAX9iC14tc6+ZyXNdeG9Zw+0E7FI4Rj5vt3yl1wI1RhU7pbJjxBaEzPFQXYaXiCl7kpSybHg==","signatures":[{"sig":"MEUCIQDFGlOVc5GulVwY2haVEDyKg52PguCBtzfQWuKMTsna2QIgLcBiIeYYdqx3XDQUjKR1+QVv4Yv5b/Z/pWrf8yEER4E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":310964,"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"},"main":"dist/cjs/src/index.js","name":"@ethereum-waffle/mock-contract","_from":"file:ethereum-waffle-mock-contract-4.0.3-dev.cf42065.tgz","types":"dist/esm/src/index.d.ts","author":{"url":"http://ethworks.io","name":"Marek Kirejczyk","email":"account@ethworks.io"},"module":"dist/esm/src/index.ts","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","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","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"},"_npmUser":{"name":"ethworks","email":"code@trusttoken.com"},"homepage":"https://github.com/EthWorks/Waffle","keywords":["ethereum","smart-contracts","solidity","testing","javascript","typescript","library","mock","double"],"_resolved":"/tmp/f5318c9c2a3d54ae351fddb2f7b19adf/ethereum-waffle-mock-contract-4.0.3-dev.cf42065.tgz","_integrity":"sha512-vKxWf4Kj8uRV8iyAX9iC14tc6+ZyXNdeG9Zw+0E7FI4Rj5vt3yl1wI1RhU7pbJjxBaEzPFQXYaXiCl7kpSybHg==","repository":{"url":"git+ssh://git@github.com/EthWorks/Waffle.git","type":"git"},"_npmVersion":"8.15.0","description":"Mock smart contracts in a smart way.","directories":{},"maintainers":[{"name":"ethworks","email":"code@trusttoken.com"}],"_nodeVersion":"16.17.1","publishConfig":{"tag":"dev","access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"solc":"0.8.15","mocha":"^8.2.1","eslint":"^7.14.0","ethers":"5.6.2","rimraf":"^3.0.2","ts-node":"^9.0.0","typechain":"^8.0.0","typescript":"^4.6.2","@ethersproject/abi":"^5.6.1","@ethereum-waffle/chai":"4.0.8-dev.cf42065","@ethereum-waffle/compiler":"4.0.3-dev.cf42065","@ethereum-waffle/provider":"4.0.5-dev.cf42065"},"peerDependencies":{"ethers":"*"},"_npmOperationalInternal":{"tmp":"tmp/mock-contract_4.0.3-dev.cf42065_1667213027471_0.5161781728416333","host":"s3://npm-registry-packages"},"_id":"@ethereum-waffle/mock-contract@4.0.3-dev.cf42065","version":"4.0.3-dev.cf42065"}