From 65aa5c46ddbed85e25b7d7830581ae0136697ad0 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 17 May 2024 15:48:46 +0100 Subject: [PATCH] refactor and doc: addressing internal audit findings --- .eslintignore | 2 +- README.md | 2 +- abis/0.8.23/VoteWeighting.json | 1086 --------------- abis/0.8.25/GuardCM.json | 681 +++++++++ abis/0.8.25/VoteWeighting.json | 1214 +++++++++++++++++ audits/internal12/README.md | 18 + contracts/VoteWeighting.sol | 73 +- contracts/multisigs/GuardCM.sol | 7 +- contracts/multisigs/VerifyData.sol | 2 +- .../ProcessBridgedDataArbitrum.sol | 2 +- .../ProcessBridgedDataGnosis.sol | 2 +- .../ProcessBridgedDataOptimism.sol | 2 +- .../ProcessBridgedDataPolygon.sol | 2 +- .../ProcessBridgedDataWormhole.sol | 2 +- .../bridge_verifier/VerifyBridgedData.sol | 2 +- .../multisigs/test/DelegatecallExploit.sol | 2 +- contracts/multisigs/test/MockTimelockCM.sol | 2 +- contracts/multisigs/test/MockTreasury.sol | 2 +- hardhat.config.js | 3 +- package.json | 2 +- test/VoteWeighting.js | 20 +- yarn.lock | 104 +- 22 files changed, 2044 insertions(+), 1188 deletions(-) delete mode 100644 abis/0.8.23/VoteWeighting.json create mode 100644 abis/0.8.25/GuardCM.json create mode 100644 abis/0.8.25/VoteWeighting.json diff --git a/.eslintignore b/.eslintignore index c6af692..baabb01 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ coverage* -audit/* +audits/* lib/* diff --git a/README.md b/README.md index 7a0bd5e..d15fee3 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ The Autonolas `OLAS` contract was inspired and based on in parts by the followin - [Rari-Capital](https://github.com/Rari-Capital/solmate). Last known audited version: `a9e3ea26a2dc73bfa87f0cb189687d029028e0c5`; - [Maple Finance](https://github.com/maple-labs/erc20). Last known audited version: `756c110ddc3c96c596a52bce43553477a19ee3aa`; -The `veOLAS` contract was inspired and based on the following sources: +The `veOLAS` and `VoteWeighting` contracts were inspired and based on the following sources: - [Curve DAO](https://github.com/curvefi/curve-dao-contracts). The governance contracts and the rest was inspired and based on the following sources: diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json deleted file mode 100644 index 7b8f6b3..0000000 --- a/abis/0.8.23/VoteWeighting.json +++ /dev/null @@ -1,1086 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "VoteWeighting", - "sourceName": "contracts/VoteWeighting.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_ve", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "curTime", - "type": "uint256" - } - ], - "name": "LockExpired", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "NomineeAlreadyExists", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "NomineeDoesNotExist", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "NomineeNotRemoved", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "NomineeRemoved", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "provided", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "Overflow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerOnly", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "provided", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - } - ], - "name": "Underflow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "curTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "nextAllowedVotingTime", - "type": "uint256" - } - ], - "name": "VoteTooOften", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "numValues1", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "numValues2", - "type": "uint256" - } - ], - "name": "WrongArrayLength", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroValue", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "AddNominee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "OwnerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newSum", - "type": "uint256" - } - ], - "name": "RemoveNominee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nominee", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "weight", - "type": "uint256" - } - ], - "name": "VoteForNominee", - "type": "event" - }, - { - "inputs": [], - "name": "MAX_EVM_CHAIN_ID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_WEIGHT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WEEK", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WEIGHT_VOTE_DELAY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "addNomineeEVM", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "addNomineeNonEVM", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newDispenser", - "type": "address" - } - ], - "name": "changeDispenser", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "changeOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "changesSum", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "changesWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "checkpoint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "checkpointNominee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "dispenser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAllNominees", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "internalType": "struct Nominee[]", - "name": "nominees", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "accounts", - "type": "bytes32[]" - }, - { - "internalType": "uint256[]", - "name": "chainIds", - "type": "uint256[]" - }, - { - "internalType": "address[]", - "name": "voters", - "type": "address[]" - } - ], - "name": "getNextAllowedVotingTimes", - "outputs": [ - { - "internalType": "uint256[]", - "name": "nextAllowedVotingTimes", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getNominee", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "internalType": "struct Nominee", - "name": "nominee", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "getNomineeId", - "outputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "getNomineeWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "startId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "numNominees", - "type": "uint256" - } - ], - "name": "getNominees", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "internalType": "struct Nominee[]", - "name": "nominees", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNumNominees", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getWeightsSum", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "lastUserVote", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "mapNomineeIds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "mapRemovedNominees", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "time", - "type": "uint256" - } - ], - "name": "nomineeRelativeWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalSum", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "time", - "type": "uint256" - } - ], - "name": "nomineeRelativeWeightWrite", - "outputs": [ - { - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalSum", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "pointsSum", - "outputs": [ - { - "internalType": "uint256", - "name": "bias", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "slope", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "pointsWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "bias", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "slope", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "removeNominee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "retrieveRemovedNomineeVotingPower", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "setNominees", - "outputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "timeSum", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "timeWeight", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ve", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "account", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "weight", - "type": "uint256" - } - ], - "name": "voteForNomineeWeights", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "accounts", - "type": "bytes32[]" - }, - { - "internalType": "uint256[]", - "name": "chainIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "weights", - "type": "uint256[]" - } - ], - "name": "voteForNomineeWeightsBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "voteUserPower", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "voteUserSlopes", - "outputs": [ - { - "internalType": "uint256", - "name": "slope", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "power", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "end", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002ebf38038062002ebf833981016040819052620000349162000119565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b81426200014b565b6200009791906200016e565b600d55506040805180820190915260008082526020820181815260028054600181018255928190529251919092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101556200019a565b6000602082840312156200012c57600080fd5b81516001600160a01b03811681146200014457600080fd5b9392505050565b6000826200016957634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019457634e487b7160e01b600052601160045260246000fd5b92915050565b608051612cfb620001c460003960008181610342015281816119ca0152611aaa0152612cfb6000f3fe608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212200951e03c92e772052c87670f684b4d3391c691297c78fda6f79467922caa7a2b64736f6c63430008170033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212200951e03c92e772052c87670f684b4d3391c691297c78fda6f79467922caa7a2b64736f6c63430008170033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/abis/0.8.25/GuardCM.json b/abis/0.8.25/GuardCM.json new file mode 100644 index 0000000..c2a62a8 --- /dev/null +++ b/abis/0.8.25/GuardCM.json @@ -0,0 +1,681 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GuardCM", + "sourceName": "contracts/multisigs/GuardCM.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_timelock", + "type": "address" + }, + { + "internalType": "address", + "name": "_multisig", + "type": "address" + }, + { + "internalType": "address", + "name": "_governor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "ContractOnly", + "type": "error" + }, + { + "inputs": [], + "name": "DelegateCallFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + } + ], + "name": "IncorrectDataLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "L2ChainIdNotSupported", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "name": "ManagerOnly", + "type": "error" + }, + { + "inputs": [], + "name": "NoDelegateCall", + "type": "error" + }, + { + "inputs": [], + "name": "NoSelfCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "enum ProposalState", + "name": "state", + "type": "uint8" + } + ], + "name": "NotDefeated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerOnly", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues4", + "type": "uint256" + } + ], + "name": "WrongArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorCheckProposalIdChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "governor", + "type": "address" + } + ], + "name": "GovernorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "GuardPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "GuardUnpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "bridgeMediatorL1s", + "type": "address[]" + }, + { + "indexed": true, + "internalType": "address[]", + "name": "verifierL2s", + "type": "address[]" + }, + { + "indexed": true, + "internalType": "address[]", + "name": "bridgeMediatorL2s", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + } + ], + "name": "SetBridgeMediators", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": true, + "internalType": "bytes4[]", + "name": "selectors", + "type": "bytes4[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "SetTargetSelectors", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_CHAIN_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_SCHEDULE_DATA_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SCHEDULE", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SCHEDULE_BATCH", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SELECTOR_DATA_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "changeGovernor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "changeGovernorCheckProposalId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "name": "checkAfterExecution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address payable", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "checkTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "getTargetSelectorChainId", + "outputs": [ + { + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governorCheckProposalId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mapAllowedTargetSelectorChainIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapBridgeMediatorL1BridgeParams", + "outputs": [ + { + "internalType": "address", + "name": "verifierL2", + "type": "address" + }, + { + "internalType": "address", + "name": "bridgeMediatorL2", + "type": "address" + }, + { + "internalType": "uint64", + "name": "chainId", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multisig", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "bridgeMediatorL1s", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "verifierL2s", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "bridgeMediatorL2s", + "type": "address[]" + } + ], + "name": "setBridgeMediatorL1BridgeParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "bytes4[]", + "name": "selectors", + "type": "bytes4[]" + }, + { + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "statuses", + "type": "bool[]" + } + ], + "name": "setTargetSelectorChainIds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040527fc31bbc1e3236488ae8f22fbf502bfdf157c6632d6e26bf7aecc7efa40d960d296001556002805460ff60a01b1916600160a01b179055348015610046575f80fd5b50604051612a8b380380612a8b833981016040819052610065916100fb565b6001600160a01b038316158061008257506001600160a01b038216155b8061009457506001600160a01b038116155b156100b25760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0392831660805290821660a052600280546001600160a01b0319169190921617905561013b565b80516001600160a01b03811681146100f6575f80fd5b919050565b5f805f6060848603121561010d575f80fd5b610116846100e0565b9250610124602085016100e0565b9150610132604085016100e0565b90509250925092565b60805160a0516128c66101c55f395f8181610300015281816110dd0152818161120501526113a101525f818161041101528181610481015281816104e9015281816109b301528181610a1b01528181610af501528181610b5d01528181610f0c01528181611184015281816114120152818161147a0152818161152a015261159201526128c65ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c80635d78d469116100d257806387b68df111610088578063e4c0aaf411610063578063e4c0aaf414610445578063ed7a975414610458578063f7cde1cc14610460575f80fd5b806387b68df1146103f95780638da5cb5b1461040c5780639327136814610433575f80fd5b80637c257f9d116100b85780637c257f9d1461038757806381792616146103e85780638456cb59146103f1575f80fd5b80635d78d4691461036157806375f0bb5214610374575f80fd5b80633ce3778c116101275780634783c35b1161010d5780634783c35b146102fb5780635bc105c0146103225780635c975abb1461032a575f80fd5b80633ce3778c146102dd5780633f4ba83a146102f3575f80fd5b806316979a181161015757806316979a18146101d157806336b057601461020a57806337a36b1f1461023c575f80fd5b80630c340a24146101725780631602c55c146101bc575b5f80fd5b6002546101929073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101cf6101ca366004611da8565b610469565b005b6101d9610978565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101b3565b61022c610218366004611e4e565b5f6020819052908152604090205460ff1681565b60405190151581526020016101b3565b6102a061024a366004611e65565b60036020525f90815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900467ffffffffffffffff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015267ffffffffffffffff16908201526060016101b3565b6102e5600481565b6040519081526020016101b3565b6101cf61099b565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6102e5610ab1565b60025461034f9074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101b3565b6101cf61036f366004611f28565b610add565b6101cf6103823660046120bb565b610e9a565b61022c610395366004612197565b60c01b77ffffffff0000000000000000000000000000000000000000604092831c1673ffffffffffffffffffffffffffffffffffffffff90931692909217919091175f9081526020819052205460ff1690565b6102e561010481565b6101cf61116d565b6101cf610407366004611e4e565b6113fa565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6101cf6104413660046121d2565b5050565b6101cf610453366004611e65565b611512565b6101d961167a565b6102e560015481565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461051b576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b8251845114158061052e57508151845114155b8061053b57508051845114155b156105905783518351835183516040517f1d0d38490000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260448301526064820152608401610512565b5f5b82518110156108f8575f73ffffffffffffffffffffffffffffffffffffffff168582815181106105c4576105c46121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16148061063257505f73ffffffffffffffffffffffffffffffffffffffff16848281518110610612576106126121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16145b15610669576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83818151811061067b5761067b6121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163b5f03610709578381815181106106b2576106b26121fc565b60200260200101516040517f601c0c21000000000000000000000000000000000000000000000000000000008152600401610512919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b5f83828151811061071c5761071c6121fc565b60200260200101519050805f148061075b57506024610744600267ffffffffffffffff612256565b61074e91906122a1565b67ffffffffffffffff1681115b15610795576040517f05877c3500000000000000000000000000000000000000000000000000000000815260048101829052602401610512565b5f60035f8885815181106107ab576107ab6121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050858381518110610800576108006121fc565b602090810291909101015181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178155835184908490811061085e5761085e6121fc565b6020026020010151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508483815181106108b9576108b96121fc565b60200260200101518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050806001019050610592565b508060405161090791906122c9565b60405180910390208360405161091d91906122c9565b60405180910390208560405161093391906122c9565b60405180910390207fccffb126c66cf191a234c0410e40143d5af455b72fbc66713d2d5a8c32105d438560405161096a919061234e565b60405180910390a450505050565b604051806060016040528060378152602001612818603791398051906020012081565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a48576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517fb7494247183e272909cbb2787cfe307a720be20191d035876006b8903349b361905f90a1565b6024610ac6600267ffffffffffffffff612256565b610ad091906122a1565b67ffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b8a576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b82518451141580610b9d57508051845114155b80610baa57508151845114155b15610bff5783518351825184516040517f1d0d38490000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260448301526064820152608401610512565b5f5b8451811015610e2e575f73ffffffffffffffffffffffffffffffffffffffff16858281518110610c3357610c336121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c88576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83515f90859083908110610c9e57610c9e6121fc565b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cfc576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828181518110610d0e57610d0e6121fc565b60200260200101515f03610d4e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858281518110610d6157610d616121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16905060a0858381518110610d9557610d956121fc565b602002602001015160e01c63ffffffff16901b8117905060c0848381518110610dc057610dc06121fc565b6020026020010151901b81179050828281518110610de057610de06121fc565b6020908102919091018101515f92835290829052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610c01565b5082604051610e3d9190612360565b604051809103902084604051610e5391906122c9565b60405180910390207f820c9405a0f2bb85b6d3faa5e7cc32aab79e983e6b14fc2f47c34855003cd8b48484604051610e8c9291906123ab565b60405180910390a350505050565b60025474010000000000000000000000000000000000000000900460ff16600103611160576001886001811115610ed357610ed3612402565b03610f0a576040517f034aef8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16036110db57600489511015610fa857885160046040517f34c9027a000000000000000000000000000000000000000000000000000000008152600401610512929190918252602082015260400190565b5f610fb28a61242f565b905060405180606001604052806037815260200161281860379139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061107b575060405180608001604052806042815260200161284f60429139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156110d5576101048a5110156110cb5789516040517f34c9027a00000000000000000000000000000000000000000000000000000000815260048101919091526101046024820152604401610512565b6110d58a8261169d565b50611160565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611160576040517f73dc029f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111ee57600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556113ce565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361135e576002546001546040517f3e4f49e600000000000000000000000000000000000000000000000000000000815260048101919091525f9173ffffffffffffffffffffffffffffffffffffffff1690633e4f49e6906024016020604051808303815f875af115801561129d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c1919061247e565b905060038160078111156112d7576112d7612402565b0361132057600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055611358565b600154816040517fe83cca1700000000000000000000000000000000000000000000000000000000815260040161051292919061249c565b506113ce565b6040517f625a43fe00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b60405133907fe09b21d6dd32859666ae309428ea624d48855f4762e0c91f342016e4947d793b905f90a2565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146114a7576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b805f036114e0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181905560405181907f63a01eaabe199ab888e562c930e21f3436583ea5acd4ca5c4ceffac3a523e039905f90a250565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146115bf576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b73ffffffffffffffffffffffffffffffffffffffff811661160c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f386c8d5fb4be6c928b7de4c7ae0a4b2ad0d2b2a7edad65d9f0af9ba255e51219905f90a250565b60405180608001604052806042815260200161284f604291398051906020012081565b5f600483516116ac91906124e5565b67ffffffffffffffff8111156116c4576116c4611c04565b6040519080825280601f01601f1916602001820160405280156116ee576020820181803683370190505b5090505f5b815181101561176b57836117088260046124fe565b81518110611718576117186121fc565b602001015160f81c60f81b828281518110611735576117356121fc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016116f3565b5060608060405180606001604052806037815260200161281860379139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036118a557604080516001808252818301909252906020808301908036833701905050604080516001808252818301909252919350816020015b606081526020019060019003908161180857905050905082806020019051810190611833919061255e565b5050855191925085915f915061184b5761184b6121fc565b60200260200101835f81518110611864576118646121fc565b602002602001018290528273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050506118c4565b828060200190518101906118b991906126a6565b509395509093505050505b5f5b8251811015611b1a575f60035f8584815181106118e5576118e56121fc565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182015f20825160608101845281548516808252600190920154948516928101929092527401000000000000000000000000000000000000000090930467ffffffffffffffff1691810191909152915015611ad4575f83838151811061197c5761197c6121fc565b6020026020010151826020015183604001516040516024016119a093929190612780565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f224b0de700000000000000000000000000000000000000000000000000000000179052835190519192505f91829173ffffffffffffffffffffffffffffffffffffffff1690611a43908590612801565b5f60405180830381855af49150503d805f8114611a7b576040519150601f19603f3d011682016040523d82523d5f602084013e611a80565b606091505b509150915081611acc57805115611a9a5780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050611b11565b611b11848381518110611ae957611ae96121fc565b6020026020010151848481518110611b0357611b036121fc565b602002602001015146611b22565b506001016118c6565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f611b438461242f565b604081811c77ffffffff0000000000000000000000000000000000000000169390931760c085901b175f8181526020819052939093205490915060ff16611bfd576040517f43abfb6c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201527fffffffff000000000000000000000000000000000000000000000000000000008216602482015260448101849052606401610512565b5050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c7857611c78611c04565b604052919050565b5f67ffffffffffffffff821115611c9957611c99611c04565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611cc4575f80fd5b50565b8035611cd281611ca3565b919050565b5f82601f830112611ce6575f80fd5b81356020611cfb611cf683611c80565b611c31565b8083825260208201915060208460051b870101935086841115611d1c575f80fd5b602086015b84811015611d41578035611d3481611ca3565b8352918301918301611d21565b509695505050505050565b5f82601f830112611d5b575f80fd5b81356020611d6b611cf683611c80565b8083825260208201915060208460051b870101935086841115611d8c575f80fd5b602086015b84811015611d415780358352918301918301611d91565b5f805f8060808587031215611dbb575f80fd5b843567ffffffffffffffff80821115611dd2575f80fd5b611dde88838901611cd7565b95506020870135915080821115611df3575f80fd5b611dff88838901611cd7565b94506040870135915080821115611e14575f80fd5b611e2088838901611d4c565b93506060870135915080821115611e35575f80fd5b50611e4287828801611cd7565b91505092959194509250565b5f60208284031215611e5e575f80fd5b5035919050565b5f60208284031215611e75575f80fd5b8135611e8081611ca3565b9392505050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114611cd2575f80fd5b80358015158114611cd2575f80fd5b5f82601f830112611ed4575f80fd5b81356020611ee4611cf683611c80565b8083825260208201915060208460051b870101935086841115611f05575f80fd5b602086015b84811015611d4157611f1b81611eb6565b8352918301918301611f0a565b5f805f8060808587031215611f3b575f80fd5b843567ffffffffffffffff80821115611f52575f80fd5b611f5e88838901611cd7565b9550602091508187013581811115611f74575f80fd5b8701601f81018913611f84575f80fd5b8035611f92611cf682611c80565b81815260059190911b8201840190848101908b831115611fb0575f80fd5b928501925b82841015611fd557611fc684611e87565b82529285019290850190611fb5565b97505050506040870135915080821115611fed575f80fd5b611ff988838901611d4c565b9350606087013591508082111561200e575f80fd5b50611e4287828801611ec5565b5f67ffffffffffffffff82111561203457612034611c04565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261206f575f80fd5b813561207d611cf68261201b565b818152846020838601011115612091575f80fd5b816020850160208301375f918101602001919091529392505050565b803560028110611cd2575f80fd5b5f805f805f805f805f805f6101608c8e0312156120d6575f80fd5b6120df8c611cc7565b9a5060208c0135995067ffffffffffffffff8060408e01351115612101575f80fd5b6121118e60408f01358f01612060565b995061211f60608e016120ad565b985060808d0135975060a08d0135965060c08d0135955061214260e08e01611cc7565b94506121516101008e01611cc7565b9350806101208e01351115612164575f80fd5b506121768d6101208e01358e01612060565b91506121856101408d01611cc7565b90509295989b509295989b9093969950565b5f805f606084860312156121a9575f80fd5b83356121b481611ca3565b92506121c260208501611e87565b9150604084013590509250925092565b5f80604083850312156121e3575f80fd5b823591506121f360208401611eb6565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612295577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b92169190910492915050565b67ffffffffffffffff8281168282160390808211156122c2576122c2612229565b5092915050565b81515f9082906020808601845b8381101561230857815173ffffffffffffffffffffffffffffffffffffffff16855293820193908201906001016122d6565b50929695505050505050565b5f815180845260208085019450602084015f5b8381101561234357815187529582019590820190600101612327565b509495945050505050565b602081525f611e806020830184612314565b81515f9082906020808601845b838110156123085781517fffffffff00000000000000000000000000000000000000000000000000000000168552938201939082019060010161236d565b604081525f6123bd6040830185612314565b8281036020848101919091528451808352858201928201905f5b818110156123f55784511515835293830193918301916001016123d7565b5090979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156124765780818460040360031b1b83161693505b505050919050565b5f6020828403121561248e575f80fd5b815160088110611e80575f80fd5b82815260408101600883106124d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8260208301529392505050565b818103818111156124f8576124f8612229565b92915050565b808201808211156124f8576124f8612229565b5f82601f830112612520575f80fd5b815161252e611cf68261201b565b818152846020838601011115612542575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f805f805f8060c08789031215612573575f80fd5b865161257e81611ca3565b60208801516040890151919750955067ffffffffffffffff8111156125a1575f80fd5b6125ad89828a01612511565b945050606087015192506080870151915060a087015190509295509295509295565b5f82601f8301126125de575f80fd5b815160206125ee611cf683611c80565b8083825260208201915060208460051b87010193508684111561260f575f80fd5b602086015b84811015611d415780518352918301918301612614565b5f82601f83011261263a575f80fd5b8151602061264a611cf683611c80565b82815260059290921b84018101918181019086841115612668575f80fd5b8286015b84811015611d4157805167ffffffffffffffff81111561268a575f80fd5b6126988986838b0101612511565b84525091830191830161266c565b5f805f805f8060c087890312156126bb575f80fd5b865167ffffffffffffffff808211156126d2575f80fd5b818901915089601f8301126126e5575f80fd5b815160206126f5611cf683611c80565b82815260059290921b8401810191818101908d841115612713575f80fd5b948201945b8386101561273a57855161272b81611ca3565b82529482019490820190612718565b918c0151919a50909350505080821115612752575f80fd5b61275e8a838b016125cf565b96506040890151915080821115612773575f80fd5b506125ad89828a0161262b565b606081525f84518060608401528060208701608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505073ffffffffffffffffffffffffffffffffffffffff8416602083015267ffffffffffffffff83166040830152949350505050565b5f82518060208501845e5f92019182525091905056fe7363686564756c6528616464726573732c75696e743235362c62797465732c627974657333322c627974657333322c75696e74323536297363686564756c65426174636828616464726573735b5d2c75696e743235365b5d2c62797465735b5d2c627974657333322c627974657333322c75696e7432353629a2646970667358221220fceec9aedc11836c1fcf42303e8b32f8f8d5f6ba388cdd2e0f6c21c371d8828164736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c80635d78d469116100d257806387b68df111610088578063e4c0aaf411610063578063e4c0aaf414610445578063ed7a975414610458578063f7cde1cc14610460575f80fd5b806387b68df1146103f95780638da5cb5b1461040c5780639327136814610433575f80fd5b80637c257f9d116100b85780637c257f9d1461038757806381792616146103e85780638456cb59146103f1575f80fd5b80635d78d4691461036157806375f0bb5214610374575f80fd5b80633ce3778c116101275780634783c35b1161010d5780634783c35b146102fb5780635bc105c0146103225780635c975abb1461032a575f80fd5b80633ce3778c146102dd5780633f4ba83a146102f3575f80fd5b806316979a181161015757806316979a18146101d157806336b057601461020a57806337a36b1f1461023c575f80fd5b80630c340a24146101725780631602c55c146101bc575b5f80fd5b6002546101929073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101cf6101ca366004611da8565b610469565b005b6101d9610978565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101b3565b61022c610218366004611e4e565b5f6020819052908152604090205460ff1681565b60405190151581526020016101b3565b6102a061024a366004611e65565b60036020525f90815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff9182169181169074010000000000000000000000000000000000000000900467ffffffffffffffff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff948516815293909216602084015267ffffffffffffffff16908201526060016101b3565b6102e5600481565b6040519081526020016101b3565b6101cf61099b565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6102e5610ab1565b60025461034f9074010000000000000000000000000000000000000000900460ff1681565b60405160ff90911681526020016101b3565b6101cf61036f366004611f28565b610add565b6101cf6103823660046120bb565b610e9a565b61022c610395366004612197565b60c01b77ffffffff0000000000000000000000000000000000000000604092831c1673ffffffffffffffffffffffffffffffffffffffff90931692909217919091175f9081526020819052205460ff1690565b6102e561010481565b6101cf61116d565b6101cf610407366004611e4e565b6113fa565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6101cf6104413660046121d2565b5050565b6101cf610453366004611e65565b611512565b6101d961167a565b6102e560015481565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461051b576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b8251845114158061052e57508151845114155b8061053b57508051845114155b156105905783518351835183516040517f1d0d38490000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260448301526064820152608401610512565b5f5b82518110156108f8575f73ffffffffffffffffffffffffffffffffffffffff168582815181106105c4576105c46121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16148061063257505f73ffffffffffffffffffffffffffffffffffffffff16848281518110610612576106126121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16145b15610669576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83818151811061067b5761067b6121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff163b5f03610709578381815181106106b2576106b26121fc565b60200260200101516040517f601c0c21000000000000000000000000000000000000000000000000000000008152600401610512919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b5f83828151811061071c5761071c6121fc565b60200260200101519050805f148061075b57506024610744600267ffffffffffffffff612256565b61074e91906122a1565b67ffffffffffffffff1681115b15610795576040517f05877c3500000000000000000000000000000000000000000000000000000000815260048101829052602401610512565b5f60035f8885815181106107ab576107ab6121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050858381518110610800576108006121fc565b602090810291909101015181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178155835184908490811061085e5761085e6121fc565b6020026020010151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508483815181106108b9576108b96121fc565b60200260200101518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050806001019050610592565b508060405161090791906122c9565b60405180910390208360405161091d91906122c9565b60405180910390208560405161093391906122c9565b60405180910390207fccffb126c66cf191a234c0410e40143d5af455b72fbc66713d2d5a8c32105d438560405161096a919061234e565b60405180910390a450505050565b604051806060016040528060378152602001612818603791398051906020012081565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a48576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517fb7494247183e272909cbb2787cfe307a720be20191d035876006b8903349b361905f90a1565b6024610ac6600267ffffffffffffffff612256565b610ad091906122a1565b67ffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b8a576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b82518451141580610b9d57508051845114155b80610baa57508151845114155b15610bff5783518351825184516040517f1d0d38490000000000000000000000000000000000000000000000000000000081526004810194909452602484019290925260448301526064820152608401610512565b5f5b8451811015610e2e575f73ffffffffffffffffffffffffffffffffffffffff16858281518110610c3357610c336121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c88576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83515f90859083908110610c9e57610c9e6121fc565b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cfc576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828181518110610d0e57610d0e6121fc565b60200260200101515f03610d4e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f858281518110610d6157610d616121fc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16905060a0858381518110610d9557610d956121fc565b602002602001015160e01c63ffffffff16901b8117905060c0848381518110610dc057610dc06121fc565b6020026020010151901b81179050828281518110610de057610de06121fc565b6020908102919091018101515f92835290829052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610c01565b5082604051610e3d9190612360565b604051809103902084604051610e5391906122c9565b60405180910390207f820c9405a0f2bb85b6d3faa5e7cc32aab79e983e6b14fc2f47c34855003cd8b48484604051610e8c9291906123ab565b60405180910390a350505050565b60025474010000000000000000000000000000000000000000900460ff16600103611160576001886001811115610ed357610ed3612402565b03610f0a576040517f034aef8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16036110db57600489511015610fa857885160046040517f34c9027a000000000000000000000000000000000000000000000000000000008152600401610512929190918252602082015260400190565b5f610fb28a61242f565b905060405180606001604052806037815260200161281860379139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061107b575060405180608001604052806042815260200161284f60429139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156110d5576101048a5110156110cb5789516040517f34c9027a00000000000000000000000000000000000000000000000000000000815260048101919091526101046024820152604401610512565b6110d58a8261169d565b50611160565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611160576040517f73dc029f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111ee57600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556113ce565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361135e576002546001546040517f3e4f49e600000000000000000000000000000000000000000000000000000000815260048101919091525f9173ffffffffffffffffffffffffffffffffffffffff1690633e4f49e6906024016020604051808303815f875af115801561129d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c1919061247e565b905060038160078111156112d7576112d7612402565b0361132057600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055611358565b600154816040517fe83cca1700000000000000000000000000000000000000000000000000000000815260040161051292919061249c565b506113ce565b6040517f625a43fe00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b60405133907fe09b21d6dd32859666ae309428ea624d48855f4762e0c91f342016e4947d793b905f90a2565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146114a7576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b805f036114e0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181905560405181907f63a01eaabe199ab888e562c930e21f3436583ea5acd4ca5c4ceffac3a523e039905f90a250565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146115bf576040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610512565b73ffffffffffffffffffffffffffffffffffffffff811661160c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f386c8d5fb4be6c928b7de4c7ae0a4b2ad0d2b2a7edad65d9f0af9ba255e51219905f90a250565b60405180608001604052806042815260200161284f604291398051906020012081565b5f600483516116ac91906124e5565b67ffffffffffffffff8111156116c4576116c4611c04565b6040519080825280601f01601f1916602001820160405280156116ee576020820181803683370190505b5090505f5b815181101561176b57836117088260046124fe565b81518110611718576117186121fc565b602001015160f81c60f81b828281518110611735576117356121fc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016116f3565b5060608060405180606001604052806037815260200161281860379139805190602001207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036118a557604080516001808252818301909252906020808301908036833701905050604080516001808252818301909252919350816020015b606081526020019060019003908161180857905050905082806020019051810190611833919061255e565b5050855191925085915f915061184b5761184b6121fc565b60200260200101835f81518110611864576118646121fc565b602002602001018290528273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050506118c4565b828060200190518101906118b991906126a6565b509395509093505050505b5f5b8251811015611b1a575f60035f8584815181106118e5576118e56121fc565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182015f20825160608101845281548516808252600190920154948516928101929092527401000000000000000000000000000000000000000090930467ffffffffffffffff1691810191909152915015611ad4575f83838151811061197c5761197c6121fc565b6020026020010151826020015183604001516040516024016119a093929190612780565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f224b0de700000000000000000000000000000000000000000000000000000000179052835190519192505f91829173ffffffffffffffffffffffffffffffffffffffff1690611a43908590612801565b5f60405180830381855af49150503d805f8114611a7b576040519150601f19603f3d011682016040523d82523d5f602084013e611a80565b606091505b509150915081611acc57805115611a9a5780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050611b11565b611b11848381518110611ae957611ae96121fc565b6020026020010151848481518110611b0357611b036121fc565b602002602001015146611b22565b506001016118c6565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f611b438461242f565b604081811c77ffffffff0000000000000000000000000000000000000000169390931760c085901b175f8181526020819052939093205490915060ff16611bfd576040517f43abfb6c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201527fffffffff000000000000000000000000000000000000000000000000000000008216602482015260448101849052606401610512565b5050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c7857611c78611c04565b604052919050565b5f67ffffffffffffffff821115611c9957611c99611c04565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611cc4575f80fd5b50565b8035611cd281611ca3565b919050565b5f82601f830112611ce6575f80fd5b81356020611cfb611cf683611c80565b611c31565b8083825260208201915060208460051b870101935086841115611d1c575f80fd5b602086015b84811015611d41578035611d3481611ca3565b8352918301918301611d21565b509695505050505050565b5f82601f830112611d5b575f80fd5b81356020611d6b611cf683611c80565b8083825260208201915060208460051b870101935086841115611d8c575f80fd5b602086015b84811015611d415780358352918301918301611d91565b5f805f8060808587031215611dbb575f80fd5b843567ffffffffffffffff80821115611dd2575f80fd5b611dde88838901611cd7565b95506020870135915080821115611df3575f80fd5b611dff88838901611cd7565b94506040870135915080821115611e14575f80fd5b611e2088838901611d4c565b93506060870135915080821115611e35575f80fd5b50611e4287828801611cd7565b91505092959194509250565b5f60208284031215611e5e575f80fd5b5035919050565b5f60208284031215611e75575f80fd5b8135611e8081611ca3565b9392505050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114611cd2575f80fd5b80358015158114611cd2575f80fd5b5f82601f830112611ed4575f80fd5b81356020611ee4611cf683611c80565b8083825260208201915060208460051b870101935086841115611f05575f80fd5b602086015b84811015611d4157611f1b81611eb6565b8352918301918301611f0a565b5f805f8060808587031215611f3b575f80fd5b843567ffffffffffffffff80821115611f52575f80fd5b611f5e88838901611cd7565b9550602091508187013581811115611f74575f80fd5b8701601f81018913611f84575f80fd5b8035611f92611cf682611c80565b81815260059190911b8201840190848101908b831115611fb0575f80fd5b928501925b82841015611fd557611fc684611e87565b82529285019290850190611fb5565b97505050506040870135915080821115611fed575f80fd5b611ff988838901611d4c565b9350606087013591508082111561200e575f80fd5b50611e4287828801611ec5565b5f67ffffffffffffffff82111561203457612034611c04565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261206f575f80fd5b813561207d611cf68261201b565b818152846020838601011115612091575f80fd5b816020850160208301375f918101602001919091529392505050565b803560028110611cd2575f80fd5b5f805f805f805f805f805f6101608c8e0312156120d6575f80fd5b6120df8c611cc7565b9a5060208c0135995067ffffffffffffffff8060408e01351115612101575f80fd5b6121118e60408f01358f01612060565b995061211f60608e016120ad565b985060808d0135975060a08d0135965060c08d0135955061214260e08e01611cc7565b94506121516101008e01611cc7565b9350806101208e01351115612164575f80fd5b506121768d6101208e01358e01612060565b91506121856101408d01611cc7565b90509295989b509295989b9093969950565b5f805f606084860312156121a9575f80fd5b83356121b481611ca3565b92506121c260208501611e87565b9150604084013590509250925092565b5f80604083850312156121e3575f80fd5b823591506121f360208401611eb6565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612295577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b92169190910492915050565b67ffffffffffffffff8281168282160390808211156122c2576122c2612229565b5092915050565b81515f9082906020808601845b8381101561230857815173ffffffffffffffffffffffffffffffffffffffff16855293820193908201906001016122d6565b50929695505050505050565b5f815180845260208085019450602084015f5b8381101561234357815187529582019590820190600101612327565b509495945050505050565b602081525f611e806020830184612314565b81515f9082906020808601845b838110156123085781517fffffffff00000000000000000000000000000000000000000000000000000000168552938201939082019060010161236d565b604081525f6123bd6040830185612314565b8281036020848101919091528451808352858201928201905f5b818110156123f55784511515835293830193918301916001016123d7565b5090979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156124765780818460040360031b1b83161693505b505050919050565b5f6020828403121561248e575f80fd5b815160088110611e80575f80fd5b82815260408101600883106124d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8260208301529392505050565b818103818111156124f8576124f8612229565b92915050565b808201808211156124f8576124f8612229565b5f82601f830112612520575f80fd5b815161252e611cf68261201b565b818152846020838601011115612542575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f805f805f8060c08789031215612573575f80fd5b865161257e81611ca3565b60208801516040890151919750955067ffffffffffffffff8111156125a1575f80fd5b6125ad89828a01612511565b945050606087015192506080870151915060a087015190509295509295509295565b5f82601f8301126125de575f80fd5b815160206125ee611cf683611c80565b8083825260208201915060208460051b87010193508684111561260f575f80fd5b602086015b84811015611d415780518352918301918301612614565b5f82601f83011261263a575f80fd5b8151602061264a611cf683611c80565b82815260059290921b84018101918181019086841115612668575f80fd5b8286015b84811015611d4157805167ffffffffffffffff81111561268a575f80fd5b6126988986838b0101612511565b84525091830191830161266c565b5f805f805f8060c087890312156126bb575f80fd5b865167ffffffffffffffff808211156126d2575f80fd5b818901915089601f8301126126e5575f80fd5b815160206126f5611cf683611c80565b82815260059290921b8401810191818101908d841115612713575f80fd5b948201945b8386101561273a57855161272b81611ca3565b82529482019490820190612718565b918c0151919a50909350505080821115612752575f80fd5b61275e8a838b016125cf565b96506040890151915080821115612773575f80fd5b506125ad89828a0161262b565b606081525f84518060608401528060208701608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505073ffffffffffffffffffffffffffffffffffffffff8416602083015267ffffffffffffffff83166040830152949350505050565b5f82518060208501845e5f92019182525091905056fe7363686564756c6528616464726573732c75696e743235362c62797465732c627974657333322c627974657333322c75696e74323536297363686564756c65426174636828616464726573735b5d2c75696e743235365b5d2c62797465735b5d2c627974657333322c627974657333322c75696e7432353629a2646970667358221220fceec9aedc11836c1fcf42303e8b32f8f8d5f6ba388cdd2e0f6c21c371d8828164736f6c63430008190033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/abis/0.8.25/VoteWeighting.json b/abis/0.8.25/VoteWeighting.json new file mode 100644 index 0000000..4756f69 --- /dev/null +++ b/abis/0.8.25/VoteWeighting.json @@ -0,0 +1,1214 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VoteWeighting", + "sourceName": "contracts/VoteWeighting.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_ve", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "curTime", + "type": "uint256" + } + ], + "name": "LockExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "int128", + "name": "slope", + "type": "int128" + } + ], + "name": "NegativeSlope", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "NomineeAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "NomineeDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "NomineeNotRemoved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "NomineeRemoved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "Overflow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerOnly", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "Underflow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "curTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nextAllowedVotingTime", + "type": "uint256" + } + ], + "name": "VoteTooOften", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numValues1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValues2", + "type": "uint256" + } + ], + "name": "WrongArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "AddNominee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "sumBias", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nomineeAccount", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nomineeWeight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalSum", + "type": "uint256" + } + ], + "name": "CheckpointNominee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dispenser", + "type": "address" + } + ], + "name": "DispenserUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nomineeAccount", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nomineeWeight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalSum", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nomineeRelativeWeight", + "type": "uint256" + } + ], + "name": "NomineeRelativeWeightWrite", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newSum", + "type": "uint256" + } + ], + "name": "RemoveNominee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nominee", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + } + ], + "name": "VoteForNominee", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_EVM_CHAIN_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_WEIGHT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WEEK", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WEIGHT_VOTE_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "addNomineeEVM", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "addNomineeNonEVM", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newDispenser", + "type": "address" + } + ], + "name": "changeDispenser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "changesSum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "changesWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "checkpointNominee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "dispenser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllNominees", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "internalType": "struct Nominee[]", + "name": "nominees", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "accounts", + "type": "bytes32[]" + }, + { + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "voters", + "type": "address[]" + } + ], + "name": "getNextAllowedVotingTimes", + "outputs": [ + { + "internalType": "uint256[]", + "name": "nextAllowedVotingTimes", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getNominee", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "internalType": "struct Nominee", + "name": "nominee", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "getNomineeId", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "getNomineeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "startId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numNominees", + "type": "uint256" + } + ], + "name": "getNominees", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "internalType": "struct Nominee[]", + "name": "nominees", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNumNominees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWeightsSum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "lastUserVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapNomineeIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapRemovedNominees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "nomineeRelativeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "relativeWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalSum", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "nomineeRelativeWeightWrite", + "outputs": [ + { + "internalType": "uint256", + "name": "relativeWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalSum", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pointsSum", + "outputs": [ + { + "internalType": "uint256", + "name": "bias", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "slope", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pointsWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "bias", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "slope", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "removeNominee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "retrieveRemovedNomineeVotingPower", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "setNominees", + "outputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timeSum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "timeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + } + ], + "name": "voteForNomineeWeights", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "accounts", + "type": "bytes32[]" + }, + { + "internalType": "uint256[]", + "name": "chainIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + } + ], + "name": "voteForNomineeWeightsBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "voteUserPower", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "voteUserSlopes", + "outputs": [ + { + "internalType": "uint256", + "name": "slope", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "power", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561000f575f80fd5b50604051612f15380380612f1583398101604081905261002e9161010b565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b031916331790556001600160a01b03811660805262093a806100818142610138565b61008b9190610157565b600d5550604080518082019091525f8082526020820181815260028054600181018255928190529251919092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf90910155610180565b5f6020828403121561011b575f80fd5b81516001600160a01b0381168114610131575f80fd5b9392505050565b5f8261015257634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761017a57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051612d6f6101a65f395f818161032f01528181611a640152611b610152612d6f5ff3fe608060405234801561000f575f80fd5b506004361061029c575f3560e01c806385556a9511610171578063c54dd0d4116100d2578063ec73d90611610088578063f4359ce51161006e578063f4359ce5146106a7578063f4da12ba146106b1578063f9572f7c146106b9575f80fd5b8063ec73d90614610669578063f0cd64af14610688575f80fd5b8063dc87f536116100b8578063dc87f53614610616578063e09d894d14610640578063e4a28a5214610660575f80fd5b8063c54dd0d4146105f0578063c88d47f014610603575f80fd5b8063a512480311610127578063b174b41c1161010d578063b174b41c146105a3578063beaf44e8146105d5578063c2c4c5c1146105e8575f80fd5b8063a512480314610588578063a6f9dae114610590575f80fd5b80638e28764b116101575780638e28764b146105295780639d1750531461055a578063a18f99ff14610580575f80fd5b806385556a95146104e05780638da5cb5b1461050a575f80fd5b8063415970361161021b578063609c6b87116101d15780636b39ac1a116101b75780636b39ac1a1461049a5780637a75b27e146104ad5780637ee8bfe9146104cd575f80fd5b8063609c6b87146104335780636a28a33c14610487575f80fd5b8063456f099711610201578063456f09971461040d57806348264997146104205780634f6ffd0714610429575f80fd5b806341597036146103e45780634479b5cf146103fa575f80fd5b80631f8507161161027057806327ebf5311161025657806327ebf531146103895780632a53b2af146103a95780633b766b3d146103bc575f80fd5b80631f8507161461032a57806326abaf2414610376575f80fd5b806292a596146102a05780630c423201146102c95780631765ab7f146102f65780631b98dd901461030b575b5f80fd5b6102b36102ae366004612723565b6106cc565b6040516102c09190612743565b60405180910390f35b6102e86102d7366004612799565b600c6020525f908152604090205481565b6040519081526020016102c0565b610309610304366004612723565b61084d565b005b6102e8610319366004612799565b600a6020525f908152604090205481565b6103517f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c0565b6103096103843660046128bb565b610945565b61039c610397366004612799565b610a0b565b6040516102c0919061293d565b6103096103b736600461297c565b610af3565b6103cf6103ca366004612799565b610bd2565b604080519283526020830191909152016102c0565b600d545f908152600b60205260409020546102e8565b6102e8610408366004612723565b610bfe565b6102e861041b366004612723565b610c80565b6102e8600d5481565b6102e8620d2f0081565b61046c610441366004612995565b600560209081525f928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102c0565b610309610495366004612723565b610cf1565b6103096104a8366004612995565b610edd565b6104c06104bb3660046129bd565b61102b565b6040516102c09190612a9a565b6103cf6104db366004612add565b611275565b6102e86104ee366004612995565b600760209081525f928352604080842090915290825290205481565b5f546103519073ffffffffffffffffffffffffffffffffffffffff1681565b6103cf610537366004612723565b600860209081525f92835260408084209091529082529020805460019091015482565b6103cf610568366004612799565b600b6020525f90815260409020805460019091015482565b6102e86112f2565b6102b3611308565b61030961059e36600461297c565b611377565b6105c56105b1366004612799565b60046020525f908152604090205460ff1681565b60405190151581526020016102c0565b6103096105e3366004612723565b6114a1565b610309611505565b6103096105fe366004612723565b611549565b6103cf610611366004612add565b611940565b6102e8610624366004612723565b600960209081525f928352604080842090915290825290205481565b6001546103519073ffffffffffffffffffffffffffffffffffffffff1681565b6102e861271081565b6102e861067736600461297c565b60066020525f908152604090205481565b6102e8610696366004612799565b60036020525f908152604090205481565b6102e862093a8081565b6102e8611959565b6103096106c7366004612add565b611985565b60608215806106d9575081155b15610710576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61071b8385612b33565b6002549091508082111561076a576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff811115610783576107836127b0565b6040519080825280602002602001820160405280156107c757816020015b604080518082019091525f80825260208201528152602001906001900390816107a15790505b5092505f5b84811015610844575f6107df8783612b33565b9050600281815481106107f4576107f4612b46565b905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505085838151811061083057610830612b46565b6020908102919091010152506001016107cc565b50505092915050565b81610884576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461089a600267ffffffffffffffff612ba0565b6108a49190612bc6565b67ffffffffffffffff1610610923578060246108c9600267ffffffffffffffff612ba0565b6108d39190612bc6565b6108e89067ffffffffffffffff166001612b33565b6040517fc076384b00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b6040805180820190915282815260208101829052610940816120e8565b505050565b8151835114158061095857508051835114155b1561099c57825181516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b5f5b8351811015610a05576109fd8482815181106109bc576109bc612b46565b60200260200101518483815181106109d6576109d6612b46565b60200260200101518484815181106109f0576109f0612b46565b6020026020010151611985565b60010161099e565b50505050565b604080518082019091525f80825260208201526002545f90610a2f90600190612bee565b9050825f03610a6a576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610aae576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610761565b60028381548110610ac157610ac1612b46565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b64575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610761565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610be1575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610c249184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610ca69184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f908152600390925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610d1b919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff16610da3576040517fa43ec26f0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610761565b335f90815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e18576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e805780515f83815260096020908152604080832081860151845290915281208054909190610e51908490612bee565b909155505080516040808301515f908152600c6020529081208054909190610e7a908490612bee565b90915550505b335f9081526006602090815260409091205490820151610ea09082612bee565b335f908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f2a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610f63576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f78600267ffffffffffffffff612ba0565b610f829190612bc6565b67ffffffffffffffff16811115610ff857806024610fa9600267ffffffffffffffff612ba0565b610fb39190612bc6565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff166024820152604401610761565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff8316815260208101829052610940816120e8565b60608251845114158061104057508151845114155b1561108457835183516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b835167ffffffffffffffff81111561109e5761109e6127b0565b6040519080825280602002602001820160405280156110c7578160200160208202803683370190505b5090505f5b845181101561126d575f60405180604001604052808784815181106110f3576110f3612b46565b6020026020010151815260200186848151811061111257611112612b46565b602002602001015181525090505f81604051602001611131919061293d565b60405160208183030381529060405280519060200120905060035f8281526020019081526020015f20545f036111d25786838151811061117357611173612b46565b602002602001015186848151811061118d5761118d612b46565b60200260200101516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600401610761929190918252602082015260400190565b620d2f0060075f8786815181106111eb576111eb612b46565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546112469190612b33565b84848151811061125857611258612b46565b602090810291909101015250506001016110cc565b509392505050565b5f805f611282868661236b565b905061128c612555565b5061129886868661264e565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b6002545f9061130390600190612bee565b905090565b60606002805480602002602001604051908101604052809291908181526020015f905b8282101561136e578382905f5260205f2090600202016040518060400160405290815f82015481526020016001820154815250508152602001906001019061132b565b50505050905090565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146113e8575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610761565b73ffffffffffffffffffffffffffffffffffffffff8116611435576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f6114ac838361236b565b90505f6114b7612555565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b5f61150e612555565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146115ba575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152336024820152604401610761565b5f60405180604001604052808481526020018381525090505f816040516020016115e4919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181526003909352908220549092509081900361166e576040517f31b05a800000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610761565b5f611679868661236b565b90505f611684612555565b90505f62093a80806116968142612b33565b6116a09190612c01565b6116aa9190612c14565b5f8681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116df8484612bee565b5f838152600b60209081526040808320849055600d8690558983526004825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556003909252822091909155600280549293509161174a9190612bee565b8154811061175a5761175a612b46565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919950611790918a910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260039093529120879055600280549192508991889081106117ed576117ed612b46565b905f5260205f2090600202015f820151815f015560208201518160010155905050600280548061181f5761181f612c2b565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff1680156118f8576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b1580156118e1575f80fd5b505af11580156118f3573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f8061194d85858561264e565b90969095509350505050565b602461196e600267ffffffffffffffff612ba0565b6119789190612bc6565b67ffffffffffffffff1681565b5f6040518060400160405280858152602001848152506040516020016119ab919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff1615611a34576040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610761565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae29190612c80565b6020015190505f81600f0b1215611b31576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b6024820152604401610761565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bdf9190612d22565b90505f62093a8080611bf18142612b33565b611bfb9190612c01565b611c059190612c14565b9050818110611c50576040517fd78507e10000000000000000000000000000000000000000000000000000000081523360048201526024810183905260448101829052606401610761565b612710851115611c97576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018690526127106024820152604401610761565b335f908152600760209081526040808320878452909152812054611cbf90620d2f0090612b33565b905042811115611d0a576040517f1760176500000000000000000000000000000000000000000000000000000000815233600482015242602482015260448101829052606401610761565b335f908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611d6e57838260400151611d5f9190612bee565b8251611d6b9190612c14565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611d9b9190612c14565b611da59190612c01565b8152602081018b905260400187905290505f611dc18688612bee565b8251611dcd9190612c14565b335f90815260066020908152604090912054868201519185015192935091611df59083612b33565b611dff9190612bee565b335f9081526006602052604090208190559050612710811115611e59576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610761565b611e7782611e678f8f61236b565b611e719190612b33565b85612704565b5f8b81526008602090815260408083208b8452909152902055611e9c82611e67612555565b5f888152600b60205260409081902091909155850151871015611f3d5782515f8b81526008602090815260408083208b8452909152902060010154611eeb91611ee491612b33565b8651612704565b5f8b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611f2791611ee491612b33565b5f888152600b6020526040902060010155611f97565b82515f8b81526008602090815260408083208b845290915281206001018054909190611f6a908490612b33565b909155505082515f888152600b602052604081206001018054909190611f91908490612b33565b90915550505b4285604001511115611fff5784515f8b8152600960209081526040808320818a0151845290915281208054909190611fd0908490612bee565b909155505084516040808701515f908152600c6020529081208054909190611ff9908490612bee565b90915550505b82515f8b81526009602090815260408083208188015184529091528120805490919061202c908490612b33565b909155505082516040808501515f908152600c6020529081208054909190612055908490612b33565b9091555050335f8181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b5f816040516020016120fa919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260039093529120549091501561218657815160208301516040517f5855e24800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b5f8181526004602052604090205460ff16156121de57815160208301516040517ffcd19b5d00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b600280545f838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a80806122628142612b33565b61226c9190612c01565b6122769190612c14565b5f848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612324576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b15801561230d575f80fd5b505af115801561231f573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b604080518082018252838152602080820184905291515f9283916123919184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff161580156123f157505f81815260036020526040902054155b15612432576040517f31b05a800000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610761565b5f818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015612549574283116125495761248a62093a8084612b33565b92505f62093a8083602001516124a09190612c14565b905080835f015111156124f75780835f018181516124be9190612bee565b9052505f85815260096020908152604080832087845282529091205490840180518291906124ed908390612bee565b9052506125019050565b5f80845260208401525b5f8581526008602090815260408083208784528252909120845181559084015160019091015542841115612540575f858152600a602052604090208490555b5060010161246c565b50519695505050505050565b600d545f818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561264657428311612646576125a262093a8084612b33565b92505f62093a8083602001516125b89190612c14565b905080835f015111156126075780835f018181516125d69190612bee565b9052505f848152600c602090815260409091205490840180518291906125fd908390612bee565b9052506126119050565b5f80845260208401525b5f848152600b6020908152604090912084518155908401516001909101554284111561263d57600d8490555b50600101612584565b505192915050565b5f808062093a8061265f8186612c01565b6126699190612c14565b5f818152600b6020908152604080832054815180830183528b81528084018b905291519096509394509261269f9184910161293d565b6040516020818303038152906040528051906020012090505f8411156126f9575f818152600860209081526040808320868452909152902054846126eb82670de0b6b3a7640000612c14565b6126f59190612c01565b9550505b505050935093915050565b5f818311612712575f61271c565b61271c8284612bee565b9392505050565b5f8060408385031215612734575f80fd5b50508035926020909101359150565b602080825282518282018190525f919060409081850190868401855b8281101561278c5761277c84835180518252602090810151910152565b928401929085019060010161275f565b5091979650505050505050565b5f602082840312156127a9575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612824576128246127b0565b604052919050565b5f67ffffffffffffffff821115612845576128456127b0565b5060051b60200190565b5f82601f83011261285e575f80fd5b8135602061287361286e8361282c565b6127dd565b8083825260208201915060208460051b870101935086841115612894575f80fd5b602086015b848110156128b05780358352918301918301612899565b509695505050505050565b5f805f606084860312156128cd575f80fd5b833567ffffffffffffffff808211156128e4575f80fd5b6128f08783880161284f565b94506020860135915080821115612905575f80fd5b6129118783880161284f565b93506040860135915080821115612926575f80fd5b506129338682870161284f565b9150509250925092565b815181526020808301519082015260408101610c7a565b803573ffffffffffffffffffffffffffffffffffffffff81168114612977575f80fd5b919050565b5f6020828403121561298c575f80fd5b61271c82612954565b5f80604083850312156129a6575f80fd5b6129af83612954565b946020939093013593505050565b5f805f606084860312156129cf575f80fd5b833567ffffffffffffffff808211156129e6575f80fd5b6129f28783880161284f565b9450602091508186013581811115612a08575f80fd5b612a148882890161284f565b945050604086013581811115612a28575f80fd5b86019050601f81018713612a3a575f80fd5b8035612a4861286e8261282c565b81815260059190911b82018301908381019089831115612a66575f80fd5b928401925b82841015612a8b57612a7c84612954565b82529284019290840190612a6b565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612ad157835183529284019291840191600101612ab5565b50909695505050505050565b5f805f60608486031215612aef575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610c7a57610c7a612b06565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f67ffffffffffffffff80841680612bba57612bba612b73565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612be757612be7612b06565b5092915050565b81810381811115610c7a57610c7a612b06565b5f82612c0f57612c0f612b73565b500490565b8082028115828204841417610c7a57610c7a612b06565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b8114612977575f80fd5b805167ffffffffffffffff81168114612977575f80fd5b5f60a08284031215612c90575f80fd5b60405160a0810181811067ffffffffffffffff82111715612cb357612cb36127b0565b604052612cbf83612c58565b8152612ccd60208401612c58565b6020820152612cde60408401612c69565b6040820152612cef60608401612c69565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612d16575f80fd5b60808201529392505050565b5f60208284031215612d32575f80fd5b505191905056fea26469706673582212203cbeaab06de45bb0137758587cf35a2eaf535c02342361c063991013e8f4aaa964736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061029c575f3560e01c806385556a9511610171578063c54dd0d4116100d2578063ec73d90611610088578063f4359ce51161006e578063f4359ce5146106a7578063f4da12ba146106b1578063f9572f7c146106b9575f80fd5b8063ec73d90614610669578063f0cd64af14610688575f80fd5b8063dc87f536116100b8578063dc87f53614610616578063e09d894d14610640578063e4a28a5214610660575f80fd5b8063c54dd0d4146105f0578063c88d47f014610603575f80fd5b8063a512480311610127578063b174b41c1161010d578063b174b41c146105a3578063beaf44e8146105d5578063c2c4c5c1146105e8575f80fd5b8063a512480314610588578063a6f9dae114610590575f80fd5b80638e28764b116101575780638e28764b146105295780639d1750531461055a578063a18f99ff14610580575f80fd5b806385556a95146104e05780638da5cb5b1461050a575f80fd5b8063415970361161021b578063609c6b87116101d15780636b39ac1a116101b75780636b39ac1a1461049a5780637a75b27e146104ad5780637ee8bfe9146104cd575f80fd5b8063609c6b87146104335780636a28a33c14610487575f80fd5b8063456f099711610201578063456f09971461040d57806348264997146104205780634f6ffd0714610429575f80fd5b806341597036146103e45780634479b5cf146103fa575f80fd5b80631f8507161161027057806327ebf5311161025657806327ebf531146103895780632a53b2af146103a95780633b766b3d146103bc575f80fd5b80631f8507161461032a57806326abaf2414610376575f80fd5b806292a596146102a05780630c423201146102c95780631765ab7f146102f65780631b98dd901461030b575b5f80fd5b6102b36102ae366004612723565b6106cc565b6040516102c09190612743565b60405180910390f35b6102e86102d7366004612799565b600c6020525f908152604090205481565b6040519081526020016102c0565b610309610304366004612723565b61084d565b005b6102e8610319366004612799565b600a6020525f908152604090205481565b6103517f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c0565b6103096103843660046128bb565b610945565b61039c610397366004612799565b610a0b565b6040516102c0919061293d565b6103096103b736600461297c565b610af3565b6103cf6103ca366004612799565b610bd2565b604080519283526020830191909152016102c0565b600d545f908152600b60205260409020546102e8565b6102e8610408366004612723565b610bfe565b6102e861041b366004612723565b610c80565b6102e8600d5481565b6102e8620d2f0081565b61046c610441366004612995565b600560209081525f928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102c0565b610309610495366004612723565b610cf1565b6103096104a8366004612995565b610edd565b6104c06104bb3660046129bd565b61102b565b6040516102c09190612a9a565b6103cf6104db366004612add565b611275565b6102e86104ee366004612995565b600760209081525f928352604080842090915290825290205481565b5f546103519073ffffffffffffffffffffffffffffffffffffffff1681565b6103cf610537366004612723565b600860209081525f92835260408084209091529082529020805460019091015482565b6103cf610568366004612799565b600b6020525f90815260409020805460019091015482565b6102e86112f2565b6102b3611308565b61030961059e36600461297c565b611377565b6105c56105b1366004612799565b60046020525f908152604090205460ff1681565b60405190151581526020016102c0565b6103096105e3366004612723565b6114a1565b610309611505565b6103096105fe366004612723565b611549565b6103cf610611366004612add565b611940565b6102e8610624366004612723565b600960209081525f928352604080842090915290825290205481565b6001546103519073ffffffffffffffffffffffffffffffffffffffff1681565b6102e861271081565b6102e861067736600461297c565b60066020525f908152604090205481565b6102e8610696366004612799565b60036020525f908152604090205481565b6102e862093a8081565b6102e8611959565b6103096106c7366004612add565b611985565b60608215806106d9575081155b15610710576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61071b8385612b33565b6002549091508082111561076a576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff811115610783576107836127b0565b6040519080825280602002602001820160405280156107c757816020015b604080518082019091525f80825260208201528152602001906001900390816107a15790505b5092505f5b84811015610844575f6107df8783612b33565b9050600281815481106107f4576107f4612b46565b905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505085838151811061083057610830612b46565b6020908102919091010152506001016107cc565b50505092915050565b81610884576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461089a600267ffffffffffffffff612ba0565b6108a49190612bc6565b67ffffffffffffffff1610610923578060246108c9600267ffffffffffffffff612ba0565b6108d39190612bc6565b6108e89067ffffffffffffffff166001612b33565b6040517fc076384b00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b6040805180820190915282815260208101829052610940816120e8565b505050565b8151835114158061095857508051835114155b1561099c57825181516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b5f5b8351811015610a05576109fd8482815181106109bc576109bc612b46565b60200260200101518483815181106109d6576109d6612b46565b60200260200101518484815181106109f0576109f0612b46565b6020026020010151611985565b60010161099e565b50505050565b604080518082019091525f80825260208201526002545f90610a2f90600190612bee565b9050825f03610a6a576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610aae576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610761565b60028381548110610ac157610ac1612b46565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b64575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610761565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610be1575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610c249184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610ca69184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f908152600390925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610d1b919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff16610da3576040517fa43ec26f0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610761565b335f90815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e18576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e805780515f83815260096020908152604080832081860151845290915281208054909190610e51908490612bee565b909155505080516040808301515f908152600c6020529081208054909190610e7a908490612bee565b90915550505b335f9081526006602090815260409091205490820151610ea09082612bee565b335f908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f2a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610f63576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f78600267ffffffffffffffff612ba0565b610f829190612bc6565b67ffffffffffffffff16811115610ff857806024610fa9600267ffffffffffffffff612ba0565b610fb39190612bc6565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff166024820152604401610761565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff8316815260208101829052610940816120e8565b60608251845114158061104057508151845114155b1561108457835183516040517f8151c11000000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b835167ffffffffffffffff81111561109e5761109e6127b0565b6040519080825280602002602001820160405280156110c7578160200160208202803683370190505b5090505f5b845181101561126d575f60405180604001604052808784815181106110f3576110f3612b46565b6020026020010151815260200186848151811061111257611112612b46565b602002602001015181525090505f81604051602001611131919061293d565b60405160208183030381529060405280519060200120905060035f8281526020019081526020015f20545f036111d25786838151811061117357611173612b46565b602002602001015186848151811061118d5761118d612b46565b60200260200101516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600401610761929190918252602082015260400190565b620d2f0060075f8786815181106111eb576111eb612b46565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546112469190612b33565b84848151811061125857611258612b46565b602090810291909101015250506001016110cc565b509392505050565b5f805f611282868661236b565b905061128c612555565b5061129886868661264e565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b6002545f9061130390600190612bee565b905090565b60606002805480602002602001604051908101604052809291908181526020015f905b8282101561136e578382905f5260205f2090600202016040518060400160405290815f82015481526020016001820154815250508152602001906001019061132b565b50505050905090565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146113e8575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610761565b73ffffffffffffffffffffffffffffffffffffffff8116611435576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f6114ac838361236b565b90505f6114b7612555565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b5f61150e612555565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146115ba575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152336024820152604401610761565b5f60405180604001604052808481526020018381525090505f816040516020016115e4919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181526003909352908220549092509081900361166e576040517f31b05a800000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610761565b5f611679868661236b565b90505f611684612555565b90505f62093a80806116968142612b33565b6116a09190612c01565b6116aa9190612c14565b5f8681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116df8484612bee565b5f838152600b60209081526040808320849055600d8690558983526004825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556003909252822091909155600280549293509161174a9190612bee565b8154811061175a5761175a612b46565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919950611790918a910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260039093529120879055600280549192508991889081106117ed576117ed612b46565b905f5260205f2090600202015f820151815f015560208201518160010155905050600280548061181f5761181f612c2b565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff1680156118f8576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b1580156118e1575f80fd5b505af11580156118f3573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f8061194d85858561264e565b90969095509350505050565b602461196e600267ffffffffffffffff612ba0565b6119789190612bc6565b67ffffffffffffffff1681565b5f6040518060400160405280858152602001848152506040516020016119ab919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff1615611a34576040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610761565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae29190612c80565b6020015190505f81600f0b1215611b31576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b6024820152604401610761565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bdf9190612d22565b90505f62093a8080611bf18142612b33565b611bfb9190612c01565b611c059190612c14565b9050818110611c50576040517fd78507e10000000000000000000000000000000000000000000000000000000081523360048201526024810183905260448101829052606401610761565b612710851115611c97576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018690526127106024820152604401610761565b335f908152600760209081526040808320878452909152812054611cbf90620d2f0090612b33565b905042811115611d0a576040517f1760176500000000000000000000000000000000000000000000000000000000815233600482015242602482015260448101829052606401610761565b335f908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611d6e57838260400151611d5f9190612bee565b8251611d6b9190612c14565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611d9b9190612c14565b611da59190612c01565b8152602081018b905260400187905290505f611dc18688612bee565b8251611dcd9190612c14565b335f90815260066020908152604090912054868201519185015192935091611df59083612b33565b611dff9190612bee565b335f9081526006602052604090208190559050612710811115611e59576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610761565b611e7782611e678f8f61236b565b611e719190612b33565b85612704565b5f8b81526008602090815260408083208b8452909152902055611e9c82611e67612555565b5f888152600b60205260409081902091909155850151871015611f3d5782515f8b81526008602090815260408083208b8452909152902060010154611eeb91611ee491612b33565b8651612704565b5f8b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611f2791611ee491612b33565b5f888152600b6020526040902060010155611f97565b82515f8b81526008602090815260408083208b845290915281206001018054909190611f6a908490612b33565b909155505082515f888152600b602052604081206001018054909190611f91908490612b33565b90915550505b4285604001511115611fff5784515f8b8152600960209081526040808320818a0151845290915281208054909190611fd0908490612bee565b909155505084516040808701515f908152600c6020529081208054909190611ff9908490612bee565b90915550505b82515f8b81526009602090815260408083208188015184529091528120805490919061202c908490612b33565b909155505082516040808501515f908152600c6020529081208054909190612055908490612b33565b9091555050335f8181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b5f816040516020016120fa919061293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260039093529120549091501561218657815160208301516040517f5855e24800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b5f8181526004602052604090205460ff16156121de57815160208301516040517ffcd19b5d00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610761565b600280545f838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a80806122628142612b33565b61226c9190612c01565b6122769190612c14565b5f848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612324576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b15801561230d575f80fd5b505af115801561231f573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b604080518082018252838152602080820184905291515f9283916123919184910161293d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291205490915060ff161580156123f157505f81815260036020526040902054155b15612432576040517f31b05a800000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610761565b5f818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015612549574283116125495761248a62093a8084612b33565b92505f62093a8083602001516124a09190612c14565b905080835f015111156124f75780835f018181516124be9190612bee565b9052505f85815260096020908152604080832087845282529091205490840180518291906124ed908390612bee565b9052506125019050565b5f80845260208401525b5f8581526008602090815260408083208784528252909120845181559084015160019091015542841115612540575f858152600a602052604090208490555b5060010161246c565b50519695505050505050565b600d545f818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561264657428311612646576125a262093a8084612b33565b92505f62093a8083602001516125b89190612c14565b905080835f015111156126075780835f018181516125d69190612bee565b9052505f848152600c602090815260409091205490840180518291906125fd908390612bee565b9052506126119050565b5f80845260208401525b5f848152600b6020908152604090912084518155908401516001909101554284111561263d57600d8490555b50600101612584565b505192915050565b5f808062093a8061265f8186612c01565b6126699190612c14565b5f818152600b6020908152604080832054815180830183528b81528084018b905291519096509394509261269f9184910161293d565b6040516020818303038152906040528051906020012090505f8411156126f9575f818152600860209081526040808320868452909152902054846126eb82670de0b6b3a7640000612c14565b6126f59190612c01565b9550505b505050935093915050565b5f818311612712575f61271c565b61271c8284612bee565b9392505050565b5f8060408385031215612734575f80fd5b50508035926020909101359150565b602080825282518282018190525f919060409081850190868401855b8281101561278c5761277c84835180518252602090810151910152565b928401929085019060010161275f565b5091979650505050505050565b5f602082840312156127a9575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612824576128246127b0565b604052919050565b5f67ffffffffffffffff821115612845576128456127b0565b5060051b60200190565b5f82601f83011261285e575f80fd5b8135602061287361286e8361282c565b6127dd565b8083825260208201915060208460051b870101935086841115612894575f80fd5b602086015b848110156128b05780358352918301918301612899565b509695505050505050565b5f805f606084860312156128cd575f80fd5b833567ffffffffffffffff808211156128e4575f80fd5b6128f08783880161284f565b94506020860135915080821115612905575f80fd5b6129118783880161284f565b93506040860135915080821115612926575f80fd5b506129338682870161284f565b9150509250925092565b815181526020808301519082015260408101610c7a565b803573ffffffffffffffffffffffffffffffffffffffff81168114612977575f80fd5b919050565b5f6020828403121561298c575f80fd5b61271c82612954565b5f80604083850312156129a6575f80fd5b6129af83612954565b946020939093013593505050565b5f805f606084860312156129cf575f80fd5b833567ffffffffffffffff808211156129e6575f80fd5b6129f28783880161284f565b9450602091508186013581811115612a08575f80fd5b612a148882890161284f565b945050604086013581811115612a28575f80fd5b86019050601f81018713612a3a575f80fd5b8035612a4861286e8261282c565b81815260059190911b82018301908381019089831115612a66575f80fd5b928401925b82841015612a8b57612a7c84612954565b82529284019290840190612a6b565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612ad157835183529284019291840191600101612ab5565b50909695505050505050565b5f805f60608486031215612aef575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610c7a57610c7a612b06565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f67ffffffffffffffff80841680612bba57612bba612b73565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612be757612be7612b06565b5092915050565b81810381811115610c7a57610c7a612b06565b5f82612c0f57612c0f612b73565b500490565b8082028115828204841417610c7a57610c7a612b06565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b8114612977575f80fd5b805167ffffffffffffffff81168114612977575f80fd5b5f60a08284031215612c90575f80fd5b60405160a0810181811067ffffffffffffffff82111715612cb357612cb36127b0565b604052612cbf83612c58565b8152612ccd60208401612c58565b6020820152612cde60408401612c69565b6040820152612cef60608401612c69565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612d16575f80fd5b60808201529392505050565b5f60208284031215612d32575f80fd5b505191905056fea26469706673582212203cbeaab06de45bb0137758587cf35a2eaf535c02342361c063991013e8f4aaa964736f6c63430008190033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/audits/internal12/README.md b/audits/internal12/README.md index 624d4eb..0959b9b 100644 --- a/audits/internal12/README.md +++ b/audits/internal12/README.md @@ -66,6 +66,8 @@ console.log("bug: negative getLastUserPoint() is possible"); 340282366920938463463374607431768211446 bug: negative getLastUserPoint() is ok ``` +[x] fixed + #### Minor issue CEI pattern:
```sh @@ -77,10 +79,14 @@ Not CEI pattern. Move to end. } ``` +[x] fixed + Lacks a zero-check on:
```sh function changeDispenser(address newDispenser) external {} ``` +[x] as designed + No events:
```sh function changeDispenser(address newDispenser) external {} @@ -88,25 +94,34 @@ function checkpoint() ? function checkpointNominee() ? function nomineeRelativeWeightWrite() ? ``` +[x] fixed + Naming test issue:
```sh Rename test\VoteWeighting.js describe("Voting Escrow OLAS", function () { ``` +[x] fixed + README issue:
```sh No link to https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/GaugeController.vy ``` +[x] fixed + Pay attention:
``` https://github.com/trailofbits/publications/blob/master/reviews/CurveDAO.pdf -> 18. Several loops are not executable due to gaslimitation Discussion: I don't think this is a problem for our version. ``` +[x] noted, will check in tests + Version solidity:
```sh For contracts that are planned to be deployed in mainnet, it is necessary to use the features of the latest hard fork. https://soliditylang.org/blog/2024/03/14/solidity-0.8.25-release-announcement/ ``` +[x] fixed #### Notes Notes for UX/UI: @@ -141,11 +156,14 @@ Notes for UX/UI: Due to operation removeNominee(), you must keep in mind that for the same `id` there can be DIFFERENT(!) `nominee` in different time. ref: tests Does the developer need to add clarification in comments to the source code? ``` +[x] added a comment + General notes (from Curve Finance audit):
```sh https://github.com/trailofbits/publications/blob/master/reviews/CurveDAO.pdf 4. GaugeController allowsfor quick vote andwithdrawvoting strategy: ref: source variable WEIGHT_VOTE_DELAY 18. Several loops are not executable due to gaslimitation ``` +[x] noted and added as a comment diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index b5ea92d..d116ff1 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; // Dispenser interface interface IDispenser { @@ -83,6 +83,11 @@ error NomineeAlreadyExists(bytes32 account, uint256 chainId); /// @param curTime Current timestamp. error LockExpired(address account, uint256 deadline, uint256 curTime); +/// @dev Violated a negative slope value. +/// @param account Account address. +/// @param slope Negative slope. +error NegativeSlope(address account, int128 slope); + /// @dev The vote has been performed already. /// @param voter Voter address. /// @param curTime Current time. @@ -120,11 +125,18 @@ struct Nominee { /// @title VoteWeighting - Smart contract for Vote Weighting with specific nominees composed of address and chain Id +/// @notice Inspired by https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/GaugeController.vy /// @author Aleksandr Kuperman - /// @author Andrey Lebedev - /// @author Mariapia Moscatiello - contract VoteWeighting { event OwnerUpdated(address indexed owner); + event DispenserUpdated(address indexed dispenser); + event Checkpoint(address indexed sender, uint256 sumBias); + event CheckpointNominee(address indexed sender, bytes32 indexed nomineeAccount, uint256 chainId, + uint256 nomineeWeight, uint256 totalSum); + event NomineeRelativeWeightWrite(address indexed sender, bytes32 indexed nomineeAccount, uint256 chainId, + uint256 nomineeWeight, uint256 totalSum, uint256 nomineeRelativeWeight); event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight); event AddNominee(bytes32 indexed account, uint256 chainId, uint256 id); event RemoveNominee(bytes32 indexed account, uint256 chainId, uint256 newSum); @@ -132,6 +144,7 @@ contract VoteWeighting { // 7 * 86400 seconds - all future times are rounded by week uint256 public constant WEEK = 604_800; // Cannot change weight votes more often than once in 10 days + // For explanation about the delay consult the official audit report: https://github.com/trailofbits/publications/blob/master/reviews/CurveDAO.pdf uint256 public constant WEIGHT_VOTE_DELAY = 864_000; // Max weight amount uint256 public constant MAX_WEIGHT = 10_000; @@ -194,7 +207,7 @@ contract VoteWeighting { } /// @dev Fill sum of nominee weights for the same type week-over-week for missed checkins and return the sum for the future week. - /// @return Sum of weights. + /// @return Sum of nominee weights. function _getSum() internal returns (uint256) { // t is always > 0 as it is set in the constructor uint256 t = timeSum; @@ -356,7 +369,7 @@ contract VoteWeighting { } /// @dev Changes the dispenser contract address. - /// @notice Dispenser can a zero address if the contract needs to serve a general purpose. + /// @notice Dispenser can be set to a zero address if the contract needs to serve a general purpose. /// @param newDispenser New dispenser contract address. function changeDispenser(address newDispenser) external { // Check for the contract ownership @@ -365,19 +378,24 @@ contract VoteWeighting { } dispenser = newDispenser; + emit DispenserUpdated(newDispenser); } /// @dev Checkpoint to fill data common for all nominees. function checkpoint() external { - _getSum(); + uint256 totalSum = _getSum(); + + emit Checkpoint(msg.sender, totalSum); } /// @dev Checkpoint to fill data for both a specific nominee and common for all nominees. /// @param account Address of the nominee. /// @param chainId Chain Id. function checkpointNominee(bytes32 account, uint256 chainId) external { - _getWeight(account, chainId); - _getSum(); + uint256 nomineeWeight = _getWeight(account, chainId); + uint256 totalSum = _getSum(); + + emit CheckpointNominee(msg.sender, account, chainId, nomineeWeight, totalSum); } /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights. @@ -410,14 +428,14 @@ contract VoteWeighting { /// @param account Address of the nominee in bytes32 form. /// @param chainId Chain Id. /// @param time Relative weight at the specified timestamp in the past or present. - /// @return weight Value of relative weight normalized to 1e18. + /// @return relativeWeight Value of nominee relative weight normalized to 1e18. /// @return totalSum Sum of nominee weights. function nomineeRelativeWeight( bytes32 account, uint256 chainId, uint256 time - ) external view returns (uint256 weight, uint256 totalSum) { - (weight, totalSum) = _nomineeRelativeWeight(account, chainId, time); + ) external view returns (uint256 relativeWeight, uint256 totalSum) { + (relativeWeight, totalSum) = _nomineeRelativeWeight(account, chainId, time); } /// @dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. @@ -426,16 +444,18 @@ contract VoteWeighting { /// @param account Address of the nominee in bytes32 form. /// @param chainId Chain Id. /// @param time Relative weight at the specified timestamp in the past or present. - /// @return weight Value of relative weight normalized to 1e18. + /// @return relativeWeight Value of nominee relative weight normalized to 1e18. /// @return totalSum Sum of nominee weights. function nomineeRelativeWeightWrite( bytes32 account, uint256 chainId, uint256 time - ) external returns (uint256 weight, uint256 totalSum) { - _getWeight(account, chainId); + ) external returns (uint256 relativeWeight, uint256 totalSum) { + uint256 nomineeWeight = _getWeight(account, chainId); _getSum(); - (weight, totalSum) = _nomineeRelativeWeight(account, chainId, time); + (relativeWeight, totalSum) = _nomineeRelativeWeight(account, chainId, time); + + emit NomineeRelativeWeightWrite(msg.sender, account, chainId, nomineeWeight, totalSum, relativeWeight); } /// @dev Allocate voting power for changing pool weights. @@ -451,7 +471,12 @@ contract VoteWeighting { revert NomineeRemoved(account, chainId); } - uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); + // Get user veOLAS slope and check its value + int128 userSlope = IVEOLAS(ve).getLastUserPoint(msg.sender).slope; + if (userSlope < 0) { + revert NegativeSlope(msg.sender, userSlope); + } + uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; @@ -479,7 +504,7 @@ contract VoteWeighting { } VotedSlope memory newSlope = VotedSlope({ - slope: slope * weight / MAX_WEIGHT, + slope: uint256(uint128(userSlope)) * weight / MAX_WEIGHT, end: lockEnd, power: weight }); @@ -547,6 +572,7 @@ contract VoteWeighting { } /// @dev Removes nominee from the contract and zeros its weight. + /// @notice The last nominee in the set of nominees is going to change its Id at the end of this function call. /// @param account Address of the nominee in bytes32 form. /// @param chainId Chain Id. function removeNominee(bytes32 account, uint256 chainId) external { @@ -580,22 +606,23 @@ contract VoteWeighting { // Add to the removed nominee map mapRemovedNominees[nomineeHash] = true; - // Remove nominee in dispenser, if applicable - address localDispenser = dispenser; - if (localDispenser != address(0)) { - IDispenser(localDispenser).removeNominee(nomineeHash); - } - // Remove nominee from the map mapNomineeIds[nomineeHash] = 0; + // Shuffle the current last nominee id in the set to be placed to the removed one nominee = setNominees[setNominees.length - 1]; - nomineeHash = keccak256(abi.encode(nominee)); - mapNomineeIds[nomineeHash] = id; + bytes32 replacedNomineeHash = keccak256(abi.encode(nominee)); + mapNomineeIds[replacedNomineeHash] = id; setNominees[id] = nominee; // Pop the last element from the set setNominees.pop(); + // Remove nominee in dispenser, if applicable + address localDispenser = dispenser; + if (localDispenser != address(0)) { + IDispenser(localDispenser).removeNominee(nomineeHash); + } + emit RemoveNominee(account, chainId, newSum); } diff --git a/contracts/multisigs/GuardCM.sol b/contracts/multisigs/GuardCM.sol index 6133416..cfef806 100644 --- a/contracts/multisigs/GuardCM.sol +++ b/contracts/multisigs/GuardCM.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {Enum} from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol"; import {VerifyData} from "./VerifyData.sol"; @@ -216,8 +216,9 @@ contract GuardCM is VerifyData { // Check if the data goes across the bridge if (bridgeParams.verifierL2 != address(0)) { // Process the bridge logic - (bool success, bytes memory returnData) = bridgeParams.verifierL2.delegatecall(abi.encodeWithSelector( - IBridgeVerifier.processBridgeData.selector, callDatas[i], bridgeParams.bridgeMediatorL2, bridgeParams.chainId)); + bytes memory processData = abi.encodeCall(IBridgeVerifier.processBridgeData, (callDatas[i], + bridgeParams.bridgeMediatorL2, bridgeParams.chainId)); + (bool success, bytes memory returnData) = bridgeParams.verifierL2.delegatecall(processData); // Process unsuccessful delegatecall if (!success) { // Get the revert message bytes diff --git a/contracts/multisigs/VerifyData.sol b/contracts/multisigs/VerifyData.sol index c34a77c..8c2a5fc 100644 --- a/contracts/multisigs/VerifyData.sol +++ b/contracts/multisigs/VerifyData.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; /// @dev The combination of target and selector is not authorized. /// @param target Target address. diff --git a/contracts/multisigs/bridge_verifier/ProcessBridgedDataArbitrum.sol b/contracts/multisigs/bridge_verifier/ProcessBridgedDataArbitrum.sol index 6bce2d3..0d49650 100644 --- a/contracts/multisigs/bridge_verifier/ProcessBridgedDataArbitrum.sol +++ b/contracts/multisigs/bridge_verifier/ProcessBridgedDataArbitrum.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyBridgedData} from "./VerifyBridgedData.sol"; diff --git a/contracts/multisigs/bridge_verifier/ProcessBridgedDataGnosis.sol b/contracts/multisigs/bridge_verifier/ProcessBridgedDataGnosis.sol index 5f0400e..3ead0b9 100644 --- a/contracts/multisigs/bridge_verifier/ProcessBridgedDataGnosis.sol +++ b/contracts/multisigs/bridge_verifier/ProcessBridgedDataGnosis.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyBridgedData} from "./VerifyBridgedData.sol"; diff --git a/contracts/multisigs/bridge_verifier/ProcessBridgedDataOptimism.sol b/contracts/multisigs/bridge_verifier/ProcessBridgedDataOptimism.sol index f98951d..5784091 100644 --- a/contracts/multisigs/bridge_verifier/ProcessBridgedDataOptimism.sol +++ b/contracts/multisigs/bridge_verifier/ProcessBridgedDataOptimism.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyBridgedData} from "./VerifyBridgedData.sol"; diff --git a/contracts/multisigs/bridge_verifier/ProcessBridgedDataPolygon.sol b/contracts/multisigs/bridge_verifier/ProcessBridgedDataPolygon.sol index 4ae2e86..9bb7cd5 100644 --- a/contracts/multisigs/bridge_verifier/ProcessBridgedDataPolygon.sol +++ b/contracts/multisigs/bridge_verifier/ProcessBridgedDataPolygon.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyBridgedData} from "./VerifyBridgedData.sol"; diff --git a/contracts/multisigs/bridge_verifier/ProcessBridgedDataWormhole.sol b/contracts/multisigs/bridge_verifier/ProcessBridgedDataWormhole.sol index c9cc2d8..c5c7136 100644 --- a/contracts/multisigs/bridge_verifier/ProcessBridgedDataWormhole.sol +++ b/contracts/multisigs/bridge_verifier/ProcessBridgedDataWormhole.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyBridgedData} from "./VerifyBridgedData.sol"; diff --git a/contracts/multisigs/bridge_verifier/VerifyBridgedData.sol b/contracts/multisigs/bridge_verifier/VerifyBridgedData.sol index 9e77245..f14086a 100644 --- a/contracts/multisigs/bridge_verifier/VerifyBridgedData.sol +++ b/contracts/multisigs/bridge_verifier/VerifyBridgedData.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; import {VerifyData} from "../VerifyData.sol"; diff --git a/contracts/multisigs/test/DelegatecallExploit.sol b/contracts/multisigs/test/DelegatecallExploit.sol index e19326d..c780a44 100644 --- a/contracts/multisigs/test/DelegatecallExploit.sol +++ b/contracts/multisigs/test/DelegatecallExploit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; contract DelegatecallExploit { bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8; diff --git a/contracts/multisigs/test/MockTimelockCM.sol b/contracts/multisigs/test/MockTimelockCM.sol index ebf89aa..ce6cdf7 100644 --- a/contracts/multisigs/test/MockTimelockCM.sol +++ b/contracts/multisigs/test/MockTimelockCM.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; error ExecFailed(address multisig, bytes payload); diff --git a/contracts/multisigs/test/MockTreasury.sol b/contracts/multisigs/test/MockTreasury.sol index 2b83c94..f248d56 100644 --- a/contracts/multisigs/test/MockTreasury.sol +++ b/contracts/multisigs/test/MockTreasury.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.23; +pragma solidity ^0.8.25; /// @dev Only `owner` has a privilege, but the `sender` was provided. /// @param sender Sender address. diff --git a/hardhat.config.js b/hardhat.config.js index 454ff71..fdc6900 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -224,12 +224,13 @@ module.exports = { solidity: { compilers: [ { - version: "0.8.23", + version: "0.8.25", settings: { optimizer: { enabled: true, runs: 1000000, }, + evmVersion: "cancun" }, } ] diff --git a/package.json b/package.json index 22d9ab3..73561c9 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@nomicfoundation/hardhat-ethers": "^3.0.5", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.7", - "hardhat": "^2.22.3", + "hardhat": "^2.22.4", "@typechain/hardhat": "^9.1.0", "ethers": "^5.7.2", "@typechain/ethers-v5": "^11.1.2", diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index 0657487..8614764 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -325,9 +325,9 @@ describe("Voting Escrow OLAS", function () { // Make sure the initial weight is zero let weight = await vw.nomineeRelativeWeight(nominee, chainId, block.timestamp); - expect(weight.weight).to.equal(0); + expect(weight.relativeWeight).to.equal(0); weight = await vw.nomineeRelativeWeight(nominee, chainId, nextTime); - expect(weight.weight).to.equal(0); + expect(weight.relativeWeight).to.equal(0); // Vote for the nominee await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight / 2); @@ -340,7 +340,7 @@ describe("Voting Escrow OLAS", function () { // Make sure the initial weight is zero weight = await vw.nomineeRelativeWeight(nominee2, chainId, nextTime); - expect(weight.weight).to.equal(0); + expect(weight.relativeWeight).to.equal(0); // Vote for another nominee await vw.voteForNomineeWeights(nominee2, chainId, maxVoteWeight / 2); @@ -355,13 +355,13 @@ describe("Voting Escrow OLAS", function () { // Check relative weights that must represent a half for each weight = await vw.nomineeRelativeWeight(nominee, chainId, nextTime); - expect(Number(weight.weight) / E18).to.equal(0.5); + expect(Number(weight.relativeWeight) / E18).to.equal(0.5); weight = await vw.nomineeRelativeWeight(nominee2, chainId, nextTime); - expect(Number(weight.weight) / E18).to.equal(0.5); + expect(Number(weight.relativeWeight) / E18).to.equal(0.5); // Write nominee weight and try to get one from the distant future weight = await vw.callStatic.nomineeRelativeWeightWrite(nominee, chainId, nextTime * 2); - expect(weight.weight).to.equal(0); + expect(weight.relativeWeight).to.equal(0); // Checkpoint and checkpoint nominee await vw.checkpoint(); @@ -402,7 +402,7 @@ describe("Voting Escrow OLAS", function () { // Check relative weights that must represent a half for each const weight = await vw.nomineeRelativeWeight(nominee, chainId, nextTime); - expect(Number(weight.weight) / E18).to.equal(1); + expect(Number(weight.relativeWeight) / E18).to.equal(1); // Restore to the state of the snapshot await snapshot.restore(); @@ -434,7 +434,7 @@ describe("Voting Escrow OLAS", function () { // Check weights that must represent a half for each for (let i = 0; i < numNominees; i++) { const weight = await vw.nomineeRelativeWeight(nominees[i], chainIds[i], nextTime); - expect(Number(weight.weight) / E18).to.equal(0.5); + expect(Number(weight.relativeWeight) / E18).to.equal(0.5); } }); @@ -466,7 +466,7 @@ describe("Voting Escrow OLAS", function () { // Check relative weights that must represent a half for each const weight = await vw.nomineeRelativeWeight(nominee, chainId, nextTime); - expect(Number(weight.weight) / E18).to.equal(1); + expect(Number(weight.relativeWeight) / E18).to.equal(1); // Restore to the state of the snapshot await snapshot.restore(); @@ -519,7 +519,7 @@ describe("Voting Escrow OLAS", function () { await vw.nomineeRelativeWeight(nominees[1], chainId, nextTime) ]; // nominees[0] weight: 666666666680682666, nominees[1] weight: 333333333319317333; the ratio is 2:1 - expect(Number(weights[0].weight) / E18).to.be.greaterThan(Number(weights[1].weight) / E18); + expect(Number(weights[0].relativeWeight) / E18).to.be.greaterThan(Number(weights[1].relativeWeight) / E18); // Restore to the state of the snapshot await snapshot.restore(); diff --git a/yarn.lock b/yarn.lock index f839951..de335ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -666,53 +666,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.5.tgz#3c428000ec27501617a00f7c447054a272f99177" - integrity sha512-gIXUIiPMUy6roLHpNlxf15DumU7/YhffUf7XIB+WUjMecaySfTGyZsTGnCMJZqrDyiYqWPyPKwCV/2u/jqFAUg== - -"@nomicfoundation/edr-darwin-x64@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.5.tgz#fee26c4a83c9fc534bc0a719e88382fafeed69fe" - integrity sha512-0MrpOCXUK8gmplpYZ2Cy0holHEylvWoNeecFcrP2WJ5DLQzrB23U5JU2MvUzOJ7aL76Za1VXNBWi/UeTWdHM+w== - -"@nomicfoundation/edr-linux-arm64-gnu@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.5.tgz#c48ad44b578abb50706cd8cad607a65b1289689f" - integrity sha512-aw9f7AZMiY1dZFNePJGKho2k+nEgFgzUAyyukiKfSqUIMXoFXMf1U3Ujv848czrSq9c5XGcdDa2xnEf3daU3xg== - -"@nomicfoundation/edr-linux-arm64-musl@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.5.tgz#7cc1b12e2adf872e5a542647182262cc4582f8d9" - integrity sha512-cVFRQjyABBlsbDj+XTczYBfrCHprZ6YNzN8gGGSqAh+UGIJkAIRomK6ar27GyJLNx3HkgbuDoi/9kA0zOo/95w== - -"@nomicfoundation/edr-linux-x64-gnu@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.5.tgz#ae4366c6fad03ea6ec3e2f2bafe397661c11f054" - integrity sha512-CjOg85DfR1Vt0fQWn5U0qi26DATK9tVzo3YOZEyI0JBsnqvk43fUTPv3uUAWBrPIRg5O5kOc9xG13hSpCBBxBg== - -"@nomicfoundation/edr-linux-x64-musl@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.5.tgz#4071929fcece90f95c271f6ba455c55f35750efd" - integrity sha512-hvX8bBGpBydAVevzK8jsu2FlqVZK1RrCyTX6wGHnltgMuBaoGLHYtNHiFpteOaJw2byYMiORc2bvj+98LhJ0Ew== - -"@nomicfoundation/edr-win32-x64-msvc@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.5.tgz#6e6684e56f336c67fbda9bf75b21d7ac586631b8" - integrity sha512-IJXjW13DY5UPsx/eG5DGfXtJ7Ydwrvw/BTZ2Y93lRLHzszVpSmeVmlxjZP5IW2afTSgMLaAAsqNw4NhppRGN8A== - -"@nomicfoundation/edr@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.5.tgz#04f980386f871e1c3bbc180b290d37af0336c81d" - integrity sha512-dPSM9DuI1sr71gqWUMgLo8MjHQWO4+WNDm3iWaT6P4vUFJReZX5qwA5X+3UwIPBry8GvNY084u7yWUvB3/8rqA== - optionalDependencies: - "@nomicfoundation/edr-darwin-arm64" "0.3.5" - "@nomicfoundation/edr-darwin-x64" "0.3.5" - "@nomicfoundation/edr-linux-arm64-gnu" "0.3.5" - "@nomicfoundation/edr-linux-arm64-musl" "0.3.5" - "@nomicfoundation/edr-linux-x64-gnu" "0.3.5" - "@nomicfoundation/edr-linux-x64-musl" "0.3.5" - "@nomicfoundation/edr-win32-x64-msvc" "0.3.5" +"@nomicfoundation/edr-darwin-arm64@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.8.tgz#09de1f03c0336670fce959f376f0fe9137545836" + integrity sha512-eB0leCexS8sQEmfyD72cdvLj9djkBzQGP4wSQw6SNf2I4Sw4Cnzb3d45caG2FqFFjbvfqL0t+badUUIceqQuMw== + +"@nomicfoundation/edr-darwin-x64@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.8.tgz#c3ca237c74ed3b6fb800fd7f1de7174f4ad24f72" + integrity sha512-JksVCS1N5ClwVF14EvO25HCQ+Laljh/KRfHERMVAC9ZwPbTuAd/9BtKvToCBi29uCHWqsXMI4lxCApYQv2nznw== + +"@nomicfoundation/edr-linux-arm64-gnu@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.8.tgz#08bd367789e745f4e78a8a87368fc470eea8a7de" + integrity sha512-raCE+fOeNXhVBLUo87cgsHSGvYYRB6arih4eG6B9KGACWK5Veebtm9xtKeiD8YCsdUlUfat6F7ibpeNm91fpsA== + +"@nomicfoundation/edr-linux-arm64-musl@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.8.tgz#9cab5cbec0052cb5812c6c66c463d28a756cd916" + integrity sha512-PwiDp4wBZWMCIy29eKkv8moTKRrpiSDlrc+GQMSZLhOAm8T33JKKXPwD/2EbplbhCygJDGXZdtEKl9x9PaH66A== + +"@nomicfoundation/edr-linux-x64-gnu@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.8.tgz#d4a11b6ebcd1b29d7431d185c6df3e65a2cd4bde" + integrity sha512-6AcvA/XKoipGap5jJmQ9Y6yT7Uf39D9lu2hBcDCXnXbMcXaDGw4mn1/L4R63D+9VGZyu1PqlcJixCUZlGGIWlg== + +"@nomicfoundation/edr-linux-x64-musl@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.8.tgz#b8eef960d06380a365866ddd1e97ecb7fbf6bd70" + integrity sha512-cxb0sEmZjlwhYWO28sPsV64VDx31ekskhC1IsDXU1p9ntjHSJRmW4KEIqJ2O3QwJap/kLKfMS6TckvY10gjc6w== + +"@nomicfoundation/edr-win32-x64-msvc@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.8.tgz#ac7061aeb07cc847c429513080b76bb05297a869" + integrity sha512-yVuVPqRRNLZk7TbBMkKw7lzCvI8XO8fNTPTYxymGadjr9rEGRuNTU1yBXjfJ59I1jJU/X2TSkRk1OFX0P5tpZQ== + +"@nomicfoundation/edr@^0.3.7": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.8.tgz#28fe7ae4f462ae74a16cd1a714ff7b1cd9c22b4c" + integrity sha512-u2UJ5QpznSHVkZRh6ePWoeVb6kmPrrqh08gCnZ9FHlJV9CITqlrTQHJkacd+INH31jx88pTAJnxePE4XAiH5qg== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.3.8" + "@nomicfoundation/edr-darwin-x64" "0.3.8" + "@nomicfoundation/edr-linux-arm64-gnu" "0.3.8" + "@nomicfoundation/edr-linux-arm64-musl" "0.3.8" + "@nomicfoundation/edr-linux-x64-gnu" "0.3.8" + "@nomicfoundation/edr-linux-x64-musl" "0.3.8" + "@nomicfoundation/edr-win32-x64-msvc" "0.3.8" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -3165,14 +3165,14 @@ hardhat-tracer@^2.8.1: debug "^4.3.4" ethers "^5.6.1" -hardhat@^2.22.3: - version "2.22.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.3.tgz#50605daca6b29862397e446c42ec14c89430bec3" - integrity sha512-k8JV2ECWNchD6ahkg2BR5wKVxY0OiKot7fuxiIpRK0frRqyOljcR2vKwgWSLw6YIeDcNNA4xybj7Og7NSxr2hA== +hardhat@^2.22.4: + version "2.22.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.4.tgz#766227b6cefca5dbf4fd15ab5b5a68138fa13baf" + integrity sha512-09qcXJFBHQUaraJkYNr7XlmwjOj27xBB0SL2rYS024hTj9tPMbp26AFjlf5quBMO9SR4AJFg+4qWahcYcvXBuQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.3.5" + "@nomicfoundation/edr" "^0.3.7" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4"