From 46614a6030ce61cacc2169449528de8bb4953c16 Mon Sep 17 00:00:00 2001 From: Giovanni Di Siena Date: Fri, 24 Dec 2021 20:26:16 +0000 Subject: [PATCH 1/2] Add keepers example using function selector checkData --- contracts/KeepersCounter.sol | 74 ++++++++++-- deploy/04_Deploy_KeepersCounter.js | 3 +- helper-hardhat-config.js | 15 ++- package.json | 1 + test/unit/KeepersCounter_unit_test.js | 112 +++++++++++++++++- yarn.lock | 162 +++++++++++++++++++++++++- 6 files changed, 343 insertions(+), 24 deletions(-) diff --git a/contracts/KeepersCounter.sol b/contracts/KeepersCounter.sol index aa5235bd3..819f04fe6 100644 --- a/contracts/KeepersCounter.sol +++ b/contracts/KeepersCounter.sol @@ -8,27 +8,83 @@ contract Counter is KeeperCompatibleInterface { */ uint public counter; + /** + * Public multiplier boolean variable + */ + bool public multiplierEnabled; + /** * Use an interval in seconds and a timestamp to slow execution of Upkeep */ uint public immutable interval; uint public lastTimeStamp; + + // keccak256 hash of empty checkData + bytes32 constant public emptyCheckDataHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - constructor(uint updateInterval) { + constructor(uint updateInterval, bool _multiplierEnabled) { interval = updateInterval; lastTimeStamp = block.timestamp; - counter = 0; + multiplierEnabled = _multiplierEnabled; + } + + function setMultiplierEnabled(bool _enabled) external { + multiplierEnabled = _enabled; + } + + function checkMultiplier() external view returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = multiplierEnabled && (counter == 3 || counter == 10); + if (upkeepNeeded) { + uint256 multiplier = counter % 2 == 0 ? 10 : 3; + performData = abi.encodeWithSelector(this.multiplyCounter.selector, multiplier); + } + return (upkeepNeeded, performData); } - function checkUpkeep(bytes calldata /* checkData */) external override returns (bool upkeepNeeded, bytes memory /* performData */) { - upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; - // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. + function checkReset() external view returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = counter > 100; + performData = abi.encodePacked(bytes4(abi.encodeWithSelector(this.resetCounter.selector, ""))); + return (upkeepNeeded, performData); + } + + function multiplyCounter(uint256 _amount) external { + require(multiplierEnabled && (counter == 3 || counter == 10), "Upkeep not satisfied"); + require(counter == _amount, "Only valid multiplier"); + counter *= _amount; + } + + function resetCounter() external { + require(counter > 100, "Too early"); + counter = 0; + } + + function checkUpkeep(bytes calldata checkData) + external + view + override + returns (bool upkeepNeeded, bytes memory performData) + { + if (keccak256(checkData) == emptyCheckDataHash) { + // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. + upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; + performData = ""; + } else { + (bool success, bytes memory returnedData) = address(this).staticcall(checkData); + require(success); + + (upkeepNeeded, performData) = abi.decode(returnedData, (bool, bytes)); + } } - function performUpkeep(bytes calldata /* performData */) external override { - lastTimeStamp = block.timestamp; - counter = counter + 1; - // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function + function performUpkeep(bytes calldata performData) external override { + lastTimeStamp = block.timestamp; + if (keccak256(performData) == emptyCheckDataHash) { + // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function + counter = counter + 1; + } else { + (bool success, ) = address(this).call(performData); + require(success); + } } } \ No newline at end of file diff --git a/deploy/04_Deploy_KeepersCounter.js b/deploy/04_Deploy_KeepersCounter.js index f91067bf0..72c392f48 100644 --- a/deploy/04_Deploy_KeepersCounter.js +++ b/deploy/04_Deploy_KeepersCounter.js @@ -10,11 +10,12 @@ module.exports = async ({ const { deployer } = await getNamedAccounts() const chainId = await getChainId() let keepersUpdateInterval = networkConfig[chainId]['keepersUpdateInterval'] + let multiplierEnabled = networkConfig[chainId]['multiplierEnabled'] // Price Feed Address, values can be obtained at https://docs.chain.link/docs/reference-contracts // Default one below is ETH/USD contract on Kovan const keepersCounter = await deploy('Counter', { from: deployer, - args: [keepersUpdateInterval], + args: [keepersUpdateInterval, multiplierEnabled], log: true }) log("Head to https://keepers.chain.link/ to register your contract for upkeeps. Then run the following command to track the counter updates") diff --git a/helper-hardhat-config.js b/helper-hardhat-config.js index a7b6ce4d6..c0f2c6144 100644 --- a/helper-hardhat-config.js +++ b/helper-hardhat-config.js @@ -5,7 +5,8 @@ const networkConfig = { keyHash: '0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4', jobId: '29fa9aa13bf1468788b7cc4a500a45b8', fundAmount: "1000000000000000000", - keepersUpdateInterval: "30" + keepersUpdateInterval: "30", + multiplierEnabled: "true" }, 31337: { name: 'localhost', @@ -13,7 +14,8 @@ const networkConfig = { keyHash: '0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4', jobId: '29fa9aa13bf1468788b7cc4a500a45b8', fundAmount: "1000000000000000000", - keepersUpdateInterval: "30" + keepersUpdateInterval: "30", + multiplierEnabled: "true" }, 42: { name: 'kovan', @@ -25,7 +27,8 @@ const networkConfig = { jobId: 'd5270d1c311941d0b08bead21fea7747', fee: '100000000000000000', fundAmount: "1000000000000000000", - keepersUpdateInterval: "30" + keepersUpdateInterval: "30", + multiplierEnabled: "true" }, 4: { name: 'rinkeby', @@ -37,13 +40,15 @@ const networkConfig = { jobId: '6b88e0402e5d415eb946e528b8e0c7ba', fee: '100000000000000000', fundAmount: "1000000000000000000", - keepersUpdateInterval: "30" + keepersUpdateInterval: "30", + multiplierEnabled: "true" }, 1: { name: 'mainnet', linkToken: '0x514910771af9ca656af840dff83e8264ecf986ca', fundAmount: "0", - keepersUpdateInterval: "30" + keepersUpdateInterval: "30", + multiplierEnabled: "true" }, 5: { name: 'goerli', diff --git a/package.json b/package.json index 8219e0a3d..069ef4675 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@nomiclabs/hardhat-etherscan": "^2.1.7", "@nomiclabs/hardhat-waffle": "^2.0.1", "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/test-helpers": "^0.5.15", "chai": "^4.3.4", "chai-bignumber": "^3.0.0", "chai-bn": "^0.2.1", diff --git a/test/unit/KeepersCounter_unit_test.js b/test/unit/KeepersCounter_unit_test.js index 6b19dcf8d..fda2bcc72 100644 --- a/test/unit/KeepersCounter_unit_test.js +++ b/test/unit/KeepersCounter_unit_test.js @@ -5,6 +5,7 @@ const skipIf = require('mocha-skip-if') chai.use(require('chai-bn')(BN)) const { deployments, getChainId } = require('hardhat') const { networkConfig, developmentChains } = require('../../helper-hardhat-config') +const { expectRevert } = require('@openzeppelin/test-helpers') skip.if(!developmentChains.includes(network.name)). describe('Keepers Counter Unit Tests', async function () { @@ -14,19 +15,118 @@ skip.if(!developmentChains.includes(network.name)). await deployments.fixture(['mocks', 'keepers']) const Counter = await deployments.get("Counter") counter = await ethers.getContractAt("Counter", Counter.address) + chainId = await getChainId() }) - it('should be able to call checkUpkeep', async () => { - const checkData = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("")); - const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData); - }) + context("Basic upkeep", async () => { + it('should be able to call checkUpkeep', async () => { + const checkData = ethers.utils.hexlify("0x"); + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData); + }) - it('should be able to call performUpkeep', async () => { - const checkData = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("")); + it('should be able to call performUpkeep', async () => { + const checkData = ethers.utils.hexlify("0x"); await counter.performUpkeep(checkData); //now get the new counter value const result = await counter.counter() console.log("Keepers Counter value: ", new ethers.BigNumber.from(result._hex).toString()) expect(new ethers.BigNumber.from(result).toString()).to.be.a.bignumber.that.is.greaterThan(new ethers.BigNumber.from(0).toString()) }) + }) + + context("Upkeep with checkData - unhappy paths", async () => { + before(function() { + if(networkConfig[chainId].multiplierEnabled == "false") this.skip(); + }); + it("Should not require upkeep from checkMultiplier if not enabled", async () => { + await counter.setMultiplierEnabled(false); + const returnData = await counter.checkMultiplier() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not multiply counter if not enabled", async () => { + await expectRevert(counter.multiplyCounter(3), "Upkeep not satisfied") + }) + + it("Should not require upkeep from checkMultiplier if not valid value", async () => { + await counter.setMultiplierEnabled(true); + const returnData = await counter.checkMultiplier() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not multiply counter if not valid value", async () => { + for(let i=0; i<3; i++) { + await counter.performUpkeep(ethers.utils.hexlify("0x")); + } + await expectRevert(counter.multiplyCounter(2), "Only valid multiplier") + }) + + it("Should not require upkeep from checkReset if too early", async () => { + const returnData = await counter.checkReset() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not reset counter if too early", async () => { + await expectRevert(counter.resetCounter(), "Too early") + }) + }) + + context("Upkeep with checkData - happy paths", async () => { + before(function() { + if(networkConfig[chainId].multiplierEnabled == "false") this.skip(); + }); + beforeEach(async () => { + for(let i=0; i<3; i++) { + await counter.performUpkeep(ethers.utils.hexlify("0x")); + } + }) + + it("Should be able to call checkUpkeep for checkMultiplier", async () => { + const abi = ["function checkMultiplier()", "function multiplyCounter(uint)"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("checkMultiplier", []) + console.log(`checkMultiplier checkData: ${checkData}`) + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData) + const calldata = iface.encodeFunctionData("multiplyCounter", ["3"]) + expect(upkeepNeeded).to.be.equal(true) + expect(performData).to.be.equal(calldata) + }) + + it("Should call performUpkeep for multiplyCounter", async () => { + const abi = ["function multiplyCounter(uint)"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("multiplyCounter", ["3"]) + await counter.performUpkeep(checkData) + const result = await counter.counter() + expect(result).to.be.equal(new ethers.BigNumber.from("9")) + }) + + it("Should be able to call checkUpkeep for checkReset", async () => { + await counter.multiplyCounter(3); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + await counter.multiplyCounter(10); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + const abi = ["function checkReset()", "function resetCounter()"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("checkReset", []) + console.log(`checkReset checkData: ${checkData}`) + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData) + const calldata = iface.encodeFunctionData("resetCounter", []) + expect(upkeepNeeded).to.be.equal(true) + expect(performData).to.be.equal(calldata) + }) + + it("Should call performUpkeep for resetCounter", async () => { + await counter.multiplyCounter(3); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + await counter.multiplyCounter(10); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + const abi = ["function resetCounter()"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("resetCounter", []) + await counter.performUpkeep(checkData) + const result = await counter.counter() + expect(result).to.be.equal(new ethers.BigNumber.from("0")) + }) + }) }) diff --git a/yarn.lock b/yarn.lock index 51d2be6fd..956f4938c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1100,11 +1100,35 @@ ethers "^4.0.0-beta.1" source-map-support "^0.5.19" +"@openzeppelin/contract-loader@^0.6.2": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz#61a7b44de327e40b7d53f39e0fb59bbf847335c3" + integrity sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg== + dependencies: + find-up "^4.1.0" + fs-extra "^8.1.0" + "@openzeppelin/contracts@^3.4.0": version "3.4.2" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== +"@openzeppelin/test-helpers@^0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz#7727d4bb1535e1fa2372d65d1dcee335ce8d36af" + integrity sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA== + dependencies: + "@openzeppelin/contract-loader" "^0.6.2" + "@truffle/contract" "^4.0.35" + ansi-colors "^3.2.3" + chai "^4.2.0" + chai-bn "^0.2.1" + ethjs-abi "^0.2.1" + lodash.flatten "^4.4.0" + semver "^5.6.0" + web3 "^1.2.5" + web3-utils "^1.2.5" + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -1259,6 +1283,15 @@ faker "^5.3.1" fast-check "^2.12.1" +"@truffle/abi-utils@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.5.tgz#62d2876e11fee76479de2aac0a1872fb7035ba24" + integrity sha512-eKDIn9LqUFP8MnHVohe8ncuza4p9bszz1NtJWc+sr5zUogtmWnnf8Ajyj7JJpNKhLNDVZVbLowVEVxWzSSpMHw== + dependencies: + change-case "3.0.2" + faker "^5.3.1" + fast-check "^2.12.1" + "@truffle/blockchain-utils@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.25.tgz#f4b320890113d282f25f1a1ecd65b94a8b763ac1" @@ -1290,6 +1323,25 @@ utf8 "^3.0.0" web3-utils "1.5.3" +"@truffle/codec@^0.11.21": + version "0.11.21" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.11.21.tgz#4c87def76104661fe7f428e10ff8f69e66c68422" + integrity sha512-ZDzaEPCUFWmQuFsXA3KzXmU4w4lpxSWZTGUcEDHxn6IqAmL7FY8mmdbR6LQ1wTRAa9oPf84PcehMpTNY47HVcg== + dependencies: + "@truffle/abi-utils" "^0.2.5" + "@truffle/compile-common" "^0.7.23" + big.js "^5.2.2" + bn.js "^5.1.3" + cbor "^5.1.0" + debug "^4.3.1" + lodash.clonedeep "^4.5.0" + lodash.escaperegexp "^4.1.2" + lodash.partition "^4.6.0" + lodash.sum "^4.0.2" + semver "^7.3.4" + utf8 "^3.0.0" + web3-utils "1.5.3" + "@truffle/codec@^0.7.1": version "0.7.1" resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4" @@ -1316,6 +1368,14 @@ "@truffle/error" "^0.0.14" colors "^1.4.0" +"@truffle/compile-common@^0.7.23": + version "0.7.23" + resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.7.23.tgz#4176ca8e499cd004618abca4e8c2bd9db43bed25" + integrity sha512-LWzeboJ9HmSZVgx5DMmKArOo96V4QZhS/+8beDOfeNT1W4QeKfkuVbAM0R77cXjiLnUsNjjFVXehnco6HiF8ww== + dependencies: + "@truffle/error" "^0.0.14" + colors "^1.4.0" + "@truffle/contract-schema@^3.2.5", "@truffle/contract-schema@^3.4.3": version "3.4.3" resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.3.tgz#c1bcde343f70b9438314202e103a7d77d684603c" @@ -1324,6 +1384,34 @@ ajv "^6.10.0" debug "^4.3.1" +"@truffle/contract-schema@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.4.tgz#e98f30c5db91f8ca6f239f2a27029b05e3dadf5b" + integrity sha512-xWgrm6WRM2jmT04w7dP7aVbS2qyP9XPmH/mybQtFXMjJ/8BZlp0yltC8QOs8sGl6q8Ws7acp19YtRkLdK6SsmQ== + dependencies: + ajv "^6.10.0" + debug "^4.3.1" + +"@truffle/contract@^4.0.35": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.4.2.tgz#b96941435ae0321f6a61fd02fcc453b782ba2015" + integrity sha512-w/iyB5dZ3KnIuvX1dqD1Z1SWFahT9/nvA1VAsK+eIy+zvtI1phx365uV75LdIoyeBtR1GmbqAO4F7ZLSfjkP+w== + dependencies: + "@ensdomains/ensjs" "^2.0.1" + "@truffle/blockchain-utils" "^0.0.31" + "@truffle/contract-schema" "^3.4.4" + "@truffle/debug-utils" "^6.0.3" + "@truffle/error" "^0.0.14" + "@truffle/interface-adapter" "^0.5.8" + bignumber.js "^7.2.1" + debug "^4.3.1" + ethers "^4.0.32" + web3 "1.5.3" + web3-core-helpers "1.5.3" + web3-core-promievent "1.5.3" + web3-eth-abi "1.5.3" + web3-utils "1.5.3" + "@truffle/contract@^4.1.8", "@truffle/contract@^4.3.8": version "4.3.43" resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.3.43.tgz#0d3944d98e9924809283f8fa6adcfb0ffc130590" @@ -1368,6 +1456,18 @@ debug "^4.3.1" highlightjs-solidity "^2.0.2" +"@truffle/debug-utils@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.3.tgz#9bd2f54640840f26219f7c1e77a9227d04dc091c" + integrity sha512-wxvZqvHIBw9wJHtSpUMJTku8sHpC0VbP0gLyV5+NVa/rn6CvVGtf0MyoDZGS4FDyhO1hui+bzzoQftoRy7jWyA== + dependencies: + "@truffle/codec" "^0.11.21" + "@trufflesuite/chromafi" "^2.2.2" + bn.js "^5.1.3" + chalk "^2.4.2" + debug "^4.3.1" + highlightjs-solidity "^2.0.3" + "@truffle/error@^0.0.11": version "0.0.11" resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.11.tgz#2789c0042d7e796dcbb840c7a9b5d2bcd8e0e2d8" @@ -1856,6 +1956,11 @@ ansi-colors@3.2.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== +ansi-colors@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -5291,6 +5396,15 @@ ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.2, ethers@^5.4.7, ethers@^5.5.1: "@ethersproject/web" "5.5.1" "@ethersproject/wordlists" "5.5.0" +ethjs-abi@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" + integrity sha1-4KepOn6BFjqUR3utVu3lJKtt5TM= + dependencies: + bn.js "4.11.6" + js-sha3 "0.5.5" + number-to-bn "1.7.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -5633,6 +5747,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-yarn-workspace-root@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" @@ -6461,6 +6583,11 @@ highlightjs-solidity@^2.0.2: resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.2.tgz#87ffdec3c51ae8b6def42d50f9a40b4676f57e4e" integrity sha512-q0aYUKiZ9MPQg41qx/KpXKaCpqql50qTvmwGYyLFfcjt9AE/+C9CwjVIdJZc7EYj6NGgJuFJ4im1gfgrzUU1fQ== +highlightjs-solidity@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.3.tgz#c89b6eca7d462f849acfb3a94c18f7db2b6d0c69" + integrity sha512-tjFm5dtIE61VQBzjlZmkCtY5fLs3CaEABbVuUNyXeW+UuOCsxMg3MsPFy0kCelHP74hPpkoqDejLrbnV1axAIw== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -7166,6 +7293,11 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +js-sha3@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" + integrity sha1-uvDA6MVK1ZA0R9+Wreekobynmko= + js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -7715,6 +7847,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -7730,6 +7869,11 @@ lodash.escaperegexp@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -8802,7 +8946,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -8823,6 +8967,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -8996,6 +9147,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -12500,7 +12656,7 @@ web3-utils@1.5.3: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@1.6.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: +web3-utils@1.6.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.2.5, web3-utils@^1.3.0: version "1.6.1" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== @@ -12552,7 +12708,7 @@ web3@1.5.3: web3-shh "1.5.3" web3-utils "1.5.3" -web3@^1.0.0-beta.34: +web3@^1.0.0-beta.34, web3@^1.2.5: version "1.6.1" resolved "https://registry.yarnpkg.com/web3/-/web3-1.6.1.tgz#c9e68fe7b3073adddf35393441f950ec69b92735" integrity sha512-c299lLiyb2/WOcxh7TinwvbATaMmrgNIeAzbLbmOKHI0LcwyfsB1eu2ReOIrfrCYDYRW2KAjYr7J7gHawqDNPQ== From 408deaaf144ace0e9a69b85df6cb9aea9e080ef4 Mon Sep 17 00:00:00 2001 From: Giovanni Di Siena Date: Fri, 24 Dec 2021 20:26:16 +0000 Subject: [PATCH 2/2] Add keepers example using function selector checkData --- contracts/KeepersCounter.sol | 118 ++-- .../fuzzing/KeepersCounterEchidnaTest.sol | 2 +- deploy/04_Deploy_KeepersCounter.js | 3 +- helper-hardhat-config.js | 9 + package.json | 2 + test/unit/KeepersCounter_unit_test.js | 126 +++- yarn.lock | 602 +++++++++++++++++- 7 files changed, 794 insertions(+), 68 deletions(-) diff --git a/contracts/KeepersCounter.sol b/contracts/KeepersCounter.sol index fa7104b10..dd55c846d 100644 --- a/contracts/KeepersCounter.sol +++ b/contracts/KeepersCounter.sol @@ -13,53 +13,83 @@ contract KeepersCounter is KeeperCompatibleInterface { */ uint256 public counter; - /** - * Use an interval in seconds and a timestamp to slow execution of Upkeep - */ - uint256 public immutable interval; - uint256 public lastTimeStamp; + /** + * Public multiplier boolean variable + */ + bool public multiplierEnabled; - /** - * @notice Executes once when a contract is created to initialize state variables - * - * @param updateInterval - Period of time between two counter increments expressed as UNIX timestamp value - */ - constructor(uint256 updateInterval) { - interval = updateInterval; - lastTimeStamp = block.timestamp; + /** + * Use an interval in seconds and a timestamp to slow execution of Upkeep + */ + uint public immutable interval; + uint public lastTimeStamp; + + // keccak256 hash of empty checkData + bytes32 constant public emptyCheckDataHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - counter = 0; - } + constructor(uint updateInterval, bool _multiplierEnabled) { + interval = updateInterval; + lastTimeStamp = block.timestamp; + counter = 0; + multiplierEnabled = _multiplierEnabled; + } - /** - * @notice Checks if the contract requires work to be done - */ - function checkUpkeep( - bytes memory /* checkData */ - ) - public - override - returns ( - bool upkeepNeeded, - bytes memory /* performData */ - ) - { - upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; - // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. - } + function setMultiplierEnabled(bool _enabled) external { + multiplierEnabled = _enabled; + } - /** - * @notice Performs the work on the contract, if instructed by :checkUpkeep(): - */ - function performUpkeep( - bytes calldata /* performData */ - ) external override { - // add some verification - (bool upkeepNeeded, ) = checkUpkeep(""); - require(upkeepNeeded, "Time interval not met"); + function checkMultiplier() external view returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = multiplierEnabled && (counter == 3 || counter == 10); + if (upkeepNeeded) { + uint256 multiplier = counter % 2 == 0 ? 10 : 3; + performData = abi.encodeWithSelector(this.multiplyCounter.selector, multiplier); + } + return (upkeepNeeded, performData); + } + + function checkReset() external view returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = counter > 100; + performData = abi.encodePacked(bytes4(abi.encodeWithSelector(this.resetCounter.selector, ""))); + return (upkeepNeeded, performData); + } + + function multiplyCounter(uint256 _amount) external { + require(multiplierEnabled && (counter == 3 || counter == 10), "Upkeep not satisfied"); + require(counter == _amount, "Only valid multiplier"); + counter *= _amount; + } + + function resetCounter() external { + require(counter > 100, "Too early"); + counter = 0; + } + + function checkUpkeep(bytes calldata checkData) + external + view + override + returns (bool upkeepNeeded, bytes memory performData) + { + if (keccak256(checkData) == emptyCheckDataHash) { + // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. + upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; + performData = ""; + } else { + (bool success, bytes memory returnedData) = address(this).staticcall(checkData); + require(success); + + (upkeepNeeded, performData) = abi.decode(returnedData, (bool, bytes)); + } + } - lastTimeStamp = block.timestamp; - counter = counter + 1; - // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function - } + function performUpkeep(bytes calldata performData) external override { + lastTimeStamp = block.timestamp; + if (keccak256(performData) == emptyCheckDataHash) { + // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function + counter = counter + 1; + } else { + (bool success, ) = address(this).call(performData); + require(success); + } + } } diff --git a/contracts/test/fuzzing/KeepersCounterEchidnaTest.sol b/contracts/test/fuzzing/KeepersCounterEchidnaTest.sol index 57467bc9f..3947f2873 100644 --- a/contracts/test/fuzzing/KeepersCounterEchidnaTest.sol +++ b/contracts/test/fuzzing/KeepersCounterEchidnaTest.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.7; import "../../KeepersCounter.sol"; contract KeepersCounterEchidnaTest is KeepersCounter { - constructor() KeepersCounter(8 days) {} + constructor() KeepersCounter(8 days, true) {} function echidna_test_perform_upkeep_gate() public view returns (bool) { return counter == 0; diff --git a/deploy/04_Deploy_KeepersCounter.js b/deploy/04_Deploy_KeepersCounter.js index e6b4b8804..cdb5a900d 100644 --- a/deploy/04_Deploy_KeepersCounter.js +++ b/deploy/04_Deploy_KeepersCounter.js @@ -11,12 +11,13 @@ module.exports = async ({ getNamedAccounts, deployments, getChainId }) => { const { deployer } = await getNamedAccounts() const chainId = network.config.chainId const keepersUpdateInterval = networkConfig[chainId]["keepersUpdateInterval"] || "30" + const multiplierEnabled = networkConfig[chainId]['multiplierEnabled'] || true // Price Feed Address, values can be obtained at https://docs.chain.link/docs/reference-contracts // Default one below is ETH/USD contract on Kovan const waitBlockConfirmations = developmentChains.includes(network.name) ? 1 : VERIFICATION_BLOCK_CONFIRMATIONS - const args = [keepersUpdateInterval] + const args = [keepersUpdateInterval, multiplierEnabled] const keepersCounter = await deploy("KeepersCounter", { from: deployer, args: args, diff --git a/helper-hardhat-config.js b/helper-hardhat-config.js index 996b5d60e..fbfc906d3 100644 --- a/helper-hardhat-config.js +++ b/helper-hardhat-config.js @@ -6,6 +6,7 @@ const networkConfig = { jobId: "29fa9aa13bf1468788b7cc4a500a45b8", fundAmount: "1000000000000000000", keepersUpdateInterval: "30", + multiplierEnabled: "true", }, 31337: { name: "localhost", @@ -14,6 +15,7 @@ const networkConfig = { jobId: "29fa9aa13bf1468788b7cc4a500a45b8", fundAmount: "1000000000000000000", keepersUpdateInterval: "30", + multiplierEnabled: "true", ethUsdPriceFeed: "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", }, 42: { @@ -25,6 +27,7 @@ const networkConfig = { fee: "100000000000000000", fundAmount: "100000000000000000", // 0.1 keepersUpdateInterval: "30", + multiplierEnabled: "true", }, 4: { name: "rinkeby", @@ -37,17 +40,21 @@ const networkConfig = { fee: "100000000000000000", fundAmount: "100000000000000000", // 0.1 keepersUpdateInterval: "30", + multiplierEnabled: "true", }, 1: { name: "mainnet", linkToken: "0x514910771af9ca656af840dff83e8264ecf986ca", fundAmount: "0", keepersUpdateInterval: "30", + multiplierEnabled: "true", }, 5: { name: "goerli", linkToken: "0x326c977e6efc84e512bb9c30f76e30c160ed06fb", fundAmount: "0", + keepersUpdateInterval: "30", + multiplierEnabled: "true", }, 137: { name: "polygon", @@ -57,6 +64,8 @@ const networkConfig = { jobId: "12b86114fa9e46bab3ca436f88e1a912", fee: "100000000000000", fundAmount: "100000000000000", + keepersUpdateInterval: "30", + multiplierEnabled: "true", }, } diff --git a/package.json b/package.json index eedd188a5..975710b57 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13", "@nomiclabs/hardhat-etherscan": "^3.0.0", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/test-helpers": "^0.5.15", "chai": "^4.3.4", "ethereum-waffle": "^3.4.0", "ethers": "^5.5.1", diff --git a/test/unit/KeepersCounter_unit_test.js b/test/unit/KeepersCounter_unit_test.js index 66da591e7..ce8cb368b 100644 --- a/test/unit/KeepersCounter_unit_test.js +++ b/test/unit/KeepersCounter_unit_test.js @@ -1,32 +1,126 @@ const { assert, expect } = require("chai") const { network, deployments, ethers } = require("hardhat") -const { developmentChains } = require("../../helper-hardhat-config") +const { developmentChains, networkConfig } = require("../../helper-hardhat-config") +const { expectRevert } = require('@openzeppelin/test-helpers') !developmentChains.includes(network.name) ? describe.skip : describe("Keepers Counter Unit Tests", async function () { + beforeEach(async () => { + await deployments.fixture(["mocks", "keepers"]) + counter = await ethers.getContract("KeepersCounter") + chainId = await getChainId() + }) + + context("Basic upkeep", async () => { + it('should be able to call checkUpkeep', async () => { + const checkData = ethers.utils.hexlify("0x"); + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData); + }) + + it('should be able to call performUpkeep', async () => { + const checkData = ethers.utils.hexlify("0x"); + await counter.performUpkeep(checkData); + //now get the new counter value + const result = await counter.counter() + console.log("Keepers Counter value: ", new ethers.BigNumber.from(result._hex).toString()) + expect(new ethers.BigNumber.from(result).toString()).to.be.a.bignumber.that.is.greaterThan(new ethers.BigNumber.from(0).toString()) + }) + }) + + context("Upkeep with checkData - unhappy paths", async () => { + before(function() { + if(networkConfig[chainId].multiplierEnabled == "false") this.skip(); + }); + it("Should not require upkeep from checkMultiplier if not enabled", async () => { + await counter.setMultiplierEnabled(false); + const returnData = await counter.checkMultiplier() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not multiply counter if not enabled", async () => { + await expectRevert(counter.multiplyCounter(3), "Upkeep not satisfied") + }) + + it("Should not require upkeep from checkMultiplier if not valid value", async () => { + await counter.setMultiplierEnabled(true); + const returnData = await counter.checkMultiplier() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not multiply counter if not valid value", async () => { + for(let i=0; i<3; i++) { + await counter.performUpkeep(ethers.utils.hexlify("0x")); + } + await expectRevert(counter.multiplyCounter(2), "Only valid multiplier") + }) + + it("Should not require upkeep from checkReset if too early", async () => { + const returnData = await counter.checkReset() + expect(returnData[0]).to.be.equal(false) + }) + + it("Should not reset counter if too early", async () => { + await expectRevert(counter.resetCounter(), "Too early") + }) + }) + + context("Upkeep with checkData - happy paths", async () => { + before(function() { + if(networkConfig[chainId].multiplierEnabled == "false") this.skip(); + }); beforeEach(async () => { - await deployments.fixture(["mocks", "keepers"]) - counter = await ethers.getContract("KeepersCounter") + for(let i=0; i<3; i++) { + await counter.performUpkeep(ethers.utils.hexlify("0x")); + } }) - it("should be able to call checkUpkeep", async () => { - const checkData = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("")) - const { upkeepNeeded } = await counter.callStatic.checkUpkeep(checkData) - assert.equal(upkeepNeeded, false) + it("Should be able to call checkUpkeep for checkMultiplier", async () => { + const abi = ["function checkMultiplier()", "function multiplyCounter(uint)"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("checkMultiplier", []) + console.log(`checkMultiplier checkData: ${checkData}`) + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData) + const calldata = iface.encodeFunctionData("multiplyCounter", ["3"]) + expect(upkeepNeeded).to.be.equal(true) + expect(performData).to.be.equal(calldata) + }) + + it("Should call performUpkeep for multiplyCounter", async () => { + const abi = ["function multiplyCounter(uint)"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("multiplyCounter", ["3"]) + await counter.performUpkeep(checkData) + const result = await counter.counter() + expect(result).to.be.equal(new ethers.BigNumber.from("9")) }) - it("should not be able to call perform upkeep without the time passed interval", async () => { - const checkData = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("")) - await expect(counter.performUpkeep(checkData)).to.be.revertedWith("Time interval not met") + it("Should be able to call checkUpkeep for checkReset", async () => { + await counter.multiplyCounter(3); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + await counter.multiplyCounter(10); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + const abi = ["function checkReset()", "function resetCounter()"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("checkReset", []) + console.log(`checkReset checkData: ${checkData}`) + const { upkeepNeeded, performData } = await counter.checkUpkeep(checkData) + const calldata = iface.encodeFunctionData("resetCounter", []) + expect(upkeepNeeded).to.be.equal(true) + expect(performData).to.be.equal(calldata) }) - it("should be able to call performUpkeep after time passes", async () => { - const startingCount = await counter.counter() - const checkData = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("")) - const interval = await counter.interval() - await network.provider.send("evm_increaseTime", [interval.toNumber() + 1]) + it("Should call performUpkeep for resetCounter", async () => { + await counter.multiplyCounter(3); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + await counter.multiplyCounter(10); + await counter.performUpkeep(ethers.utils.hexlify("0x")); + const abi = ["function resetCounter()"] + const iface = new ethers.utils.Interface(abi) + const checkData = iface.encodeFunctionData("resetCounter", []) await counter.performUpkeep(checkData) - assert.equal(startingCount + 1, (await counter.counter()).toNumber()) + const result = await counter.counter() + expect(result).to.be.equal(new ethers.BigNumber.from("0")) }) }) + }) diff --git a/yarn.lock b/yarn.lock index d7994f96d..ac2ae6ddc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -700,6 +700,21 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/abi@^5.6.3": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" + integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" @@ -713,6 +728,19 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/web" "^5.5.0" +"@ethersproject/abstract-provider@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + "@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" @@ -724,6 +752,17 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" +"@ethersproject/abstract-signer@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" @@ -735,6 +774,17 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" +"@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" @@ -742,6 +792,13 @@ dependencies: "@ethersproject/bytes" "^5.5.0" +"@ethersproject/base64@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" @@ -759,6 +816,15 @@ "@ethersproject/logger" "^5.5.0" bn.js "^4.11.9" +"@ethersproject/bignumber@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + bn.js "^5.2.1" + "@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" @@ -766,6 +832,13 @@ dependencies: "@ethersproject/logger" "^5.5.0" +"@ethersproject/bytes@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + "@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" @@ -773,6 +846,13 @@ dependencies: "@ethersproject/bignumber" "^5.5.0" +"@ethersproject/constants@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/contracts@5.5.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.0.5", "@ethersproject/contracts@^5.4.1": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" @@ -815,6 +895,20 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/hash@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" @@ -860,11 +954,24 @@ "@ethersproject/bytes" "^5.5.0" js-sha3 "0.8.0" +"@ethersproject/keccak256@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.0" + "@ethersproject/logger@5.5.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== +"@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + "@ethersproject/networks@5.5.2", "@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.5.0": version "5.5.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" @@ -872,6 +979,13 @@ dependencies: "@ethersproject/logger" "^5.5.0" +"@ethersproject/networks@^5.6.3": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" + integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" @@ -887,6 +1001,13 @@ dependencies: "@ethersproject/logger" "^5.5.0" +"@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + "@ethersproject/providers@5.5.3", "@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.4": version "5.5.3" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.3.tgz#56c2b070542ac44eb5de2ed3cf6784acd60a3130" @@ -928,6 +1049,14 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@ethersproject/rlp@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" @@ -949,6 +1078,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + "@ethersproject/solidity@5.5.0", "@ethersproject/solidity@^5.0.0", "@ethersproject/solidity@^5.4.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" @@ -970,6 +1111,15 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@ethersproject/strings@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" @@ -985,6 +1135,21 @@ "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" +"@ethersproject/transactions@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/units@5.5.0", "@ethersproject/units@^5.0.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" @@ -1026,6 +1191,17 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/web@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== + dependencies: + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" @@ -1283,6 +1459,13 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" +"@nomiclabs/hardhat-web3@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz#2d9850cb285a2cebe1bd718ef26a9523542e52a9" + integrity sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q== + dependencies: + "@types/bignumber.js" "^5.0.0" + "@nomiclabs/truffle-contract@^4.2.23": version "4.2.23" resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.2.23.tgz#3431d09d2400413d3a14650494abc0a6233c16d4" @@ -1298,11 +1481,35 @@ ethers "^4.0.0-beta.1" source-map-support "^0.5.19" +"@openzeppelin/contract-loader@^0.6.2": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz#61a7b44de327e40b7d53f39e0fb59bbf847335c3" + integrity sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg== + dependencies: + find-up "^4.1.0" + fs-extra "^8.1.0" + "@openzeppelin/contracts@^3.3.0", "@openzeppelin/contracts@^3.4.0": version "3.4.2" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== +"@openzeppelin/test-helpers@^0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz#7727d4bb1535e1fa2372d65d1dcee335ce8d36af" + integrity sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA== + dependencies: + "@openzeppelin/contract-loader" "^0.6.2" + "@truffle/contract" "^4.0.35" + ansi-colors "^3.2.3" + chai "^4.2.0" + chai-bn "^0.2.1" + ethjs-abi "^0.2.1" + lodash.flatten "^4.4.0" + semver "^5.6.0" + web3 "^1.2.5" + web3-utils "^1.2.5" + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -1455,6 +1662,15 @@ dependencies: defer-to-connect "^1.0.1" +"@truffle/abi-utils@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.5.tgz#62d2876e11fee76479de2aac0a1872fb7035ba24" + integrity sha512-eKDIn9LqUFP8MnHVohe8ncuza4p9bszz1NtJWc+sr5zUogtmWnnf8Ajyj7JJpNKhLNDVZVbLowVEVxWzSSpMHw== + dependencies: + change-case "3.0.2" + faker "^5.3.1" + fast-check "^2.12.1" + "@truffle/abi-utils@^0.2.8": version "0.2.8" resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.8.tgz#d7210451dc612340bff0d260ed8499ddb099678f" @@ -1471,11 +1687,35 @@ dependencies: source-map-support "^0.5.19" +"@truffle/blockchain-utils@^0.0.31": + version "0.0.31" + resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.31.tgz#0503d9fb2ce3e05c167c27294927f2f88d70a24d" + integrity sha512-BFo/nyxwhoHqPrqBQA1EAmSxeNnspGLiOCMa9pAL7WYSjyNBlrHaqCMO/F2O87G+NUK/u06E70DiSP2BFP0ZZw== + "@truffle/blockchain-utils@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.0.tgz#96742866e5d0274dd715402610162dbf51e31e6f" integrity sha512-9mzYXPQkjOc23rHQM1i630i3ackITWP1cxf3PvBObaAnGqwPCQuqtmZtNDPdvN+YpOLpBGpZIdYolI91xLdJNQ== +"@truffle/codec@^0.11.21": + version "0.11.21" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.11.21.tgz#4c87def76104661fe7f428e10ff8f69e66c68422" + integrity sha512-ZDzaEPCUFWmQuFsXA3KzXmU4w4lpxSWZTGUcEDHxn6IqAmL7FY8mmdbR6LQ1wTRAa9oPf84PcehMpTNY47HVcg== + dependencies: + "@truffle/abi-utils" "^0.2.5" + "@truffle/compile-common" "^0.7.23" + big.js "^5.2.2" + bn.js "^5.1.3" + cbor "^5.1.0" + debug "^4.3.1" + lodash.clonedeep "^4.5.0" + lodash.escaperegexp "^4.1.2" + lodash.partition "^4.6.0" + lodash.sum "^4.0.2" + semver "^7.3.4" + utf8 "^3.0.0" + web3-utils "1.5.3" + "@truffle/codec@^0.11.25": version "0.11.25" resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.11.25.tgz#d4324eb7b76dea715df25750a634d2d6dda57f10" @@ -1513,6 +1753,14 @@ utf8 "^3.0.0" web3-utils "1.2.9" +"@truffle/compile-common@^0.7.23": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.7.31.tgz#ab0b6219d5a02c4364b10ccd97615fc515402367" + integrity sha512-BGhWPd6NoI4VZfYBg+RgrCyLaxxq40vDOp6Ouofa1NQdN6LSPwlqWf0JWvPIKFNRp+TA9aWRHGmZntYyE94OZg== + dependencies: + "@truffle/error" "^0.1.0" + colors "1.4.0" + "@truffle/compile-common@^0.7.26": version "0.7.26" resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.7.26.tgz#b903b4f6c275d33c741adcc11a2e9a3aae7f20a1" @@ -1529,6 +1777,26 @@ ajv "^6.10.0" debug "^4.3.1" +"@truffle/contract@^4.0.35": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.4.2.tgz#b96941435ae0321f6a61fd02fcc453b782ba2015" + integrity sha512-w/iyB5dZ3KnIuvX1dqD1Z1SWFahT9/nvA1VAsK+eIy+zvtI1phx365uV75LdIoyeBtR1GmbqAO4F7ZLSfjkP+w== + dependencies: + "@ensdomains/ensjs" "^2.0.1" + "@truffle/blockchain-utils" "^0.0.31" + "@truffle/contract-schema" "^3.4.4" + "@truffle/debug-utils" "^6.0.3" + "@truffle/error" "^0.0.14" + "@truffle/interface-adapter" "^0.5.8" + bignumber.js "^7.2.1" + debug "^4.3.1" + ethers "^4.0.32" + web3 "1.5.3" + web3-core-helpers "1.5.3" + web3-core-promievent "1.5.3" + web3-eth-abi "1.5.3" + web3-utils "1.5.3" + "@truffle/contract@^4.1.8", "@truffle/contract@^4.3.8": version "4.4.7" resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.4.7.tgz#deea6d774a3aa08f7e14951774312cff15d81ca2" @@ -1561,6 +1829,18 @@ highlight.js "^9.15.8" highlightjs-solidity "^1.0.18" +"@truffle/debug-utils@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.3.tgz#9bd2f54640840f26219f7c1e77a9227d04dc091c" + integrity sha512-wxvZqvHIBw9wJHtSpUMJTku8sHpC0VbP0gLyV5+NVa/rn6CvVGtf0MyoDZGS4FDyhO1hui+bzzoQftoRy7jWyA== + dependencies: + "@truffle/codec" "^0.11.21" + "@trufflesuite/chromafi" "^2.2.2" + bn.js "^5.1.3" + chalk "^2.4.2" + debug "^4.3.1" + highlightjs-solidity "^2.0.3" + "@truffle/debug-utils@^6.0.7": version "6.0.7" resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.7.tgz#0e516f4b0b095731f76071e245ecb46f9737e9ef" @@ -1578,11 +1858,21 @@ resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.11.tgz#2789c0042d7e796dcbb840c7a9b5d2bcd8e0e2d8" integrity sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw== +"@truffle/error@^0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" + integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== + "@truffle/error@^0.0.15": version "0.0.15" resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.15.tgz#fa24de95c7eb37dd8ee71161e1a876320ddb41e6" integrity sha512-keiYGlVAH7GLggqMpB+XorT7NkOlr3qeBc56thI2WP0eas3qstlyrc0WvckXJ2LXrOfcR2uH6f0Nk6FIxaKXSA== +"@truffle/error@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.0.tgz#5e9fed79e6cda624c926d314b280a576f8b22a36" + integrity sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg== + "@truffle/interface-adapter@^0.4.16": version "0.4.24" resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.24.tgz#5d6d4f10c756e967f19ac2ad1620d11d25c034bb" @@ -1601,6 +1891,15 @@ ethers "^4.0.32" web3 "1.5.3" +"@truffle/interface-adapter@^0.5.8": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.17.tgz#34e7e28930f6aa4c722f1b2ede127d379f891e70" + integrity sha512-2MJ+YLAL4y2QqlWc90NKizBLpavcETTzV8EpYkYJgAM326xKrAt+N3wx3f3tgRPSsbdtiEVKf1JRXHmDYQ+xIg== + dependencies: + bn.js "^5.1.3" + ethers "^4.0.32" + web3 "1.5.3" + "@truffle/provider@^0.2.24": version "0.2.45" resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.45.tgz#d543530e3514c5381351c88357834cf157fef31d" @@ -1647,6 +1946,13 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== +"@types/bignumber.js@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" + integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== + dependencies: + bignumber.js "*" + "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -2057,6 +2363,11 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -2932,16 +3243,16 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@~9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + bignumber.js@7.2.1, bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== -bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@~9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -3027,6 +3338,11 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.19.1, body-parser@^1.16.0: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" @@ -3410,6 +3726,11 @@ chai-bignumber@^3.0.0: resolved "https://registry.yarnpkg.com/chai-bignumber/-/chai-bignumber-3.0.0.tgz#e90cf1f468355bbb11a9acd051222586cd2648a9" integrity sha512-SubOtaSI2AILWTWe2j0c6i2yFT/f9J6UBjeVGDuwDiPLkF/U5+/eTWUE3sbCZ1KgcPF6UJsDVYbIxaYA097MQA== +chai-bn@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.2.tgz#4dcf30dbc79db2378a00781693bc749c972bf34f" + integrity sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg== + chai@^4.0.1, chai@^4.2.0, chai@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" @@ -5321,6 +5642,15 @@ ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.14, ethers@^5.0.2, ethers@^5.4.7, eth "@ethersproject/web" "5.5.1" "@ethersproject/wordlists" "5.5.0" +ethjs-abi@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" + integrity sha1-4KepOn6BFjqUR3utVu3lJKtt5TM= + dependencies: + bn.js "4.11.6" + js-sha3 "0.5.5" + number-to-bn "1.7.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -5664,6 +5994,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-yarn-workspace-root@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" @@ -7177,6 +7515,11 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +js-sha3@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" + integrity sha1-uvDA6MVK1ZA0R9+Wreekobynmko= + js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -7720,6 +8063,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -7742,6 +8092,11 @@ lodash.escaperegexp@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -8844,7 +9199,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -8872,6 +9227,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -11563,6 +11925,15 @@ web3-bzz@1.7.0: got "9.6.0" swarm-js "^0.1.40" +web3-bzz@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" + integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -11597,6 +11968,14 @@ web3-core-helpers@1.7.0: web3-eth-iban "1.7.0" web3-utils "1.7.0" +web3-core-helpers@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" + integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== + dependencies: + web3-eth-iban "1.7.4" + web3-utils "1.7.4" + web3-core-method@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" @@ -11644,6 +12023,17 @@ web3-core-method@1.7.0: web3-core-subscriptions "1.7.0" web3-utils "1.7.0" +web3-core-method@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" + integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-utils "1.7.4" + web3-core-promievent@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" @@ -11672,6 +12062,13 @@ web3-core-promievent@1.7.0: dependencies: eventemitter3 "4.0.4" +web3-core-promievent@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" + integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== + dependencies: + eventemitter3 "4.0.4" + web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -11717,6 +12114,17 @@ web3-core-requestmanager@1.7.0: web3-providers-ipc "1.7.0" web3-providers-ws "1.7.0" +web3-core-requestmanager@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" + integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== + dependencies: + util "^0.12.0" + web3-core-helpers "1.7.4" + web3-providers-http "1.7.4" + web3-providers-ipc "1.7.4" + web3-providers-ws "1.7.4" + web3-core-subscriptions@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" @@ -11751,6 +12159,14 @@ web3-core-subscriptions@1.7.0: eventemitter3 "4.0.4" web3-core-helpers "1.7.0" +web3-core-subscriptions@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" + integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" + web3-core@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" @@ -11803,6 +12219,19 @@ web3-core@1.7.0: web3-core-requestmanager "1.7.0" web3-utils "1.7.0" +web3-core@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" + integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-requestmanager "1.7.4" + web3-utils "1.7.4" + web3-eth-abi@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" @@ -11837,6 +12266,14 @@ web3-eth-abi@1.7.0, web3-eth-abi@^1.0.0-beta.24: "@ethersproject/abi" "5.0.7" web3-utils "1.7.0" +web3-eth-abi@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" + integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.7.4" + web3-eth-accounts@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" @@ -11905,6 +12342,23 @@ web3-eth-accounts@1.7.0: web3-core-method "1.7.0" web3-utils "1.7.0" +web3-eth-accounts@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" + integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== + dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" + uuid "3.3.2" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" + web3-eth-contract@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" @@ -11963,6 +12417,20 @@ web3-eth-contract@1.7.0: web3-eth-abi "1.7.0" web3-utils "1.7.0" +web3-eth-contract@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" + integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== + dependencies: + "@types/bn.js" "^5.1.0" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-utils "1.7.4" + web3-eth-ens@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" @@ -12021,6 +12489,20 @@ web3-eth-ens@1.7.0: web3-eth-contract "1.7.0" web3-utils "1.7.0" +web3-eth-ens@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" + integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-contract "1.7.4" + web3-utils "1.7.4" + web3-eth-iban@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" @@ -12053,6 +12535,14 @@ web3-eth-iban@1.7.0: bn.js "^4.11.9" web3-utils "1.7.0" +web3-eth-iban@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" + integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== + dependencies: + bn.js "^5.2.1" + web3-utils "1.7.4" + web3-eth-personal@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" @@ -12101,6 +12591,18 @@ web3-eth-personal@1.7.0: web3-net "1.7.0" web3-utils "1.7.0" +web3-eth-personal@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" + integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + web3-eth@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" @@ -12175,6 +12677,24 @@ web3-eth@1.7.0: web3-net "1.7.0" web3-utils "1.7.0" +web3-eth@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" + integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== + dependencies: + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-accounts "1.7.4" + web3-eth-contract "1.7.4" + web3-eth-ens "1.7.4" + web3-eth-iban "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + web3-net@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" @@ -12211,6 +12731,15 @@ web3-net@1.7.0: web3-core-method "1.7.0" web3-utils "1.7.0" +web3-net@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" + integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== + dependencies: + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" + web3-provider-engine@14.0.6: version "14.0.6" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0" @@ -12296,6 +12825,14 @@ web3-providers-http@1.7.0: web3-core-helpers "1.7.0" xhr2-cookies "1.1.0" +web3-providers-http@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" + integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== + dependencies: + web3-core-helpers "1.7.4" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -12330,6 +12867,14 @@ web3-providers-ipc@1.7.0: oboe "2.1.5" web3-core-helpers "1.7.0" +web3-providers-ipc@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" + integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.7.4" + web3-providers-ws@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" @@ -12368,6 +12913,15 @@ web3-providers-ws@1.7.0: web3-core-helpers "1.7.0" websocket "^1.0.32" +web3-providers-ws@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" + integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" + websocket "^1.0.32" + web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -12408,6 +12962,16 @@ web3-shh@1.7.0: web3-core-subscriptions "1.7.0" web3-net "1.7.0" +web3-shh@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" + integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== + dependencies: + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-net "1.7.4" + web3-utils@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" @@ -12476,6 +13040,19 @@ web3-utils@1.7.0, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: randombytes "^2.1.0" utf8 "3.0.0" +web3-utils@1.7.4, web3-utils@^1.2.5: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" + integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + web3@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" @@ -12528,6 +13105,19 @@ web3@^1.0.0-beta.34: web3-shh "1.7.0" web3-utils "1.7.0" +web3@^1.2.5: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" + integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== + dependencies: + web3-bzz "1.7.4" + web3-core "1.7.4" + web3-eth "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-shh "1.7.4" + web3-utils "1.7.4" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"