diff --git a/.github/workflows/workflow.yaml b/.github/workflows/workflow.yaml index 91851ac..bad87a9 100644 --- a/.github/workflows/workflow.yaml +++ b/.github/workflows/workflow.yaml @@ -1,4 +1,9 @@ name: Workflow + +concurrency: + cancel-in-progress: true + group: ${{github.workflow}}-${{github.ref}} + on: push: branches: diff --git a/.solcover.js b/.solcover.js index 706e13d..4e7bed3 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,10 +1,16 @@ module.exports = { skipFiles: ["bridges/test/FxChildTunnel.sol", "bridges/test/ChildMockERC20.sol", - "bridges/test/MockTimelock.sol", + "bridges/test/FxRootMock.sol", "bridges/test/HomeMediatorTest.sol", "bridges/test/MockAMBMediator.sol", + "bridges/test/MockL2Relayer.sol", + "bridges/test/MockTimelock.sol", + "bridges/test/WormholeL1Receiver.sol", + "bridges/test/WormholeL1Sender.sol", + "bridges/test/WormholeL2ReceiverL1Sender.sol", "test/BridgeSetup.sol", + "test/BrokenERC20.sol", "test/SafeSetup.sol", "multisigs/test/MockTimelockCM.sol", "multisigs/test/MockTreasury.sol", diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json new file mode 100644 index 0000000..7b8f6b3 --- /dev/null +++ b/abis/0.8.23/VoteWeighting.json @@ -0,0 +1,1086 @@ +{ + "_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/audits/internal11/fuzzing/README.md b/audits/internal11/fuzzing/README.md new file mode 100644 index 0000000..ab2fee2 --- /dev/null +++ b/audits/internal11/fuzzing/README.md @@ -0,0 +1,18 @@ +# Fuzzing VoteWeighting + +## Prepare contracts for fuzzing +contracts/test/VoteWeightingFuzzing.sol
+contracts/test/EchidnaVoteWeightingAssert.sol
+ +## Fuzzing +```sh +# Move the script to the root of the project +cp start_echidna.sh ../../../ +# Move config file to the root of the project +cp echidna_assert.yaml ../../../ +cd ../../../ +# Run +./start_echidna.sh +``` +result overflow: [fuzzing-overflow.PNG](fuzzing-overflow.PNG)
+result assert: [fuzzing-assert.PNG](fuzzing-assert.PNG) diff --git a/audits/internal11/fuzzing/corpusEchidna/covered.1713373564.html b/audits/internal11/fuzzing/corpusEchidna/covered.1713373564.html new file mode 100644 index 0000000..7699c00 --- /dev/null +++ b/audits/internal11/fuzzing/corpusEchidna/covered.1713373564.html @@ -0,0 +1,2072 @@ +/home/andrey/valory/autonolas-governance/contracts/OLAS.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | import "../lib/solmate/src/tokens/ERC20.sol"; + 5 | | + 6 | | /// @dev Only `manager` has a privilege, but the `sender` was provided. + 7 | | /// @param sender Sender address. + 8 | | /// @param manager Required sender address as a manager. + 9 | | error ManagerOnly(address sender, address manager); + 10 | | + 11 | | /// @dev Provided zero address. + 12 | | error ZeroAddress(); + 13 | | + 14 | | /// @title OLAS - Smart contract for the OLAS token. + 15 | | /// @author AL + 16 | | /// @author Aleksandr Kuperman - <aleksandr.kuperman@valory.xyz> + 17 | * | contract OLAS is ERC20 { + 18 | | event MinterUpdated(address indexed minter); + 19 | | event OwnerUpdated(address indexed owner); + 20 | | + 21 | | // One year interval + 22 | | uint256 public constant oneYear = 1 days * 365; + 23 | | // Total supply cap for the first ten years (one billion OLAS tokens) + 24 | | uint256 public constant tenYearSupplyCap = 1_000_000_000e18; + 25 | | // Maximum annual inflation after first ten years + 26 | | uint256 public constant maxMintCapFraction = 2; + 27 | | // Initial timestamp of the token deployment + 28 | | uint256 public immutable timeLaunch; + 29 | | + 30 | | // Owner address + 31 | | address public owner; + 32 | | // Minter address + 33 | | address public minter; + 34 | | + 35 | | constructor() ERC20("Autonolas", "OLAS", 18) { + 36 | | owner = msg.sender; + 37 | | minter = msg.sender; + 38 | | timeLaunch = block.timestamp; + 39 | | } + 40 | | + 41 | | /// @dev Changes the owner address. + 42 | | /// @param newOwner Address of a new owner. + 43 | | function changeOwner(address newOwner) external { + 44 | | if (msg.sender != owner) { + 45 | | revert ManagerOnly(msg.sender, owner); + 46 | | } + 47 | | + 48 | | if (newOwner == address(0)) { + 49 | | revert ZeroAddress(); + 50 | | } + 51 | | + 52 | | owner = newOwner; + 53 | | emit OwnerUpdated(newOwner); + 54 | | } + 55 | | + 56 | | /// @dev Changes the minter address. + 57 | | /// @param newMinter Address of a new minter. + 58 | | function changeMinter(address newMinter) external { + 59 | | if (msg.sender != owner) { + 60 | | revert ManagerOnly(msg.sender, owner); + 61 | | } + 62 | | + 63 | | if (newMinter == address(0)) { + 64 | | revert ZeroAddress(); + 65 | | } + 66 | | + 67 | | minter = newMinter; + 68 | | emit MinterUpdated(newMinter); + 69 | | } + 70 | | + 71 | | /// @dev Mints OLAS tokens. + 72 | | /// @notice If the inflation control does not pass, the revert does not take place, as well as no action is performed. + 73 | | /// @param account Account address. + 74 | | /// @param amount OLAS token amount. + 75 | | function mint(address account, uint256 amount) external { + 76 | | // Access control + 77 | | if (msg.sender != minter) { + 78 | | revert ManagerOnly(msg.sender, minter); + 79 | | } + 80 | | + 81 | | // Check the inflation schedule and mint + 82 | | if (inflationControl(amount)) { + 83 | | _mint(account, amount); + 84 | | } + 85 | | } + 86 | | + 87 | | /// @dev Provides various checks for the inflation control. + 88 | | /// @notice The `<=` check is left as is for a better code readability. + 89 | | /// @param amount Amount of OLAS to mint. + 90 | | /// @return True if the amount request is within inflation boundaries. + 91 | | function inflationControl(uint256 amount) public view returns (bool) { + 92 | | uint256 remainder = inflationRemainder(); + 93 | | return (amount <= remainder); + 94 | | } + 95 | | + 96 | | /// @dev Gets the reminder of OLAS possible for the mint. + 97 | | /// @return remainder OLAS token remainder. + 98 | | function inflationRemainder() public view returns (uint256 remainder) { + 99 | | uint256 _totalSupply = totalSupply; + 100 | | // Current year + 101 | | uint256 numYears = (block.timestamp - timeLaunch) / oneYear; + 102 | | // Calculate maximum mint amount to date + 103 | | uint256 supplyCap = tenYearSupplyCap; + 104 | | // After 10 years, adjust supplyCap according to the yearly inflation % set in maxMintCapFraction + 105 | | if (numYears > 9) { + 106 | | // Number of years after ten years have passed (including ongoing ones) + 107 | | numYears -= 9; + 108 | | for (uint256 i = 0; i < numYears; ++i) { + 109 | | supplyCap += (supplyCap * maxMintCapFraction) / 100; + 110 | | } + 111 | | } + 112 | | // Check for the requested mint overflow + 113 | | remainder = supplyCap - _totalSupply; + 114 | | } + 115 | | + 116 | | /// @dev Burns OLAS tokens. + 117 | | /// @param amount OLAS token amount to burn. + 118 | | function burn(uint256 amount) external { + 119 | | _burn(msg.sender, amount); + 120 | | } + 121 | | + 122 | | /// @dev Decreases the allowance of another account over their tokens. + 123 | | /// @notice This implementation does not decrease spender allowance if the maximum allowance was granted. + 124 | | /// @notice The underflow condition is treated by the default code generation check. + 125 | | /// @param spender Account that tokens are approved for. + 126 | | /// @param amount Amount to decrease approval by. + 127 | | /// @return True if the operation succeeded. + 128 | | function decreaseAllowance(address spender, uint256 amount) external returns (bool) { + 129 | | uint256 spenderAllowance = allowance[msg.sender][spender]; + 130 | | + 131 | | if (spenderAllowance != type(uint256).max) { + 132 | | spenderAllowance -= amount; + 133 | | allowance[msg.sender][spender] = spenderAllowance; + 134 | | emit Approval(msg.sender, spender, spenderAllowance); + 135 | | } + 136 | | + 137 | | return true; + 138 | | } + 139 | | + 140 | | /// @dev Increases the allowance of another account over their tokens. + 141 | | /// @notice The overflow condition is treated by the default code generation check. + 142 | | /// @param spender Account that tokens are approved for. + 143 | | /// @param amount Amount to increase approval by. + 144 | | /// @return True if the operation succeeded. + 145 | | function increaseAllowance(address spender, uint256 amount) external returns (bool) { + 146 | | uint256 spenderAllowance = allowance[msg.sender][spender]; + 147 | | + 148 | | spenderAllowance += amount; + 149 | | allowance[msg.sender][spender] = spenderAllowance; + 150 | | emit Approval(msg.sender, spender, spenderAllowance); + 151 | | + 152 | | return true; + 153 | | } + 154 | | } + 155 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/interfaces/IErrors.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | /// @dev Errors. + 5 | | interface IErrors { + 6 | | /// @dev Only `owner` has a privilege, but the `sender` was provided. + 7 | | /// @param sender Sender address. + 8 | | /// @param owner Required sender address as an owner. + 9 | | error OwnerOnly(address sender, address owner); + 10 | | + 11 | | /// @dev Provided zero address. + 12 | | error ZeroAddress(); + 13 | | + 14 | | /// @dev Zero value when it has to be different from zero. + 15 | | error ZeroValue(); + 16 | | + 17 | | /// @dev Non-zero value when it has to be zero. + 18 | | error NonZeroValue(); + 19 | | + 20 | | /// @dev Wrong length of two arrays. + 21 | | /// @param numValues1 Number of values in a first array. + 22 | | /// @param numValues2 Numberf of values in a second array. + 23 | | error WrongArrayLength(uint256 numValues1, uint256 numValues2); + 24 | | + 25 | | /// @dev Value overflow. + 26 | | /// @param provided Overflow value. + 27 | | /// @param max Maximum possible value. + 28 | | error Overflow(uint256 provided, uint256 max); + 29 | | + 30 | | /// @dev Token is non-transferable. + 31 | | /// @param account Token address. + 32 | | error NonTransferable(address account); + 33 | | + 34 | | /// @dev Token is non-delegatable. + 35 | | /// @param account Token address. + 36 | | error NonDelegatable(address account); + 37 | | + 38 | | /// @dev Insufficient token allowance. + 39 | | /// @param provided Provided amount. + 40 | | /// @param expected Minimum expected amount. + 41 | | error InsufficientAllowance(uint256 provided, uint256 expected); + 42 | | + 43 | | /// @dev No existing lock value is found. + 44 | | /// @param account Address that is checked for the locked value. + 45 | | error NoValueLocked(address account); + 46 | | + 47 | | /// @dev Locked value is not zero. + 48 | | /// @param account Address that is checked for the locked value. + 49 | | /// @param amount Locked amount. + 50 | | error LockedValueNotZero(address account, uint256 amount); + 51 | | + 52 | | /// @dev Value lock is expired. + 53 | | /// @param account Address that is checked for the locked value. + 54 | | /// @param deadline The lock expiration deadline. + 55 | | /// @param curTime Current timestamp. + 56 | | error LockExpired(address account, uint256 deadline, uint256 curTime); + 57 | | + 58 | | /// @dev Value lock is not expired. + 59 | | /// @param account Address that is checked for the locked value. + 60 | | /// @param deadline The lock expiration deadline. + 61 | | /// @param curTime Current timestamp. + 62 | | error LockNotExpired(address account, uint256 deadline, uint256 curTime); + 63 | | + 64 | | /// @dev Provided unlock time is incorrect. + 65 | | /// @param account Address that is checked for the locked value. + 66 | | /// @param minUnlockTime Minimal unlock time that can be set. + 67 | | /// @param providedUnlockTime Provided unlock time. + 68 | | error UnlockTimeIncorrect(address account, uint256 minUnlockTime, uint256 providedUnlockTime); + 69 | | + 70 | | /// @dev Provided unlock time is bigger than the maximum allowed. + 71 | | /// @param account Address that is checked for the locked value. + 72 | | /// @param maxUnlockTime Max unlock time that can be set. + 73 | | /// @param providedUnlockTime Provided unlock time. + 74 | | error MaxUnlockTimeReached(address account, uint256 maxUnlockTime, uint256 providedUnlockTime); + 75 | | + 76 | | /// @dev Provided block number is incorrect (has not been processed yet). + 77 | | /// @param providedBlockNumber Provided block number. + 78 | | /// @param actualBlockNumber Actual block number. + 79 | | error WrongBlockNumber(uint256 providedBlockNumber, uint256 actualBlockNumber); + 80 | | } + 81 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/test/EchidnaVoteWeightingAssert.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.23; + 3 | | + 4 | | import "../OLAS.sol"; + 5 | | import "../veOLAS.sol"; + 6 | | import "./VoteWeightingFuzzing.sol"; + 7 | | + 8 | | + 9 | *r | contract EchidnaVoteWeightingAssert { + 10 | | OLAS olas; + 11 | | veOLAS ve; + 12 | | VoteWeightingFuzzing vw; + 13 | | uint160 constant FAKE_OLAS = 7; + 14 | | + 15 | | uint256 constant oneOLASBalance = 1 ether; + 16 | * | uint256 constant fourYear = 4 * 365 * 86400; + 17 | | uint256 constant oneYear = 1 * 365 * 86400; + 18 | * | uint256 constant maxVoteWeight = 10000; + 19 | | uint64 constant WEEK = 1 weeks; + 20 | * | uint256 constant oneOLAS = 1 ether; + 21 | | uint256 constant oneMLN = 1_000_000; + 22 | | uint256 ts; + 23 | | + 24 | | // msg.sender in Echidna + 25 | | address[3] private senders = [ address(0x10000), address(0x20000), address(0x30000) ]; + 26 | | + 27 | | constructor() payable { + 28 | | olas = new OLAS(); + 29 | | address aolas = address(olas); + 30 | | ve = new veOLAS(aolas, "Voting Escrow OLAS", "veOLAS"); + 31 | | address ave = address(ve); + 32 | | vw = new VoteWeightingFuzzing(ave); + 33 | | olas.mint(address(this),oneOLAS*oneMLN); + 34 | | } + 35 | | + 36 | | // voteForNomineeWeights_assert(0xdeadbeef,1,0,4495678220902361,1124857) + 37 | * | function voteForNomineeWeights_assert(address nominee, uint32 chainId, uint16 weight, uint256 amount, uint32 unlockTime) external { + 38 | * | require(block.timestamp > 0); + 39 | *r | require(block.timestamp > ts); + 40 | *r | require(unlockTime < fourYear); + 41 | *r | require(weight < maxVoteWeight); + 42 | *r | require(amount < 100 * oneOLAS); + 43 | * | uint256 balanceOf = olas.balanceOf(address(this)); + 44 | * | assert(balanceOf > amount); + 45 | * | (uint128 initialAmount,) = ve.mapLockedBalances(address(this)); + 46 | * | if (initialAmount == 0) { + 47 | * | olas.approve(address(ve), amount); + 48 | *r | ve.createLock(amount, unlockTime); + 49 | * | (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + 50 | * | assert(lockedAmount > 0); + 51 | * | } else { + 52 | * | (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + 53 | * | assert(lockedAmount > 0); + 54 | | } + 55 | *r | vw.addNominee(nominee, chainId); + 56 | * | uint256 id = vw.getNomineeId(nominee, chainId); + 57 | * | uint256 num = vw.getNumNominees(); + 58 | * | assert(id > 0); + 59 | * | assert(num > 0); + 60 | * | vw.setCallVoteForNomineeWeights(false); + 61 | * | bool beforeAfterCall = vw.callVoteForNomineeWeights(); + 62 | * | assert(beforeAfterCall == false); + 63 | *r | vw.voteForNomineeWeights(nominee, chainId, weight); + 64 | * | bool stateAfterCall = vw.callVoteForNomineeWeights(); + 65 | * | if(stateAfterCall == true) { + 66 | * | uint256 lts = vw.getlastUserVote(nominee,chainId); + 67 | * | assert(lts > 0); + 68 | | } + 69 | * | ts = block.timestamp; // next timestamp > timestamp + 70 | * | vw.checkpointNominee(nominee, chainId); + 71 | | } + 72 | | + 73 | | } + 74 | | + 75 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.23; + 3 | | + 4 | | import "../interfaces/IErrors.sol"; + 5 | | + 6 | | interface IVEOLAS { + 7 | | // Structure for voting escrow points + 8 | | // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + 9 | | struct PointVoting { + 10 | | // w(i) = at + b (bias) + 11 | | int128 bias; + 12 | | // dw / dt = a (slope) + 13 | | int128 slope; + 14 | | // Timestamp. It will never practically be bigger than 2^64 - 1 + 15 | | uint64 ts; + 16 | | // Block number. It will not be bigger than the timestamp + 17 | | uint64 blockNumber; + 18 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 19 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 20 | | uint128 balance; + 21 | | } + 22 | | + 23 | | /// @dev Gets the `account`'s lock end time. + 24 | | /// @param account Account address. + 25 | | /// @return unlockTime Lock end time. + 26 | | function lockedEnd(address account) external view returns (uint256 unlockTime); + 27 | | + 28 | | /// @dev Gets the most recently recorded user point for `account`. + 29 | | /// @param account Account address. + 30 | | /// @return pv Last checkpoint. + 31 | | function getLastUserPoint(address account) external view returns (PointVoting memory pv); + 32 | | } + 33 | | + 34 | | error NomineeDoesNotExist(address nominee, uint256 chainId); + 35 | | error NomineeAlreadyExists(address nominee, uint256 chainId); + 36 | | error VoteTooOften(address voter, uint256 curTime, uint256 nextAllowedVotingTime); + 37 | | + 38 | | struct Point { + 39 | | uint256 bias; + 40 | | uint256 slope; + 41 | | } + 42 | | + 43 | | struct VotedSlope { + 44 | | uint256 slope; + 45 | | uint256 power; + 46 | | uint256 end; + 47 | | } + 48 | | + 49 | * | contract VoteWeightingFuzzing is IErrors { + 50 | | event NewNomineeWeight(address indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); + 51 | | event VoteForNominee(address indexed user, address indexed nominee, uint256 chainId, uint256 weight); + 52 | | event NewNominee(address nominee, uint256 chainId); + 53 | | + 54 | | // 7 * 86400 seconds - all future times are rounded by week + 55 | * | uint256 public constant WEEK = 604_800; + 56 | | // Cannot change weight votes more often than once in 10 days + 57 | * | uint256 public constant WEIGHT_VOTE_DELAY = 864_000; + 58 | | // Max weight amount + 59 | * | uint256 public constant MAX_WEIGHT = 10_000; + 60 | | // Maximum chain Id as per EVM specs + 61 | * | uint256 public constant MAX_CHAIN_ID = type(uint64).max / 2 - 36; + 62 | | // veOLAS contract address + 63 | | address public immutable ve; + 64 | | + 65 | * | bool public callVoteForNomineeWeights = false; + 66 | | + 67 | | // TODO: Convert both to cyclic map? + 68 | | // Set of (chainId | nominee) + 69 | | uint256[] public setNominees; + 70 | | // Mapping of (chainId | nominee) => nominee Id + 71 | | mapping(uint256 => uint256) public mapNomineeIds; + 72 | | + 73 | | // user -> (chainId | nominee) -> VotedSlope + 74 | | mapping(address => mapping(uint256 => VotedSlope)) public voteUserSlopes; + 75 | | // Total vote power used by user + 76 | | mapping(address => uint256) public voteUserPower; + 77 | | // Last user vote's timestamp for each (chainId | nominee) + 78 | | mapping(address => mapping(uint256 => uint256)) public lastUserVote; + 79 | | + 80 | | // Past and scheduled points for nominee weight, sum of weights per type, total weight + 81 | | // Point is for bias+slope + 82 | | // changes_* are for changes in slope + 83 | | // time_* are for the last change timestamp + 84 | | // timestamps are rounded to whole weeks + 85 | | + 86 | | // (chainId | nominee) -> time -> Point + 87 | | mapping(uint256 => mapping(uint256 => Point)) public pointsWeight; + 88 | | // (chainId | nominee) -> time -> slope + 89 | | mapping(uint256 => mapping(uint256 => uint256)) public changesWeight; + 90 | | // (chainId | nominee) -> last scheduled time (next week) + 91 | | mapping(uint256 => uint256) public timeWeight; + 92 | | + 93 | | // time -> Point + 94 | | mapping(uint256 => Point) public pointsSum; + 95 | | // time -> slope + 96 | | mapping(uint256 => uint256) public changesSum; + 97 | | // last scheduled time (next week) + 98 | | uint256 public timeSum; + 99 | | + 100 | | /// @dev Contract constructor. + 101 | | /// @param _ve `VotingEscrow` contract address. + 102 | | constructor(address _ve) { + 103 | | // Check for the zero address + 104 | | if (_ve == address(0)) { + 105 | | revert ZeroAddress(); + 106 | | } + 107 | | + 108 | | // Set initial parameters + 109 | | ve = _ve; + 110 | | timeSum = block.timestamp / WEEK * WEEK; + 111 | | setNominees.push(0); + 112 | | } + 113 | | + 114 | | /// @dev Fill sum of nominee weights for the same type week-over-week for missed checkins and return the sum for the future week. + 115 | | /// @return Sum of weights. + 116 | * | function _getSum() internal returns (uint256) { + 117 | | // t is always > 0 as it is set in the constructor + 118 | * | uint256 t = timeSum; + 119 | * | Point memory pt = pointsSum[t]; + 120 | * | for (uint256 i = 0; i < 500; i++) { + 121 | * | if (t > block.timestamp) { + 122 | * | break; + 123 | | } + 124 | * | t += WEEK; + 125 | * | uint256 dBias = pt.slope * WEEK; + 126 | * | if (pt.bias > dBias) { + 127 | * | pt.bias -= dBias; + 128 | * | uint256 dSlope = changesSum[t]; + 129 | * | pt.slope -= dSlope; + 130 | | } else { + 131 | * | pt.bias = 0; + 132 | * | pt.slope = 0; + 133 | | } + 134 | | + 135 | * | pointsSum[t] = pt; + 136 | * | if (t > block.timestamp) { + 137 | * | timeSum = t; + 138 | | } + 139 | | } + 140 | * | return pt.bias; + 141 | | } + 142 | | + 143 | | /// @dev Fill historic nominee weights week-over-week for missed checkins and return the total for the future week. + 144 | | /// @param nominee Address of the nominee. + 145 | | /// @param chainId Chain Id. + 146 | | /// @return Nominee weight. + 147 | * | function _getWeight(address nominee, uint256 chainId) internal returns (uint256) { + 148 | | // Push a pair of key defining variables into one key + 149 | | // Nominee address and chain Id + 150 | | // nominee occupies first 160 bits + 151 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 152 | | // chain Id occupies no more than next 64 bits + 153 | * | nomineeChainId |= chainId << 160; + 154 | | + 155 | | // Check that the nominee exists + 156 | * | if (mapNomineeIds[nomineeChainId] == 0) { + 157 | | revert NomineeDoesNotExist(nominee, chainId); + 158 | | } + 159 | | + 160 | | // t is always > 0 as it is set during the addNominee() call + 161 | * | uint256 t = timeWeight[nomineeChainId]; + 162 | * | Point memory pt = pointsWeight[nomineeChainId][t]; + 163 | * | for (uint256 i = 0; i < 500; i++) { + 164 | * | if (t > block.timestamp) { + 165 | * | break; + 166 | | } + 167 | | t += WEEK; + 168 | | uint256 dBias = pt.slope * WEEK; + 169 | | if (pt.bias > dBias) { + 170 | | pt.bias -= dBias; + 171 | | uint256 dSlope = changesWeight[nomineeChainId][t]; + 172 | | pt.slope -= dSlope; + 173 | | } else { + 174 | | pt.bias = 0; + 175 | | pt.slope = 0; + 176 | | } + 177 | | + 178 | | pointsWeight[nomineeChainId][t] = pt; + 179 | | if (t > block.timestamp) { + 180 | | timeWeight[nomineeChainId] = t; + 181 | | } + 182 | | } + 183 | * | return pt.bias; + 184 | | } + 185 | | + 186 | | /// @dev Add nominee address along with the chain Id. + 187 | | /// @param nominee Address of the nominee. + 188 | | /// @param chainId Chain Id. + 189 | * | function addNominee(address nominee, uint256 chainId) external { + 190 | | // Check for the zero address + 191 | * | if (nominee == address(0)) { + 192 | * | revert ZeroAddress(); + 193 | | } + 194 | | + 195 | | // Check for the chain Id + 196 | * | if (chainId == 0) { + 197 | * | revert ZeroValue(); + 198 | | } + 199 | * | else if (chainId > MAX_CHAIN_ID) { + 200 | | revert Overflow(chainId, MAX_CHAIN_ID); + 201 | | } + 202 | | + 203 | | // Push a pair of key defining variables into one key + 204 | | // nominee occupies first 160 bits + 205 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 206 | | // chain Id occupies no more than next 64 bits + 207 | * | nomineeChainId |= chainId << 160; + 208 | | + 209 | | // Check for the nominee existence + 210 | * | if (mapNomineeIds[nomineeChainId] > 0) { + 211 | | revert NomineeAlreadyExists(nominee, chainId); + 212 | | } + 213 | * | mapNomineeIds[nomineeChainId] = setNominees.length; + 214 | | // Push the nominee into the list + 215 | * | setNominees.push(nomineeChainId); + 216 | | + 217 | * | uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + 218 | * | timeWeight[nomineeChainId] = nextTime; + 219 | | + 220 | * | emit NewNominee(nominee, chainId); + 221 | | } + 222 | | + 223 | | /// @dev Checkpoint to fill data common for all nominees. + 224 | | function checkpoint() external { + 225 | | _getSum(); + 226 | | } + 227 | | + 228 | | /// @dev Checkpoint to fill data for both a specific nominee and common for all nominees. + 229 | | /// @param nominee Address of the nominee. + 230 | | /// @param chainId Chain Id. + 231 | * | function checkpointNominee(address nominee, uint256 chainId) external { + 232 | * | _getWeight(nominee, chainId); + 233 | * | _getSum(); + 234 | | } + 235 | | + 236 | | /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights. + 237 | | /// Inflation which will be received by it is inflation_rate * relativeWeight / 1e18. + 238 | | /// @param nominee Address of the nominee. + 239 | | /// @param chainId Chain Id. + 240 | | /// @param time Relative weight at the specified timestamp in the past or present. + 241 | | /// @return weight Value of relative weight normalized to 1e18. + 242 | | /// @return totalSum Sum of nominee weights. + 243 | | function _nomineeRelativeWeight( + 244 | | address nominee, + 245 | | uint256 chainId, + 246 | | uint256 time + 247 | | ) internal view returns (uint256 weight, uint256 totalSum) { + 248 | | uint256 t = time / WEEK * WEEK; + 249 | | totalSum = pointsSum[t].bias; + 250 | | + 251 | | // Push a pair of key defining variables into one key + 252 | | // nominee occupies first 160 bits + 253 | | uint256 nomineeChainId = uint256(uint160(nominee)); + 254 | | // chain Id occupies no more than next 64 bits + 255 | | nomineeChainId |= chainId << 160; + 256 | | + 257 | | if (totalSum > 0) { + 258 | | uint256 nomineeWeight = pointsWeight[nomineeChainId][t].bias; + 259 | | weight = 1e18 * nomineeWeight / totalSum; + 260 | | } + 261 | | } + 262 | | + 263 | | /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights. + 264 | | /// (e.g. 1.0 == 1e18). Inflation which will be received by it is + 265 | | /// inflation_rate * relativeWeight / 1e18. + 266 | | /// @param nominee Address of the nominee. + 267 | | /// @param chainId Chain Id. + 268 | | /// @param time Relative weight at the specified timestamp in the past or present. + 269 | | /// @return weight Value of relative weight normalized to 1e18. + 270 | | /// @return totalSum Sum of nominee weights. + 271 | | function nomineeRelativeWeight( + 272 | | address nominee, + 273 | | uint256 chainId, + 274 | | uint256 time + 275 | | ) external view returns (uint256 weight, uint256 totalSum) { + 276 | | (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + 277 | | } + 278 | | + 279 | | /// @dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. + 280 | | /// Also, get the total sum of all the nominee weights. + 281 | | /// @notice Any address can call, however nothing is recorded if the values are filled already. + 282 | | /// @param nominee Address of the nominee. + 283 | | /// @param chainId Chain Id. + 284 | | /// @param time Relative weight at the specified timestamp in the past or present. + 285 | | /// @return weight Value of relative weight normalized to 1e18. + 286 | | /// @return totalSum Sum of nominee weights. + 287 | | function nomineeRelativeWeightWrite( + 288 | | address nominee, + 289 | | uint256 chainId, + 290 | | uint256 time + 291 | | ) external returns (uint256 weight, uint256 totalSum) { + 292 | | _getWeight(nominee, chainId); + 293 | | _getSum(); + 294 | | (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + 295 | | } + 296 | | + 297 | | /// @dev Allocate voting power for changing pool weights. + 298 | | /// @param nominee Address of the nominee the `msg.sender` votes for. + 299 | | /// @param chainId Chain Id. + 300 | | /// @param weight Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + 301 | * | function voteForNomineeWeights(address nominee, uint256 chainId, uint256 weight) public { + 302 | | + 303 | | // Push a pair of key defining variables into one key + 304 | | // nominee occupies first 160 bits + 305 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 306 | | // chain Id occupies no more than next 64 bits + 307 | * | nomineeChainId |= chainId << 160; + 308 | | + 309 | * | uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); + 310 | * | uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); + 311 | * | uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + 312 | | + 313 | | // Check for the lock end expiration + 314 | * | if (nextTime >= lockEnd) { + 315 | * | revert LockExpired(msg.sender, lockEnd, nextTime); + 316 | | } + 317 | | + 318 | | // Check for the weight number + 319 | * | if (weight > MAX_WEIGHT) { + 320 | | revert Overflow(weight, MAX_WEIGHT); + 321 | | } + 322 | | + 323 | | // Check for the last voting time + 324 | * | uint256 nextAllowedVotingTime = lastUserVote[msg.sender][nomineeChainId] + WEIGHT_VOTE_DELAY; + 325 | * | if (nextAllowedVotingTime > block.timestamp) { + 326 | | revert VoteTooOften(msg.sender, block.timestamp, nextAllowedVotingTime); + 327 | | } + 328 | | + 329 | | // Prepare old and new slopes and biases + 330 | * | VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeChainId]; + 331 | * | uint256 oldBias; + 332 | * | if (oldSlope.end > nextTime) { + 333 | | oldBias = oldSlope.slope * (oldSlope.end - nextTime); + 334 | | } + 335 | | + 336 | * | VotedSlope memory newSlope = VotedSlope({ + 337 | * | slope: slope * weight / MAX_WEIGHT, + 338 | * | end: lockEnd, + 339 | * | power: weight + 340 | | }); + 341 | | + 342 | * | uint256 newBias = newSlope.slope * (lockEnd - nextTime); + 343 | | + 344 | * | uint256 powerUsed = voteUserPower[msg.sender]; + 345 | * | powerUsed = powerUsed + newSlope.power - oldSlope.power; + 346 | * | voteUserPower[msg.sender] = powerUsed; + 347 | * | if (powerUsed > MAX_WEIGHT) { + 348 | * | revert Overflow(powerUsed, MAX_WEIGHT); + 349 | | } + 350 | | + 351 | | // Remove old and schedule new slope changes + 352 | | // Remove slope changes for old slopes + 353 | | // Schedule recording of initial slope for nextTime + 354 | * | pointsWeight[nomineeChainId][nextTime].bias = _maxAndSub(_getWeight(nominee, chainId) + newBias, oldBias); + 355 | | + 356 | * | pointsSum[nextTime].bias = _maxAndSub(_getSum() + newBias, oldBias); + 357 | * | if (oldSlope.end > nextTime) { + 358 | | pointsWeight[nomineeChainId][nextTime].slope = _maxAndSub(pointsWeight[nomineeChainId][nextTime].slope + newSlope.slope, oldSlope.slope); + 359 | | pointsSum[nextTime].slope = _maxAndSub(pointsSum[nextTime].slope + newSlope.slope, oldSlope.slope); + 360 | | } else { + 361 | * | pointsWeight[nomineeChainId][nextTime].slope += newSlope.slope; + 362 | * | pointsSum[nextTime].slope += newSlope.slope; + 363 | | } + 364 | * | if (oldSlope.end > block.timestamp) { + 365 | | // Cancel old slope changes if they still didn't happen + 366 | | changesWeight[nomineeChainId][oldSlope.end] -= oldSlope.slope; + 367 | | changesSum[oldSlope.end] -= oldSlope.slope; + 368 | | } + 369 | | // Add slope changes for new slopes + 370 | * | changesWeight[nomineeChainId][newSlope.end] += newSlope.slope; + 371 | * | changesSum[newSlope.end] += newSlope.slope; + 372 | | + 373 | * | voteUserSlopes[msg.sender][nomineeChainId] = newSlope; + 374 | | + 375 | | // Record last action time + 376 | * | lastUserVote[msg.sender][nomineeChainId] = block.timestamp; + 377 | * | assert(lastUserVote[msg.sender][nomineeChainId] > 0); + 378 | | + 379 | * | callVoteForNomineeWeights = true; + 380 | * | emit VoteForNominee(msg.sender, nominee, chainId, weight); + 381 | | } + 382 | | + 383 | | /// @dev Allocate voting power for changing pool weights in batch. + 384 | | /// @param nominees Set of nominees the `msg.sender` votes for. + 385 | | /// @param chainIds Set of corresponding chain Ids. + 386 | | /// @param weights Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + 387 | | function voteForNomineeWeightsBatch( + 388 | | address[] memory nominees, + 389 | | uint256[] memory chainIds, + 390 | | uint256[] memory weights + 391 | | ) external { + 392 | | if (nominees.length != chainIds.length || nominees.length != weights.length) { + 393 | | revert WrongArrayLength(nominees.length, weights.length); + 394 | | } + 395 | | + 396 | | // Traverse all accounts and weights + 397 | | for (uint256 i = 0; i < nominees.length; ++i) { + 398 | | voteForNomineeWeights(nominees[i], chainIds[i], weights[i]); + 399 | | } + 400 | | } + 401 | | + 402 | * | function _maxAndSub(uint256 a, uint256 b) internal pure returns (uint256) { + 403 | * | return a > b ? a - b : 0; + 404 | | } + 405 | | + 406 | | /// @dev Get current nominee weight. + 407 | | /// @param nominee Address of the nominee. + 408 | | /// @param chainId Chain Id. + 409 | | /// @return Nominee weight. + 410 | | function getNomineeWeight(address nominee, uint256 chainId) external view returns (uint256) { + 411 | | // Push a pair of key defining variables into one key + 412 | | // nominee occupies first 160 bits + 413 | | uint256 nomineeChainId = uint256(uint160(nominee)); + 414 | | // chain Id occupies no more than next 64 bits + 415 | | nomineeChainId |= chainId << 160; + 416 | | + 417 | | return pointsWeight[nomineeChainId][timeWeight[nomineeChainId]].bias; + 418 | | } + 419 | | + 420 | | /// @dev Get sum of nominee weights. + 421 | | /// @return Sum of nominee weights. + 422 | | function getWeightsSum() external view returns (uint256) { + 423 | | return pointsSum[timeSum].bias; + 424 | | } + 425 | | + 426 | | /// @dev Get the number of nominees. + 427 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 428 | | /// @return Total number of nominees. + 429 | * | function getNumNominees() external view returns (uint256) { + 430 | * | return setNominees.length - 1; + 431 | | } + 432 | | + 433 | | /// @dev Gets the nominee Id in the global nominees set. + 434 | | /// @param nominee Nominee address. + 435 | | /// @param chainId Chain Id. + 436 | | /// @return id Nominee Id in the global set of (nominee | chainId) values. + 437 | * | function getNomineeId(address nominee, uint256 chainId) external view returns (uint256 id) { + 438 | | // Push a pair of key defining variables into one key + 439 | | // nominee occupies first 160 bits + 440 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 441 | | // chain Id occupies no more than next 64 bits + 442 | * | nomineeChainId |= chainId << 160; + 443 | | + 444 | * | id = mapNomineeIds[nomineeChainId]; + 445 | | } + 446 | | + 447 | | /// @dev Get the nominee address and its corresponding chain Id. + 448 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 449 | | /// @param id Nominee Id in the global set of (nominee | chainId) values. + 450 | | /// @return nominee Nominee address. + 451 | | /// @return chainId Chain Id. + 452 | | function getNominee(uint256 id) external view returns (address nominee, uint256 chainId) { + 453 | | // Get the total number of nominees in the contract + 454 | | uint256 totalNumNominees = setNominees.length - 1; + 455 | | // Check for the zero id or the overflow + 456 | | if (id == 0) { + 457 | | revert ZeroValue(); + 458 | | } else if (id > totalNumNominees) { + 459 | | revert Overflow(id, totalNumNominees); + 460 | | } + 461 | | + 462 | | uint256 nomineeChainId = setNominees[id]; + 463 | | // Extract the nominee address + 464 | | nominee = address(uint160(uint256(nomineeChainId))); + 465 | | // Extract chain Id + 466 | | chainId = nomineeChainId >> 160; + 467 | | } + 468 | | + 469 | | /// @dev Get the set of nominee addresses and corresponding chain Ids. + 470 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 471 | | /// @param startId Start Id of the nominee in the global set of (nominee | chainId) values. + 472 | | /// @param numNominees Number of nominees to get. + 473 | | /// @return nominees Set of nominee addresses. + 474 | | /// @return chainIds Set of corresponding chain Ids. + 475 | | function getNominees( + 476 | | uint256 startId, + 477 | | uint256 numNominees + 478 | | ) external view returns (address[] memory nominees, uint256[] memory chainIds) + 479 | | { + 480 | | // Check for the zero id or the overflow + 481 | | if (startId == 0 || numNominees == 0) { + 482 | | revert ZeroValue(); + 483 | | } + 484 | | + 485 | | // Get the last nominee Id requested + 486 | | uint256 endId = startId + numNominees; + 487 | | // Get the total number of nominees in the contract with the zero-th nominee + 488 | | uint256 totalNumNominees = setNominees.length; + 489 | | + 490 | | // Check for the overflow + 491 | | if (endId > totalNumNominees) { + 492 | | revert Overflow(endId, totalNumNominees); + 493 | | } + 494 | | + 495 | | // Allocate + 496 | | nominees = new address[](numNominees); + 497 | | chainIds = new uint256[](numNominees); + 498 | | + 499 | | // Traverse selected nominees + 500 | | for (uint256 i = 0; i < numNominees; ++i) { + 501 | | uint256 id = i + startId; + 502 | | uint256 nomineeChainId = setNominees[id]; + 503 | | // Extract the nominee address + 504 | | nominees[i] = address(uint160(uint256(nomineeChainId))); + 505 | | // Extract chain Id + 506 | | chainIds[i] = nomineeChainId >> 160; + 507 | | } + 508 | | } + 509 | | + 510 | | /// @dev For fuzzing only + 511 | * | function setCallVoteForNomineeWeights(bool flag) external { + 512 | * | callVoteForNomineeWeights = flag; + 513 | | } + 514 | | /// @dev For fuzzing only + 515 | * | function getlastUserVote(address nominee, uint256 chainId) external view returns (uint256) { + 516 | | // Push a pair of key defining variables into one key + 517 | | // nominee occupies first 160 bits + 518 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 519 | | // chain Id occupies no more than next 64 bits + 520 | * | nomineeChainId |= chainId << 160; + 521 | * | return lastUserVote[msg.sender][nomineeChainId]; + 522 | | } + 523 | | } + + +
+ +/home/andrey/valory/autonolas-governance/contracts/veOLAS.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | import "@openzeppelin/contracts/governance/utils/IVotes.sol"; + 5 | | import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + 6 | | import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + 7 | | import "./interfaces/IErrors.sol"; + 8 | | + 9 | | /** + 10 | | Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for). + 11 | | Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years). + 12 | | Voting escrow has time-weighted votes derived from the amount of tokens locked. The maximum voting power can be + 13 | | achieved with the longest lock possible. This way the users are incentivized to lock tokens for more time. + 14 | | # w ^ = amount * time_locked / MAXTIME + 15 | | # 1 + / + 16 | | # | / + 17 | | # | / + 18 | | # | / + 19 | | # |/ + 20 | | # 0 +--------+------> time + 21 | | # maxtime (4 years?) + 22 | | + 23 | | We cannot really do block numbers per se because slope is per time, not per block, and per block could be fairly bad + 24 | | because Ethereum changes its block times. What we can do is to extrapolate ***At functions. + 25 | | */ + 26 | | + 27 | | /// @title Voting Escrow OLAS - the workflow is ported from Curve Finance Vyper implementation + 28 | | /// @author Aleksandr Kuperman - <aleksandr.kuperman@valory.xyz> + 29 | | /// Code ported from: https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy + 30 | | /// and: https://github.com/solidlyexchange/solidly/blob/master/contracts/ve.sol + 31 | | + 32 | | /* This VotingEscrow is based on the OLAS token that has the following specifications: + 33 | | * - For the first 10 years there will be the cap of 1 billion (1e27) tokens; + 34 | | * - After 10 years, the inflation rate is 2% per year. + 35 | | * The maximum number of tokens for each year then can be calculated from the formula: 2^n = 1e27 * (1.02)^x, + 36 | | * where n is the specified number of bits that is sufficient to store and not overflow the total supply, + 37 | | * and x is the number of years. We limit n by 128, thus it would take 1340+ years to reach that total supply. + 38 | | * The amount for each locker is eventually cannot overcome this number as well, and thus uint128 is sufficient. + 39 | | * + 40 | | * We then limit the time in seconds to last until the value of 2^64 - 1, or for the next 583+ billion years. + 41 | | * The number of blocks is essentially cannot be bigger than the number of seconds, and thus it is safe to assume + 42 | | * that uint64 for the number of blocks is also sufficient. + 43 | | * + 44 | | * We also limit the individual deposit amount to be no bigger than 2^96 - 1, or the value of total supply in 220+ years. + 45 | | * This limitation is dictated by the fact that there will be at least several accounts with locked tokens, and the + 46 | | * sum of all of them cannot be bigger than the total supply. Checking the limit of deposited / increased amount + 47 | | * allows us to perform the unchecked operation on adding the amounts. + 48 | | * + 49 | | * The rest of calculations throughout the contract do not go beyond specified limitations. The contract was checked + 50 | | * by echidna and the results can be found in the audit section of the repository. + 51 | | * + 52 | | * These specified limits allowed us to have storage-added structs to be bound by 2*256 and 1*256 bit sizes + 53 | | * respectively, thus limiting the gas amount compared to using bigger variable sizes. + 54 | | * + 55 | | * Note that after 220 years it is no longer possible to deposit / increase the locked amount to be bigger than 2^96 - 1. + 56 | | * It is going to be not safe to use this contract for governance after 1340 years. + 57 | | */ + 58 | | + 59 | | // Struct for storing balance and unlock time + 60 | | // The struct size is one storage slot of uint256 (128 + 64 + padding) + 61 | | struct LockedBalance { + 62 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 63 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 64 | | uint128 amount; + 65 | | // Unlock time. It will never practically be bigger + 66 | | uint64 endTime; + 67 | | } + 68 | | + 69 | | // Structure for voting escrow points + 70 | | // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + 71 | | struct PointVoting { + 72 | | // w(i) = at + b (bias) + 73 | | int128 bias; + 74 | | // dw / dt = a (slope) + 75 | | int128 slope; + 76 | | // Timestamp. It will never practically be bigger than 2^64 - 1 + 77 | | uint64 ts; + 78 | | // Block number. It will not be bigger than the timestamp + 79 | | uint64 blockNumber; + 80 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 81 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 82 | | uint128 balance; + 83 | | } + 84 | | + 85 | | /// @notice This token supports the ERC20 interface specifications except for transfers and approvals. + 86 | * | contract veOLAS is IErrors, IVotes, IERC20, IERC165 { + 87 | | enum DepositType { + 88 | | DEPOSIT_FOR_TYPE, + 89 | | CREATE_LOCK_TYPE, + 90 | | INCREASE_LOCK_AMOUNT, + 91 | | INCREASE_UNLOCK_TIME + 92 | | } + 93 | | + 94 | | event Deposit(address indexed account, uint256 amount, uint256 locktime, DepositType depositType, uint256 ts); + 95 | | event Withdraw(address indexed account, uint256 amount, uint256 ts); + 96 | | event Supply(uint256 previousSupply, uint256 currentSupply); + 97 | | + 98 | | // 1 week time + 99 | * | uint64 internal constant WEEK = 1 weeks; + 100 | | // Maximum lock time (4 years) + 101 | * | uint256 internal constant MAXTIME = 4 * 365 * 86400; + 102 | | // Maximum lock time (4 years) in int128 + 103 | * | int128 internal constant IMAXTIME = 4 * 365 * 86400; + 104 | | // Number of decimals + 105 | | uint8 public constant decimals = 18; + 106 | | + 107 | | // Token address + 108 | | address public immutable token; + 109 | | // Total token supply + 110 | | uint256 public supply; + 111 | | // Mapping of account address => LockedBalance + 112 | * | mapping(address => LockedBalance) public mapLockedBalances; + 113 | | + 114 | | // Total number of economical checkpoints (starting from zero) + 115 | | uint256 public totalNumPoints; + 116 | | // Mapping of point Id => point + 117 | | mapping(uint256 => PointVoting) public mapSupplyPoints; + 118 | | // Mapping of account address => PointVoting[point Id] + 119 | | mapping(address => PointVoting[]) public mapUserPoints; + 120 | | // Mapping of time => signed slope change + 121 | | mapping(uint64 => int128) public mapSlopeChanges; + 122 | | + 123 | | // Voting token name + 124 | | string public name; + 125 | | // Voting token symbol + 126 | | string public symbol; + 127 | | + 128 | | /// @dev Contract constructor + 129 | | /// @param _token Token address. + 130 | | /// @param _name Token name. + 131 | | /// @param _symbol Token symbol. + 132 | | constructor(address _token, string memory _name, string memory _symbol) + 133 | | { + 134 | | token = _token; + 135 | | name = _name; + 136 | | symbol = _symbol; + 137 | | // Create initial point such that default timestamp and block number are not zero + 138 | | // See cast specification in the PointVoting structure + 139 | | mapSupplyPoints[0] = PointVoting(0, 0, uint64(block.timestamp), uint64(block.number), 0); + 140 | | } + 141 | | + 142 | | /// @dev Gets the most recently recorded user point for `account`. + 143 | | /// @param account Account address. + 144 | | /// @return pv Last checkpoint. + 145 | * | function getLastUserPoint(address account) external view returns (PointVoting memory pv) { + 146 | * | uint256 lastPointNumber = mapUserPoints[account].length; + 147 | * | if (lastPointNumber > 0) { + 148 | * | pv = mapUserPoints[account][lastPointNumber - 1]; + 149 | | } + 150 | | } + 151 | | + 152 | | /// @dev Gets the number of user points. + 153 | | /// @param account Account address. + 154 | | /// @return accountNumPoints Number of user points. + 155 | | function getNumUserPoints(address account) external view returns (uint256 accountNumPoints) { + 156 | | accountNumPoints = mapUserPoints[account].length; + 157 | | } + 158 | | + 159 | | /// @dev Gets the checkpoint structure at number `idx` for `account`. + 160 | | /// @notice The out of bound condition is treated by the default code generation check. + 161 | | /// @param account User wallet address. + 162 | | /// @param idx User point number. + 163 | | /// @return The requested checkpoint. + 164 | | function getUserPoint(address account, uint256 idx) external view returns (PointVoting memory) { + 165 | | return mapUserPoints[account][idx]; + 166 | | } + 167 | | + 168 | | /// @dev Record global and per-user data to checkpoint. + 169 | | /// @param account Account address. User checkpoint is skipped if the address is zero. + 170 | | /// @param oldLocked Previous locked amount / end lock time for the user. + 171 | | /// @param newLocked New locked amount / end lock time for the user. + 172 | | /// @param curSupply Current total supply (to avoid using a storage total supply variable) + 173 | * | function _checkpoint( + 174 | | address account, + 175 | | LockedBalance memory oldLocked, + 176 | | LockedBalance memory newLocked, + 177 | | uint128 curSupply + 178 | * | ) internal { + 179 | * | PointVoting memory uOld; + 180 | * | PointVoting memory uNew; + 181 | * | int128 oldDSlope; + 182 | * | int128 newDSlope; + 183 | * | uint256 curNumPoint = totalNumPoints; + 184 | | + 185 | * | if (account != address(0)) { + 186 | | // Calculate slopes and biases + 187 | | // Kept at zero when they have to + 188 | * | if (oldLocked.endTime > block.timestamp && oldLocked.amount > 0) { + 189 | | uOld.slope = int128(oldLocked.amount) / IMAXTIME; + 190 | | uOld.bias = uOld.slope * int128(uint128(oldLocked.endTime - uint64(block.timestamp))); + 191 | | } + 192 | * | if (newLocked.endTime > block.timestamp && newLocked.amount > 0) { + 193 | * | uNew.slope = int128(newLocked.amount) / IMAXTIME; + 194 | * | uNew.bias = uNew.slope * int128(uint128(newLocked.endTime - uint64(block.timestamp))); + 195 | | } + 196 | | + 197 | | // Reads values of scheduled changes in the slope + 198 | | // oldLocked.endTime can be in the past and in the future + 199 | | // newLocked.endTime can ONLY be in the FUTURE unless everything is expired: then zeros + 200 | * | oldDSlope = mapSlopeChanges[oldLocked.endTime]; + 201 | * | if (newLocked.endTime > 0) { + 202 | * | if (newLocked.endTime == oldLocked.endTime) { + 203 | | newDSlope = oldDSlope; + 204 | | } else { + 205 | * | newDSlope = mapSlopeChanges[newLocked.endTime]; + 206 | | } + 207 | | } + 208 | | } + 209 | | + 210 | * | PointVoting memory lastPoint; + 211 | * | if (curNumPoint > 0) { + 212 | | lastPoint = mapSupplyPoints[curNumPoint]; + 213 | | } else { + 214 | | // If no point is created yet, we take the actual time and block parameters + 215 | * | lastPoint = PointVoting(0, 0, uint64(block.timestamp), uint64(block.number), 0); + 216 | | } + 217 | * | uint64 lastCheckpoint = lastPoint.ts; + 218 | | // initialPoint is used for extrapolation to calculate the block number and save them + 219 | | // as we cannot figure that out in exact values from inside of the contract + 220 | * | PointVoting memory initialPoint = lastPoint; + 221 | * | uint256 block_slope; // dblock/dt + 222 | * | if (block.timestamp > lastPoint.ts) { + 223 | | // This 1e18 multiplier is needed for the numerator to be bigger than the denominator + 224 | | // We need to calculate this in > uint64 size (1e18 is > 2^59 multiplied by 2^64). + 225 | | block_slope = (1e18 * uint256(block.number - lastPoint.blockNumber)) / uint256(block.timestamp - lastPoint.ts); + 226 | | } + 227 | | // If last point is already recorded in this block, slope == 0, but we know the block already in this case + 228 | | // Go over weeks to fill in the history and (or) calculate what the current point is + 229 | * | { + 230 | | // The timestamp is rounded by a week and < 2^64-1 + 231 | * | uint64 tStep = (lastCheckpoint / WEEK) * WEEK; + 232 | * | for (uint256 i = 0; i < 255; ++i) { + 233 | | // Hopefully it won't happen that this won't get used in 5 years! + 234 | | // If it does, users will be able to withdraw but vote weight will be broken + 235 | | // This is always practically < 2^64-1 + 236 | | unchecked { + 237 | * | tStep += WEEK; + 238 | | } + 239 | * | int128 dSlope; + 240 | * | if (tStep > block.timestamp) { + 241 | * | tStep = uint64(block.timestamp); + 242 | | } else { + 243 | | dSlope = mapSlopeChanges[tStep]; + 244 | | } + 245 | * | lastPoint.bias -= lastPoint.slope * int128(int64(tStep - lastCheckpoint)); + 246 | * | lastPoint.slope += dSlope; + 247 | * | if (lastPoint.bias < 0) { + 248 | | // This could potentially happen, but fuzzer didn't find available "real" combinations + 249 | | lastPoint.bias = 0; + 250 | | } + 251 | * | if (lastPoint.slope < 0) { + 252 | | // This cannot happen - just in case. Again, fuzzer didn't reach this + 253 | | lastPoint.slope = 0; + 254 | | } + 255 | * | lastCheckpoint = tStep; + 256 | * | lastPoint.ts = tStep; + 257 | | // After division by 1e18 the uint64 size can be reclaimed + 258 | * | lastPoint.blockNumber = initialPoint.blockNumber + uint64((block_slope * uint256(tStep - initialPoint.ts)) / 1e18); + 259 | * | lastPoint.balance = initialPoint.balance; + 260 | | // In order for the overflow of total number of economical checkpoints (starting from zero) + 261 | | // The _checkpoint() call must happen n >(2^256 -1)/255 or n > ~1e77/255 > ~1e74 times + 262 | | unchecked { + 263 | * | curNumPoint += 1; + 264 | | } + 265 | * | if (tStep == block.timestamp) { + 266 | * | lastPoint.blockNumber = uint64(block.number); + 267 | * | lastPoint.balance = curSupply; + 268 | * | break; + 269 | | } else { + 270 | | mapSupplyPoints[curNumPoint] = lastPoint; + 271 | | } + 272 | | } + 273 | | } + 274 | | + 275 | * | totalNumPoints = curNumPoint; + 276 | | + 277 | | // Now mapSupplyPoints is filled until current time + 278 | * | if (account != address(0)) { + 279 | | // If last point was in this block, the slope change has been already applied. In such case we have 0 slope(s) + 280 | * | lastPoint.slope += (uNew.slope - uOld.slope); + 281 | * | lastPoint.bias += (uNew.bias - uOld.bias); + 282 | * | if (lastPoint.slope < 0) { + 283 | | lastPoint.slope = 0; + 284 | | } + 285 | * | if (lastPoint.bias < 0) { + 286 | | lastPoint.bias = 0; + 287 | | } + 288 | | } + 289 | | + 290 | | // Record the last updated point + 291 | * | mapSupplyPoints[curNumPoint] = lastPoint; + 292 | | + 293 | * | if (account != address(0)) { + 294 | | // Schedule the slope changes (slope is going down) + 295 | | // We subtract new_user_slope from [newLocked.endTime] + 296 | | // and add old_user_slope to [oldLocked.endTime] + 297 | * | if (oldLocked.endTime > block.timestamp) { + 298 | | // oldDSlope was <something> - uOld.slope, so we cancel that + 299 | | oldDSlope += uOld.slope; + 300 | | if (newLocked.endTime == oldLocked.endTime) { + 301 | | oldDSlope -= uNew.slope; // It was a new deposit, not extension + 302 | | } + 303 | | mapSlopeChanges[oldLocked.endTime] = oldDSlope; + 304 | | } + 305 | | + 306 | * | if (newLocked.endTime > block.timestamp && newLocked.endTime > oldLocked.endTime) { + 307 | * | newDSlope -= uNew.slope; // old slope disappeared at this point + 308 | * | mapSlopeChanges[newLocked.endTime] = newDSlope; + 309 | | // else: we recorded it already in oldDSlope + 310 | | } + 311 | | // Now handle user history + 312 | * | uNew.ts = uint64(block.timestamp); + 313 | * | uNew.blockNumber = uint64(block.number); + 314 | * | uNew.balance = newLocked.amount; + 315 | * | mapUserPoints[account].push(uNew); + 316 | | } + 317 | | } + 318 | | + 319 | | /// @dev Record global data to checkpoint. + 320 | | function checkpoint() external { + 321 | | _checkpoint(address(0), LockedBalance(0, 0), LockedBalance(0, 0), uint128(supply)); + 322 | | } + 323 | | + 324 | | /// @dev Deposits and locks tokens for a specified account. + 325 | | /// @param account Target address for the locked amount. + 326 | | /// @param amount Amount to deposit. + 327 | | /// @param unlockTime New time when to unlock the tokens, or 0 if unchanged. + 328 | | /// @param lockedBalance Previous locked amount / end time. + 329 | | /// @param depositType Deposit type. + 330 | * | function _depositFor( + 331 | | address account, + 332 | | uint256 amount, + 333 | | uint256 unlockTime, + 334 | | LockedBalance memory lockedBalance, + 335 | | DepositType depositType + 336 | * | ) internal { + 337 | * | uint256 supplyBefore = supply; + 338 | * | uint256 supplyAfter; + 339 | | // Cannot overflow because the total supply << 2^128-1 + 340 | | unchecked { + 341 | * | supplyAfter = supplyBefore + amount; + 342 | * | supply = supplyAfter; + 343 | | } + 344 | | // Get the old locked data + 345 | * | LockedBalance memory oldLocked; + 346 | * | (oldLocked.amount, oldLocked.endTime) = (lockedBalance.amount, lockedBalance.endTime); + 347 | | // Adding to the existing lock, or if a lock is expired - creating a new one + 348 | | // This cannot be larger than the total supply + 349 | | unchecked { + 350 | * | lockedBalance.amount += uint128(amount); + 351 | | } + 352 | * | if (unlockTime > 0) { + 353 | * | lockedBalance.endTime = uint64(unlockTime); + 354 | | } + 355 | * | mapLockedBalances[account] = lockedBalance; + 356 | | + 357 | | // Possibilities: + 358 | | // Both oldLocked.endTime could be current or expired (>/< block.timestamp) + 359 | | // amount == 0 (extend lock) or amount > 0 (add to lock or extend lock) + 360 | | // lockedBalance.endTime > block.timestamp (always) + 361 | * | _checkpoint(account, oldLocked, lockedBalance, uint128(supplyAfter)); + 362 | * | if (amount > 0) { + 363 | | // OLAS is a solmate-based ERC20 token with optimized transferFrom() that either returns true or reverts + 364 | * | IERC20(token).transferFrom(msg.sender, address(this), amount); + 365 | | } + 366 | | + 367 | * | emit Deposit(account, amount, lockedBalance.endTime, depositType, block.timestamp); + 368 | * | emit Supply(supplyBefore, supplyAfter); + 369 | | } + 370 | | + 371 | | /// @dev Deposits `amount` tokens for `account` and adds to the lock. + 372 | | /// @dev Anyone (even a smart contract) can deposit for someone else, but + 373 | | /// cannot extend their locktime and deposit for a brand new user. + 374 | | /// @param account Account address. + 375 | | /// @param amount Amount to add. + 376 | | function depositFor(address account, uint256 amount) external { + 377 | | LockedBalance memory lockedBalance = mapLockedBalances[account]; + 378 | | // Check if the amount is zero + 379 | | if (amount == 0) { + 380 | | revert ZeroValue(); + 381 | | } + 382 | | // The locked balance must already exist + 383 | | if (lockedBalance.amount == 0) { + 384 | | revert NoValueLocked(account); + 385 | | } + 386 | | // Check the lock expiry + 387 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 388 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 389 | | } + 390 | | // Since in the _depositFor() we have the unchecked sum of amounts, this is needed to prevent unsafe behavior. + 391 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 392 | | if (amount > type(uint96).max) { + 393 | | revert Overflow(amount, type(uint96).max); + 394 | | } + 395 | | + 396 | | _depositFor(account, amount, 0, lockedBalance, DepositType.DEPOSIT_FOR_TYPE); + 397 | | } + 398 | | + 399 | | /// @dev Deposits `amount` tokens for `msg.sender` and locks for `unlockTime`. + 400 | | /// @param amount Amount to deposit. + 401 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 402 | * | function createLock(uint256 amount, uint256 unlockTime) external { + 403 | * | _createLockFor(msg.sender, amount, unlockTime); + 404 | | } + 405 | | + 406 | | /// @dev Deposits `amount` tokens for `account` and locks for `unlockTime`. + 407 | | /// @notice Tokens are taken from `msg.sender`'s balance. + 408 | | /// @param account Account address. + 409 | | /// @param amount Amount to deposit. + 410 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 411 | | function createLockFor(address account, uint256 amount, uint256 unlockTime) external { + 412 | | // Check if the account address is zero + 413 | | if (account == address(0)) { + 414 | | revert ZeroAddress(); + 415 | | } + 416 | | + 417 | | _createLockFor(account, amount, unlockTime); + 418 | | } + 419 | | + 420 | | /// @dev Deposits `amount` tokens for `account` and locks for `unlockTime`. + 421 | | /// @notice Tokens are taken from `msg.sender`'s balance. + 422 | | /// @param account Account address. + 423 | | /// @param amount Amount to deposit. + 424 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 425 | * | function _createLockFor(address account, uint256 amount, uint256 unlockTime) private { + 426 | | // Check if the amount is zero + 427 | * | if (amount == 0) { + 428 | * | revert ZeroValue(); + 429 | | } + 430 | | // Lock time is rounded down to weeks + 431 | | // Cannot practically overflow because block.timestamp + unlockTime (max 4 years) << 2^64-1 + 432 | | unchecked { + 433 | * | unlockTime = ((block.timestamp + unlockTime) / WEEK) * WEEK; + 434 | | } + 435 | * | LockedBalance memory lockedBalance = mapLockedBalances[account]; + 436 | | // The locked balance must be zero in order to start the lock + 437 | * | if (lockedBalance.amount > 0) { + 438 | | revert LockedValueNotZero(account, uint256(lockedBalance.amount)); + 439 | | } + 440 | | // Check for the lock time correctness + 441 | * | if (unlockTime < (block.timestamp + 1)) { + 442 | * | revert UnlockTimeIncorrect(account, block.timestamp, unlockTime); + 443 | | } + 444 | | // Check for the lock time not to exceed the MAXTIME + 445 | * | if (unlockTime > block.timestamp + MAXTIME) { + 446 | | revert MaxUnlockTimeReached(account, block.timestamp + MAXTIME, unlockTime); + 447 | | } + 448 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 449 | * | if (amount > type(uint96).max) { + 450 | | revert Overflow(amount, type(uint96).max); + 451 | | } + 452 | | + 453 | * | _depositFor(account, amount, unlockTime, lockedBalance, DepositType.CREATE_LOCK_TYPE); + 454 | | } + 455 | | + 456 | | /// @dev Deposits `amount` additional tokens for `msg.sender` without modifying the unlock time. + 457 | | /// @param amount Amount of tokens to deposit and add to the lock. + 458 | | function increaseAmount(uint256 amount) external { + 459 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 460 | | // Check if the amount is zero + 461 | | if (amount == 0) { + 462 | | revert ZeroValue(); + 463 | | } + 464 | | // The locked balance must already exist + 465 | | if (lockedBalance.amount == 0) { + 466 | | revert NoValueLocked(msg.sender); + 467 | | } + 468 | | // Check the lock expiry + 469 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 470 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 471 | | } + 472 | | // Check the max possible amount to add, that must be less than the total supply + 473 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 474 | | if (amount > type(uint96).max) { + 475 | | revert Overflow(amount, type(uint96).max); + 476 | | } + 477 | | + 478 | | _depositFor(msg.sender, amount, 0, lockedBalance, DepositType.INCREASE_LOCK_AMOUNT); + 479 | | } + 480 | | + 481 | | /// @dev Extends the unlock time. + 482 | | /// @param unlockTime New tokens unlock time. + 483 | | function increaseUnlockTime(uint256 unlockTime) external { + 484 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 485 | | // Cannot practically overflow because block.timestamp + unlockTime (max 4 years) << 2^64-1 + 486 | | unchecked { + 487 | | unlockTime = ((block.timestamp + unlockTime) / WEEK) * WEEK; + 488 | | } + 489 | | // The locked balance must already exist + 490 | | if (lockedBalance.amount == 0) { + 491 | | revert NoValueLocked(msg.sender); + 492 | | } + 493 | | // Check the lock expiry + 494 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 495 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 496 | | } + 497 | | // Check for the lock time correctness + 498 | | if (unlockTime < (lockedBalance.endTime + 1)) { + 499 | | revert UnlockTimeIncorrect(msg.sender, lockedBalance.endTime, unlockTime); + 500 | | } + 501 | | // Check for the lock time not to exceed the MAXTIME + 502 | | if (unlockTime > block.timestamp + MAXTIME) { + 503 | | revert MaxUnlockTimeReached(msg.sender, block.timestamp + MAXTIME, unlockTime); + 504 | | } + 505 | | + 506 | | _depositFor(msg.sender, 0, unlockTime, lockedBalance, DepositType.INCREASE_UNLOCK_TIME); + 507 | | } + 508 | | + 509 | | /// @dev Withdraws all tokens for `msg.sender`. Only possible if the lock has expired. + 510 | | function withdraw() external { + 511 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 512 | | if (lockedBalance.endTime > block.timestamp) { + 513 | | revert LockNotExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 514 | | } + 515 | | uint256 amount = uint256(lockedBalance.amount); + 516 | | + 517 | | mapLockedBalances[msg.sender] = LockedBalance(0, 0); + 518 | | uint256 supplyBefore = supply; + 519 | | uint256 supplyAfter; + 520 | | // The amount cannot be less than the total supply + 521 | | unchecked { + 522 | | supplyAfter = supplyBefore - amount; + 523 | | supply = supplyAfter; + 524 | | } + 525 | | // oldLocked can have either expired <= timestamp or zero end + 526 | | // lockedBalance has only 0 end + 527 | | // Both can have >= 0 amount + 528 | | _checkpoint(msg.sender, lockedBalance, LockedBalance(0, 0), uint128(supplyAfter)); + 529 | | + 530 | | emit Withdraw(msg.sender, amount, block.timestamp); + 531 | | emit Supply(supplyBefore, supplyAfter); + 532 | | + 533 | | // OLAS is a solmate-based ERC20 token with optimized transfer() that either returns true or reverts + 534 | | IERC20(token).transfer(msg.sender, amount); + 535 | | } + 536 | | + 537 | | /// @dev Finds a closest point that has a specified block number. + 538 | | /// @param blockNumber Block to find. + 539 | | /// @param account Account address for user points. + 540 | | /// @return point Point with the approximate index number for the specified block. + 541 | | /// @return minPointNumber Point number. + 542 | | function _findPointByBlock(uint256 blockNumber, address account) internal view + 543 | | returns (PointVoting memory point, uint256 minPointNumber) + 544 | | { + 545 | | // Get the last available point number + 546 | | uint256 maxPointNumber; + 547 | | if (account == address(0)) { + 548 | | maxPointNumber = totalNumPoints; + 549 | | } else { + 550 | | maxPointNumber = mapUserPoints[account].length; + 551 | | if (maxPointNumber == 0) { + 552 | | return (point, minPointNumber); + 553 | | } + 554 | | // Already checked for > 0 in this case + 555 | | unchecked { + 556 | | maxPointNumber -= 1; + 557 | | } + 558 | | } + 559 | | + 560 | | // Binary search that will be always enough for 128-bit numbers + 561 | | for (uint256 i = 0; i < 128; ++i) { + 562 | | if ((minPointNumber + 1) > maxPointNumber) { + 563 | | break; + 564 | | } + 565 | | uint256 mid = (minPointNumber + maxPointNumber + 1) / 2; + 566 | | + 567 | | // Choose the source of points + 568 | | if (account == address(0)) { + 569 | | point = mapSupplyPoints[mid]; + 570 | | } else { + 571 | | point = mapUserPoints[account][mid]; + 572 | | } + 573 | | + 574 | | if (point.blockNumber < (blockNumber + 1)) { + 575 | | minPointNumber = mid; + 576 | | } else { + 577 | | maxPointNumber = mid - 1; + 578 | | } + 579 | | } + 580 | | + 581 | | // Get the found point + 582 | | if (account == address(0)) { + 583 | | point = mapSupplyPoints[minPointNumber]; + 584 | | } else { + 585 | | point = mapUserPoints[account][minPointNumber]; + 586 | | } + 587 | | } + 588 | | + 589 | | /// @dev Gets the voting power for an `account` at time `ts`. + 590 | | /// @param account Account address. + 591 | | /// @param ts Time to get voting power at. + 592 | | /// @return vBalance Account voting power. + 593 | | function _balanceOfLocked(address account, uint64 ts) internal view returns (uint256 vBalance) { + 594 | | uint256 pointNumber = mapUserPoints[account].length; + 595 | | if (pointNumber > 0) { + 596 | | PointVoting memory uPoint = mapUserPoints[account][pointNumber - 1]; + 597 | | uPoint.bias -= uPoint.slope * int128(int64(ts) - int64(uPoint.ts)); + 598 | | if (uPoint.bias > 0) { + 599 | | vBalance = uint256(int256(uPoint.bias)); + 600 | | } + 601 | | } + 602 | | } + 603 | | + 604 | | /// @dev Gets the account balance in native token. + 605 | | /// @param account Account address. + 606 | | /// @return balance Account balance. + 607 | | function balanceOf(address account) public view override returns (uint256 balance) { + 608 | | balance = uint256(mapLockedBalances[account].amount); + 609 | | } + 610 | | + 611 | | /// @dev Gets the `account`'s lock end time. + 612 | | /// @param account Account address. + 613 | | /// @return unlockTime Lock end time. + 614 | * | function lockedEnd(address account) external view returns (uint256 unlockTime) { + 615 | * | unlockTime = uint256(mapLockedBalances[account].endTime); + 616 | | } + 617 | | + 618 | | /// @dev Gets the account balance at a specific block number. + 619 | | /// @param account Account address. + 620 | | /// @param blockNumber Block number. + 621 | | /// @return balance Account balance. + 622 | | function balanceOfAt(address account, uint256 blockNumber) external view returns (uint256 balance) { + 623 | | // Find point with the closest block number to the provided one + 624 | | (PointVoting memory uPoint, ) = _findPointByBlock(blockNumber, account); + 625 | | // If the block number at the point index is bigger than the specified block number, the balance was zero + 626 | | if (uPoint.blockNumber < (blockNumber + 1)) { + 627 | | balance = uint256(uPoint.balance); + 628 | | } + 629 | | } + 630 | | + 631 | | /// @dev Gets the voting power. + 632 | | /// @param account Account address. + 633 | | function getVotes(address account) public view override returns (uint256) { + 634 | | return _balanceOfLocked(account, uint64(block.timestamp)); + 635 | | } + 636 | | + 637 | | /// @dev Gets the block time adjustment for two neighboring points. + 638 | | /// @notice `blockNumber` must not be lower than the contract deployment block number, + 639 | | /// as the behavior and the return value is undefined. + 640 | | /// @param blockNumber Block number. + 641 | | /// @return point Point with the specified block number (or closest to it). + 642 | | /// @return blockTime Adjusted block time of the neighboring point. + 643 | | function _getBlockTime(uint256 blockNumber) internal view returns (PointVoting memory point, uint256 blockTime) { + 644 | | // Check the block number to be in the past or equal to the current block + 645 | | if (blockNumber > block.number) { + 646 | | revert WrongBlockNumber(blockNumber, block.number); + 647 | | } + 648 | | // Get the minimum historical point with the provided block number + 649 | | uint256 minPointNumber; + 650 | | (point, minPointNumber) = _findPointByBlock(blockNumber, address(0)); + 651 | | + 652 | | uint256 dBlock; + 653 | | uint256 dt; + 654 | | if (minPointNumber < totalNumPoints) { + 655 | | PointVoting memory pointNext = mapSupplyPoints[minPointNumber + 1]; + 656 | | dBlock = pointNext.blockNumber - point.blockNumber; + 657 | | dt = pointNext.ts - point.ts; + 658 | | } else { + 659 | | dBlock = block.number - point.blockNumber; + 660 | | dt = block.timestamp - point.ts; + 661 | | } + 662 | | blockTime = point.ts; + 663 | | if (dBlock > 0) { + 664 | | blockTime += (dt * (blockNumber - point.blockNumber)) / dBlock; + 665 | | } + 666 | | } + 667 | | + 668 | | /// @dev Gets voting power at a specific block number. + 669 | | /// @param account Account address. + 670 | | /// @param blockNumber Block number. + 671 | | /// @return balance Voting balance / power. + 672 | | function getPastVotes(address account, uint256 blockNumber) public view override returns (uint256 balance) { + 673 | | // Find the user point for the provided block number + 674 | | (PointVoting memory uPoint, ) = _findPointByBlock(blockNumber, account); + 675 | | + 676 | | // Get block time adjustment. + 677 | | (, uint256 blockTime) = _getBlockTime(blockNumber); + 678 | | + 679 | | // Calculate bias based on a block time + 680 | | uPoint.bias -= uPoint.slope * int128(int64(uint64(blockTime)) - int64(uPoint.ts)); + 681 | | if (uPoint.bias > 0) { + 682 | | balance = uint256(uint128(uPoint.bias)); + 683 | | } + 684 | | } + 685 | | + 686 | | /// @dev Calculate total voting power at some point in the past. + 687 | | /// @param lastPoint The point (bias/slope) to start the search from. + 688 | | /// @param ts Time to calculate the total voting power at. + 689 | | /// @return vSupply Total voting power at that time. + 690 | | function _supplyLockedAt(PointVoting memory lastPoint, uint64 ts) internal view returns (uint256 vSupply) { + 691 | | // The timestamp is rounded and < 2^64-1 + 692 | | uint64 tStep = (lastPoint.ts / WEEK) * WEEK; + 693 | | for (uint256 i = 0; i < 255; ++i) { + 694 | | // This is always practically < 2^64-1 + 695 | | unchecked { + 696 | | tStep += WEEK; + 697 | | } + 698 | | int128 dSlope; + 699 | | if (tStep > ts) { + 700 | | tStep = ts; + 701 | | } else { + 702 | | dSlope = mapSlopeChanges[tStep]; + 703 | | } + 704 | | lastPoint.bias -= lastPoint.slope * int128(int64(tStep) - int64(lastPoint.ts)); + 705 | | if (tStep == ts) { + 706 | | break; + 707 | | } + 708 | | lastPoint.slope += dSlope; + 709 | | lastPoint.ts = tStep; + 710 | | } + 711 | | + 712 | | if (lastPoint.bias > 0) { + 713 | | vSupply = uint256(uint128(lastPoint.bias)); + 714 | | } + 715 | | } + 716 | | + 717 | | /// @dev Gets total token supply. + 718 | | /// @return Total token supply. + 719 | | function totalSupply() public view override returns (uint256) { + 720 | | return supply; + 721 | | } + 722 | | + 723 | | /// @dev Gets total token supply at a specific block number. + 724 | | /// @param blockNumber Block number. + 725 | | /// @return supplyAt Supply at the specified block number. + 726 | | function totalSupplyAt(uint256 blockNumber) external view returns (uint256 supplyAt) { + 727 | | // Find point with the closest block number to the provided one + 728 | | (PointVoting memory sPoint, ) = _findPointByBlock(blockNumber, address(0)); + 729 | | // If the block number at the point index is bigger than the specified block number, the balance was zero + 730 | | if (sPoint.blockNumber < (blockNumber + 1)) { + 731 | | supplyAt = uint256(sPoint.balance); + 732 | | } + 733 | | } + 734 | | + 735 | | /// @dev Calculates total voting power at time `ts`. + 736 | | /// @param ts Time to get total voting power at. + 737 | | /// @return Total voting power. + 738 | | function totalSupplyLockedAtT(uint256 ts) public view returns (uint256) { + 739 | | PointVoting memory lastPoint = mapSupplyPoints[totalNumPoints]; + 740 | | return _supplyLockedAt(lastPoint, uint64(ts)); + 741 | | } + 742 | | + 743 | | /// @dev Calculates current total voting power. + 744 | | /// @return Total voting power. + 745 | | function totalSupplyLocked() public view returns (uint256) { + 746 | | return totalSupplyLockedAtT(block.timestamp); + 747 | | } + 748 | | + 749 | | /// @dev Calculate total voting power at some point in the past. + 750 | | /// @param blockNumber Block number to calculate the total voting power at. + 751 | | /// @return Total voting power. + 752 | | function getPastTotalSupply(uint256 blockNumber) public view override returns (uint256) { + 753 | | (PointVoting memory sPoint, uint256 blockTime) = _getBlockTime(blockNumber); + 754 | | // Now dt contains info on how far are we beyond the point + 755 | | return _supplyLockedAt(sPoint, uint64(blockTime)); + 756 | | } + 757 | | + 758 | | /// @dev Gets information about the interface support. + 759 | | /// @param interfaceId A specified interface Id. + 760 | | /// @return True if this contract implements the interface defined by interfaceId. + 761 | | function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + 762 | | return interfaceId == type(IERC20).interfaceId || interfaceId == type(IVotes).interfaceId || + 763 | | interfaceId == type(IERC165).interfaceId; + 764 | | } + 765 | | + 766 | | /// @dev Reverts the transfer of this token. + 767 | | function transfer(address to, uint256 amount) external virtual override returns (bool) { + 768 | | revert NonTransferable(address(this)); + 769 | | } + 770 | | + 771 | | /// @dev Reverts the approval of this token. + 772 | | function approve(address spender, uint256 amount) external virtual override returns (bool) { + 773 | | revert NonTransferable(address(this)); + 774 | | } + 775 | | + 776 | | /// @dev Reverts the transferFrom of this token. + 777 | | function transferFrom(address from, address to, uint256 amount) external virtual override returns (bool) { + 778 | | revert NonTransferable(address(this)); + 779 | | } + 780 | | + 781 | | /// @dev Reverts the allowance of this token. + 782 | | function allowance(address owner, address spender) external view virtual override returns (uint256) + 783 | | { + 784 | | revert NonTransferable(address(this)); + 785 | | } + 786 | | + 787 | | /// @dev Reverts delegates of this token. + 788 | | function delegates(address account) external view virtual override returns (address) + 789 | | { + 790 | | revert NonDelegatable(address(this)); + 791 | | } + 792 | | + 793 | | /// @dev Reverts delegate for this token. + 794 | | function delegate(address delegatee) external virtual override + 795 | | { + 796 | | revert NonDelegatable(address(this)); + 797 | | } + 798 | | + 799 | | /// @dev Reverts delegateBySig for this token. + 800 | | function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) + 801 | | external virtual override + 802 | | { + 803 | | revert NonDelegatable(address(this)); + 804 | | } + 805 | | } + 806 | | + + +
+ +/home/andrey/valory/autonolas-governance/lib/solmate/src/tokens/ERC20.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity >=0.8.0; + 3 | | + 4 | | /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. + 5 | | /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) + 6 | | /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) + 7 | | /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. + 8 | | abstract contract ERC20 { + 9 | | /*////////////////////////////////////////////////////////////// + 10 | | EVENTS + 11 | | //////////////////////////////////////////////////////////////*/ + 12 | | + 13 | | event Transfer(address indexed from, address indexed to, uint256 amount); + 14 | | + 15 | | event Approval(address indexed owner, address indexed spender, uint256 amount); + 16 | | + 17 | | /*////////////////////////////////////////////////////////////// + 18 | | METADATA STORAGE + 19 | | //////////////////////////////////////////////////////////////*/ + 20 | | + 21 | | string public name; + 22 | | + 23 | | string public symbol; + 24 | | + 25 | | uint8 public immutable decimals; + 26 | | + 27 | | /*////////////////////////////////////////////////////////////// + 28 | | ERC20 STORAGE + 29 | | //////////////////////////////////////////////////////////////*/ + 30 | | + 31 | | uint256 public totalSupply; + 32 | | + 33 | * | mapping(address => uint256) public balanceOf; + 34 | | + 35 | | mapping(address => mapping(address => uint256)) public allowance; + 36 | | + 37 | | /*////////////////////////////////////////////////////////////// + 38 | | EIP-2612 STORAGE + 39 | | //////////////////////////////////////////////////////////////*/ + 40 | | + 41 | | uint256 internal immutable INITIAL_CHAIN_ID; + 42 | | + 43 | | bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + 44 | | + 45 | | mapping(address => uint256) public nonces; + 46 | | + 47 | | /*////////////////////////////////////////////////////////////// + 48 | | CONSTRUCTOR + 49 | | //////////////////////////////////////////////////////////////*/ + 50 | | + 51 | | constructor( + 52 | | string memory _name, + 53 | | string memory _symbol, + 54 | | uint8 _decimals + 55 | | ) { + 56 | | name = _name; + 57 | | symbol = _symbol; + 58 | | decimals = _decimals; + 59 | | + 60 | | INITIAL_CHAIN_ID = block.chainid; + 61 | | INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + 62 | | } + 63 | | + 64 | | /*////////////////////////////////////////////////////////////// + 65 | | ERC20 LOGIC + 66 | | //////////////////////////////////////////////////////////////*/ + 67 | | + 68 | * | function approve(address spender, uint256 amount) public virtual returns (bool) { + 69 | * | allowance[msg.sender][spender] = amount; + 70 | | + 71 | * | emit Approval(msg.sender, spender, amount); + 72 | | + 73 | * | return true; + 74 | | } + 75 | | + 76 | | function transfer(address to, uint256 amount) public virtual returns (bool) { + 77 | | balanceOf[msg.sender] -= amount; + 78 | | + 79 | | // Cannot overflow because the sum of all user + 80 | | // balances can't exceed the max uint256 value. + 81 | | unchecked { + 82 | | balanceOf[to] += amount; + 83 | | } + 84 | | + 85 | | emit Transfer(msg.sender, to, amount); + 86 | | + 87 | | return true; + 88 | | } + 89 | | + 90 | * | function transferFrom( + 91 | | address from, + 92 | | address to, + 93 | | uint256 amount + 94 | * | ) public virtual returns (bool) { + 95 | * | uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + 96 | | + 97 | * | if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + 98 | | + 99 | * | balanceOf[from] -= amount; + 100 | | + 101 | | // Cannot overflow because the sum of all user + 102 | | // balances can't exceed the max uint256 value. + 103 | | unchecked { + 104 | * | balanceOf[to] += amount; + 105 | | } + 106 | | + 107 | * | emit Transfer(from, to, amount); + 108 | | + 109 | * | return true; + 110 | | } + 111 | | + 112 | | /*////////////////////////////////////////////////////////////// + 113 | | EIP-2612 LOGIC + 114 | | //////////////////////////////////////////////////////////////*/ + 115 | | + 116 | | function permit( + 117 | | address owner, + 118 | | address spender, + 119 | | uint256 value, + 120 | | uint256 deadline, + 121 | | uint8 v, + 122 | | bytes32 r, + 123 | | bytes32 s + 124 | | ) public virtual { + 125 | | require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + 126 | | + 127 | | // Unchecked because the only math done is incrementing + 128 | | // the owner's nonce which cannot realistically overflow. + 129 | | unchecked { + 130 | | address recoveredAddress = ecrecover( + 131 | | keccak256( + 132 | | abi.encodePacked( + 133 | | "\x19\x01", + 134 | | DOMAIN_SEPARATOR(), + 135 | | keccak256( + 136 | | abi.encode( + 137 | | keccak256( + 138 | | "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + 139 | | ), + 140 | | owner, + 141 | | spender, + 142 | | value, + 143 | | nonces[owner]++, + 144 | | deadline + 145 | | ) + 146 | | ) + 147 | | ) + 148 | | ), + 149 | | v, + 150 | | r, + 151 | | s + 152 | | ); + 153 | | + 154 | | require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + 155 | | + 156 | | allowance[recoveredAddress][spender] = value; + 157 | | } + 158 | | + 159 | | emit Approval(owner, spender, value); + 160 | | } + 161 | | + 162 | | function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + 163 | | return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + 164 | | } + 165 | | + 166 | | function computeDomainSeparator() internal view virtual returns (bytes32) { + 167 | | return + 168 | | keccak256( + 169 | | abi.encode( + 170 | | keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + 171 | | keccak256(bytes(name)), + 172 | | keccak256("1"), + 173 | | block.chainid, + 174 | | address(this) + 175 | | ) + 176 | | ); + 177 | | } + 178 | | + 179 | | /*////////////////////////////////////////////////////////////// + 180 | | INTERNAL MINT/BURN LOGIC + 181 | | //////////////////////////////////////////////////////////////*/ + 182 | | + 183 | | function _mint(address to, uint256 amount) internal virtual { + 184 | | totalSupply += amount; + 185 | | + 186 | | // Cannot overflow because the sum of all user + 187 | | // balances can't exceed the max uint256 value. + 188 | | unchecked { + 189 | | balanceOf[to] += amount; + 190 | | } + 191 | | + 192 | | emit Transfer(address(0), to, amount); + 193 | | } + 194 | | + 195 | | function _burn(address from, uint256 amount) internal virtual { + 196 | | balanceOf[from] -= amount; + 197 | | + 198 | | // Cannot underflow because a user's balance + 199 | | // will never be larger than the total supply. + 200 | | unchecked { + 201 | | totalSupply -= amount; + 202 | | } + 203 | | + 204 | | emit Transfer(from, address(0), amount); + 205 | | } + 206 | | } + 207 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) + 3 | | pragma solidity ^0.8.0; + 4 | | + 5 | | /** + 6 | | * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. + 7 | | * + 8 | | * _Available since v4.5._ + 9 | | */ + 10 | | interface IVotes { + 11 | | /** + 12 | | * @dev Emitted when an account changes their delegate. + 13 | | */ + 14 | | event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + 15 | | + 16 | | /** + 17 | | * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. + 18 | | */ + 19 | | event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + 20 | | + 21 | | /** + 22 | | * @dev Returns the current amount of votes that `account` has. + 23 | | */ + 24 | | function getVotes(address account) external view returns (uint256); + 25 | | + 26 | | /** + 27 | | * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). + 28 | | */ + 29 | | function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); + 30 | | + 31 | | /** + 32 | | * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). + 33 | | * + 34 | | * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. + 35 | | * Votes that have not been delegated are still part of total supply, even though they would not participate in a + 36 | | * vote. + 37 | | */ + 38 | | function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); + 39 | | + 40 | | /** + 41 | | * @dev Returns the delegate that `account` has chosen. + 42 | | */ + 43 | | function delegates(address account) external view returns (address); + 44 | | + 45 | | /** + 46 | | * @dev Delegates votes from the sender to `delegatee`. + 47 | | */ + 48 | | function delegate(address delegatee) external; + 49 | | + 50 | | /** + 51 | | * @dev Delegates votes from signer to `delegatee`. + 52 | | */ + 53 | | function delegateBySig( + 54 | | address delegatee, + 55 | | uint256 nonce, + 56 | | uint256 expiry, + 57 | | uint8 v, + 58 | | bytes32 r, + 59 | | bytes32 s + 60 | | ) external; + 61 | | } + 62 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) + 3 | | + 4 | | pragma solidity ^0.8.0; + 5 | | + 6 | | /** + 7 | | * @dev Interface of the ERC20 standard as defined in the EIP. + 8 | | */ + 9 | | interface IERC20 { + 10 | | /** + 11 | | * @dev Emitted when `value` tokens are moved from one account (`from`) to + 12 | | * another (`to`). + 13 | | * + 14 | | * Note that `value` may be zero. + 15 | | */ + 16 | | event Transfer(address indexed from, address indexed to, uint256 value); + 17 | | + 18 | | /** + 19 | | * @dev Emitted when the allowance of a `spender` for an `owner` is set by + 20 | | * a call to {approve}. `value` is the new allowance. + 21 | | */ + 22 | | event Approval(address indexed owner, address indexed spender, uint256 value); + 23 | | + 24 | | /** + 25 | | * @dev Returns the amount of tokens in existence. + 26 | | */ + 27 | | function totalSupply() external view returns (uint256); + 28 | | + 29 | | /** + 30 | | * @dev Returns the amount of tokens owned by `account`. + 31 | | */ + 32 | | function balanceOf(address account) external view returns (uint256); + 33 | | + 34 | | /** + 35 | | * @dev Moves `amount` tokens from the caller's account to `to`. + 36 | | * + 37 | | * Returns a boolean value indicating whether the operation succeeded. + 38 | | * + 39 | | * Emits a {Transfer} event. + 40 | | */ + 41 | | function transfer(address to, uint256 amount) external returns (bool); + 42 | | + 43 | | /** + 44 | | * @dev Returns the remaining number of tokens that `spender` will be + 45 | | * allowed to spend on behalf of `owner` through {transferFrom}. This is + 46 | | * zero by default. + 47 | | * + 48 | | * This value changes when {approve} or {transferFrom} are called. + 49 | | */ + 50 | | function allowance(address owner, address spender) external view returns (uint256); + 51 | | + 52 | | /** + 53 | | * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + 54 | | * + 55 | | * Returns a boolean value indicating whether the operation succeeded. + 56 | | * + 57 | | * IMPORTANT: Beware that changing an allowance with this method brings the risk + 58 | | * that someone may use both the old and the new allowance by unfortunate + 59 | | * transaction ordering. One possible solution to mitigate this race + 60 | | * condition is to first reduce the spender's allowance to 0 and set the + 61 | | * desired value afterwards: + 62 | | * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + 63 | | * + 64 | | * Emits an {Approval} event. + 65 | | */ + 66 | | function approve(address spender, uint256 amount) external returns (bool); + 67 | | + 68 | | /** + 69 | | * @dev Moves `amount` tokens from `from` to `to` using the + 70 | | * allowance mechanism. `amount` is then deducted from the caller's + 71 | | * allowance. + 72 | | * + 73 | | * Returns a boolean value indicating whether the operation succeeded. + 74 | | * + 75 | | * Emits a {Transfer} event. + 76 | | */ + 77 | | function transferFrom( + 78 | | address from, + 79 | | address to, + 80 | | uint256 amount + 81 | | ) external returns (bool); + 82 | | } + 83 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) + 3 | | + 4 | | pragma solidity ^0.8.0; + 5 | | + 6 | | /** + 7 | | * @dev Interface of the ERC165 standard, as defined in the + 8 | | * https://eips.ethereum.org/EIPS/eip-165[EIP]. + 9 | | * + 10 | | * Implementers can declare support of contract interfaces, which can then be + 11 | | * queried by others ({ERC165Checker}). + 12 | | * + 13 | | * For an implementation, see {ERC165}. + 14 | | */ + 15 | | interface IERC165 { + 16 | | /** + 17 | | * @dev Returns true if this contract implements the interface defined by + 18 | | * `interfaceId`. See the corresponding + 19 | | * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + 20 | | * to learn more about how these ids are created. + 21 | | * + 22 | | * This function call must use less than 30 000 gas. + 23 | | */ + 24 | | function supportsInterface(bytes4 interfaceId) external view returns (bool); + 25 | | } + 26 | | + + +
+ diff --git a/audits/internal11/fuzzing/corpusEchidna/covered.1713373572.html b/audits/internal11/fuzzing/corpusEchidna/covered.1713373572.html new file mode 100644 index 0000000..f4f6767 --- /dev/null +++ b/audits/internal11/fuzzing/corpusEchidna/covered.1713373572.html @@ -0,0 +1,2073 @@ +/home/andrey/valory/autonolas-governance/contracts/OLAS.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | import "../lib/solmate/src/tokens/ERC20.sol"; + 5 | | + 6 | | /// @dev Only `manager` has a privilege, but the `sender` was provided. + 7 | | /// @param sender Sender address. + 8 | | /// @param manager Required sender address as a manager. + 9 | | error ManagerOnly(address sender, address manager); + 10 | | + 11 | | /// @dev Provided zero address. + 12 | | error ZeroAddress(); + 13 | | + 14 | | /// @title OLAS - Smart contract for the OLAS token. + 15 | | /// @author AL + 16 | | /// @author Aleksandr Kuperman - <aleksandr.kuperman@valory.xyz> + 17 | * | contract OLAS is ERC20 { + 18 | | event MinterUpdated(address indexed minter); + 19 | | event OwnerUpdated(address indexed owner); + 20 | | + 21 | | // One year interval + 22 | | uint256 public constant oneYear = 1 days * 365; + 23 | | // Total supply cap for the first ten years (one billion OLAS tokens) + 24 | | uint256 public constant tenYearSupplyCap = 1_000_000_000e18; + 25 | | // Maximum annual inflation after first ten years + 26 | | uint256 public constant maxMintCapFraction = 2; + 27 | | // Initial timestamp of the token deployment + 28 | | uint256 public immutable timeLaunch; + 29 | | + 30 | | // Owner address + 31 | | address public owner; + 32 | | // Minter address + 33 | | address public minter; + 34 | | + 35 | | constructor() ERC20("Autonolas", "OLAS", 18) { + 36 | | owner = msg.sender; + 37 | | minter = msg.sender; + 38 | | timeLaunch = block.timestamp; + 39 | | } + 40 | | + 41 | | /// @dev Changes the owner address. + 42 | | /// @param newOwner Address of a new owner. + 43 | | function changeOwner(address newOwner) external { + 44 | | if (msg.sender != owner) { + 45 | | revert ManagerOnly(msg.sender, owner); + 46 | | } + 47 | | + 48 | | if (newOwner == address(0)) { + 49 | | revert ZeroAddress(); + 50 | | } + 51 | | + 52 | | owner = newOwner; + 53 | | emit OwnerUpdated(newOwner); + 54 | | } + 55 | | + 56 | | /// @dev Changes the minter address. + 57 | | /// @param newMinter Address of a new minter. + 58 | | function changeMinter(address newMinter) external { + 59 | | if (msg.sender != owner) { + 60 | | revert ManagerOnly(msg.sender, owner); + 61 | | } + 62 | | + 63 | | if (newMinter == address(0)) { + 64 | | revert ZeroAddress(); + 65 | | } + 66 | | + 67 | | minter = newMinter; + 68 | | emit MinterUpdated(newMinter); + 69 | | } + 70 | | + 71 | | /// @dev Mints OLAS tokens. + 72 | | /// @notice If the inflation control does not pass, the revert does not take place, as well as no action is performed. + 73 | | /// @param account Account address. + 74 | | /// @param amount OLAS token amount. + 75 | | function mint(address account, uint256 amount) external { + 76 | | // Access control + 77 | | if (msg.sender != minter) { + 78 | | revert ManagerOnly(msg.sender, minter); + 79 | | } + 80 | | + 81 | | // Check the inflation schedule and mint + 82 | | if (inflationControl(amount)) { + 83 | | _mint(account, amount); + 84 | | } + 85 | | } + 86 | | + 87 | | /// @dev Provides various checks for the inflation control. + 88 | | /// @notice The `<=` check is left as is for a better code readability. + 89 | | /// @param amount Amount of OLAS to mint. + 90 | | /// @return True if the amount request is within inflation boundaries. + 91 | | function inflationControl(uint256 amount) public view returns (bool) { + 92 | | uint256 remainder = inflationRemainder(); + 93 | | return (amount <= remainder); + 94 | | } + 95 | | + 96 | | /// @dev Gets the reminder of OLAS possible for the mint. + 97 | | /// @return remainder OLAS token remainder. + 98 | | function inflationRemainder() public view returns (uint256 remainder) { + 99 | | uint256 _totalSupply = totalSupply; + 100 | | // Current year + 101 | | uint256 numYears = (block.timestamp - timeLaunch) / oneYear; + 102 | | // Calculate maximum mint amount to date + 103 | | uint256 supplyCap = tenYearSupplyCap; + 104 | | // After 10 years, adjust supplyCap according to the yearly inflation % set in maxMintCapFraction + 105 | | if (numYears > 9) { + 106 | | // Number of years after ten years have passed (including ongoing ones) + 107 | | numYears -= 9; + 108 | | for (uint256 i = 0; i < numYears; ++i) { + 109 | | supplyCap += (supplyCap * maxMintCapFraction) / 100; + 110 | | } + 111 | | } + 112 | | // Check for the requested mint overflow + 113 | | remainder = supplyCap - _totalSupply; + 114 | | } + 115 | | + 116 | | /// @dev Burns OLAS tokens. + 117 | | /// @param amount OLAS token amount to burn. + 118 | | function burn(uint256 amount) external { + 119 | | _burn(msg.sender, amount); + 120 | | } + 121 | | + 122 | | /// @dev Decreases the allowance of another account over their tokens. + 123 | | /// @notice This implementation does not decrease spender allowance if the maximum allowance was granted. + 124 | | /// @notice The underflow condition is treated by the default code generation check. + 125 | | /// @param spender Account that tokens are approved for. + 126 | | /// @param amount Amount to decrease approval by. + 127 | | /// @return True if the operation succeeded. + 128 | | function decreaseAllowance(address spender, uint256 amount) external returns (bool) { + 129 | | uint256 spenderAllowance = allowance[msg.sender][spender]; + 130 | | + 131 | | if (spenderAllowance != type(uint256).max) { + 132 | | spenderAllowance -= amount; + 133 | | allowance[msg.sender][spender] = spenderAllowance; + 134 | | emit Approval(msg.sender, spender, spenderAllowance); + 135 | | } + 136 | | + 137 | | return true; + 138 | | } + 139 | | + 140 | | /// @dev Increases the allowance of another account over their tokens. + 141 | | /// @notice The overflow condition is treated by the default code generation check. + 142 | | /// @param spender Account that tokens are approved for. + 143 | | /// @param amount Amount to increase approval by. + 144 | | /// @return True if the operation succeeded. + 145 | | function increaseAllowance(address spender, uint256 amount) external returns (bool) { + 146 | | uint256 spenderAllowance = allowance[msg.sender][spender]; + 147 | | + 148 | | spenderAllowance += amount; + 149 | | allowance[msg.sender][spender] = spenderAllowance; + 150 | | emit Approval(msg.sender, spender, spenderAllowance); + 151 | | + 152 | | return true; + 153 | | } + 154 | | } + 155 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/interfaces/IErrors.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | /// @dev Errors. + 5 | | interface IErrors { + 6 | | /// @dev Only `owner` has a privilege, but the `sender` was provided. + 7 | | /// @param sender Sender address. + 8 | | /// @param owner Required sender address as an owner. + 9 | | error OwnerOnly(address sender, address owner); + 10 | | + 11 | | /// @dev Provided zero address. + 12 | | error ZeroAddress(); + 13 | | + 14 | | /// @dev Zero value when it has to be different from zero. + 15 | | error ZeroValue(); + 16 | | + 17 | | /// @dev Non-zero value when it has to be zero. + 18 | | error NonZeroValue(); + 19 | | + 20 | | /// @dev Wrong length of two arrays. + 21 | | /// @param numValues1 Number of values in a first array. + 22 | | /// @param numValues2 Numberf of values in a second array. + 23 | | error WrongArrayLength(uint256 numValues1, uint256 numValues2); + 24 | | + 25 | | /// @dev Value overflow. + 26 | | /// @param provided Overflow value. + 27 | | /// @param max Maximum possible value. + 28 | | error Overflow(uint256 provided, uint256 max); + 29 | | + 30 | | /// @dev Token is non-transferable. + 31 | | /// @param account Token address. + 32 | | error NonTransferable(address account); + 33 | | + 34 | | /// @dev Token is non-delegatable. + 35 | | /// @param account Token address. + 36 | | error NonDelegatable(address account); + 37 | | + 38 | | /// @dev Insufficient token allowance. + 39 | | /// @param provided Provided amount. + 40 | | /// @param expected Minimum expected amount. + 41 | | error InsufficientAllowance(uint256 provided, uint256 expected); + 42 | | + 43 | | /// @dev No existing lock value is found. + 44 | | /// @param account Address that is checked for the locked value. + 45 | | error NoValueLocked(address account); + 46 | | + 47 | | /// @dev Locked value is not zero. + 48 | | /// @param account Address that is checked for the locked value. + 49 | | /// @param amount Locked amount. + 50 | | error LockedValueNotZero(address account, uint256 amount); + 51 | | + 52 | | /// @dev Value lock is expired. + 53 | | /// @param account Address that is checked for the locked value. + 54 | | /// @param deadline The lock expiration deadline. + 55 | | /// @param curTime Current timestamp. + 56 | | error LockExpired(address account, uint256 deadline, uint256 curTime); + 57 | | + 58 | | /// @dev Value lock is not expired. + 59 | | /// @param account Address that is checked for the locked value. + 60 | | /// @param deadline The lock expiration deadline. + 61 | | /// @param curTime Current timestamp. + 62 | | error LockNotExpired(address account, uint256 deadline, uint256 curTime); + 63 | | + 64 | | /// @dev Provided unlock time is incorrect. + 65 | | /// @param account Address that is checked for the locked value. + 66 | | /// @param minUnlockTime Minimal unlock time that can be set. + 67 | | /// @param providedUnlockTime Provided unlock time. + 68 | | error UnlockTimeIncorrect(address account, uint256 minUnlockTime, uint256 providedUnlockTime); + 69 | | + 70 | | /// @dev Provided unlock time is bigger than the maximum allowed. + 71 | | /// @param account Address that is checked for the locked value. + 72 | | /// @param maxUnlockTime Max unlock time that can be set. + 73 | | /// @param providedUnlockTime Provided unlock time. + 74 | | error MaxUnlockTimeReached(address account, uint256 maxUnlockTime, uint256 providedUnlockTime); + 75 | | + 76 | | /// @dev Provided block number is incorrect (has not been processed yet). + 77 | | /// @param providedBlockNumber Provided block number. + 78 | | /// @param actualBlockNumber Actual block number. + 79 | | error WrongBlockNumber(uint256 providedBlockNumber, uint256 actualBlockNumber); + 80 | | } + 81 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/test/EchidnaVoteWeightingAssert.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.23; + 3 | | + 4 | | import "../OLAS.sol"; + 5 | | import "../veOLAS.sol"; + 6 | | import "./VoteWeightingFuzzing.sol"; + 7 | | + 8 | | + 9 | *r | contract EchidnaVoteWeightingAssert { + 10 | | OLAS olas; + 11 | | veOLAS ve; + 12 | | VoteWeightingFuzzing vw; + 13 | | uint160 constant FAKE_OLAS = 7; + 14 | | + 15 | | uint256 constant oneOLASBalance = 1 ether; + 16 | * | uint256 constant fourYear = 4 * 365 * 86400; + 17 | | uint256 constant oneYear = 1 * 365 * 86400; + 18 | * | uint256 constant maxVoteWeight = 10000; + 19 | | uint64 constant WEEK = 1 weeks; + 20 | * | uint256 constant oneOLAS = 1 ether; + 21 | | uint256 constant oneMLN = 1_000_000; + 22 | | uint256 ts; + 23 | | + 24 | | // msg.sender in Echidna + 25 | | address[3] private senders = [ address(0x10000), address(0x20000), address(0x30000) ]; + 26 | | + 27 | | constructor() payable { + 28 | | olas = new OLAS(); + 29 | | address aolas = address(olas); + 30 | | ve = new veOLAS(aolas, "Voting Escrow OLAS", "veOLAS"); + 31 | | address ave = address(ve); + 32 | | vw = new VoteWeightingFuzzing(ave); + 33 | | olas.mint(address(this),oneOLAS*oneMLN); + 34 | | } + 35 | | + 36 | | // voteForNomineeWeights_assert(0xdeadbeef,1,0,4495678220902361,1124857) + 37 | * | function voteForNomineeWeights_assert(address nominee, uint32 chainId, uint16 weight, uint256 amount, uint32 unlockTime) external { + 38 | * | require(block.timestamp > 0); + 39 | *r | require(block.timestamp > ts); + 40 | *r | require(unlockTime < fourYear); + 41 | *r | require(weight < maxVoteWeight); + 42 | *r | require(amount < 100 * oneOLAS); + 43 | * | uint256 balanceOf = olas.balanceOf(address(this)); + 44 | * | assert(balanceOf > amount); + 45 | * | (uint128 initialAmount,) = ve.mapLockedBalances(address(this)); + 46 | * | if (initialAmount == 0) { + 47 | * | olas.approve(address(ve), amount); + 48 | *r | ve.createLock(amount, unlockTime); + 49 | * | (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + 50 | * | assert(lockedAmount > 0); + 51 | * | } else { + 52 | * | (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + 53 | * | assert(lockedAmount > 0); + 54 | | } + 55 | *r | vw.addNominee(nominee, chainId); + 56 | * | uint256 id = vw.getNomineeId(nominee, chainId); + 57 | * | uint256 num = vw.getNumNominees(); + 58 | * | assert(id > 0); + 59 | * | assert(num > 0); + 60 | * | vw.setCallVoteForNomineeWeights(false); + 61 | * | bool beforeAfterCall = vw.callVoteForNomineeWeights(); + 62 | * | assert(beforeAfterCall == false); + 63 | *r | vw.voteForNomineeWeights(nominee, chainId, weight); + 64 | * | bool stateAfterCall = vw.callVoteForNomineeWeights(); + 65 | * | if(stateAfterCall == true) { + 66 | * | uint256 lts = vw.getlastUserVote(nominee,chainId); + 67 | * | assert(lts > 0); + 68 | | } + 69 | * | ts = block.timestamp; // next timestamp > timestamp + 70 | * | vw.checkpointNominee(nominee, chainId); + 71 | | } + 72 | | + 73 | | } + 74 | | + 75 | | + + +
+ +/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.23; + 3 | | + 4 | | import "../interfaces/IErrors.sol"; + 5 | | + 6 | | interface IVEOLAS { + 7 | | // Structure for voting escrow points + 8 | | // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + 9 | | struct PointVoting { + 10 | | // w(i) = at + b (bias) + 11 | | int128 bias; + 12 | | // dw / dt = a (slope) + 13 | | int128 slope; + 14 | | // Timestamp. It will never practically be bigger than 2^64 - 1 + 15 | | uint64 ts; + 16 | | // Block number. It will not be bigger than the timestamp + 17 | | uint64 blockNumber; + 18 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 19 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 20 | | uint128 balance; + 21 | | } + 22 | | + 23 | | /// @dev Gets the `account`'s lock end time. + 24 | | /// @param account Account address. + 25 | | /// @return unlockTime Lock end time. + 26 | | function lockedEnd(address account) external view returns (uint256 unlockTime); + 27 | | + 28 | | /// @dev Gets the most recently recorded user point for `account`. + 29 | | /// @param account Account address. + 30 | | /// @return pv Last checkpoint. + 31 | | function getLastUserPoint(address account) external view returns (PointVoting memory pv); + 32 | | } + 33 | | + 34 | | error NomineeDoesNotExist(address nominee, uint256 chainId); + 35 | | error NomineeAlreadyExists(address nominee, uint256 chainId); + 36 | | error VoteTooOften(address voter, uint256 curTime, uint256 nextAllowedVotingTime); + 37 | | + 38 | | struct Point { + 39 | | uint256 bias; + 40 | | uint256 slope; + 41 | | } + 42 | | + 43 | | struct VotedSlope { + 44 | | uint256 slope; + 45 | | uint256 power; + 46 | | uint256 end; + 47 | | } + 48 | | + 49 | * | contract VoteWeightingFuzzing is IErrors { + 50 | | event NewNomineeWeight(address indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); + 51 | | event VoteForNominee(address indexed user, address indexed nominee, uint256 chainId, uint256 weight); + 52 | | event NewNominee(address nominee, uint256 chainId); + 53 | | + 54 | | // 7 * 86400 seconds - all future times are rounded by week + 55 | * | uint256 public constant WEEK = 604_800; + 56 | | // Cannot change weight votes more often than once in 10 days + 57 | * | uint256 public constant WEIGHT_VOTE_DELAY = 864_000; + 58 | | // Max weight amount + 59 | * | uint256 public constant MAX_WEIGHT = 10_000; + 60 | | // Maximum chain Id as per EVM specs + 61 | * | uint256 public constant MAX_CHAIN_ID = type(uint64).max / 2 - 36; + 62 | | // veOLAS contract address + 63 | | address public immutable ve; + 64 | | + 65 | * | bool public callVoteForNomineeWeights = false; + 66 | | + 67 | | // TODO: Convert both to cyclic map? + 68 | | // Set of (chainId | nominee) + 69 | | uint256[] public setNominees; + 70 | | // Mapping of (chainId | nominee) => nominee Id + 71 | | mapping(uint256 => uint256) public mapNomineeIds; + 72 | | + 73 | | // user -> (chainId | nominee) -> VotedSlope + 74 | | mapping(address => mapping(uint256 => VotedSlope)) public voteUserSlopes; + 75 | | // Total vote power used by user + 76 | | mapping(address => uint256) public voteUserPower; + 77 | | // Last user vote's timestamp for each (chainId | nominee) + 78 | | mapping(address => mapping(uint256 => uint256)) public lastUserVote; + 79 | | + 80 | | // Past and scheduled points for nominee weight, sum of weights per type, total weight + 81 | | // Point is for bias+slope + 82 | | // changes_* are for changes in slope + 83 | | // time_* are for the last change timestamp + 84 | | // timestamps are rounded to whole weeks + 85 | | + 86 | | // (chainId | nominee) -> time -> Point + 87 | | mapping(uint256 => mapping(uint256 => Point)) public pointsWeight; + 88 | | // (chainId | nominee) -> time -> slope + 89 | | mapping(uint256 => mapping(uint256 => uint256)) public changesWeight; + 90 | | // (chainId | nominee) -> last scheduled time (next week) + 91 | | mapping(uint256 => uint256) public timeWeight; + 92 | | + 93 | | // time -> Point + 94 | | mapping(uint256 => Point) public pointsSum; + 95 | | // time -> slope + 96 | | mapping(uint256 => uint256) public changesSum; + 97 | | // last scheduled time (next week) + 98 | | uint256 public timeSum; + 99 | | + 100 | | /// @dev Contract constructor. + 101 | | /// @param _ve `VotingEscrow` contract address. + 102 | | constructor(address _ve) { + 103 | | // Check for the zero address + 104 | | if (_ve == address(0)) { + 105 | | revert ZeroAddress(); + 106 | | } + 107 | | + 108 | | // Set initial parameters + 109 | | ve = _ve; + 110 | | timeSum = block.timestamp / WEEK * WEEK; + 111 | | setNominees.push(0); + 112 | | } + 113 | | + 114 | | /// @dev Fill sum of nominee weights for the same type week-over-week for missed checkins and return the sum for the future week. + 115 | | /// @return Sum of weights. + 116 | * | function _getSum() internal returns (uint256) { + 117 | | // t is always > 0 as it is set in the constructor + 118 | * | uint256 t = timeSum; + 119 | * | Point memory pt = pointsSum[t]; + 120 | * | for (uint256 i = 0; i < 500; i++) { + 121 | * | if (t > block.timestamp) { + 122 | * | break; + 123 | | } + 124 | * | t += WEEK; + 125 | * | uint256 dBias = pt.slope * WEEK; + 126 | * | if (pt.bias > dBias) { + 127 | | pt.bias -= dBias; + 128 | | uint256 dSlope = changesSum[t]; + 129 | | pt.slope -= dSlope; + 130 | | } else { + 131 | * | pt.bias = 0; + 132 | * | pt.slope = 0; + 133 | | } + 134 | | + 135 | * | pointsSum[t] = pt; + 136 | * | if (t > block.timestamp) { + 137 | * | timeSum = t; + 138 | | } + 139 | | } + 140 | * | return pt.bias; + 141 | | } + 142 | | + 143 | | /// @dev Fill historic nominee weights week-over-week for missed checkins and return the total for the future week. + 144 | | /// @param nominee Address of the nominee. + 145 | | /// @param chainId Chain Id. + 146 | | /// @return Nominee weight. + 147 | * | function _getWeight(address nominee, uint256 chainId) internal returns (uint256) { + 148 | | // Push a pair of key defining variables into one key + 149 | | // Nominee address and chain Id + 150 | | // nominee occupies first 160 bits + 151 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 152 | | // chain Id occupies no more than next 64 bits + 153 | * | nomineeChainId |= chainId << 160; + 154 | | + 155 | | // Check that the nominee exists + 156 | * | if (mapNomineeIds[nomineeChainId] == 0) { + 157 | | revert NomineeDoesNotExist(nominee, chainId); + 158 | | } + 159 | | + 160 | | // t is always > 0 as it is set during the addNominee() call + 161 | * | uint256 t = timeWeight[nomineeChainId]; + 162 | * | Point memory pt = pointsWeight[nomineeChainId][t]; + 163 | * | for (uint256 i = 0; i < 500; i++) { + 164 | * | if (t > block.timestamp) { + 165 | * | break; + 166 | | } + 167 | | t += WEEK; + 168 | | uint256 dBias = pt.slope * WEEK; + 169 | | if (pt.bias > dBias) { + 170 | | pt.bias -= dBias; + 171 | | uint256 dSlope = changesWeight[nomineeChainId][t]; + 172 | | pt.slope -= dSlope; + 173 | | } else { + 174 | | pt.bias = 0; + 175 | | pt.slope = 0; + 176 | | } + 177 | | + 178 | | pointsWeight[nomineeChainId][t] = pt; + 179 | | if (t > block.timestamp) { + 180 | | timeWeight[nomineeChainId] = t; + 181 | | } + 182 | | } + 183 | * | return pt.bias; + 184 | | } + 185 | | + 186 | | /// @dev Add nominee address along with the chain Id. + 187 | | /// @param nominee Address of the nominee. + 188 | | /// @param chainId Chain Id. + 189 | * | function addNominee(address nominee, uint256 chainId) external { + 190 | | // Check for the zero address + 191 | * | if (nominee == address(0)) { + 192 | * | revert ZeroAddress(); + 193 | | } + 194 | | + 195 | | // Check for the chain Id + 196 | * | if (chainId == 0) { + 197 | * | revert ZeroValue(); + 198 | | } + 199 | * | else if (chainId > MAX_CHAIN_ID) { + 200 | | revert Overflow(chainId, MAX_CHAIN_ID); + 201 | | } + 202 | | + 203 | | // Push a pair of key defining variables into one key + 204 | | // nominee occupies first 160 bits + 205 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 206 | | // chain Id occupies no more than next 64 bits + 207 | * | nomineeChainId |= chainId << 160; + 208 | | + 209 | | // Check for the nominee existence + 210 | * | if (mapNomineeIds[nomineeChainId] > 0) { + 211 | * | revert NomineeAlreadyExists(nominee, chainId); + 212 | | } + 213 | * | mapNomineeIds[nomineeChainId] = setNominees.length; + 214 | | // Push the nominee into the list + 215 | * | setNominees.push(nomineeChainId); + 216 | | + 217 | * | uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + 218 | * | timeWeight[nomineeChainId] = nextTime; + 219 | | + 220 | * | emit NewNominee(nominee, chainId); + 221 | | } + 222 | | + 223 | | /// @dev Checkpoint to fill data common for all nominees. + 224 | | function checkpoint() external { + 225 | | _getSum(); + 226 | | } + 227 | | + 228 | | /// @dev Checkpoint to fill data for both a specific nominee and common for all nominees. + 229 | | /// @param nominee Address of the nominee. + 230 | | /// @param chainId Chain Id. + 231 | * | function checkpointNominee(address nominee, uint256 chainId) external { + 232 | * | _getWeight(nominee, chainId); + 233 | * | _getSum(); + 234 | | } + 235 | | + 236 | | /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights. + 237 | | /// Inflation which will be received by it is inflation_rate * relativeWeight / 1e18. + 238 | | /// @param nominee Address of the nominee. + 239 | | /// @param chainId Chain Id. + 240 | | /// @param time Relative weight at the specified timestamp in the past or present. + 241 | | /// @return weight Value of relative weight normalized to 1e18. + 242 | | /// @return totalSum Sum of nominee weights. + 243 | | function _nomineeRelativeWeight( + 244 | | address nominee, + 245 | | uint256 chainId, + 246 | | uint256 time + 247 | | ) internal view returns (uint256 weight, uint256 totalSum) { + 248 | | uint256 t = time / WEEK * WEEK; + 249 | | totalSum = pointsSum[t].bias; + 250 | | + 251 | | // Push a pair of key defining variables into one key + 252 | | // nominee occupies first 160 bits + 253 | | uint256 nomineeChainId = uint256(uint160(nominee)); + 254 | | // chain Id occupies no more than next 64 bits + 255 | | nomineeChainId |= chainId << 160; + 256 | | + 257 | | if (totalSum > 0) { + 258 | | uint256 nomineeWeight = pointsWeight[nomineeChainId][t].bias; + 259 | | weight = 1e18 * nomineeWeight / totalSum; + 260 | | } + 261 | | } + 262 | | + 263 | | /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights. + 264 | | /// (e.g. 1.0 == 1e18). Inflation which will be received by it is + 265 | | /// inflation_rate * relativeWeight / 1e18. + 266 | | /// @param nominee Address of the nominee. + 267 | | /// @param chainId Chain Id. + 268 | | /// @param time Relative weight at the specified timestamp in the past or present. + 269 | | /// @return weight Value of relative weight normalized to 1e18. + 270 | | /// @return totalSum Sum of nominee weights. + 271 | | function nomineeRelativeWeight( + 272 | | address nominee, + 273 | | uint256 chainId, + 274 | | uint256 time + 275 | | ) external view returns (uint256 weight, uint256 totalSum) { + 276 | | (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + 277 | | } + 278 | | + 279 | | /// @dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. + 280 | | /// Also, get the total sum of all the nominee weights. + 281 | | /// @notice Any address can call, however nothing is recorded if the values are filled already. + 282 | | /// @param nominee Address of the nominee. + 283 | | /// @param chainId Chain Id. + 284 | | /// @param time Relative weight at the specified timestamp in the past or present. + 285 | | /// @return weight Value of relative weight normalized to 1e18. + 286 | | /// @return totalSum Sum of nominee weights. + 287 | | function nomineeRelativeWeightWrite( + 288 | | address nominee, + 289 | | uint256 chainId, + 290 | | uint256 time + 291 | | ) external returns (uint256 weight, uint256 totalSum) { + 292 | | _getWeight(nominee, chainId); + 293 | | _getSum(); + 294 | | (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + 295 | | } + 296 | | + 297 | | /// @dev Allocate voting power for changing pool weights. + 298 | | /// @param nominee Address of the nominee the `msg.sender` votes for. + 299 | | /// @param chainId Chain Id. + 300 | | /// @param weight Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + 301 | * | function voteForNomineeWeights(address nominee, uint256 chainId, uint256 weight) public { + 302 | | + 303 | | // Push a pair of key defining variables into one key + 304 | | // nominee occupies first 160 bits + 305 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 306 | | // chain Id occupies no more than next 64 bits + 307 | * | nomineeChainId |= chainId << 160; + 308 | | + 309 | * | uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); + 310 | * | uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); + 311 | * | uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + 312 | | + 313 | | // Check for the lock end expiration + 314 | * | if (nextTime >= lockEnd) { + 315 | * | revert LockExpired(msg.sender, lockEnd, nextTime); + 316 | | } + 317 | | + 318 | | // Check for the weight number + 319 | * | if (weight > MAX_WEIGHT) { + 320 | | revert Overflow(weight, MAX_WEIGHT); + 321 | | } + 322 | | + 323 | | // Check for the last voting time + 324 | * | uint256 nextAllowedVotingTime = lastUserVote[msg.sender][nomineeChainId] + WEIGHT_VOTE_DELAY; + 325 | * | if (nextAllowedVotingTime > block.timestamp) { + 326 | | revert VoteTooOften(msg.sender, block.timestamp, nextAllowedVotingTime); + 327 | | } + 328 | | + 329 | | // Prepare old and new slopes and biases + 330 | * | VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeChainId]; + 331 | * | uint256 oldBias; + 332 | * | if (oldSlope.end > nextTime) { + 333 | | oldBias = oldSlope.slope * (oldSlope.end - nextTime); + 334 | | } + 335 | | + 336 | * | VotedSlope memory newSlope = VotedSlope({ + 337 | * | slope: slope * weight / MAX_WEIGHT, + 338 | * | end: lockEnd, + 339 | * | power: weight + 340 | | }); + 341 | | + 342 | * | uint256 newBias = newSlope.slope * (lockEnd - nextTime); + 343 | | + 344 | * | uint256 powerUsed = voteUserPower[msg.sender]; + 345 | * | powerUsed = powerUsed + newSlope.power - oldSlope.power; + 346 | * | voteUserPower[msg.sender] = powerUsed; + 347 | * | if (powerUsed > MAX_WEIGHT) { + 348 | * | revert Overflow(powerUsed, MAX_WEIGHT); + 349 | | } + 350 | | + 351 | | // Remove old and schedule new slope changes + 352 | | // Remove slope changes for old slopes + 353 | | // Schedule recording of initial slope for nextTime + 354 | * | pointsWeight[nomineeChainId][nextTime].bias = _maxAndSub(_getWeight(nominee, chainId) + newBias, oldBias); + 355 | | + 356 | * | pointsSum[nextTime].bias = _maxAndSub(_getSum() + newBias, oldBias); + 357 | * | if (oldSlope.end > nextTime) { + 358 | | pointsWeight[nomineeChainId][nextTime].slope = _maxAndSub(pointsWeight[nomineeChainId][nextTime].slope + newSlope.slope, oldSlope.slope); + 359 | | pointsSum[nextTime].slope = _maxAndSub(pointsSum[nextTime].slope + newSlope.slope, oldSlope.slope); + 360 | | } else { + 361 | * | pointsWeight[nomineeChainId][nextTime].slope += newSlope.slope; + 362 | * | pointsSum[nextTime].slope += newSlope.slope; + 363 | | } + 364 | * | if (oldSlope.end > block.timestamp) { + 365 | | // Cancel old slope changes if they still didn't happen + 366 | | changesWeight[nomineeChainId][oldSlope.end] -= oldSlope.slope; + 367 | | changesSum[oldSlope.end] -= oldSlope.slope; + 368 | | } + 369 | | // Add slope changes for new slopes + 370 | * | changesWeight[nomineeChainId][newSlope.end] += newSlope.slope; + 371 | * | changesSum[newSlope.end] += newSlope.slope; + 372 | | + 373 | * | voteUserSlopes[msg.sender][nomineeChainId] = newSlope; + 374 | | + 375 | | // Record last action time + 376 | * | lastUserVote[msg.sender][nomineeChainId] = block.timestamp; + 377 | * | assert(lastUserVote[msg.sender][nomineeChainId] > 0); + 378 | | + 379 | * | callVoteForNomineeWeights = true; + 380 | * | emit VoteForNominee(msg.sender, nominee, chainId, weight); + 381 | | } + 382 | | + 383 | | /// @dev Allocate voting power for changing pool weights in batch. + 384 | | /// @param nominees Set of nominees the `msg.sender` votes for. + 385 | | /// @param chainIds Set of corresponding chain Ids. + 386 | | /// @param weights Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + 387 | | function voteForNomineeWeightsBatch( + 388 | | address[] memory nominees, + 389 | | uint256[] memory chainIds, + 390 | | uint256[] memory weights + 391 | | ) external { + 392 | | if (nominees.length != chainIds.length || nominees.length != weights.length) { + 393 | | revert WrongArrayLength(nominees.length, weights.length); + 394 | | } + 395 | | + 396 | | // Traverse all accounts and weights + 397 | | for (uint256 i = 0; i < nominees.length; ++i) { + 398 | | voteForNomineeWeights(nominees[i], chainIds[i], weights[i]); + 399 | | } + 400 | | } + 401 | | + 402 | * | function _maxAndSub(uint256 a, uint256 b) internal pure returns (uint256) { + 403 | * | return a > b ? a - b : 0; + 404 | | } + 405 | | + 406 | | /// @dev Get current nominee weight. + 407 | | /// @param nominee Address of the nominee. + 408 | | /// @param chainId Chain Id. + 409 | | /// @return Nominee weight. + 410 | | function getNomineeWeight(address nominee, uint256 chainId) external view returns (uint256) { + 411 | | // Push a pair of key defining variables into one key + 412 | | // nominee occupies first 160 bits + 413 | | uint256 nomineeChainId = uint256(uint160(nominee)); + 414 | | // chain Id occupies no more than next 64 bits + 415 | | nomineeChainId |= chainId << 160; + 416 | | + 417 | | return pointsWeight[nomineeChainId][timeWeight[nomineeChainId]].bias; + 418 | | } + 419 | | + 420 | | /// @dev Get sum of nominee weights. + 421 | | /// @return Sum of nominee weights. + 422 | | function getWeightsSum() external view returns (uint256) { + 423 | | return pointsSum[timeSum].bias; + 424 | | } + 425 | | + 426 | | /// @dev Get the number of nominees. + 427 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 428 | | /// @return Total number of nominees. + 429 | * | function getNumNominees() external view returns (uint256) { + 430 | * | return setNominees.length - 1; + 431 | | } + 432 | | + 433 | | /// @dev Gets the nominee Id in the global nominees set. + 434 | | /// @param nominee Nominee address. + 435 | | /// @param chainId Chain Id. + 436 | | /// @return id Nominee Id in the global set of (nominee | chainId) values. + 437 | * | function getNomineeId(address nominee, uint256 chainId) external view returns (uint256 id) { + 438 | | // Push a pair of key defining variables into one key + 439 | | // nominee occupies first 160 bits + 440 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 441 | | // chain Id occupies no more than next 64 bits + 442 | * | nomineeChainId |= chainId << 160; + 443 | | + 444 | * | id = mapNomineeIds[nomineeChainId]; + 445 | | } + 446 | | + 447 | | /// @dev Get the nominee address and its corresponding chain Id. + 448 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 449 | | /// @param id Nominee Id in the global set of (nominee | chainId) values. + 450 | | /// @return nominee Nominee address. + 451 | | /// @return chainId Chain Id. + 452 | | function getNominee(uint256 id) external view returns (address nominee, uint256 chainId) { + 453 | | // Get the total number of nominees in the contract + 454 | | uint256 totalNumNominees = setNominees.length - 1; + 455 | | // Check for the zero id or the overflow + 456 | | if (id == 0) { + 457 | | revert ZeroValue(); + 458 | | } else if (id > totalNumNominees) { + 459 | | revert Overflow(id, totalNumNominees); + 460 | | } + 461 | | + 462 | | uint256 nomineeChainId = setNominees[id]; + 463 | | // Extract the nominee address + 464 | | nominee = address(uint160(uint256(nomineeChainId))); + 465 | | // Extract chain Id + 466 | | chainId = nomineeChainId >> 160; + 467 | | } + 468 | | + 469 | | /// @dev Get the set of nominee addresses and corresponding chain Ids. + 470 | | /// @notice The zero-th default nominee Id with id == 0 does not count. + 471 | | /// @param startId Start Id of the nominee in the global set of (nominee | chainId) values. + 472 | | /// @param numNominees Number of nominees to get. + 473 | | /// @return nominees Set of nominee addresses. + 474 | | /// @return chainIds Set of corresponding chain Ids. + 475 | | function getNominees( + 476 | | uint256 startId, + 477 | | uint256 numNominees + 478 | | ) external view returns (address[] memory nominees, uint256[] memory chainIds) + 479 | | { + 480 | | // Check for the zero id or the overflow + 481 | | if (startId == 0 || numNominees == 0) { + 482 | | revert ZeroValue(); + 483 | | } + 484 | | + 485 | | // Get the last nominee Id requested + 486 | | uint256 endId = startId + numNominees; + 487 | | // Get the total number of nominees in the contract with the zero-th nominee + 488 | | uint256 totalNumNominees = setNominees.length; + 489 | | + 490 | | // Check for the overflow + 491 | | if (endId > totalNumNominees) { + 492 | | revert Overflow(endId, totalNumNominees); + 493 | | } + 494 | | + 495 | | // Allocate + 496 | | nominees = new address[](numNominees); + 497 | | chainIds = new uint256[](numNominees); + 498 | | + 499 | | // Traverse selected nominees + 500 | | for (uint256 i = 0; i < numNominees; ++i) { + 501 | | uint256 id = i + startId; + 502 | | uint256 nomineeChainId = setNominees[id]; + 503 | | // Extract the nominee address + 504 | | nominees[i] = address(uint160(uint256(nomineeChainId))); + 505 | | // Extract chain Id + 506 | | chainIds[i] = nomineeChainId >> 160; + 507 | | } + 508 | | } + 509 | | + 510 | | /// @dev For fuzzing only + 511 | * | function setCallVoteForNomineeWeights(bool flag) external { + 512 | * | callVoteForNomineeWeights = flag; + 513 | | } + 514 | | /// @dev For fuzzing only + 515 | * | function getlastUserVote(address nominee, uint256 chainId) external view returns (uint256) { + 516 | | // Push a pair of key defining variables into one key + 517 | | // nominee occupies first 160 bits + 518 | * | uint256 nomineeChainId = uint256(uint160(nominee)); + 519 | | // chain Id occupies no more than next 64 bits + 520 | * | nomineeChainId |= chainId << 160; + 521 | * | return lastUserVote[msg.sender][nomineeChainId]; + 522 | | } + 523 | | } + + +
+ +/home/andrey/valory/autonolas-governance/contracts/veOLAS.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity ^0.8.15; + 3 | | + 4 | | import "@openzeppelin/contracts/governance/utils/IVotes.sol"; + 5 | | import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + 6 | | import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + 7 | | import "./interfaces/IErrors.sol"; + 8 | | + 9 | | /** + 10 | | Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for). + 11 | | Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years). + 12 | | Voting escrow has time-weighted votes derived from the amount of tokens locked. The maximum voting power can be + 13 | | achieved with the longest lock possible. This way the users are incentivized to lock tokens for more time. + 14 | | # w ^ = amount * time_locked / MAXTIME + 15 | | # 1 + / + 16 | | # | / + 17 | | # | / + 18 | | # | / + 19 | | # |/ + 20 | | # 0 +--------+------> time + 21 | | # maxtime (4 years?) + 22 | | + 23 | | We cannot really do block numbers per se because slope is per time, not per block, and per block could be fairly bad + 24 | | because Ethereum changes its block times. What we can do is to extrapolate ***At functions. + 25 | | */ + 26 | | + 27 | | /// @title Voting Escrow OLAS - the workflow is ported from Curve Finance Vyper implementation + 28 | | /// @author Aleksandr Kuperman - <aleksandr.kuperman@valory.xyz> + 29 | | /// Code ported from: https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy + 30 | | /// and: https://github.com/solidlyexchange/solidly/blob/master/contracts/ve.sol + 31 | | + 32 | | /* This VotingEscrow is based on the OLAS token that has the following specifications: + 33 | | * - For the first 10 years there will be the cap of 1 billion (1e27) tokens; + 34 | | * - After 10 years, the inflation rate is 2% per year. + 35 | | * The maximum number of tokens for each year then can be calculated from the formula: 2^n = 1e27 * (1.02)^x, + 36 | | * where n is the specified number of bits that is sufficient to store and not overflow the total supply, + 37 | | * and x is the number of years. We limit n by 128, thus it would take 1340+ years to reach that total supply. + 38 | | * The amount for each locker is eventually cannot overcome this number as well, and thus uint128 is sufficient. + 39 | | * + 40 | | * We then limit the time in seconds to last until the value of 2^64 - 1, or for the next 583+ billion years. + 41 | | * The number of blocks is essentially cannot be bigger than the number of seconds, and thus it is safe to assume + 42 | | * that uint64 for the number of blocks is also sufficient. + 43 | | * + 44 | | * We also limit the individual deposit amount to be no bigger than 2^96 - 1, or the value of total supply in 220+ years. + 45 | | * This limitation is dictated by the fact that there will be at least several accounts with locked tokens, and the + 46 | | * sum of all of them cannot be bigger than the total supply. Checking the limit of deposited / increased amount + 47 | | * allows us to perform the unchecked operation on adding the amounts. + 48 | | * + 49 | | * The rest of calculations throughout the contract do not go beyond specified limitations. The contract was checked + 50 | | * by echidna and the results can be found in the audit section of the repository. + 51 | | * + 52 | | * These specified limits allowed us to have storage-added structs to be bound by 2*256 and 1*256 bit sizes + 53 | | * respectively, thus limiting the gas amount compared to using bigger variable sizes. + 54 | | * + 55 | | * Note that after 220 years it is no longer possible to deposit / increase the locked amount to be bigger than 2^96 - 1. + 56 | | * It is going to be not safe to use this contract for governance after 1340 years. + 57 | | */ + 58 | | + 59 | | // Struct for storing balance and unlock time + 60 | | // The struct size is one storage slot of uint256 (128 + 64 + padding) + 61 | | struct LockedBalance { + 62 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 63 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 64 | | uint128 amount; + 65 | | // Unlock time. It will never practically be bigger + 66 | | uint64 endTime; + 67 | | } + 68 | | + 69 | | // Structure for voting escrow points + 70 | | // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + 71 | | struct PointVoting { + 72 | | // w(i) = at + b (bias) + 73 | | int128 bias; + 74 | | // dw / dt = a (slope) + 75 | | int128 slope; + 76 | | // Timestamp. It will never practically be bigger than 2^64 - 1 + 77 | | uint64 ts; + 78 | | // Block number. It will not be bigger than the timestamp + 79 | | uint64 blockNumber; + 80 | | // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + 81 | | // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + 82 | | uint128 balance; + 83 | | } + 84 | | + 85 | | /// @notice This token supports the ERC20 interface specifications except for transfers and approvals. + 86 | * | contract veOLAS is IErrors, IVotes, IERC20, IERC165 { + 87 | | enum DepositType { + 88 | | DEPOSIT_FOR_TYPE, + 89 | | CREATE_LOCK_TYPE, + 90 | | INCREASE_LOCK_AMOUNT, + 91 | | INCREASE_UNLOCK_TIME + 92 | | } + 93 | | + 94 | | event Deposit(address indexed account, uint256 amount, uint256 locktime, DepositType depositType, uint256 ts); + 95 | | event Withdraw(address indexed account, uint256 amount, uint256 ts); + 96 | | event Supply(uint256 previousSupply, uint256 currentSupply); + 97 | | + 98 | | // 1 week time + 99 | * | uint64 internal constant WEEK = 1 weeks; + 100 | | // Maximum lock time (4 years) + 101 | * | uint256 internal constant MAXTIME = 4 * 365 * 86400; + 102 | | // Maximum lock time (4 years) in int128 + 103 | * | int128 internal constant IMAXTIME = 4 * 365 * 86400; + 104 | | // Number of decimals + 105 | | uint8 public constant decimals = 18; + 106 | | + 107 | | // Token address + 108 | | address public immutable token; + 109 | | // Total token supply + 110 | | uint256 public supply; + 111 | | // Mapping of account address => LockedBalance + 112 | * | mapping(address => LockedBalance) public mapLockedBalances; + 113 | | + 114 | | // Total number of economical checkpoints (starting from zero) + 115 | | uint256 public totalNumPoints; + 116 | | // Mapping of point Id => point + 117 | | mapping(uint256 => PointVoting) public mapSupplyPoints; + 118 | | // Mapping of account address => PointVoting[point Id] + 119 | | mapping(address => PointVoting[]) public mapUserPoints; + 120 | | // Mapping of time => signed slope change + 121 | | mapping(uint64 => int128) public mapSlopeChanges; + 122 | | + 123 | | // Voting token name + 124 | | string public name; + 125 | | // Voting token symbol + 126 | | string public symbol; + 127 | | + 128 | | /// @dev Contract constructor + 129 | | /// @param _token Token address. + 130 | | /// @param _name Token name. + 131 | | /// @param _symbol Token symbol. + 132 | | constructor(address _token, string memory _name, string memory _symbol) + 133 | | { + 134 | | token = _token; + 135 | | name = _name; + 136 | | symbol = _symbol; + 137 | | // Create initial point such that default timestamp and block number are not zero + 138 | | // See cast specification in the PointVoting structure + 139 | | mapSupplyPoints[0] = PointVoting(0, 0, uint64(block.timestamp), uint64(block.number), 0); + 140 | | } + 141 | | + 142 | | /// @dev Gets the most recently recorded user point for `account`. + 143 | | /// @param account Account address. + 144 | | /// @return pv Last checkpoint. + 145 | * | function getLastUserPoint(address account) external view returns (PointVoting memory pv) { + 146 | * | uint256 lastPointNumber = mapUserPoints[account].length; + 147 | * | if (lastPointNumber > 0) { + 148 | * | pv = mapUserPoints[account][lastPointNumber - 1]; + 149 | | } + 150 | | } + 151 | | + 152 | | /// @dev Gets the number of user points. + 153 | | /// @param account Account address. + 154 | | /// @return accountNumPoints Number of user points. + 155 | | function getNumUserPoints(address account) external view returns (uint256 accountNumPoints) { + 156 | | accountNumPoints = mapUserPoints[account].length; + 157 | | } + 158 | | + 159 | | /// @dev Gets the checkpoint structure at number `idx` for `account`. + 160 | | /// @notice The out of bound condition is treated by the default code generation check. + 161 | | /// @param account User wallet address. + 162 | | /// @param idx User point number. + 163 | | /// @return The requested checkpoint. + 164 | | function getUserPoint(address account, uint256 idx) external view returns (PointVoting memory) { + 165 | | return mapUserPoints[account][idx]; + 166 | | } + 167 | | + 168 | | /// @dev Record global and per-user data to checkpoint. + 169 | | /// @param account Account address. User checkpoint is skipped if the address is zero. + 170 | | /// @param oldLocked Previous locked amount / end lock time for the user. + 171 | | /// @param newLocked New locked amount / end lock time for the user. + 172 | | /// @param curSupply Current total supply (to avoid using a storage total supply variable) + 173 | * | function _checkpoint( + 174 | | address account, + 175 | | LockedBalance memory oldLocked, + 176 | | LockedBalance memory newLocked, + 177 | | uint128 curSupply + 178 | * | ) internal { + 179 | * | PointVoting memory uOld; + 180 | * | PointVoting memory uNew; + 181 | * | int128 oldDSlope; + 182 | * | int128 newDSlope; + 183 | * | uint256 curNumPoint = totalNumPoints; + 184 | | + 185 | * | if (account != address(0)) { + 186 | | // Calculate slopes and biases + 187 | | // Kept at zero when they have to + 188 | * | if (oldLocked.endTime > block.timestamp && oldLocked.amount > 0) { + 189 | | uOld.slope = int128(oldLocked.amount) / IMAXTIME; + 190 | | uOld.bias = uOld.slope * int128(uint128(oldLocked.endTime - uint64(block.timestamp))); + 191 | | } + 192 | * | if (newLocked.endTime > block.timestamp && newLocked.amount > 0) { + 193 | * | uNew.slope = int128(newLocked.amount) / IMAXTIME; + 194 | * | uNew.bias = uNew.slope * int128(uint128(newLocked.endTime - uint64(block.timestamp))); + 195 | | } + 196 | | + 197 | | // Reads values of scheduled changes in the slope + 198 | | // oldLocked.endTime can be in the past and in the future + 199 | | // newLocked.endTime can ONLY be in the FUTURE unless everything is expired: then zeros + 200 | * | oldDSlope = mapSlopeChanges[oldLocked.endTime]; + 201 | * | if (newLocked.endTime > 0) { + 202 | * | if (newLocked.endTime == oldLocked.endTime) { + 203 | | newDSlope = oldDSlope; + 204 | | } else { + 205 | * | newDSlope = mapSlopeChanges[newLocked.endTime]; + 206 | | } + 207 | | } + 208 | | } + 209 | | + 210 | * | PointVoting memory lastPoint; + 211 | * | if (curNumPoint > 0) { + 212 | | lastPoint = mapSupplyPoints[curNumPoint]; + 213 | | } else { + 214 | | // If no point is created yet, we take the actual time and block parameters + 215 | * | lastPoint = PointVoting(0, 0, uint64(block.timestamp), uint64(block.number), 0); + 216 | | } + 217 | * | uint64 lastCheckpoint = lastPoint.ts; + 218 | | // initialPoint is used for extrapolation to calculate the block number and save them + 219 | | // as we cannot figure that out in exact values from inside of the contract + 220 | * | PointVoting memory initialPoint = lastPoint; + 221 | * | uint256 block_slope; // dblock/dt + 222 | * | if (block.timestamp > lastPoint.ts) { + 223 | | // This 1e18 multiplier is needed for the numerator to be bigger than the denominator + 224 | | // We need to calculate this in > uint64 size (1e18 is > 2^59 multiplied by 2^64). + 225 | | block_slope = (1e18 * uint256(block.number - lastPoint.blockNumber)) / uint256(block.timestamp - lastPoint.ts); + 226 | | } + 227 | | // If last point is already recorded in this block, slope == 0, but we know the block already in this case + 228 | | // Go over weeks to fill in the history and (or) calculate what the current point is + 229 | * | { + 230 | | // The timestamp is rounded by a week and < 2^64-1 + 231 | * | uint64 tStep = (lastCheckpoint / WEEK) * WEEK; + 232 | * | for (uint256 i = 0; i < 255; ++i) { + 233 | | // Hopefully it won't happen that this won't get used in 5 years! + 234 | | // If it does, users will be able to withdraw but vote weight will be broken + 235 | | // This is always practically < 2^64-1 + 236 | | unchecked { + 237 | * | tStep += WEEK; + 238 | | } + 239 | * | int128 dSlope; + 240 | * | if (tStep > block.timestamp) { + 241 | * | tStep = uint64(block.timestamp); + 242 | | } else { + 243 | | dSlope = mapSlopeChanges[tStep]; + 244 | | } + 245 | * | lastPoint.bias -= lastPoint.slope * int128(int64(tStep - lastCheckpoint)); + 246 | * | lastPoint.slope += dSlope; + 247 | * | if (lastPoint.bias < 0) { + 248 | | // This could potentially happen, but fuzzer didn't find available "real" combinations + 249 | | lastPoint.bias = 0; + 250 | | } + 251 | * | if (lastPoint.slope < 0) { + 252 | | // This cannot happen - just in case. Again, fuzzer didn't reach this + 253 | | lastPoint.slope = 0; + 254 | | } + 255 | * | lastCheckpoint = tStep; + 256 | * | lastPoint.ts = tStep; + 257 | | // After division by 1e18 the uint64 size can be reclaimed + 258 | * | lastPoint.blockNumber = initialPoint.blockNumber + uint64((block_slope * uint256(tStep - initialPoint.ts)) / 1e18); + 259 | * | lastPoint.balance = initialPoint.balance; + 260 | | // In order for the overflow of total number of economical checkpoints (starting from zero) + 261 | | // The _checkpoint() call must happen n >(2^256 -1)/255 or n > ~1e77/255 > ~1e74 times + 262 | | unchecked { + 263 | * | curNumPoint += 1; + 264 | | } + 265 | * | if (tStep == block.timestamp) { + 266 | * | lastPoint.blockNumber = uint64(block.number); + 267 | * | lastPoint.balance = curSupply; + 268 | * | break; + 269 | | } else { + 270 | | mapSupplyPoints[curNumPoint] = lastPoint; + 271 | | } + 272 | | } + 273 | | } + 274 | | + 275 | * | totalNumPoints = curNumPoint; + 276 | | + 277 | | // Now mapSupplyPoints is filled until current time + 278 | * | if (account != address(0)) { + 279 | | // If last point was in this block, the slope change has been already applied. In such case we have 0 slope(s) + 280 | * | lastPoint.slope += (uNew.slope - uOld.slope); + 281 | * | lastPoint.bias += (uNew.bias - uOld.bias); + 282 | * | if (lastPoint.slope < 0) { + 283 | | lastPoint.slope = 0; + 284 | | } + 285 | * | if (lastPoint.bias < 0) { + 286 | | lastPoint.bias = 0; + 287 | | } + 288 | | } + 289 | | + 290 | | // Record the last updated point + 291 | * | mapSupplyPoints[curNumPoint] = lastPoint; + 292 | | + 293 | * | if (account != address(0)) { + 294 | | // Schedule the slope changes (slope is going down) + 295 | | // We subtract new_user_slope from [newLocked.endTime] + 296 | | // and add old_user_slope to [oldLocked.endTime] + 297 | * | if (oldLocked.endTime > block.timestamp) { + 298 | | // oldDSlope was <something> - uOld.slope, so we cancel that + 299 | | oldDSlope += uOld.slope; + 300 | | if (newLocked.endTime == oldLocked.endTime) { + 301 | | oldDSlope -= uNew.slope; // It was a new deposit, not extension + 302 | | } + 303 | | mapSlopeChanges[oldLocked.endTime] = oldDSlope; + 304 | | } + 305 | | + 306 | * | if (newLocked.endTime > block.timestamp && newLocked.endTime > oldLocked.endTime) { + 307 | * | newDSlope -= uNew.slope; // old slope disappeared at this point + 308 | * | mapSlopeChanges[newLocked.endTime] = newDSlope; + 309 | | // else: we recorded it already in oldDSlope + 310 | | } + 311 | | // Now handle user history + 312 | * | uNew.ts = uint64(block.timestamp); + 313 | * | uNew.blockNumber = uint64(block.number); + 314 | * | uNew.balance = newLocked.amount; + 315 | * | mapUserPoints[account].push(uNew); + 316 | | } + 317 | | } + 318 | | + 319 | | /// @dev Record global data to checkpoint. + 320 | | function checkpoint() external { + 321 | | _checkpoint(address(0), LockedBalance(0, 0), LockedBalance(0, 0), uint128(supply)); + 322 | | } + 323 | | + 324 | | /// @dev Deposits and locks tokens for a specified account. + 325 | | /// @param account Target address for the locked amount. + 326 | | /// @param amount Amount to deposit. + 327 | | /// @param unlockTime New time when to unlock the tokens, or 0 if unchanged. + 328 | | /// @param lockedBalance Previous locked amount / end time. + 329 | | /// @param depositType Deposit type. + 330 | * | function _depositFor( + 331 | | address account, + 332 | | uint256 amount, + 333 | | uint256 unlockTime, + 334 | | LockedBalance memory lockedBalance, + 335 | | DepositType depositType + 336 | * | ) internal { + 337 | * | uint256 supplyBefore = supply; + 338 | * | uint256 supplyAfter; + 339 | | // Cannot overflow because the total supply << 2^128-1 + 340 | | unchecked { + 341 | * | supplyAfter = supplyBefore + amount; + 342 | * | supply = supplyAfter; + 343 | | } + 344 | | // Get the old locked data + 345 | * | LockedBalance memory oldLocked; + 346 | * | (oldLocked.amount, oldLocked.endTime) = (lockedBalance.amount, lockedBalance.endTime); + 347 | | // Adding to the existing lock, or if a lock is expired - creating a new one + 348 | | // This cannot be larger than the total supply + 349 | | unchecked { + 350 | * | lockedBalance.amount += uint128(amount); + 351 | | } + 352 | * | if (unlockTime > 0) { + 353 | * | lockedBalance.endTime = uint64(unlockTime); + 354 | | } + 355 | * | mapLockedBalances[account] = lockedBalance; + 356 | | + 357 | | // Possibilities: + 358 | | // Both oldLocked.endTime could be current or expired (>/< block.timestamp) + 359 | | // amount == 0 (extend lock) or amount > 0 (add to lock or extend lock) + 360 | | // lockedBalance.endTime > block.timestamp (always) + 361 | * | _checkpoint(account, oldLocked, lockedBalance, uint128(supplyAfter)); + 362 | * | if (amount > 0) { + 363 | | // OLAS is a solmate-based ERC20 token with optimized transferFrom() that either returns true or reverts + 364 | * | IERC20(token).transferFrom(msg.sender, address(this), amount); + 365 | | } + 366 | | + 367 | * | emit Deposit(account, amount, lockedBalance.endTime, depositType, block.timestamp); + 368 | * | emit Supply(supplyBefore, supplyAfter); + 369 | | } + 370 | | + 371 | | /// @dev Deposits `amount` tokens for `account` and adds to the lock. + 372 | | /// @dev Anyone (even a smart contract) can deposit for someone else, but + 373 | | /// cannot extend their locktime and deposit for a brand new user. + 374 | | /// @param account Account address. + 375 | | /// @param amount Amount to add. + 376 | | function depositFor(address account, uint256 amount) external { + 377 | | LockedBalance memory lockedBalance = mapLockedBalances[account]; + 378 | | // Check if the amount is zero + 379 | | if (amount == 0) { + 380 | | revert ZeroValue(); + 381 | | } + 382 | | // The locked balance must already exist + 383 | | if (lockedBalance.amount == 0) { + 384 | | revert NoValueLocked(account); + 385 | | } + 386 | | // Check the lock expiry + 387 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 388 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 389 | | } + 390 | | // Since in the _depositFor() we have the unchecked sum of amounts, this is needed to prevent unsafe behavior. + 391 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 392 | | if (amount > type(uint96).max) { + 393 | | revert Overflow(amount, type(uint96).max); + 394 | | } + 395 | | + 396 | | _depositFor(account, amount, 0, lockedBalance, DepositType.DEPOSIT_FOR_TYPE); + 397 | | } + 398 | | + 399 | | /// @dev Deposits `amount` tokens for `msg.sender` and locks for `unlockTime`. + 400 | | /// @param amount Amount to deposit. + 401 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 402 | * | function createLock(uint256 amount, uint256 unlockTime) external { + 403 | * | _createLockFor(msg.sender, amount, unlockTime); + 404 | | } + 405 | | + 406 | | /// @dev Deposits `amount` tokens for `account` and locks for `unlockTime`. + 407 | | /// @notice Tokens are taken from `msg.sender`'s balance. + 408 | | /// @param account Account address. + 409 | | /// @param amount Amount to deposit. + 410 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 411 | | function createLockFor(address account, uint256 amount, uint256 unlockTime) external { + 412 | | // Check if the account address is zero + 413 | | if (account == address(0)) { + 414 | | revert ZeroAddress(); + 415 | | } + 416 | | + 417 | | _createLockFor(account, amount, unlockTime); + 418 | | } + 419 | | + 420 | | /// @dev Deposits `amount` tokens for `account` and locks for `unlockTime`. + 421 | | /// @notice Tokens are taken from `msg.sender`'s balance. + 422 | | /// @param account Account address. + 423 | | /// @param amount Amount to deposit. + 424 | | /// @param unlockTime Time when tokens unlock, rounded down to a whole week. + 425 | * | function _createLockFor(address account, uint256 amount, uint256 unlockTime) private { + 426 | | + 427 | | // Check if the amount is zero + 428 | * | if (amount == 0) { + 429 | * | revert ZeroValue(); + 430 | | } + 431 | | // Lock time is rounded down to weeks + 432 | | // Cannot practically overflow because block.timestamp + unlockTime (max 4 years) << 2^64-1 + 433 | | unchecked { + 434 | * | unlockTime = ((block.timestamp + unlockTime) / WEEK) * WEEK; + 435 | | } + 436 | * | LockedBalance memory lockedBalance = mapLockedBalances[account]; + 437 | | // The locked balance must be zero in order to start the lock + 438 | * | if (lockedBalance.amount > 0) { + 439 | | revert LockedValueNotZero(account, uint256(lockedBalance.amount)); + 440 | | } + 441 | | // Check for the lock time correctness + 442 | * | if (unlockTime < (block.timestamp + 1)) { + 443 | * | revert UnlockTimeIncorrect(account, block.timestamp, unlockTime); + 444 | | } + 445 | | // Check for the lock time not to exceed the MAXTIME + 446 | * | if (unlockTime > block.timestamp + MAXTIME) { + 447 | | revert MaxUnlockTimeReached(account, block.timestamp + MAXTIME, unlockTime); + 448 | | } + 449 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 450 | * | if (amount > type(uint96).max) { + 451 | | revert Overflow(amount, type(uint96).max); + 452 | | } + 453 | | + 454 | * | _depositFor(account, amount, unlockTime, lockedBalance, DepositType.CREATE_LOCK_TYPE); + 455 | | } + 456 | | + 457 | | /// @dev Deposits `amount` additional tokens for `msg.sender` without modifying the unlock time. + 458 | | /// @param amount Amount of tokens to deposit and add to the lock. + 459 | | function increaseAmount(uint256 amount) external { + 460 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 461 | | // Check if the amount is zero + 462 | | if (amount == 0) { + 463 | | revert ZeroValue(); + 464 | | } + 465 | | // The locked balance must already exist + 466 | | if (lockedBalance.amount == 0) { + 467 | | revert NoValueLocked(msg.sender); + 468 | | } + 469 | | // Check the lock expiry + 470 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 471 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 472 | | } + 473 | | // Check the max possible amount to add, that must be less than the total supply + 474 | | // After 10 years, the inflation rate is 2% per year. It would take 220+ years to reach 2^96 - 1 total supply + 475 | | if (amount > type(uint96).max) { + 476 | | revert Overflow(amount, type(uint96).max); + 477 | | } + 478 | | + 479 | | _depositFor(msg.sender, amount, 0, lockedBalance, DepositType.INCREASE_LOCK_AMOUNT); + 480 | | } + 481 | | + 482 | | /// @dev Extends the unlock time. + 483 | | /// @param unlockTime New tokens unlock time. + 484 | | function increaseUnlockTime(uint256 unlockTime) external { + 485 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 486 | | // Cannot practically overflow because block.timestamp + unlockTime (max 4 years) << 2^64-1 + 487 | | unchecked { + 488 | | unlockTime = ((block.timestamp + unlockTime) / WEEK) * WEEK; + 489 | | } + 490 | | // The locked balance must already exist + 491 | | if (lockedBalance.amount == 0) { + 492 | | revert NoValueLocked(msg.sender); + 493 | | } + 494 | | // Check the lock expiry + 495 | | if (lockedBalance.endTime < (block.timestamp + 1)) { + 496 | | revert LockExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 497 | | } + 498 | | // Check for the lock time correctness + 499 | | if (unlockTime < (lockedBalance.endTime + 1)) { + 500 | | revert UnlockTimeIncorrect(msg.sender, lockedBalance.endTime, unlockTime); + 501 | | } + 502 | | // Check for the lock time not to exceed the MAXTIME + 503 | | if (unlockTime > block.timestamp + MAXTIME) { + 504 | | revert MaxUnlockTimeReached(msg.sender, block.timestamp + MAXTIME, unlockTime); + 505 | | } + 506 | | + 507 | | _depositFor(msg.sender, 0, unlockTime, lockedBalance, DepositType.INCREASE_UNLOCK_TIME); + 508 | | } + 509 | | + 510 | | /// @dev Withdraws all tokens for `msg.sender`. Only possible if the lock has expired. + 511 | | function withdraw() external { + 512 | | LockedBalance memory lockedBalance = mapLockedBalances[msg.sender]; + 513 | | if (lockedBalance.endTime > block.timestamp) { + 514 | | revert LockNotExpired(msg.sender, lockedBalance.endTime, block.timestamp); + 515 | | } + 516 | | uint256 amount = uint256(lockedBalance.amount); + 517 | | + 518 | | mapLockedBalances[msg.sender] = LockedBalance(0, 0); + 519 | | uint256 supplyBefore = supply; + 520 | | uint256 supplyAfter; + 521 | | // The amount cannot be less than the total supply + 522 | | unchecked { + 523 | | supplyAfter = supplyBefore - amount; + 524 | | supply = supplyAfter; + 525 | | } + 526 | | // oldLocked can have either expired <= timestamp or zero end + 527 | | // lockedBalance has only 0 end + 528 | | // Both can have >= 0 amount + 529 | | _checkpoint(msg.sender, lockedBalance, LockedBalance(0, 0), uint128(supplyAfter)); + 530 | | + 531 | | emit Withdraw(msg.sender, amount, block.timestamp); + 532 | | emit Supply(supplyBefore, supplyAfter); + 533 | | + 534 | | // OLAS is a solmate-based ERC20 token with optimized transfer() that either returns true or reverts + 535 | | IERC20(token).transfer(msg.sender, amount); + 536 | | } + 537 | | + 538 | | /// @dev Finds a closest point that has a specified block number. + 539 | | /// @param blockNumber Block to find. + 540 | | /// @param account Account address for user points. + 541 | | /// @return point Point with the approximate index number for the specified block. + 542 | | /// @return minPointNumber Point number. + 543 | | function _findPointByBlock(uint256 blockNumber, address account) internal view + 544 | | returns (PointVoting memory point, uint256 minPointNumber) + 545 | | { + 546 | | // Get the last available point number + 547 | | uint256 maxPointNumber; + 548 | | if (account == address(0)) { + 549 | | maxPointNumber = totalNumPoints; + 550 | | } else { + 551 | | maxPointNumber = mapUserPoints[account].length; + 552 | | if (maxPointNumber == 0) { + 553 | | return (point, minPointNumber); + 554 | | } + 555 | | // Already checked for > 0 in this case + 556 | | unchecked { + 557 | | maxPointNumber -= 1; + 558 | | } + 559 | | } + 560 | | + 561 | | // Binary search that will be always enough for 128-bit numbers + 562 | | for (uint256 i = 0; i < 128; ++i) { + 563 | | if ((minPointNumber + 1) > maxPointNumber) { + 564 | | break; + 565 | | } + 566 | | uint256 mid = (minPointNumber + maxPointNumber + 1) / 2; + 567 | | + 568 | | // Choose the source of points + 569 | | if (account == address(0)) { + 570 | | point = mapSupplyPoints[mid]; + 571 | | } else { + 572 | | point = mapUserPoints[account][mid]; + 573 | | } + 574 | | + 575 | | if (point.blockNumber < (blockNumber + 1)) { + 576 | | minPointNumber = mid; + 577 | | } else { + 578 | | maxPointNumber = mid - 1; + 579 | | } + 580 | | } + 581 | | + 582 | | // Get the found point + 583 | | if (account == address(0)) { + 584 | | point = mapSupplyPoints[minPointNumber]; + 585 | | } else { + 586 | | point = mapUserPoints[account][minPointNumber]; + 587 | | } + 588 | | } + 589 | | + 590 | | /// @dev Gets the voting power for an `account` at time `ts`. + 591 | | /// @param account Account address. + 592 | | /// @param ts Time to get voting power at. + 593 | | /// @return vBalance Account voting power. + 594 | | function _balanceOfLocked(address account, uint64 ts) internal view returns (uint256 vBalance) { + 595 | | uint256 pointNumber = mapUserPoints[account].length; + 596 | | if (pointNumber > 0) { + 597 | | PointVoting memory uPoint = mapUserPoints[account][pointNumber - 1]; + 598 | | uPoint.bias -= uPoint.slope * int128(int64(ts) - int64(uPoint.ts)); + 599 | | if (uPoint.bias > 0) { + 600 | | vBalance = uint256(int256(uPoint.bias)); + 601 | | } + 602 | | } + 603 | | } + 604 | | + 605 | | /// @dev Gets the account balance in native token. + 606 | | /// @param account Account address. + 607 | | /// @return balance Account balance. + 608 | | function balanceOf(address account) public view override returns (uint256 balance) { + 609 | | balance = uint256(mapLockedBalances[account].amount); + 610 | | } + 611 | | + 612 | | /// @dev Gets the `account`'s lock end time. + 613 | | /// @param account Account address. + 614 | | /// @return unlockTime Lock end time. + 615 | * | function lockedEnd(address account) external view returns (uint256 unlockTime) { + 616 | * | unlockTime = uint256(mapLockedBalances[account].endTime); + 617 | | } + 618 | | + 619 | | /// @dev Gets the account balance at a specific block number. + 620 | | /// @param account Account address. + 621 | | /// @param blockNumber Block number. + 622 | | /// @return balance Account balance. + 623 | | function balanceOfAt(address account, uint256 blockNumber) external view returns (uint256 balance) { + 624 | | // Find point with the closest block number to the provided one + 625 | | (PointVoting memory uPoint, ) = _findPointByBlock(blockNumber, account); + 626 | | // If the block number at the point index is bigger than the specified block number, the balance was zero + 627 | | if (uPoint.blockNumber < (blockNumber + 1)) { + 628 | | balance = uint256(uPoint.balance); + 629 | | } + 630 | | } + 631 | | + 632 | | /// @dev Gets the voting power. + 633 | | /// @param account Account address. + 634 | | function getVotes(address account) public view override returns (uint256) { + 635 | | return _balanceOfLocked(account, uint64(block.timestamp)); + 636 | | } + 637 | | + 638 | | /// @dev Gets the block time adjustment for two neighboring points. + 639 | | /// @notice `blockNumber` must not be lower than the contract deployment block number, + 640 | | /// as the behavior and the return value is undefined. + 641 | | /// @param blockNumber Block number. + 642 | | /// @return point Point with the specified block number (or closest to it). + 643 | | /// @return blockTime Adjusted block time of the neighboring point. + 644 | | function _getBlockTime(uint256 blockNumber) internal view returns (PointVoting memory point, uint256 blockTime) { + 645 | | // Check the block number to be in the past or equal to the current block + 646 | | if (blockNumber > block.number) { + 647 | | revert WrongBlockNumber(blockNumber, block.number); + 648 | | } + 649 | | // Get the minimum historical point with the provided block number + 650 | | uint256 minPointNumber; + 651 | | (point, minPointNumber) = _findPointByBlock(blockNumber, address(0)); + 652 | | + 653 | | uint256 dBlock; + 654 | | uint256 dt; + 655 | | if (minPointNumber < totalNumPoints) { + 656 | | PointVoting memory pointNext = mapSupplyPoints[minPointNumber + 1]; + 657 | | dBlock = pointNext.blockNumber - point.blockNumber; + 658 | | dt = pointNext.ts - point.ts; + 659 | | } else { + 660 | | dBlock = block.number - point.blockNumber; + 661 | | dt = block.timestamp - point.ts; + 662 | | } + 663 | | blockTime = point.ts; + 664 | | if (dBlock > 0) { + 665 | | blockTime += (dt * (blockNumber - point.blockNumber)) / dBlock; + 666 | | } + 667 | | } + 668 | | + 669 | | /// @dev Gets voting power at a specific block number. + 670 | | /// @param account Account address. + 671 | | /// @param blockNumber Block number. + 672 | | /// @return balance Voting balance / power. + 673 | | function getPastVotes(address account, uint256 blockNumber) public view override returns (uint256 balance) { + 674 | | // Find the user point for the provided block number + 675 | | (PointVoting memory uPoint, ) = _findPointByBlock(blockNumber, account); + 676 | | + 677 | | // Get block time adjustment. + 678 | | (, uint256 blockTime) = _getBlockTime(blockNumber); + 679 | | + 680 | | // Calculate bias based on a block time + 681 | | uPoint.bias -= uPoint.slope * int128(int64(uint64(blockTime)) - int64(uPoint.ts)); + 682 | | if (uPoint.bias > 0) { + 683 | | balance = uint256(uint128(uPoint.bias)); + 684 | | } + 685 | | } + 686 | | + 687 | | /// @dev Calculate total voting power at some point in the past. + 688 | | /// @param lastPoint The point (bias/slope) to start the search from. + 689 | | /// @param ts Time to calculate the total voting power at. + 690 | | /// @return vSupply Total voting power at that time. + 691 | | function _supplyLockedAt(PointVoting memory lastPoint, uint64 ts) internal view returns (uint256 vSupply) { + 692 | | // The timestamp is rounded and < 2^64-1 + 693 | | uint64 tStep = (lastPoint.ts / WEEK) * WEEK; + 694 | | for (uint256 i = 0; i < 255; ++i) { + 695 | | // This is always practically < 2^64-1 + 696 | | unchecked { + 697 | | tStep += WEEK; + 698 | | } + 699 | | int128 dSlope; + 700 | | if (tStep > ts) { + 701 | | tStep = ts; + 702 | | } else { + 703 | | dSlope = mapSlopeChanges[tStep]; + 704 | | } + 705 | | lastPoint.bias -= lastPoint.slope * int128(int64(tStep) - int64(lastPoint.ts)); + 706 | | if (tStep == ts) { + 707 | | break; + 708 | | } + 709 | | lastPoint.slope += dSlope; + 710 | | lastPoint.ts = tStep; + 711 | | } + 712 | | + 713 | | if (lastPoint.bias > 0) { + 714 | | vSupply = uint256(uint128(lastPoint.bias)); + 715 | | } + 716 | | } + 717 | | + 718 | | /// @dev Gets total token supply. + 719 | | /// @return Total token supply. + 720 | | function totalSupply() public view override returns (uint256) { + 721 | | return supply; + 722 | | } + 723 | | + 724 | | /// @dev Gets total token supply at a specific block number. + 725 | | /// @param blockNumber Block number. + 726 | | /// @return supplyAt Supply at the specified block number. + 727 | | function totalSupplyAt(uint256 blockNumber) external view returns (uint256 supplyAt) { + 728 | | // Find point with the closest block number to the provided one + 729 | | (PointVoting memory sPoint, ) = _findPointByBlock(blockNumber, address(0)); + 730 | | // If the block number at the point index is bigger than the specified block number, the balance was zero + 731 | | if (sPoint.blockNumber < (blockNumber + 1)) { + 732 | | supplyAt = uint256(sPoint.balance); + 733 | | } + 734 | | } + 735 | | + 736 | | /// @dev Calculates total voting power at time `ts`. + 737 | | /// @param ts Time to get total voting power at. + 738 | | /// @return Total voting power. + 739 | | function totalSupplyLockedAtT(uint256 ts) public view returns (uint256) { + 740 | | PointVoting memory lastPoint = mapSupplyPoints[totalNumPoints]; + 741 | | return _supplyLockedAt(lastPoint, uint64(ts)); + 742 | | } + 743 | | + 744 | | /// @dev Calculates current total voting power. + 745 | | /// @return Total voting power. + 746 | | function totalSupplyLocked() public view returns (uint256) { + 747 | | return totalSupplyLockedAtT(block.timestamp); + 748 | | } + 749 | | + 750 | | /// @dev Calculate total voting power at some point in the past. + 751 | | /// @param blockNumber Block number to calculate the total voting power at. + 752 | | /// @return Total voting power. + 753 | | function getPastTotalSupply(uint256 blockNumber) public view override returns (uint256) { + 754 | | (PointVoting memory sPoint, uint256 blockTime) = _getBlockTime(blockNumber); + 755 | | // Now dt contains info on how far are we beyond the point + 756 | | return _supplyLockedAt(sPoint, uint64(blockTime)); + 757 | | } + 758 | | + 759 | | /// @dev Gets information about the interface support. + 760 | | /// @param interfaceId A specified interface Id. + 761 | | /// @return True if this contract implements the interface defined by interfaceId. + 762 | | function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + 763 | | return interfaceId == type(IERC20).interfaceId || interfaceId == type(IVotes).interfaceId || + 764 | | interfaceId == type(IERC165).interfaceId; + 765 | | } + 766 | | + 767 | | /// @dev Reverts the transfer of this token. + 768 | | function transfer(address to, uint256 amount) external virtual override returns (bool) { + 769 | | revert NonTransferable(address(this)); + 770 | | } + 771 | | + 772 | | /// @dev Reverts the approval of this token. + 773 | | function approve(address spender, uint256 amount) external virtual override returns (bool) { + 774 | | revert NonTransferable(address(this)); + 775 | | } + 776 | | + 777 | | /// @dev Reverts the transferFrom of this token. + 778 | | function transferFrom(address from, address to, uint256 amount) external virtual override returns (bool) { + 779 | | revert NonTransferable(address(this)); + 780 | | } + 781 | | + 782 | | /// @dev Reverts the allowance of this token. + 783 | | function allowance(address owner, address spender) external view virtual override returns (uint256) + 784 | | { + 785 | | revert NonTransferable(address(this)); + 786 | | } + 787 | | + 788 | | /// @dev Reverts delegates of this token. + 789 | | function delegates(address account) external view virtual override returns (address) + 790 | | { + 791 | | revert NonDelegatable(address(this)); + 792 | | } + 793 | | + 794 | | /// @dev Reverts delegate for this token. + 795 | | function delegate(address delegatee) external virtual override + 796 | | { + 797 | | revert NonDelegatable(address(this)); + 798 | | } + 799 | | + 800 | | /// @dev Reverts delegateBySig for this token. + 801 | | function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) + 802 | | external virtual override + 803 | | { + 804 | | revert NonDelegatable(address(this)); + 805 | | } + 806 | | } + 807 | | + + +
+ +/home/andrey/valory/autonolas-governance/lib/solmate/src/tokens/ERC20.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | pragma solidity >=0.8.0; + 3 | | + 4 | | /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. + 5 | | /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) + 6 | | /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) + 7 | | /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. + 8 | | abstract contract ERC20 { + 9 | | /*////////////////////////////////////////////////////////////// + 10 | | EVENTS + 11 | | //////////////////////////////////////////////////////////////*/ + 12 | | + 13 | | event Transfer(address indexed from, address indexed to, uint256 amount); + 14 | | + 15 | | event Approval(address indexed owner, address indexed spender, uint256 amount); + 16 | | + 17 | | /*////////////////////////////////////////////////////////////// + 18 | | METADATA STORAGE + 19 | | //////////////////////////////////////////////////////////////*/ + 20 | | + 21 | | string public name; + 22 | | + 23 | | string public symbol; + 24 | | + 25 | | uint8 public immutable decimals; + 26 | | + 27 | | /*////////////////////////////////////////////////////////////// + 28 | | ERC20 STORAGE + 29 | | //////////////////////////////////////////////////////////////*/ + 30 | | + 31 | | uint256 public totalSupply; + 32 | | + 33 | * | mapping(address => uint256) public balanceOf; + 34 | | + 35 | | mapping(address => mapping(address => uint256)) public allowance; + 36 | | + 37 | | /*////////////////////////////////////////////////////////////// + 38 | | EIP-2612 STORAGE + 39 | | //////////////////////////////////////////////////////////////*/ + 40 | | + 41 | | uint256 internal immutable INITIAL_CHAIN_ID; + 42 | | + 43 | | bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + 44 | | + 45 | | mapping(address => uint256) public nonces; + 46 | | + 47 | | /*////////////////////////////////////////////////////////////// + 48 | | CONSTRUCTOR + 49 | | //////////////////////////////////////////////////////////////*/ + 50 | | + 51 | | constructor( + 52 | | string memory _name, + 53 | | string memory _symbol, + 54 | | uint8 _decimals + 55 | | ) { + 56 | | name = _name; + 57 | | symbol = _symbol; + 58 | | decimals = _decimals; + 59 | | + 60 | | INITIAL_CHAIN_ID = block.chainid; + 61 | | INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + 62 | | } + 63 | | + 64 | | /*////////////////////////////////////////////////////////////// + 65 | | ERC20 LOGIC + 66 | | //////////////////////////////////////////////////////////////*/ + 67 | | + 68 | * | function approve(address spender, uint256 amount) public virtual returns (bool) { + 69 | * | allowance[msg.sender][spender] = amount; + 70 | | + 71 | * | emit Approval(msg.sender, spender, amount); + 72 | | + 73 | * | return true; + 74 | | } + 75 | | + 76 | | function transfer(address to, uint256 amount) public virtual returns (bool) { + 77 | | balanceOf[msg.sender] -= amount; + 78 | | + 79 | | // Cannot overflow because the sum of all user + 80 | | // balances can't exceed the max uint256 value. + 81 | | unchecked { + 82 | | balanceOf[to] += amount; + 83 | | } + 84 | | + 85 | | emit Transfer(msg.sender, to, amount); + 86 | | + 87 | | return true; + 88 | | } + 89 | | + 90 | * | function transferFrom( + 91 | | address from, + 92 | | address to, + 93 | | uint256 amount + 94 | * | ) public virtual returns (bool) { + 95 | * | uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + 96 | | + 97 | * | if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + 98 | | + 99 | * | balanceOf[from] -= amount; + 100 | | + 101 | | // Cannot overflow because the sum of all user + 102 | | // balances can't exceed the max uint256 value. + 103 | | unchecked { + 104 | * | balanceOf[to] += amount; + 105 | | } + 106 | | + 107 | * | emit Transfer(from, to, amount); + 108 | | + 109 | * | return true; + 110 | | } + 111 | | + 112 | | /*////////////////////////////////////////////////////////////// + 113 | | EIP-2612 LOGIC + 114 | | //////////////////////////////////////////////////////////////*/ + 115 | | + 116 | | function permit( + 117 | | address owner, + 118 | | address spender, + 119 | | uint256 value, + 120 | | uint256 deadline, + 121 | | uint8 v, + 122 | | bytes32 r, + 123 | | bytes32 s + 124 | | ) public virtual { + 125 | | require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + 126 | | + 127 | | // Unchecked because the only math done is incrementing + 128 | | // the owner's nonce which cannot realistically overflow. + 129 | | unchecked { + 130 | | address recoveredAddress = ecrecover( + 131 | | keccak256( + 132 | | abi.encodePacked( + 133 | | "\x19\x01", + 134 | | DOMAIN_SEPARATOR(), + 135 | | keccak256( + 136 | | abi.encode( + 137 | | keccak256( + 138 | | "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + 139 | | ), + 140 | | owner, + 141 | | spender, + 142 | | value, + 143 | | nonces[owner]++, + 144 | | deadline + 145 | | ) + 146 | | ) + 147 | | ) + 148 | | ), + 149 | | v, + 150 | | r, + 151 | | s + 152 | | ); + 153 | | + 154 | | require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + 155 | | + 156 | | allowance[recoveredAddress][spender] = value; + 157 | | } + 158 | | + 159 | | emit Approval(owner, spender, value); + 160 | | } + 161 | | + 162 | | function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + 163 | | return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + 164 | | } + 165 | | + 166 | | function computeDomainSeparator() internal view virtual returns (bytes32) { + 167 | | return + 168 | | keccak256( + 169 | | abi.encode( + 170 | | keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + 171 | | keccak256(bytes(name)), + 172 | | keccak256("1"), + 173 | | block.chainid, + 174 | | address(this) + 175 | | ) + 176 | | ); + 177 | | } + 178 | | + 179 | | /*////////////////////////////////////////////////////////////// + 180 | | INTERNAL MINT/BURN LOGIC + 181 | | //////////////////////////////////////////////////////////////*/ + 182 | | + 183 | | function _mint(address to, uint256 amount) internal virtual { + 184 | | totalSupply += amount; + 185 | | + 186 | | // Cannot overflow because the sum of all user + 187 | | // balances can't exceed the max uint256 value. + 188 | | unchecked { + 189 | | balanceOf[to] += amount; + 190 | | } + 191 | | + 192 | | emit Transfer(address(0), to, amount); + 193 | | } + 194 | | + 195 | | function _burn(address from, uint256 amount) internal virtual { + 196 | | balanceOf[from] -= amount; + 197 | | + 198 | | // Cannot underflow because a user's balance + 199 | | // will never be larger than the total supply. + 200 | | unchecked { + 201 | | totalSupply -= amount; + 202 | | } + 203 | | + 204 | | emit Transfer(from, address(0), amount); + 205 | | } + 206 | | } + 207 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) + 3 | | pragma solidity ^0.8.0; + 4 | | + 5 | | /** + 6 | | * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. + 7 | | * + 8 | | * _Available since v4.5._ + 9 | | */ + 10 | | interface IVotes { + 11 | | /** + 12 | | * @dev Emitted when an account changes their delegate. + 13 | | */ + 14 | | event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + 15 | | + 16 | | /** + 17 | | * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. + 18 | | */ + 19 | | event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + 20 | | + 21 | | /** + 22 | | * @dev Returns the current amount of votes that `account` has. + 23 | | */ + 24 | | function getVotes(address account) external view returns (uint256); + 25 | | + 26 | | /** + 27 | | * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). + 28 | | */ + 29 | | function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); + 30 | | + 31 | | /** + 32 | | * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). + 33 | | * + 34 | | * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. + 35 | | * Votes that have not been delegated are still part of total supply, even though they would not participate in a + 36 | | * vote. + 37 | | */ + 38 | | function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); + 39 | | + 40 | | /** + 41 | | * @dev Returns the delegate that `account` has chosen. + 42 | | */ + 43 | | function delegates(address account) external view returns (address); + 44 | | + 45 | | /** + 46 | | * @dev Delegates votes from the sender to `delegatee`. + 47 | | */ + 48 | | function delegate(address delegatee) external; + 49 | | + 50 | | /** + 51 | | * @dev Delegates votes from signer to `delegatee`. + 52 | | */ + 53 | | function delegateBySig( + 54 | | address delegatee, + 55 | | uint256 nonce, + 56 | | uint256 expiry, + 57 | | uint8 v, + 58 | | bytes32 r, + 59 | | bytes32 s + 60 | | ) external; + 61 | | } + 62 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) + 3 | | + 4 | | pragma solidity ^0.8.0; + 5 | | + 6 | | /** + 7 | | * @dev Interface of the ERC20 standard as defined in the EIP. + 8 | | */ + 9 | | interface IERC20 { + 10 | | /** + 11 | | * @dev Emitted when `value` tokens are moved from one account (`from`) to + 12 | | * another (`to`). + 13 | | * + 14 | | * Note that `value` may be zero. + 15 | | */ + 16 | | event Transfer(address indexed from, address indexed to, uint256 value); + 17 | | + 18 | | /** + 19 | | * @dev Emitted when the allowance of a `spender` for an `owner` is set by + 20 | | * a call to {approve}. `value` is the new allowance. + 21 | | */ + 22 | | event Approval(address indexed owner, address indexed spender, uint256 value); + 23 | | + 24 | | /** + 25 | | * @dev Returns the amount of tokens in existence. + 26 | | */ + 27 | | function totalSupply() external view returns (uint256); + 28 | | + 29 | | /** + 30 | | * @dev Returns the amount of tokens owned by `account`. + 31 | | */ + 32 | | function balanceOf(address account) external view returns (uint256); + 33 | | + 34 | | /** + 35 | | * @dev Moves `amount` tokens from the caller's account to `to`. + 36 | | * + 37 | | * Returns a boolean value indicating whether the operation succeeded. + 38 | | * + 39 | | * Emits a {Transfer} event. + 40 | | */ + 41 | | function transfer(address to, uint256 amount) external returns (bool); + 42 | | + 43 | | /** + 44 | | * @dev Returns the remaining number of tokens that `spender` will be + 45 | | * allowed to spend on behalf of `owner` through {transferFrom}. This is + 46 | | * zero by default. + 47 | | * + 48 | | * This value changes when {approve} or {transferFrom} are called. + 49 | | */ + 50 | | function allowance(address owner, address spender) external view returns (uint256); + 51 | | + 52 | | /** + 53 | | * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + 54 | | * + 55 | | * Returns a boolean value indicating whether the operation succeeded. + 56 | | * + 57 | | * IMPORTANT: Beware that changing an allowance with this method brings the risk + 58 | | * that someone may use both the old and the new allowance by unfortunate + 59 | | * transaction ordering. One possible solution to mitigate this race + 60 | | * condition is to first reduce the spender's allowance to 0 and set the + 61 | | * desired value afterwards: + 62 | | * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + 63 | | * + 64 | | * Emits an {Approval} event. + 65 | | */ + 66 | | function approve(address spender, uint256 amount) external returns (bool); + 67 | | + 68 | | /** + 69 | | * @dev Moves `amount` tokens from `from` to `to` using the + 70 | | * allowance mechanism. `amount` is then deducted from the caller's + 71 | | * allowance. + 72 | | * + 73 | | * Returns a boolean value indicating whether the operation succeeded. + 74 | | * + 75 | | * Emits a {Transfer} event. + 76 | | */ + 77 | | function transferFrom( + 78 | | address from, + 79 | | address to, + 80 | | uint256 amount + 81 | | ) external returns (bool); + 82 | | } + 83 | | + + +
+ +/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol + + 1 | | // SPDX-License-Identifier: MIT + 2 | | // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) + 3 | | + 4 | | pragma solidity ^0.8.0; + 5 | | + 6 | | /** + 7 | | * @dev Interface of the ERC165 standard, as defined in the + 8 | | * https://eips.ethereum.org/EIPS/eip-165[EIP]. + 9 | | * + 10 | | * Implementers can declare support of contract interfaces, which can then be + 11 | | * queried by others ({ERC165Checker}). + 12 | | * + 13 | | * For an implementation, see {ERC165}. + 14 | | */ + 15 | | interface IERC165 { + 16 | | /** + 17 | | * @dev Returns true if this contract implements the interface defined by + 18 | | * `interfaceId`. See the corresponding + 19 | | * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + 20 | | * to learn more about how these ids are created. + 21 | | * + 22 | | * This function call must use less than 30 000 gas. + 23 | | */ + 24 | | function supportsInterface(bytes4 interfaceId) external view returns (bool); + 25 | | } + 26 | | + + +
+ diff --git a/audits/internal11/fuzzing/crytic-export/combined_solc.json b/audits/internal11/fuzzing/crytic-export/combined_solc.json new file mode 100644 index 0000000..d686ac8 --- /dev/null +++ b/audits/internal11/fuzzing/crytic-export/combined_solc.json @@ -0,0 +1 @@ +{"sources": {"/home/andrey/valory/autonolas-governance/contracts/OLAS.sol": {"AST": {"absolutePath": "contracts/OLAS.sol", "exportedSymbols": {"ERC20": [4930], "ManagerOnly": [355], "OLAS": [704], "ZeroAddress": [358]}, "id": 705, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 347, "literals": ["solidity", "^", "0.8", ".15"], "nodeType": "PragmaDirective", "src": "32:24:0"}, {"absolutePath": "lib/solmate/src/tokens/ERC20.sol", "file": "../lib/solmate/src/tokens/ERC20.sol", "id": 348, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 705, "sourceUnit": 4931, "src": "58:45:0", "symbolAliases": [], "unitAlias": ""}, {"documentation": {"id": 349, "nodeType": "StructuredDocumentation", "src": "105:163:0", "text": "@dev Only `manager` has a privilege, but the `sender` was provided.\n @param sender Sender address.\n @param manager Required sender address as a manager."}, "errorSelector": "625a43fe", "id": 355, "name": "ManagerOnly", "nameLocation": "274:11:0", "nodeType": "ErrorDefinition", "parameters": {"id": 354, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 351, "mutability": "mutable", "name": "sender", "nameLocation": "294:6:0", "nodeType": "VariableDeclaration", "scope": 355, "src": "286:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 350, "name": "address", "nodeType": "ElementaryTypeName", "src": "286:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 353, "mutability": "mutable", "name": "manager", "nameLocation": "310:7:0", "nodeType": "VariableDeclaration", "scope": 355, "src": "302:15:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 352, "name": "address", "nodeType": "ElementaryTypeName", "src": "302:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "285:33:0"}, "src": "268:51:0"}, {"documentation": {"id": 356, "nodeType": "StructuredDocumentation", "src": "321:32:0", "text": "@dev Provided zero address."}, "errorSelector": "d92e233d", "id": 358, "name": "ZeroAddress", "nameLocation": "359:11:0", "nodeType": "ErrorDefinition", "parameters": {"id": 357, "nodeType": "ParameterList", "parameters": [], "src": "370:2:0"}, "src": "353:20:0"}, {"abstract": false, "baseContracts": [{"baseName": {"id": 360, "name": "ERC20", "nameLocations": ["525:5:0"], "nodeType": "IdentifierPath", "referencedDeclaration": 4930, "src": "525:5:0"}, "id": 361, "nodeType": "InheritanceSpecifier", "src": "525:5:0"}], "canonicalName": "OLAS", "contractDependencies": [], "contractKind": "contract", "documentation": {"id": 359, "nodeType": "StructuredDocumentation", "src": "375:133:0", "text": "@title OLAS - Smart contract for the OLAS token.\n @author AL\n @author Aleksandr Kuperman - "}, "fullyImplemented": true, "id": 704, "linearizedBaseContracts": [704, 4930], "name": "OLAS", "nameLocation": "517:4:0", "nodeType": "ContractDefinition", "nodes": [{"anonymous": false, "eventSelector": "ad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a", "id": 365, "name": "MinterUpdated", "nameLocation": "543:13:0", "nodeType": "EventDefinition", "parameters": {"id": 364, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 363, "indexed": true, "mutability": "mutable", "name": "minter", "nameLocation": "573:6:0", "nodeType": "VariableDeclaration", "scope": 365, "src": "557:22:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 362, "name": "address", "nodeType": "ElementaryTypeName", "src": "557:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "556:24:0"}, "src": "537:44:0"}, {"anonymous": false, "eventSelector": "4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b", "id": 369, "name": "OwnerUpdated", "nameLocation": "592:12:0", "nodeType": "EventDefinition", "parameters": {"id": 368, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 367, "indexed": true, "mutability": "mutable", "name": "owner", "nameLocation": "621:5:0", "nodeType": "VariableDeclaration", "scope": 369, "src": "605:21:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 366, "name": "address", "nodeType": "ElementaryTypeName", "src": "605:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "604:23:0"}, "src": "586:42:0"}, {"constant": true, "functionSelector": "f27c3bf6", "id": 374, "mutability": "constant", "name": "oneYear", "nameLocation": "683:7:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "659:46:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 370, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "659:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"commonType": {"typeIdentifier": "t_rational_31536000_by_1", "typeString": "int_const 31536000"}, "id": 373, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "31", "id": 371, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "693:6:0", "subdenomination": "days", "typeDescriptions": {"typeIdentifier": "t_rational_86400_by_1", "typeString": "int_const 86400"}, "value": "1"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "333635", "id": 372, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "702:3:0", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "value": "365"}, "src": "693:12:0", "typeDescriptions": {"typeIdentifier": "t_rational_31536000_by_1", "typeString": "int_const 31536000"}}, "visibility": "public"}, {"constant": true, "functionSelector": "0a8ded1d", "id": 377, "mutability": "constant", "name": "tenYearSupplyCap", "nameLocation": "809:16:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "785:59:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 375, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "785:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "315f3030305f3030305f303030653138", "id": 376, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "828:16:0", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000000000000_by_1", "typeString": "int_const 1000000000000000000000000000"}, "value": "1_000_000_000e18"}, "visibility": "public"}, {"constant": true, "functionSelector": "5ff99e9d", "id": 380, "mutability": "constant", "name": "maxMintCapFraction", "nameLocation": "928:18:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "904:46:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 378, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "904:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "32", "id": 379, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "949:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_2_by_1", "typeString": "int_const 2"}, "value": "2"}, "visibility": "public"}, {"constant": false, "functionSelector": "8e4a8379", "id": 382, "mutability": "immutable", "name": "timeLaunch", "nameLocation": "1030:10:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "1005:35:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 381, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1005:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "public"}, {"constant": false, "functionSelector": "8da5cb5b", "id": 384, "mutability": "mutable", "name": "owner", "nameLocation": "1083:5:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "1068:20:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 383, "name": "address", "nodeType": "ElementaryTypeName", "src": "1068:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "public"}, {"constant": false, "functionSelector": "07546172", "id": 386, "mutability": "mutable", "name": "minter", "nameLocation": "1131:6:0", "nodeType": "VariableDeclaration", "scope": 704, "src": "1116:21:0", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 385, "name": "address", "nodeType": "ElementaryTypeName", "src": "1116:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "public"}, {"body": {"id": 409, "nodeType": "Block", "src": "1189:102:0", "statements": [{"expression": {"id": 397, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 394, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1199:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 395, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1207:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 396, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1211:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1207:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1199:18:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 398, "nodeType": "ExpressionStatement", "src": "1199:18:0"}, {"expression": {"id": 402, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 399, "name": "minter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 386, "src": "1227:6:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 400, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1236:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 401, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1240:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1236:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1227:19:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 403, "nodeType": "ExpressionStatement", "src": "1227:19:0"}, {"expression": {"id": 407, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 404, "name": "timeLaunch", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 382, "src": "1256:10:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 405, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "1269:5:0", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 406, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1275:9:0", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "1269:15:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1256:28:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 408, "nodeType": "ExpressionStatement", "src": "1256:28:0"}]}, "id": 410, "implemented": true, "kind": "constructor", "modifiers": [{"arguments": [{"hexValue": "4175746f6e6f6c6173", "id": 389, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "1164:11:0", "typeDescriptions": {"typeIdentifier": "t_stringliteral_baf065a0203c40020601a5bd2bb245d4db4acc0c210a80a99e3fbf2fe16fb242", "typeString": "literal_string \"Autonolas\""}, "value": "Autonolas"}, {"hexValue": "4f4c4153", "id": 390, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "1177:6:0", "typeDescriptions": {"typeIdentifier": "t_stringliteral_523f1bb39a49927241fcd48dacab09dd72c218bf1e3a01e3206264fd666f0d79", "typeString": "literal_string \"OLAS\""}, "value": "OLAS"}, {"hexValue": "3138", "id": 391, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1185:2:0", "typeDescriptions": {"typeIdentifier": "t_rational_18_by_1", "typeString": "int_const 18"}, "value": "18"}], "id": 392, "kind": "baseConstructorSpecifier", "modifierName": {"id": 388, "name": "ERC20", "nameLocations": ["1158:5:0"], "nodeType": "IdentifierPath", "referencedDeclaration": 4930, "src": "1158:5:0"}, "nodeType": "ModifierInvocation", "src": "1158:30:0"}], "name": "", "nameLocation": "-1:-1:-1", "nodeType": "FunctionDefinition", "parameters": {"id": 387, "nodeType": "ParameterList", "parameters": [], "src": "1155:2:0"}, "returnParameters": {"id": 393, "nodeType": "ParameterList", "parameters": [], "src": "1189:0:0"}, "scope": 704, "src": "1144:147:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "public"}, {"body": {"id": 447, "nodeType": "Block", "src": "1433:250:0", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 419, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 416, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1447:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 417, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1451:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1447:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"id": 418, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1461:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1447:19:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 427, "nodeType": "IfStatement", "src": "1443:87:0", "trueBody": {"id": 426, "nodeType": "Block", "src": "1468:62:0", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 421, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1501:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 422, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1505:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1501:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 423, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1513:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 420, "name": "ManagerOnly", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 355, "src": "1489:11:0", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$__$", "typeString": "function (address,address) pure"}}, "id": 424, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1489:30:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 425, "nodeType": "RevertStatement", "src": "1482:37:0"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 433, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 428, "name": "newOwner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 413, "src": "1544:8:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 431, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1564:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 430, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1556:7:0", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 429, "name": "address", "nodeType": "ElementaryTypeName", "src": "1556:7:0", "typeDescriptions": {}}}, "id": 432, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1556:10:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1544:22:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 438, "nodeType": "IfStatement", "src": "1540:73:0", "trueBody": {"id": 437, "nodeType": "Block", "src": "1568:45:0", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 434, "name": "ZeroAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 358, "src": "1589:11:0", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 435, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1589:13:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 436, "nodeType": "RevertStatement", "src": "1582:20:0"}]}}, {"expression": {"id": 441, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 439, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1623:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 440, "name": "newOwner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 413, "src": "1631:8:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1623:16:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 442, "nodeType": "ExpressionStatement", "src": "1623:16:0"}, {"eventCall": {"arguments": [{"id": 444, "name": "newOwner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 413, "src": "1667:8:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 443, "name": "OwnerUpdated", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 369, "src": "1654:12:0", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", "typeString": "function (address)"}}, "id": 445, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1654:22:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 446, "nodeType": "EmitStatement", "src": "1649:27:0"}]}, "documentation": {"id": 411, "nodeType": "StructuredDocumentation", "src": "1297:83:0", "text": "@dev Changes the owner address.\n @param newOwner Address of a new owner."}, "functionSelector": "a6f9dae1", "id": 448, "implemented": true, "kind": "function", "modifiers": [], "name": "changeOwner", "nameLocation": "1394:11:0", "nodeType": "FunctionDefinition", "parameters": {"id": 414, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 413, "mutability": "mutable", "name": "newOwner", "nameLocation": "1414:8:0", "nodeType": "VariableDeclaration", "scope": 448, "src": "1406:16:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 412, "name": "address", "nodeType": "ElementaryTypeName", "src": "1406:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1405:18:0"}, "returnParameters": {"id": 415, "nodeType": "ParameterList", "parameters": [], "src": "1433:0:0"}, "scope": 704, "src": "1385:298:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 485, "nodeType": "Block", "src": "1830:255:0", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 457, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 454, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1844:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 455, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1848:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1844:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"id": 456, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1858:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1844:19:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 465, "nodeType": "IfStatement", "src": "1840:87:0", "trueBody": {"id": 464, "nodeType": "Block", "src": "1865:62:0", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 459, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1898:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 460, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1902:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "1898:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 461, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 384, "src": "1910:5:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 458, "name": "ManagerOnly", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 355, "src": "1886:11:0", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$__$", "typeString": "function (address,address) pure"}}, "id": 462, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1886:30:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 463, "nodeType": "RevertStatement", "src": "1879:37:0"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 471, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 466, "name": "newMinter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 451, "src": "1941:9:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 469, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1962:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 468, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1954:7:0", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 467, "name": "address", "nodeType": "ElementaryTypeName", "src": "1954:7:0", "typeDescriptions": {}}}, "id": 470, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1954:10:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "1941:23:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 476, "nodeType": "IfStatement", "src": "1937:74:0", "trueBody": {"id": 475, "nodeType": "Block", "src": "1966:45:0", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 472, "name": "ZeroAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 358, "src": "1987:11:0", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 473, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1987:13:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 474, "nodeType": "RevertStatement", "src": "1980:20:0"}]}}, {"expression": {"id": 479, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 477, "name": "minter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 386, "src": "2021:6:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 478, "name": "newMinter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 451, "src": "2030:9:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "2021:18:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 480, "nodeType": "ExpressionStatement", "src": "2021:18:0"}, {"eventCall": {"arguments": [{"id": 482, "name": "newMinter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 451, "src": "2068:9:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 481, "name": "MinterUpdated", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 365, "src": "2054:13:0", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", "typeString": "function (address)"}}, "id": 483, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2054:24:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 484, "nodeType": "EmitStatement", "src": "2049:29:0"}]}, "documentation": {"id": 449, "nodeType": "StructuredDocumentation", "src": "1689:86:0", "text": "@dev Changes the minter address.\n @param newMinter Address of a new minter."}, "functionSelector": "2c4d4d18", "id": 486, "implemented": true, "kind": "function", "modifiers": [], "name": "changeMinter", "nameLocation": "1789:12:0", "nodeType": "FunctionDefinition", "parameters": {"id": 452, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 451, "mutability": "mutable", "name": "newMinter", "nameLocation": "1810:9:0", "nodeType": "VariableDeclaration", "scope": 486, "src": "1802:17:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 450, "name": "address", "nodeType": "ElementaryTypeName", "src": "1802:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1801:19:0"}, "returnParameters": {"id": 453, "nodeType": "ParameterList", "parameters": [], "src": "1830:0:0"}, "scope": 704, "src": "1780:305:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 516, "nodeType": "Block", "src": "2383:267:0", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 497, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 494, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2423:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 495, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2427:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "2423:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"id": 496, "name": "minter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 386, "src": "2437:6:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "2423:20:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 505, "nodeType": "IfStatement", "src": "2419:89:0", "trueBody": {"id": 504, "nodeType": "Block", "src": "2445:63:0", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 499, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2478:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 500, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2482:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "2478:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 501, "name": "minter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 386, "src": "2490:6:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 498, "name": "ManagerOnly", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 355, "src": "2466:11:0", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$__$", "typeString": "function (address,address) pure"}}, "id": 502, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2466:31:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 503, "nodeType": "RevertStatement", "src": "2459:38:0"}]}}, {"condition": {"arguments": [{"id": 507, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 491, "src": "2588:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 506, "name": "inflationControl", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 536, "src": "2571:16:0", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$", "typeString": "function (uint256) view returns (bool)"}}, "id": 508, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2571:24:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 515, "nodeType": "IfStatement", "src": "2567:77:0", "trueBody": {"id": 514, "nodeType": "Block", "src": "2597:47:0", "statements": [{"expression": {"arguments": [{"id": 510, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 489, "src": "2617:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 511, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 491, "src": "2626:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 509, "name": "_mint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4901, "src": "2611:5:0", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256)"}}, "id": 512, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2611:22:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 513, "nodeType": "ExpressionStatement", "src": "2611:22:0"}]}}]}, "documentation": {"id": 487, "nodeType": "StructuredDocumentation", "src": "2091:231:0", "text": "@dev Mints OLAS tokens.\n @notice If the inflation control does not pass, the revert does not take place, as well as no action is performed.\n @param account Account address.\n @param amount OLAS token amount."}, "functionSelector": "40c10f19", "id": 517, "implemented": true, "kind": "function", "modifiers": [], "name": "mint", "nameLocation": "2336:4:0", "nodeType": "FunctionDefinition", "parameters": {"id": 492, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 489, "mutability": "mutable", "name": "account", "nameLocation": "2349:7:0", "nodeType": "VariableDeclaration", "scope": 517, "src": "2341:15:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 488, "name": "address", "nodeType": "ElementaryTypeName", "src": "2341:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 491, "mutability": "mutable", "name": "amount", "nameLocation": "2366:6:0", "nodeType": "VariableDeclaration", "scope": 517, "src": "2358:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 490, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2358:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2340:33:0"}, "returnParameters": {"id": 493, "nodeType": "ParameterList", "parameters": [], "src": "2383:0:0"}, "scope": 704, "src": "2327:323:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 535, "nodeType": "Block", "src": "2986:95:0", "statements": [{"assignments": [526], "declarations": [{"constant": false, "id": 526, "mutability": "mutable", "name": "remainder", "nameLocation": "3004:9:0", "nodeType": "VariableDeclaration", "scope": 535, "src": "2996:17:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 525, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2996:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 529, "initialValue": {"arguments": [], "expression": {"argumentTypes": [], "id": 527, "name": "inflationRemainder", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 597, "src": "3016:18:0", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", "typeString": "function () view returns (uint256)"}}, "id": 528, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "3016:20:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "2996:40:0"}, {"expression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 532, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 530, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 520, "src": "3054:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<=", "rightExpression": {"id": 531, "name": "remainder", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 526, "src": "3064:9:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3054:19:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "id": 533, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "3053:21:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "functionReturnParameters": 524, "id": 534, "nodeType": "Return", "src": "3046:28:0"}]}, "documentation": {"id": 518, "nodeType": "StructuredDocumentation", "src": "2656:256:0", "text": "@dev Provides various checks for the inflation control.\n @notice The `<=` check is left as is for a better code readability.\n @param amount Amount of OLAS to mint.\n @return True if the amount request is within inflation boundaries."}, "functionSelector": "6e79265c", "id": 536, "implemented": true, "kind": "function", "modifiers": [], "name": "inflationControl", "nameLocation": "2926:16:0", "nodeType": "FunctionDefinition", "parameters": {"id": 521, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 520, "mutability": "mutable", "name": "amount", "nameLocation": "2951:6:0", "nodeType": "VariableDeclaration", "scope": 536, "src": "2943:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 519, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2943:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2942:16:0"}, "returnParameters": {"id": 524, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 523, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 536, "src": "2980:4:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 522, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2980:4:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "2979:6:0"}, "scope": 704, "src": "2917:164:0", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 596, "nodeType": "Block", "src": "3267:725:0", "statements": [{"assignments": [543], "declarations": [{"constant": false, "id": 543, "mutability": "mutable", "name": "_totalSupply", "nameLocation": "3285:12:0", "nodeType": "VariableDeclaration", "scope": 596, "src": "3277:20:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 542, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3277:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 545, "initialValue": {"id": 544, "name": "totalSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4569, "src": "3300:11:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "3277:34:0"}, {"assignments": [547], "declarations": [{"constant": false, "id": 547, "mutability": "mutable", "name": "numYears", "nameLocation": "3353:8:0", "nodeType": "VariableDeclaration", "scope": 596, "src": "3345:16:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 546, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3345:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 555, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 554, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 551, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 548, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "3365:5:0", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 549, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "3371:9:0", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "3365:15:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 550, "name": "timeLaunch", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 382, "src": "3383:10:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3365:28:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 552, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "3364:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 553, "name": "oneYear", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 374, "src": "3397:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3364:40:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "3345:59:0"}, {"assignments": [557], "declarations": [{"constant": false, "id": 557, "mutability": "mutable", "name": "supplyCap", "nameLocation": "3471:9:0", "nodeType": "VariableDeclaration", "scope": 596, "src": "3463:17:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 556, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3463:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 559, "initialValue": {"id": 558, "name": "tenYearSupplyCap", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 377, "src": "3483:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "3463:36:0"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 562, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 560, "name": "numYears", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 547, "src": "3619:8:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "39", "id": 561, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "3630:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_9_by_1", "typeString": "int_const 9"}, "value": "9"}, "src": "3619:12:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 589, "nodeType": "IfStatement", "src": "3615:276:0", "trueBody": {"id": 588, "nodeType": "Block", "src": "3633:258:0", "statements": [{"expression": {"id": 565, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 563, "name": "numYears", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 547, "src": "3731:8:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"hexValue": "39", "id": 564, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "3743:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_9_by_1", "typeString": "int_const 9"}, "value": "9"}, "src": "3731:13:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 566, "nodeType": "ExpressionStatement", "src": "3731:13:0"}, {"body": {"id": 586, "nodeType": "Block", "src": "3797:84:0", "statements": [{"expression": {"id": 584, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 577, "name": "supplyCap", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 557, "src": "3815:9:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 583, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 580, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 578, "name": "supplyCap", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 557, "src": "3829:9:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 579, "name": "maxMintCapFraction", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 380, "src": "3841:18:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3829:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 581, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "3828:32:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"hexValue": "313030", "id": 582, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "3863:3:0", "typeDescriptions": {"typeIdentifier": "t_rational_100_by_1", "typeString": "int_const 100"}, "value": "100"}, "src": "3828:38:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3815:51:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 585, "nodeType": "ExpressionStatement", "src": "3815:51:0"}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 573, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 571, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 568, "src": "3778:1:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"id": 572, "name": "numYears", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 547, "src": "3782:8:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3778:12:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 587, "initializationExpression": {"assignments": [568], "declarations": [{"constant": false, "id": 568, "mutability": "mutable", "name": "i", "nameLocation": "3771:1:0", "nodeType": "VariableDeclaration", "scope": 587, "src": "3763:9:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 567, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3763:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 570, "initialValue": {"hexValue": "30", "id": 569, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "3775:1:0", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "3763:13:0"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 575, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "3792:3:0", "subExpression": {"id": 574, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 568, "src": "3794:1:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 576, "nodeType": "ExpressionStatement", "src": "3792:3:0"}, "nodeType": "ForStatement", "src": "3758:123:0"}]}}, {"expression": {"id": 594, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 590, "name": "remainder", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 540, "src": "3949:9:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 593, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 591, "name": "supplyCap", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 557, "src": "3961:9:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 592, "name": "_totalSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 543, "src": "3973:12:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3961:24:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3949:36:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 595, "nodeType": "ExpressionStatement", "src": "3949:36:0"}]}, "documentation": {"id": 537, "nodeType": "StructuredDocumentation", "src": "3087:105:0", "text": "@dev Gets the reminder of OLAS possible for the mint.\n @return remainder OLAS token remainder."}, "functionSelector": "b091dab3", "id": 597, "implemented": true, "kind": "function", "modifiers": [], "name": "inflationRemainder", "nameLocation": "3206:18:0", "nodeType": "FunctionDefinition", "parameters": {"id": 538, "nodeType": "ParameterList", "parameters": [], "src": "3224:2:0"}, "returnParameters": {"id": 541, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 540, "mutability": "mutable", "name": "remainder", "nameLocation": "3256:9:0", "nodeType": "VariableDeclaration", "scope": 597, "src": "3248:17:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 539, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3248:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "3247:19:0"}, "scope": 704, "src": "3197:795:0", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 609, "nodeType": "Block", "src": "4118:42:0", "statements": [{"expression": {"arguments": [{"expression": {"id": 604, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "4134:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 605, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4138:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "4134:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 606, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 600, "src": "4146:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 603, "name": "_burn", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4929, "src": "4128:5:0", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256)"}}, "id": 607, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4128:25:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 608, "nodeType": "ExpressionStatement", "src": "4128:25:0"}]}, "documentation": {"id": 598, "nodeType": "StructuredDocumentation", "src": "3998:76:0", "text": "@dev Burns OLAS tokens.\n @param amount OLAS token amount to burn."}, "functionSelector": "42966c68", "id": 610, "implemented": true, "kind": "function", "modifiers": [], "name": "burn", "nameLocation": "4088:4:0", "nodeType": "FunctionDefinition", "parameters": {"id": 601, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 600, "mutability": "mutable", "name": "amount", "nameLocation": "4101:6:0", "nodeType": "VariableDeclaration", "scope": 610, "src": "4093:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 599, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4093:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4092:16:0"}, "returnParameters": {"id": 602, "nodeType": "ParameterList", "parameters": [], "src": "4118:0:0"}, "scope": 704, "src": "4079:81:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 660, "nodeType": "Block", "src": "4688:329:0", "statements": [{"assignments": [621], "declarations": [{"constant": false, "id": 621, "mutability": "mutable", "name": "spenderAllowance", "nameLocation": "4706:16:0", "nodeType": "VariableDeclaration", "scope": 660, "src": "4698:24:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 620, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4698:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 628, "initialValue": {"baseExpression": {"baseExpression": {"id": 622, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "4725:9:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 625, "indexExpression": {"expression": {"id": 623, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "4735:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 624, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4739:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "4735:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "4725:21:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 627, "indexExpression": {"id": 626, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 613, "src": "4747:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "4725:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "4698:57:0"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 635, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 629, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 621, "src": "4770:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"expression": {"arguments": [{"id": 632, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "4795:7:0", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 631, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4795:7:0", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}], "id": 630, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "4790:4:0", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 633, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4790:13:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint256", "typeString": "type(uint256)"}}, "id": 634, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "4804:3:0", "memberName": "max", "nodeType": "MemberAccess", "src": "4790:17:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4770:37:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 657, "nodeType": "IfStatement", "src": "4766:223:0", "trueBody": {"id": 656, "nodeType": "Block", "src": "4809:180:0", "statements": [{"expression": {"id": 638, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 636, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 621, "src": "4823:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 637, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 615, "src": "4843:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4823:26:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 639, "nodeType": "ExpressionStatement", "src": "4823:26:0"}, {"expression": {"id": 647, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 640, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "4863:9:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 644, "indexExpression": {"expression": {"id": 641, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "4873:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 642, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4877:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "4873:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "4863:21:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 645, "indexExpression": {"id": 643, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 613, "src": "4885:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "4863:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 646, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 621, "src": "4896:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4863:49:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 648, "nodeType": "ExpressionStatement", "src": "4863:49:0"}, {"eventCall": {"arguments": [{"expression": {"id": 650, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "4940:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 651, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4944:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "4940:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 652, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 613, "src": "4952:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 653, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 621, "src": "4961:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 649, "name": "Approval", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4561, "src": "4931:8:0", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 654, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4931:47:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 655, "nodeType": "EmitStatement", "src": "4926:52:0"}]}}, {"expression": {"hexValue": "74727565", "id": 658, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "5006:4:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "functionReturnParameters": 619, "id": 659, "nodeType": "Return", "src": "4999:11:0"}]}, "documentation": {"id": 611, "nodeType": "StructuredDocumentation", "src": "4166:433:0", "text": "@dev Decreases the allowance of another account over their tokens.\n @notice This implementation does not decrease spender allowance if the maximum allowance was granted.\n @notice The underflow condition is treated by the default code generation check.\n @param spender Account that tokens are approved for.\n @param amount Amount to decrease approval by.\n @return True if the operation succeeded."}, "functionSelector": "a457c2d7", "id": 661, "implemented": true, "kind": "function", "modifiers": [], "name": "decreaseAllowance", "nameLocation": "4613:17:0", "nodeType": "FunctionDefinition", "parameters": {"id": 616, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 613, "mutability": "mutable", "name": "spender", "nameLocation": "4639:7:0", "nodeType": "VariableDeclaration", "scope": 661, "src": "4631:15:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 612, "name": "address", "nodeType": "ElementaryTypeName", "src": "4631:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 615, "mutability": "mutable", "name": "amount", "nameLocation": "4656:6:0", "nodeType": "VariableDeclaration", "scope": 661, "src": "4648:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 614, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4648:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4630:33:0"}, "returnParameters": {"id": 619, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 618, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 661, "src": "4682:4:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 617, "name": "bool", "nodeType": "ElementaryTypeName", "src": "4682:4:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "4681:6:0"}, "scope": 704, "src": "4604:413:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 702, "nodeType": "Block", "src": "5434:254:0", "statements": [{"assignments": [672], "declarations": [{"constant": false, "id": 672, "mutability": "mutable", "name": "spenderAllowance", "nameLocation": "5452:16:0", "nodeType": "VariableDeclaration", "scope": 702, "src": "5444:24:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 671, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5444:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 679, "initialValue": {"baseExpression": {"baseExpression": {"id": 673, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "5471:9:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 676, "indexExpression": {"expression": {"id": 674, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "5481:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 675, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5485:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "5481:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "5471:21:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 678, "indexExpression": {"id": 677, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 664, "src": "5493:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "5471:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "5444:57:0"}, {"expression": {"id": 682, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 680, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 672, "src": "5512:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 681, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 666, "src": "5532:6:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5512:26:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 683, "nodeType": "ExpressionStatement", "src": "5512:26:0"}, {"expression": {"id": 691, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 684, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "5548:9:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 688, "indexExpression": {"expression": {"id": 685, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "5558:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 686, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5562:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "5558:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "5548:21:0", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 689, "indexExpression": {"id": 687, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 664, "src": "5570:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "5548:30:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 690, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 672, "src": "5581:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5548:49:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 692, "nodeType": "ExpressionStatement", "src": "5548:49:0"}, {"eventCall": {"arguments": [{"expression": {"id": 694, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "5621:3:0", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 695, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5625:6:0", "memberName": "sender", "nodeType": "MemberAccess", "src": "5621:10:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 696, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 664, "src": "5633:7:0", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 697, "name": "spenderAllowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 672, "src": "5642:16:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 693, "name": "Approval", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4561, "src": "5612:8:0", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 698, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5612:47:0", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 699, "nodeType": "EmitStatement", "src": "5607:52:0"}, {"expression": {"hexValue": "74727565", "id": 700, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "5677:4:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "functionReturnParameters": 670, "id": 701, "nodeType": "Return", "src": "5670:11:0"}]}, "documentation": {"id": 662, "nodeType": "StructuredDocumentation", "src": "5023:322:0", "text": "@dev Increases the allowance of another account over their tokens.\n @notice The overflow condition is treated by the default code generation check.\n @param spender Account that tokens are approved for.\n @param amount Amount to increase approval by.\n @return True if the operation succeeded."}, "functionSelector": "39509351", "id": 703, "implemented": true, "kind": "function", "modifiers": [], "name": "increaseAllowance", "nameLocation": "5359:17:0", "nodeType": "FunctionDefinition", "parameters": {"id": 667, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 664, "mutability": "mutable", "name": "spender", "nameLocation": "5385:7:0", "nodeType": "VariableDeclaration", "scope": 703, "src": "5377:15:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 663, "name": "address", "nodeType": "ElementaryTypeName", "src": "5377:7:0", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 666, "mutability": "mutable", "name": "amount", "nameLocation": "5402:6:0", "nodeType": "VariableDeclaration", "scope": 703, "src": "5394:14:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 665, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5394:7:0", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "5376:33:0"}, "returnParameters": {"id": 670, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 669, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 703, "src": "5428:4:0", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 668, "name": "bool", "nodeType": "ElementaryTypeName", "src": "5428:4:0", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "5427:6:0"}, "scope": 704, "src": "5350:338:0", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}], "scope": 705, "src": "508:5182:0", "usedErrors": [355, 358], "usedEvents": [365, 369, 4553, 4561]}], "src": "32:5659:0"}}, "/home/andrey/valory/autonolas-governance/contracts/interfaces/IErrors.sol": {"AST": {"absolutePath": "contracts/interfaces/IErrors.sol", "exportedSymbols": {"IErrors": [5036]}, "id": 5037, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 4932, "literals": ["solidity", "^", "0.8", ".15"], "nodeType": "PragmaDirective", "src": "32:24:1"}, {"abstract": false, "baseContracts": [], "canonicalName": "IErrors", "contractDependencies": [], "contractKind": "interface", "documentation": {"id": 4933, "nodeType": "StructuredDocumentation", "src": "58:17:1", "text": "@dev Errors."}, "fullyImplemented": true, "id": 5036, "linearizedBaseContracts": [5036], "name": "IErrors", "nameLocation": "85:7:1", "nodeType": "ContractDefinition", "nodes": [{"documentation": {"id": 4934, "nodeType": "StructuredDocumentation", "src": "99:165:1", "text": "@dev Only `owner` has a privilege, but the `sender` was provided.\n @param sender Sender address.\n @param owner Required sender address as an owner."}, "errorSelector": "a43d6ada", "id": 4940, "name": "OwnerOnly", "nameLocation": "275:9:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4939, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4936, "mutability": "mutable", "name": "sender", "nameLocation": "293:6:1", "nodeType": "VariableDeclaration", "scope": 4940, "src": "285:14:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4935, "name": "address", "nodeType": "ElementaryTypeName", "src": "285:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4938, "mutability": "mutable", "name": "owner", "nameLocation": "309:5:1", "nodeType": "VariableDeclaration", "scope": 4940, "src": "301:13:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4937, "name": "address", "nodeType": "ElementaryTypeName", "src": "301:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "284:31:1"}, "src": "269:47:1"}, {"documentation": {"id": 4941, "nodeType": "StructuredDocumentation", "src": "322:31:1", "text": "@dev Provided zero address."}, "errorSelector": "d92e233d", "id": 4943, "name": "ZeroAddress", "nameLocation": "364:11:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4942, "nodeType": "ParameterList", "parameters": [], "src": "375:2:1"}, "src": "358:20:1"}, {"documentation": {"id": 4944, "nodeType": "StructuredDocumentation", "src": "384:58:1", "text": "@dev Zero value when it has to be different from zero."}, "errorSelector": "7c946ed7", "id": 4946, "name": "ZeroValue", "nameLocation": "453:9:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4945, "nodeType": "ParameterList", "parameters": [], "src": "462:2:1"}, "src": "447:18:1"}, {"documentation": {"id": 4947, "nodeType": "StructuredDocumentation", "src": "471:47:1", "text": "@dev Non-zero value when it has to be zero."}, "errorSelector": "e320176b", "id": 4949, "name": "NonZeroValue", "nameLocation": "529:12:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4948, "nodeType": "ParameterList", "parameters": [], "src": "541:2:1"}, "src": "523:21:1"}, {"documentation": {"id": 4950, "nodeType": "StructuredDocumentation", "src": "550:160:1", "text": "@dev Wrong length of two arrays.\n @param numValues1 Number of values in a first array.\n @param numValues2 Numberf of values in a second array."}, "errorSelector": "8151c110", "id": 4956, "name": "WrongArrayLength", "nameLocation": "721:16:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4955, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4952, "mutability": "mutable", "name": "numValues1", "nameLocation": "746:10:1", "nodeType": "VariableDeclaration", "scope": 4956, "src": "738:18:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4951, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "738:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4954, "mutability": "mutable", "name": "numValues2", "nameLocation": "766:10:1", "nodeType": "VariableDeclaration", "scope": 4956, "src": "758:18:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4953, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "758:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "737:40:1"}, "src": "715:63:1"}, {"documentation": {"id": 4957, "nodeType": "StructuredDocumentation", "src": "784:107:1", "text": "@dev Value overflow.\n @param provided Overflow value.\n @param max Maximum possible value."}, "errorSelector": "7ae59685", "id": 4963, "name": "Overflow", "nameLocation": "902:8:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4962, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4959, "mutability": "mutable", "name": "provided", "nameLocation": "919:8:1", "nodeType": "VariableDeclaration", "scope": 4963, "src": "911:16:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4958, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "911:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4961, "mutability": "mutable", "name": "max", "nameLocation": "937:3:1", "nodeType": "VariableDeclaration", "scope": 4963, "src": "929:11:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4960, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "929:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "910:31:1"}, "src": "896:46:1"}, {"documentation": {"id": 4964, "nodeType": "StructuredDocumentation", "src": "948:73:1", "text": "@dev Token is non-transferable.\n @param account Token address."}, "errorSelector": "9c21e7b2", "id": 4968, "name": "NonTransferable", "nameLocation": "1032:15:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4967, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4966, "mutability": "mutable", "name": "account", "nameLocation": "1056:7:1", "nodeType": "VariableDeclaration", "scope": 4968, "src": "1048:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4965, "name": "address", "nodeType": "ElementaryTypeName", "src": "1048:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1047:17:1"}, "src": "1026:39:1"}, {"documentation": {"id": 4969, "nodeType": "StructuredDocumentation", "src": "1071:72:1", "text": "@dev Token is non-delegatable.\n @param account Token address."}, "errorSelector": "535db4ec", "id": 4973, "name": "NonDelegatable", "nameLocation": "1154:14:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4972, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4971, "mutability": "mutable", "name": "account", "nameLocation": "1177:7:1", "nodeType": "VariableDeclaration", "scope": 4973, "src": "1169:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4970, "name": "address", "nodeType": "ElementaryTypeName", "src": "1169:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1168:17:1"}, "src": "1148:38:1"}, {"documentation": {"id": 4974, "nodeType": "StructuredDocumentation", "src": "1192:128:1", "text": "@dev Insufficient token allowance.\n @param provided Provided amount.\n @param expected Minimum expected amount."}, "errorSelector": "2a1b2dd8", "id": 4980, "name": "InsufficientAllowance", "nameLocation": "1331:21:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4979, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4976, "mutability": "mutable", "name": "provided", "nameLocation": "1361:8:1", "nodeType": "VariableDeclaration", "scope": 4980, "src": "1353:16:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4975, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1353:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4978, "mutability": "mutable", "name": "expected", "nameLocation": "1379:8:1", "nodeType": "VariableDeclaration", "scope": 4980, "src": "1371:16:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4977, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1371:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1352:36:1"}, "src": "1325:64:1"}, {"documentation": {"id": 4981, "nodeType": "StructuredDocumentation", "src": "1395:110:1", "text": "@dev No existing lock value is found.\n @param account Address that is checked for the locked value."}, "errorSelector": "1ff847b6", "id": 4985, "name": "NoValueLocked", "nameLocation": "1516:13:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4984, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4983, "mutability": "mutable", "name": "account", "nameLocation": "1538:7:1", "nodeType": "VariableDeclaration", "scope": 4985, "src": "1530:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4982, "name": "address", "nodeType": "ElementaryTypeName", "src": "1530:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1529:17:1"}, "src": "1510:37:1"}, {"documentation": {"id": 4986, "nodeType": "StructuredDocumentation", "src": "1553:140:1", "text": "@dev Locked value is not zero.\n @param account Address that is checked for the locked value.\n @param amount Locked amount."}, "errorSelector": "89bf64dd", "id": 4992, "name": "LockedValueNotZero", "nameLocation": "1704:18:1", "nodeType": "ErrorDefinition", "parameters": {"id": 4991, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4988, "mutability": "mutable", "name": "account", "nameLocation": "1731:7:1", "nodeType": "VariableDeclaration", "scope": 4992, "src": "1723:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4987, "name": "address", "nodeType": "ElementaryTypeName", "src": "1723:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4990, "mutability": "mutable", "name": "amount", "nameLocation": "1748:6:1", "nodeType": "VariableDeclaration", "scope": 4992, "src": "1740:14:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4989, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1740:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1722:33:1"}, "src": "1698:58:1"}, {"documentation": {"id": 4993, "nodeType": "StructuredDocumentation", "src": "1762:196:1", "text": "@dev Value lock is expired.\n @param account Address that is checked for the locked value.\n @param deadline The lock expiration deadline.\n @param curTime Current timestamp."}, "errorSelector": "d78507e1", "id": 5001, "name": "LockExpired", "nameLocation": "1969:11:1", "nodeType": "ErrorDefinition", "parameters": {"id": 5000, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4995, "mutability": "mutable", "name": "account", "nameLocation": "1989:7:1", "nodeType": "VariableDeclaration", "scope": 5001, "src": "1981:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4994, "name": "address", "nodeType": "ElementaryTypeName", "src": "1981:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4997, "mutability": "mutable", "name": "deadline", "nameLocation": "2006:8:1", "nodeType": "VariableDeclaration", "scope": 5001, "src": "1998:16:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4996, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1998:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4999, "mutability": "mutable", "name": "curTime", "nameLocation": "2024:7:1", "nodeType": "VariableDeclaration", "scope": 5001, "src": "2016:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4998, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2016:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1980:52:1"}, "src": "1963:70:1"}, {"documentation": {"id": 5002, "nodeType": "StructuredDocumentation", "src": "2039:200:1", "text": "@dev Value lock is not expired.\n @param account Address that is checked for the locked value.\n @param deadline The lock expiration deadline.\n @param curTime Current timestamp."}, "errorSelector": "ab0246b3", "id": 5010, "name": "LockNotExpired", "nameLocation": "2250:14:1", "nodeType": "ErrorDefinition", "parameters": {"id": 5009, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5004, "mutability": "mutable", "name": "account", "nameLocation": "2273:7:1", "nodeType": "VariableDeclaration", "scope": 5010, "src": "2265:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5003, "name": "address", "nodeType": "ElementaryTypeName", "src": "2265:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5006, "mutability": "mutable", "name": "deadline", "nameLocation": "2290:8:1", "nodeType": "VariableDeclaration", "scope": 5010, "src": "2282:16:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5005, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2282:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5008, "mutability": "mutable", "name": "curTime", "nameLocation": "2308:7:1", "nodeType": "VariableDeclaration", "scope": 5010, "src": "2300:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5007, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2300:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2264:52:1"}, "src": "2244:73:1"}, {"documentation": {"id": 5011, "nodeType": "StructuredDocumentation", "src": "2323:234:1", "text": "@dev Provided unlock time is incorrect.\n @param account Address that is checked for the locked value.\n @param minUnlockTime Minimal unlock time that can be set.\n @param providedUnlockTime Provided unlock time."}, "errorSelector": "311d1bf9", "id": 5019, "name": "UnlockTimeIncorrect", "nameLocation": "2568:19:1", "nodeType": "ErrorDefinition", "parameters": {"id": 5018, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5013, "mutability": "mutable", "name": "account", "nameLocation": "2596:7:1", "nodeType": "VariableDeclaration", "scope": 5019, "src": "2588:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5012, "name": "address", "nodeType": "ElementaryTypeName", "src": "2588:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5015, "mutability": "mutable", "name": "minUnlockTime", "nameLocation": "2613:13:1", "nodeType": "VariableDeclaration", "scope": 5019, "src": "2605:21:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5014, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2605:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5017, "mutability": "mutable", "name": "providedUnlockTime", "nameLocation": "2636:18:1", "nodeType": "VariableDeclaration", "scope": 5019, "src": "2628:26:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5016, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2628:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2587:68:1"}, "src": "2562:94:1"}, {"documentation": {"id": 5020, "nodeType": "StructuredDocumentation", "src": "2662:252:1", "text": "@dev Provided unlock time is bigger than the maximum allowed.\n @param account Address that is checked for the locked value.\n @param maxUnlockTime Max unlock time that can be set.\n @param providedUnlockTime Provided unlock time."}, "errorSelector": "c172987b", "id": 5028, "name": "MaxUnlockTimeReached", "nameLocation": "2925:20:1", "nodeType": "ErrorDefinition", "parameters": {"id": 5027, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5022, "mutability": "mutable", "name": "account", "nameLocation": "2954:7:1", "nodeType": "VariableDeclaration", "scope": 5028, "src": "2946:15:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5021, "name": "address", "nodeType": "ElementaryTypeName", "src": "2946:7:1", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5024, "mutability": "mutable", "name": "maxUnlockTime", "nameLocation": "2971:13:1", "nodeType": "VariableDeclaration", "scope": 5028, "src": "2963:21:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5023, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2963:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5026, "mutability": "mutable", "name": "providedUnlockTime", "nameLocation": "2994:18:1", "nodeType": "VariableDeclaration", "scope": 5028, "src": "2986:26:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5025, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2986:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2945:68:1"}, "src": "2919:95:1"}, {"documentation": {"id": 5029, "nodeType": "StructuredDocumentation", "src": "3020:185:1", "text": "@dev Provided block number is incorrect (has not been processed yet).\n @param providedBlockNumber Provided block number.\n @param actualBlockNumber Actual block number."}, "errorSelector": "8633967e", "id": 5035, "name": "WrongBlockNumber", "nameLocation": "3216:16:1", "nodeType": "ErrorDefinition", "parameters": {"id": 5034, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5031, "mutability": "mutable", "name": "providedBlockNumber", "nameLocation": "3241:19:1", "nodeType": "VariableDeclaration", "scope": 5035, "src": "3233:27:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5030, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3233:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5033, "mutability": "mutable", "name": "actualBlockNumber", "nameLocation": "3270:17:1", "nodeType": "VariableDeclaration", "scope": 5035, "src": "3262:25:1", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5032, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3262:7:1", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "3232:56:1"}, "src": "3210:79:1"}], "scope": 5037, "src": "75:3216:1", "usedErrors": [4940, 4943, 4946, 4949, 4956, 4963, 4968, 4973, 4980, 4985, 4992, 5001, 5010, 5019, 5028, 5035], "usedEvents": []}], "src": "32:3260:1"}}, "/home/andrey/valory/autonolas-governance/contracts/test/EchidnaVoteWeightingAssert.sol": {"AST": {"absolutePath": "contracts/test/EchidnaVoteWeightingAssert.sol", "exportedSymbols": {"ERC20": [4930], "EchidnaVoteWeightingAssert": [345], "IERC165": [5204], "IERC20": [5192], "IErrors": [5036], "IVEOLAS": [736], "IVotes": [5114], "LockedBalance": [2192], "ManagerOnly": [355], "NomineeAlreadyExists": [748], "NomineeDoesNotExist": [742], "OLAS": [704], "Point": [761], "PointVoting": [2203], "VoteTooOften": [756], "VoteWeightingFuzzing": [2180], "VotedSlope": [768], "ZeroAddress": [358], "veOLAS": [4542]}, "id": 346, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 1, "literals": ["solidity", "^", "0.8", ".23"], "nodeType": "PragmaDirective", "src": "32:24:2"}, {"absolutePath": "contracts/OLAS.sol", "file": "../OLAS.sol", "id": 2, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 346, "sourceUnit": 705, "src": "58:21:2", "symbolAliases": [], "unitAlias": ""}, {"absolutePath": "contracts/veOLAS.sol", "file": "../veOLAS.sol", "id": 3, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 346, "sourceUnit": 4543, "src": "80:23:2", "symbolAliases": [], "unitAlias": ""}, {"absolutePath": "contracts/test/VoteWeightingFuzzing.sol", "file": "./VoteWeightingFuzzing.sol", "id": 4, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 346, "sourceUnit": 2181, "src": "104:36:2", "symbolAliases": [], "unitAlias": ""}, {"abstract": false, "baseContracts": [], "canonicalName": "EchidnaVoteWeightingAssert", "contractDependencies": [704, 2180, 4542], "contractKind": "contract", "fullyImplemented": true, "id": 345, "linearizedBaseContracts": [345], "name": "EchidnaVoteWeightingAssert", "nameLocation": "152:26:2", "nodeType": "ContractDefinition", "nodes": [{"constant": false, "id": 7, "mutability": "mutable", "name": "olas", "nameLocation": "194:4:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "189:9:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}, "typeName": {"id": 6, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 5, "name": "OLAS", "nameLocations": ["189:4:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 704, "src": "189:4:2"}, "referencedDeclaration": 704, "src": "189:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "visibility": "internal"}, {"constant": false, "id": 10, "mutability": "mutable", "name": "ve", "nameLocation": "211:2:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "204:9:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}, "typeName": {"id": 9, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 8, "name": "veOLAS", "nameLocations": ["204:6:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 4542, "src": "204:6:2"}, "referencedDeclaration": 4542, "src": "204:6:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "visibility": "internal"}, {"constant": false, "id": 13, "mutability": "mutable", "name": "vw", "nameLocation": "240:2:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "219:23:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}, "typeName": {"id": 12, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 11, "name": "VoteWeightingFuzzing", "nameLocations": ["219:20:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 2180, "src": "219:20:2"}, "referencedDeclaration": 2180, "src": "219:20:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "visibility": "internal"}, {"constant": true, "id": 16, "mutability": "constant", "name": "FAKE_OLAS", "nameLocation": "265:9:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "248:30:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}, "typeName": {"id": 14, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "248:7:2", "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}, "value": {"hexValue": "37", "id": 15, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "277:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_7_by_1", "typeString": "int_const 7"}, "value": "7"}, "visibility": "internal"}, {"constant": true, "id": 19, "mutability": "constant", "name": "oneOLASBalance", "nameLocation": "302:14:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "285:41:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 17, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "285:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "31", "id": 18, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "319:7:2", "subdenomination": "ether", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000_by_1", "typeString": "int_const 1000000000000000000"}, "value": "1"}, "visibility": "internal"}, {"constant": true, "id": 26, "mutability": "constant", "name": "fourYear", "nameLocation": "349:8:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "332:43:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 20, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "332:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"commonType": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}, "id": 25, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}, "id": 23, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "34", "id": 21, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "360:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_4_by_1", "typeString": "int_const 4"}, "value": "4"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "333635", "id": 22, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "364:3:2", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "value": "365"}, "src": "360:7:2", "typeDescriptions": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "3836343030", "id": 24, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "370:5:2", "typeDescriptions": {"typeIdentifier": "t_rational_86400_by_1", "typeString": "int_const 86400"}, "value": "86400"}, "src": "360:15:2", "typeDescriptions": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}}, "visibility": "internal"}, {"constant": true, "id": 33, "mutability": "constant", "name": "oneYear", "nameLocation": "398:7:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "381:42:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 27, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "381:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"commonType": {"typeIdentifier": "t_rational_31536000_by_1", "typeString": "int_const 31536000"}, "id": 32, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "id": 30, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "31", "id": 28, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "408:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "333635", "id": 29, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "412:3:2", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "value": "365"}, "src": "408:7:2", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "3836343030", "id": 31, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "418:5:2", "typeDescriptions": {"typeIdentifier": "t_rational_86400_by_1", "typeString": "int_const 86400"}, "value": "86400"}, "src": "408:15:2", "typeDescriptions": {"typeIdentifier": "t_rational_31536000_by_1", "typeString": "int_const 31536000"}}, "visibility": "internal"}, {"constant": true, "id": 36, "mutability": "constant", "name": "maxVoteWeight", "nameLocation": "446:13:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "429:38:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 34, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "429:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "3130303030", "id": 35, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "462:5:2", "typeDescriptions": {"typeIdentifier": "t_rational_10000_by_1", "typeString": "int_const 10000"}, "value": "10000"}, "visibility": "internal"}, {"constant": true, "id": 39, "mutability": "constant", "name": "WEEK", "nameLocation": "490:4:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "473:31:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 37, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "473:6:2", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "value": {"hexValue": "31", "id": 38, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "497:7:2", "subdenomination": "weeks", "typeDescriptions": {"typeIdentifier": "t_rational_604800_by_1", "typeString": "int_const 604800"}, "value": "1"}, "visibility": "internal"}, {"constant": true, "id": 42, "mutability": "constant", "name": "oneOLAS", "nameLocation": "527:7:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "510:34:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 40, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "510:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "31", "id": 41, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "537:7:2", "subdenomination": "ether", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000_by_1", "typeString": "int_const 1000000000000000000"}, "value": "1"}, "visibility": "internal"}, {"constant": true, "id": 45, "mutability": "constant", "name": "oneMLN", "nameLocation": "567:6:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "550:35:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 43, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "550:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "315f3030305f303030", "id": 44, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "576:9:2", "typeDescriptions": {"typeIdentifier": "t_rational_1000000_by_1", "typeString": "int_const 1000000"}, "value": "1_000_000"}, "visibility": "internal"}, {"constant": false, "id": 47, "mutability": "mutable", "name": "ts", "nameLocation": "599:2:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "591:10:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 46, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "591:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 64, "mutability": "mutable", "name": "senders", "nameLocation": "661:7:2", "nodeType": "VariableDeclaration", "scope": 345, "src": "642:85:2", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$3_storage", "typeString": "address[3]"}, "typeName": {"baseType": {"id": 48, "name": "address", "nodeType": "ElementaryTypeName", "src": "642:7:2", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 50, "length": {"hexValue": "33", "id": 49, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "650:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_3_by_1", "typeString": "int_const 3"}, "value": "3"}, "nodeType": "ArrayTypeName", "src": "642:10:2", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$3_storage_ptr", "typeString": "address[3]"}}, "value": {"components": [{"arguments": [{"hexValue": "30783130303030", "id": 53, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "681:7:2", "typeDescriptions": {"typeIdentifier": "t_rational_65536_by_1", "typeString": "int_const 65536"}, "value": "0x10000"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_65536_by_1", "typeString": "int_const 65536"}], "id": 52, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "673:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 51, "name": "address", "nodeType": "ElementaryTypeName", "src": "673:7:2", "typeDescriptions": {}}}, "id": 54, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "673:16:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"hexValue": "30783230303030", "id": 57, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "699:7:2", "typeDescriptions": {"typeIdentifier": "t_rational_131072_by_1", "typeString": "int_const 131072"}, "value": "0x20000"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_131072_by_1", "typeString": "int_const 131072"}], "id": 56, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "691:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 55, "name": "address", "nodeType": "ElementaryTypeName", "src": "691:7:2", "typeDescriptions": {}}}, "id": 58, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "691:16:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"hexValue": "30783330303030", "id": 61, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "717:7:2", "typeDescriptions": {"typeIdentifier": "t_rational_196608_by_1", "typeString": "int_const 196608"}, "value": "0x30000"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_196608_by_1", "typeString": "int_const 196608"}], "id": 60, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "709:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 59, "name": "address", "nodeType": "ElementaryTypeName", "src": "709:7:2", "typeDescriptions": {}}}, "id": 62, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "709:16:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "id": 63, "isConstant": false, "isInlineArray": true, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "TupleExpression", "src": "671:56:2", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$3_memory_ptr", "typeString": "address[3] memory"}}, "visibility": "private"}, {"body": {"id": 118, "nodeType": "Block", "src": "756:266:2", "statements": [{"expression": {"id": 72, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 67, "name": "olas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 7, "src": "766:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [], "expression": {"argumentTypes": [], "id": 70, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "NewExpression", "src": "773:8:2", "typeDescriptions": {"typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_OLAS_$704_$", "typeString": "function () returns (contract OLAS)"}, "typeName": {"id": 69, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 68, "name": "OLAS", "nameLocations": ["777:4:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 704, "src": "777:4:2"}, "referencedDeclaration": 704, "src": "777:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}}, "id": 71, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "773:10:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "src": "766:17:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "id": 73, "nodeType": "ExpressionStatement", "src": "766:17:2"}, {"assignments": [75], "declarations": [{"constant": false, "id": 75, "mutability": "mutable", "name": "aolas", "nameLocation": "801:5:2", "nodeType": "VariableDeclaration", "scope": 118, "src": "793:13:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 74, "name": "address", "nodeType": "ElementaryTypeName", "src": "793:7:2", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "id": 80, "initialValue": {"arguments": [{"id": 78, "name": "olas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 7, "src": "817:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}], "id": 77, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "809:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 76, "name": "address", "nodeType": "ElementaryTypeName", "src": "809:7:2", "typeDescriptions": {}}}, "id": 79, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "809:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "VariableDeclarationStatement", "src": "793:29:2"}, {"expression": {"id": 89, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 81, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "832:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 85, "name": "aolas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 75, "src": "848:5:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"hexValue": "566f74696e6720457363726f77204f4c4153", "id": 86, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "855:20:2", "typeDescriptions": {"typeIdentifier": "t_stringliteral_5cd7d735ed282b299a51550240e484ccc393b8ba5bdbe4676696c96d2d4d9509", "typeString": "literal_string \"Voting Escrow OLAS\""}, "value": "Voting Escrow OLAS"}, {"hexValue": "76654f4c4153", "id": 87, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "877:8:2", "typeDescriptions": {"typeIdentifier": "t_stringliteral_077ff8fa5bb2ef8fc0e72978e0b913b6fccfe52727542f7a5baaf7580b32bcac", "typeString": "literal_string \"veOLAS\""}, "value": "veOLAS"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_stringliteral_5cd7d735ed282b299a51550240e484ccc393b8ba5bdbe4676696c96d2d4d9509", "typeString": "literal_string \"Voting Escrow OLAS\""}, {"typeIdentifier": "t_stringliteral_077ff8fa5bb2ef8fc0e72978e0b913b6fccfe52727542f7a5baaf7580b32bcac", "typeString": "literal_string \"veOLAS\""}], "id": 84, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "NewExpression", "src": "837:10:2", "typeDescriptions": {"typeIdentifier": "t_function_creation_nonpayable$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_contract$_veOLAS_$4542_$", "typeString": "function (address,string memory,string memory) returns (contract veOLAS)"}, "typeName": {"id": 83, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 82, "name": "veOLAS", "nameLocations": ["841:6:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 4542, "src": "841:6:2"}, "referencedDeclaration": 4542, "src": "841:6:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}}, "id": 88, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "837:49:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "src": "832:54:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "id": 90, "nodeType": "ExpressionStatement", "src": "832:54:2"}, {"assignments": [92], "declarations": [{"constant": false, "id": 92, "mutability": "mutable", "name": "ave", "nameLocation": "904:3:2", "nodeType": "VariableDeclaration", "scope": 118, "src": "896:11:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 91, "name": "address", "nodeType": "ElementaryTypeName", "src": "896:7:2", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "id": 97, "initialValue": {"arguments": [{"id": 95, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "918:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 94, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "910:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 93, "name": "address", "nodeType": "ElementaryTypeName", "src": "910:7:2", "typeDescriptions": {}}}, "id": 96, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "910:11:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "VariableDeclarationStatement", "src": "896:25:2"}, {"expression": {"id": 104, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 98, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "932:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 102, "name": "ave", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 92, "src": "962:3:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 101, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "NewExpression", "src": "937:24:2", "typeDescriptions": {"typeIdentifier": "t_function_creation_nonpayable$_t_address_$returns$_t_contract$_VoteWeightingFuzzing_$2180_$", "typeString": "function (address) returns (contract VoteWeightingFuzzing)"}, "typeName": {"id": 100, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 99, "name": "VoteWeightingFuzzing", "nameLocations": ["941:20:2"], "nodeType": "IdentifierPath", "referencedDeclaration": 2180, "src": "941:20:2"}, "referencedDeclaration": 2180, "src": "941:20:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}}, "id": 103, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "937:29:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "src": "932:34:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 105, "nodeType": "ExpressionStatement", "src": "932:34:2"}, {"expression": {"arguments": [{"arguments": [{"id": 111, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "994:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}], "id": 110, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "986:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 109, "name": "address", "nodeType": "ElementaryTypeName", "src": "986:7:2", "typeDescriptions": {}}}, "id": 112, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "986:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 115, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"id": 113, "name": "oneOLAS", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 42, "src": "1000:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 114, "name": "oneMLN", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 45, "src": "1008:6:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1000:14:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"id": 106, "name": "olas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 7, "src": "976:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "id": 108, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "981:4:2", "memberName": "mint", "nodeType": "MemberAccess", "referencedDeclaration": 517, "src": "976:9:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) external"}}, "id": 116, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "976:39:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 117, "nodeType": "ExpressionStatement", "src": "976:39:2"}]}, "id": 119, "implemented": true, "kind": "constructor", "modifiers": [], "name": "", "nameLocation": "-1:-1:-1", "nodeType": "FunctionDefinition", "parameters": {"id": 65, "nodeType": "ParameterList", "parameters": [], "src": "745:2:2"}, "returnParameters": {"id": 66, "nodeType": "ParameterList", "parameters": [], "src": "756:0:2"}, "scope": 345, "src": "734:288:2", "stateMutability": "payable", "virtual": false, "visibility": "public"}, {"body": {"id": 343, "nodeType": "Block", "src": "1235:1465:2", "statements": [{"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 136, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 133, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "1253:5:2", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 134, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1259:9:2", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "1253:15:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 135, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1271:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "1253:19:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 132, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "1245:7:2", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 137, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1245:28:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 138, "nodeType": "ExpressionStatement", "src": "1245:28:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 143, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 140, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "1291:5:2", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 141, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1297:9:2", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "1291:15:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 142, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 47, "src": "1309:2:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1291:20:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 139, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "1283:7:2", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 144, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1283:29:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 145, "nodeType": "ExpressionStatement", "src": "1283:29:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 149, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 147, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 129, "src": "1330:10:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"id": 148, "name": "fourYear", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 26, "src": "1343:8:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1330:21:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 146, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "1322:7:2", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 150, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1322:30:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 151, "nodeType": "ExpressionStatement", "src": "1322:30:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 155, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 153, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 125, "src": "1370:6:2", "typeDescriptions": {"typeIdentifier": "t_uint16", "typeString": "uint16"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"id": 154, "name": "maxVoteWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 36, "src": "1379:13:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1370:22:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 152, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "1362:7:2", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 156, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1362:31:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 157, "nodeType": "ExpressionStatement", "src": "1362:31:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 163, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 159, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 127, "src": "1411:6:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 162, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "313030", "id": 160, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1420:3:2", "typeDescriptions": {"typeIdentifier": "t_rational_100_by_1", "typeString": "int_const 100"}, "value": "100"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 161, "name": "oneOLAS", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 42, "src": "1426:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1420:13:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1411:22:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 158, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "1403:7:2", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 164, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1403:31:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 165, "nodeType": "ExpressionStatement", "src": "1403:31:2"}, {"assignments": [167], "declarations": [{"constant": false, "id": 167, "mutability": "mutable", "name": "balanceOf", "nameLocation": "1452:9:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "1444:17:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 166, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1444:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 175, "initialValue": {"arguments": [{"arguments": [{"id": 172, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "1487:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}], "id": 171, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1479:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 170, "name": "address", "nodeType": "ElementaryTypeName", "src": "1479:7:2", "typeDescriptions": {}}}, "id": 173, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1479:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"id": 168, "name": "olas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 7, "src": "1464:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "id": 169, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1469:9:2", "memberName": "balanceOf", "nodeType": "MemberAccess", "referencedDeclaration": 4573, "src": "1464:14:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", "typeString": "function (address) view external returns (uint256)"}}, "id": 174, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1464:29:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "1444:49:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 179, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 177, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 167, "src": "1510:9:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 178, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 127, "src": "1522:6:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "1510:18:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 176, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "1503:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 180, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1503:26:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 181, "nodeType": "ExpressionStatement", "src": "1503:26:2"}, {"assignments": [183, null], "declarations": [{"constant": false, "id": 183, "mutability": "mutable", "name": "initialAmount", "nameLocation": "1548:13:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "1540:21:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 182, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "1540:7:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}, null], "id": 191, "initialValue": {"arguments": [{"arguments": [{"id": 188, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "1595:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}], "id": 187, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1587:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 186, "name": "address", "nodeType": "ElementaryTypeName", "src": "1587:7:2", "typeDescriptions": {}}}, "id": 189, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1587:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"id": 184, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "1566:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "id": 185, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1569:17:2", "memberName": "mapLockedBalances", "nodeType": "MemberAccess", "referencedDeclaration": 2273, "src": "1566:20:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint128_$_t_uint64_$", "typeString": "function (address) view external returns (uint128,uint64)"}}, "id": 190, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1566:35:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint128_$_t_uint64_$", "typeString": "tuple(uint128,uint64)"}}, "nodeType": "VariableDeclarationStatement", "src": "1539:62:2"}, {"condition": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 194, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 192, "name": "initialAmount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 183, "src": "1615:13:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 193, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1632:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "1615:18:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 245, "nodeType": "Block", "src": "1859:124:2", "statements": [{"assignments": [230, null], "declarations": [{"constant": false, "id": 230, "mutability": "mutable", "name": "lockedAmount", "nameLocation": "1882:12:2", "nodeType": "VariableDeclaration", "scope": 245, "src": "1874:20:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 229, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "1874:7:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}, null], "id": 238, "initialValue": {"arguments": [{"arguments": [{"id": 235, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "1928:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}], "id": 234, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1920:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 233, "name": "address", "nodeType": "ElementaryTypeName", "src": "1920:7:2", "typeDescriptions": {}}}, "id": 236, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1920:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"id": 231, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "1899:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "id": 232, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1902:17:2", "memberName": "mapLockedBalances", "nodeType": "MemberAccess", "referencedDeclaration": 2273, "src": "1899:20:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint128_$_t_uint64_$", "typeString": "function (address) view external returns (uint128,uint64)"}}, "id": 237, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1899:35:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint128_$_t_uint64_$", "typeString": "tuple(uint128,uint64)"}}, "nodeType": "VariableDeclarationStatement", "src": "1873:61:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 242, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 240, "name": "lockedAmount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 230, "src": "1955:12:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 241, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1970:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "1955:16:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 239, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "1948:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 243, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1948:24:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 244, "nodeType": "ExpressionStatement", "src": "1948:24:2"}]}, "id": 246, "nodeType": "IfStatement", "src": "1611:372:2", "trueBody": {"id": 228, "nodeType": "Block", "src": "1635:218:2", "statements": [{"expression": {"arguments": [{"arguments": [{"id": 200, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "1670:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 199, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1662:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 198, "name": "address", "nodeType": "ElementaryTypeName", "src": "1662:7:2", "typeDescriptions": {}}}, "id": 201, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1662:11:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 202, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 127, "src": "1675:6:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"id": 195, "name": "olas", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 7, "src": "1649:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_OLAS_$704", "typeString": "contract OLAS"}}, "id": 197, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1654:7:2", "memberName": "approve", "nodeType": "MemberAccess", "referencedDeclaration": 4647, "src": "1649:12:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,uint256) external returns (bool)"}}, "id": 203, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1649:33:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 204, "nodeType": "ExpressionStatement", "src": "1649:33:2"}, {"expression": {"arguments": [{"id": 208, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 127, "src": "1710:6:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 209, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 129, "src": "1718:10:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}], "expression": {"id": 205, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "1696:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "id": 207, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1699:10:2", "memberName": "createLock", "nodeType": "MemberAccess", "referencedDeclaration": 3225, "src": "1696:13:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) external"}}, "id": 210, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1696:33:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 211, "nodeType": "ExpressionStatement", "src": "1696:33:2"}, {"assignments": [213, null], "declarations": [{"constant": false, "id": 213, "mutability": "mutable", "name": "lockedAmount", "nameLocation": "1752:12:2", "nodeType": "VariableDeclaration", "scope": 228, "src": "1744:20:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 212, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "1744:7:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}, null], "id": 221, "initialValue": {"arguments": [{"arguments": [{"id": 218, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "1798:4:2", "typeDescriptions": {"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_EchidnaVoteWeightingAssert_$345", "typeString": "contract EchidnaVoteWeightingAssert"}], "id": 217, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1790:7:2", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 216, "name": "address", "nodeType": "ElementaryTypeName", "src": "1790:7:2", "typeDescriptions": {}}}, "id": 219, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1790:13:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"id": 214, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 10, "src": "1769:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}, "id": 215, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1772:17:2", "memberName": "mapLockedBalances", "nodeType": "MemberAccess", "referencedDeclaration": 2273, "src": "1769:20:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint128_$_t_uint64_$", "typeString": "function (address) view external returns (uint128,uint64)"}}, "id": 220, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1769:35:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint128_$_t_uint64_$", "typeString": "tuple(uint128,uint64)"}}, "nodeType": "VariableDeclarationStatement", "src": "1743:61:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 225, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 223, "name": "lockedAmount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 213, "src": "1825:12:2", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 224, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1840:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "1825:16:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 222, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "1818:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 226, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1818:24:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 227, "nodeType": "ExpressionStatement", "src": "1818:24:2"}]}}, {"expression": {"arguments": [{"id": 250, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 121, "src": "2006:7:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 251, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 123, "src": "2015:7:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}], "expression": {"id": 247, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "1992:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 249, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "1995:10:2", "memberName": "addNominee", "nodeType": "MemberAccess", "referencedDeclaration": 1262, "src": "1992:13:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) external"}}, "id": 252, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1992:31:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 253, "nodeType": "ExpressionStatement", "src": "1992:31:2"}, {"assignments": [255], "declarations": [{"constant": false, "id": 255, "mutability": "mutable", "name": "id", "nameLocation": "2041:2:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "2033:10:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 254, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2033:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 261, "initialValue": {"arguments": [{"id": 258, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 121, "src": "2062:7:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 259, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 123, "src": "2071:7:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}], "expression": {"id": 256, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2046:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 257, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2049:12:2", "memberName": "getNomineeId", "nodeType": "MemberAccess", "referencedDeclaration": 1962, "src": "2046:15:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (address,uint256) view external returns (uint256)"}}, "id": 260, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2046:33:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "2033:46:2"}, {"assignments": [263], "declarations": [{"constant": false, "id": 263, "mutability": "mutable", "name": "num", "nameLocation": "2097:3:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "2089:11:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 262, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2089:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 267, "initialValue": {"arguments": [], "expression": {"argumentTypes": [], "expression": {"id": 264, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2103:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 265, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2106:14:2", "memberName": "getNumNominees", "nodeType": "MemberAccess", "referencedDeclaration": 1929, "src": "2103:17:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", "typeString": "function () view external returns (uint256)"}}, "id": 266, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2103:19:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "2089:33:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 271, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 269, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 255, "src": "2139:2:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 270, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2144:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "2139:6:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 268, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "2132:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 272, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2132:14:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 273, "nodeType": "ExpressionStatement", "src": "2132:14:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 277, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 275, "name": "num", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 263, "src": "2163:3:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 276, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2169:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "2163:7:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 274, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "2156:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 278, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2156:15:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 279, "nodeType": "ExpressionStatement", "src": "2156:15:2"}, {"expression": {"arguments": [{"hexValue": "66616c7365", "id": 283, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "2213:5:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "false"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "expression": {"id": 280, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2181:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 282, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2184:28:2", "memberName": "setCallVoteForNomineeWeights", "nodeType": "MemberAccess", "referencedDeclaration": 2145, "src": "2181:31:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_bool_$returns$__$", "typeString": "function (bool) external"}}, "id": 284, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2181:38:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 285, "nodeType": "ExpressionStatement", "src": "2181:38:2"}, {"assignments": [287], "declarations": [{"constant": false, "id": 287, "mutability": "mutable", "name": "beforeAfterCall", "nameLocation": "2234:15:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "2229:20:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 286, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2229:4:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "id": 291, "initialValue": {"arguments": [], "expression": {"argumentTypes": [], "expression": {"id": 288, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2252:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 289, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2255:25:2", "memberName": "callVoteForNomineeWeights", "nodeType": "MemberAccess", "referencedDeclaration": 821, "src": "2252:28:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$__$returns$_t_bool_$", "typeString": "function () view external returns (bool)"}}, "id": 290, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2252:30:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "VariableDeclarationStatement", "src": "2229:53:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 295, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 293, "name": "beforeAfterCall", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 287, "src": "2299:15:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "66616c7365", "id": 294, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "2318:5:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "false"}, "src": "2299:24:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 292, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "2292:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 296, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2292:32:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 297, "nodeType": "ExpressionStatement", "src": "2292:32:2"}, {"expression": {"arguments": [{"id": 301, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 121, "src": "2359:7:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 302, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 123, "src": "2368:7:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}, {"id": 303, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 125, "src": "2377:6:2", "typeDescriptions": {"typeIdentifier": "t_uint16", "typeString": "uint16"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}, {"typeIdentifier": "t_uint16", "typeString": "uint16"}], "expression": {"id": 298, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2334:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 300, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2337:21:2", "memberName": "voteForNomineeWeights", "nodeType": "MemberAccess", "referencedDeclaration": 1791, "src": "2334:24:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) external"}}, "id": 304, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2334:50:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 305, "nodeType": "ExpressionStatement", "src": "2334:50:2"}, {"assignments": [307], "declarations": [{"constant": false, "id": 307, "mutability": "mutable", "name": "stateAfterCall", "nameLocation": "2399:14:2", "nodeType": "VariableDeclaration", "scope": 343, "src": "2394:19:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 306, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2394:4:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "id": 311, "initialValue": {"arguments": [], "expression": {"argumentTypes": [], "expression": {"id": 308, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2416:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 309, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2419:25:2", "memberName": "callVoteForNomineeWeights", "nodeType": "MemberAccess", "referencedDeclaration": 821, "src": "2416:28:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$__$returns$_t_bool_$", "typeString": "function () view external returns (bool)"}}, "id": 310, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2416:30:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "VariableDeclarationStatement", "src": "2394:52:2"}, {"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 314, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 312, "name": "stateAfterCall", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 307, "src": "2459:14:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "74727565", "id": 313, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "2477:4:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "src": "2459:22:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 330, "nodeType": "IfStatement", "src": "2456:130:2", "trueBody": {"id": 329, "nodeType": "Block", "src": "2483:103:2", "statements": [{"assignments": [316], "declarations": [{"constant": false, "id": 316, "mutability": "mutable", "name": "lts", "nameLocation": "2505:3:2", "nodeType": "VariableDeclaration", "scope": 329, "src": "2497:11:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 315, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2497:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 322, "initialValue": {"arguments": [{"id": 319, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 121, "src": "2530:7:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 320, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 123, "src": "2538:7:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}], "expression": {"id": 317, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2511:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 318, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2514:15:2", "memberName": "getlastUserVote", "nodeType": "MemberAccess", "referencedDeclaration": 2179, "src": "2511:18:2", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (address,uint256) view external returns (uint256)"}}, "id": 321, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2511:35:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "2497:49:2"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 326, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 324, "name": "lts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 316, "src": "2567:3:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 325, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2573:1:2", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "2567:7:2", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 323, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "2560:6:2", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 327, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2560:15:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 328, "nodeType": "ExpressionStatement", "src": "2560:15:2"}]}}, {"expression": {"id": 334, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 331, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 47, "src": "2595:2:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 332, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "2600:5:2", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 333, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2606:9:2", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "2600:15:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "2595:20:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 335, "nodeType": "ExpressionStatement", "src": "2595:20:2"}, {"expression": {"arguments": [{"id": 339, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 121, "src": "2676:7:2", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 340, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 123, "src": "2685:7:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint32", "typeString": "uint32"}], "expression": {"id": 336, "name": "vw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 13, "src": "2655:2:2", "typeDescriptions": {"typeIdentifier": "t_contract$_VoteWeightingFuzzing_$2180", "typeString": "contract VoteWeightingFuzzing"}}, "id": 338, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2658:17:2", "memberName": "checkpointNominee", "nodeType": "MemberAccess", "referencedDeclaration": 1287, "src": "2655:20:2", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) external"}}, "id": 341, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2655:38:2", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 342, "nodeType": "ExpressionStatement", "src": "2655:38:2"}]}, "functionSelector": "b5dbd02f", "id": 344, "implemented": true, "kind": "function", "modifiers": [], "name": "voteForNomineeWeights_assert", "nameLocation": "1114:28:2", "nodeType": "FunctionDefinition", "parameters": {"id": 130, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 121, "mutability": "mutable", "name": "nominee", "nameLocation": "1151:7:2", "nodeType": "VariableDeclaration", "scope": 344, "src": "1143:15:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 120, "name": "address", "nodeType": "ElementaryTypeName", "src": "1143:7:2", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 123, "mutability": "mutable", "name": "chainId", "nameLocation": "1167:7:2", "nodeType": "VariableDeclaration", "scope": 344, "src": "1160:14:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}, "typeName": {"id": 122, "name": "uint32", "nodeType": "ElementaryTypeName", "src": "1160:6:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}, "visibility": "internal"}, {"constant": false, "id": 125, "mutability": "mutable", "name": "weight", "nameLocation": "1183:6:2", "nodeType": "VariableDeclaration", "scope": 344, "src": "1176:13:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint16", "typeString": "uint16"}, "typeName": {"id": 124, "name": "uint16", "nodeType": "ElementaryTypeName", "src": "1176:6:2", "typeDescriptions": {"typeIdentifier": "t_uint16", "typeString": "uint16"}}, "visibility": "internal"}, {"constant": false, "id": 127, "mutability": "mutable", "name": "amount", "nameLocation": "1199:6:2", "nodeType": "VariableDeclaration", "scope": 344, "src": "1191:14:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 126, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1191:7:2", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 129, "mutability": "mutable", "name": "unlockTime", "nameLocation": "1214:10:2", "nodeType": "VariableDeclaration", "scope": 344, "src": "1207:17:2", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}, "typeName": {"id": 128, "name": "uint32", "nodeType": "ElementaryTypeName", "src": "1207:6:2", "typeDescriptions": {"typeIdentifier": "t_uint32", "typeString": "uint32"}}, "visibility": "internal"}], "src": "1142:83:2"}, "returnParameters": {"id": 131, "nodeType": "ParameterList", "parameters": [], "src": "1235:0:2"}, "scope": 345, "src": "1105:1595:2", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}], "scope": 346, "src": "143:2560:2", "usedErrors": [], "usedEvents": []}], "src": "32:2673:2"}}, "/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol": {"AST": {"absolutePath": "contracts/test/VoteWeightingFuzzing.sol", "exportedSymbols": {"IErrors": [5036], "IVEOLAS": [736], "NomineeAlreadyExists": [748], "NomineeDoesNotExist": [742], "Point": [761], "VoteTooOften": [756], "VoteWeightingFuzzing": [2180], "VotedSlope": [768]}, "id": 2181, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 706, "literals": ["solidity", "^", "0.8", ".23"], "nodeType": "PragmaDirective", "src": "32:24:3"}, {"absolutePath": "contracts/interfaces/IErrors.sol", "file": "../interfaces/IErrors.sol", "id": 707, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 2181, "sourceUnit": 5037, "src": "58:35:3", "symbolAliases": [], "unitAlias": ""}, {"abstract": false, "baseContracts": [], "canonicalName": "IVEOLAS", "contractDependencies": [], "contractKind": "interface", "fullyImplemented": false, "id": 736, "linearizedBaseContracts": [736], "name": "IVEOLAS", "nameLocation": "105:7:3", "nodeType": "ContractDefinition", "nodes": [{"canonicalName": "IVEOLAS.PointVoting", "id": 718, "members": [{"constant": false, "id": 709, "mutability": "mutable", "name": "bias", "nameLocation": "316:4:3", "nodeType": "VariableDeclaration", "scope": 718, "src": "309:11:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 708, "name": "int128", "nodeType": "ElementaryTypeName", "src": "309:6:3", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}, {"constant": false, "id": 711, "mutability": "mutable", "name": "slope", "nameLocation": "368:5:3", "nodeType": "VariableDeclaration", "scope": 718, "src": "361:12:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 710, "name": "int128", "nodeType": "ElementaryTypeName", "src": "361:6:3", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}, {"constant": false, "id": 713, "mutability": "mutable", "name": "ts", "nameLocation": "462:2:3", "nodeType": "VariableDeclaration", "scope": 718, "src": "455:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 712, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "455:6:3", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}, {"constant": false, "id": 715, "mutability": "mutable", "name": "blockNumber", "nameLocation": "547:11:3", "nodeType": "VariableDeclaration", "scope": 718, "src": "540:18:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 714, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "540:6:3", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}, {"constant": false, "id": 717, "mutability": "mutable", "name": "balance", "nameLocation": "787:7:3", "nodeType": "VariableDeclaration", "scope": 718, "src": "779:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 716, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "779:7:3", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}], "name": "PointVoting", "nameLocation": "255:11:3", "nodeType": "StructDefinition", "scope": 736, "src": "248:553:3", "visibility": "public"}, {"documentation": {"id": 719, "nodeType": "StructuredDocumentation", "src": "807:126:3", "text": "@dev Gets the `account`'s lock end time.\n @param account Account address.\n @return unlockTime Lock end time."}, "functionSelector": "4deafcae", "id": 726, "implemented": false, "kind": "function", "modifiers": [], "name": "lockedEnd", "nameLocation": "947:9:3", "nodeType": "FunctionDefinition", "parameters": {"id": 722, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 721, "mutability": "mutable", "name": "account", "nameLocation": "965:7:3", "nodeType": "VariableDeclaration", "scope": 726, "src": "957:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 720, "name": "address", "nodeType": "ElementaryTypeName", "src": "957:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "956:17:3"}, "returnParameters": {"id": 725, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 724, "mutability": "mutable", "name": "unlockTime", "nameLocation": "1005:10:3", "nodeType": "VariableDeclaration", "scope": 726, "src": "997:18:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 723, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "997:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "996:20:3"}, "scope": 736, "src": "938:79:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 727, "nodeType": "StructuredDocumentation", "src": "1023:142:3", "text": "@dev Gets the most recently recorded user point for `account`.\n @param account Account address.\n @return pv Last checkpoint."}, "functionSelector": "c4698ee5", "id": 735, "implemented": false, "kind": "function", "modifiers": [], "name": "getLastUserPoint", "nameLocation": "1179:16:3", "nodeType": "FunctionDefinition", "parameters": {"id": 730, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 729, "mutability": "mutable", "name": "account", "nameLocation": "1204:7:3", "nodeType": "VariableDeclaration", "scope": 735, "src": "1196:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 728, "name": "address", "nodeType": "ElementaryTypeName", "src": "1196:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1195:17:3"}, "returnParameters": {"id": 734, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 733, "mutability": "mutable", "name": "pv", "nameLocation": "1255:2:3", "nodeType": "VariableDeclaration", "scope": 735, "src": "1236:21:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$718_memory_ptr", "typeString": "struct IVEOLAS.PointVoting"}, "typeName": {"id": 732, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 731, "name": "PointVoting", "nameLocations": ["1236:11:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 718, "src": "1236:11:3"}, "referencedDeclaration": 718, "src": "1236:11:3", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$718_storage_ptr", "typeString": "struct IVEOLAS.PointVoting"}}, "visibility": "internal"}], "src": "1235:23:3"}, "scope": 736, "src": "1170:89:3", "stateMutability": "view", "virtual": false, "visibility": "external"}], "scope": 2181, "src": "95:1166:3", "usedErrors": [], "usedEvents": []}, {"errorSelector": "5e613257", "id": 742, "name": "NomineeDoesNotExist", "nameLocation": "1269:19:3", "nodeType": "ErrorDefinition", "parameters": {"id": 741, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 738, "mutability": "mutable", "name": "nominee", "nameLocation": "1297:7:3", "nodeType": "VariableDeclaration", "scope": 742, "src": "1289:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 737, "name": "address", "nodeType": "ElementaryTypeName", "src": "1289:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 740, "mutability": "mutable", "name": "chainId", "nameLocation": "1314:7:3", "nodeType": "VariableDeclaration", "scope": 742, "src": "1306:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 739, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1306:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1288:34:3"}, "src": "1263:60:3"}, {"errorSelector": "64212613", "id": 748, "name": "NomineeAlreadyExists", "nameLocation": "1330:20:3", "nodeType": "ErrorDefinition", "parameters": {"id": 747, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 744, "mutability": "mutable", "name": "nominee", "nameLocation": "1359:7:3", "nodeType": "VariableDeclaration", "scope": 748, "src": "1351:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 743, "name": "address", "nodeType": "ElementaryTypeName", "src": "1351:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 746, "mutability": "mutable", "name": "chainId", "nameLocation": "1376:7:3", "nodeType": "VariableDeclaration", "scope": 748, "src": "1368:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 745, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1368:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1350:34:3"}, "src": "1324:61:3"}, {"errorSelector": "17601765", "id": 756, "name": "VoteTooOften", "nameLocation": "1392:12:3", "nodeType": "ErrorDefinition", "parameters": {"id": 755, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 750, "mutability": "mutable", "name": "voter", "nameLocation": "1413:5:3", "nodeType": "VariableDeclaration", "scope": 756, "src": "1405:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 749, "name": "address", "nodeType": "ElementaryTypeName", "src": "1405:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 752, "mutability": "mutable", "name": "curTime", "nameLocation": "1428:7:3", "nodeType": "VariableDeclaration", "scope": 756, "src": "1420:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 751, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1420:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 754, "mutability": "mutable", "name": "nextAllowedVotingTime", "nameLocation": "1445:21:3", "nodeType": "VariableDeclaration", "scope": 756, "src": "1437:29:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 753, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1437:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1404:63:3"}, "src": "1386:82:3"}, {"canonicalName": "Point", "id": 761, "members": [{"constant": false, "id": 758, "mutability": "mutable", "name": "bias", "nameLocation": "1497:4:3", "nodeType": "VariableDeclaration", "scope": 761, "src": "1489:12:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 757, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1489:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 760, "mutability": "mutable", "name": "slope", "nameLocation": "1515:5:3", "nodeType": "VariableDeclaration", "scope": 761, "src": "1507:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 759, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1507:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "name": "Point", "nameLocation": "1477:5:3", "nodeType": "StructDefinition", "scope": 2181, "src": "1470:53:3", "visibility": "public"}, {"canonicalName": "VotedSlope", "id": 768, "members": [{"constant": false, "id": 763, "mutability": "mutable", "name": "slope", "nameLocation": "1557:5:3", "nodeType": "VariableDeclaration", "scope": 768, "src": "1549:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 762, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1549:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 765, "mutability": "mutable", "name": "power", "nameLocation": "1576:5:3", "nodeType": "VariableDeclaration", "scope": 768, "src": "1568:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 764, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1568:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 767, "mutability": "mutable", "name": "end", "nameLocation": "1595:3:3", "nodeType": "VariableDeclaration", "scope": 768, "src": "1587:11:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 766, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1587:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "name": "VotedSlope", "nameLocation": "1532:10:3", "nodeType": "StructDefinition", "scope": 2181, "src": "1525:76:3", "visibility": "public"}, {"abstract": false, "baseContracts": [{"baseName": {"id": 769, "name": "IErrors", "nameLocations": ["1636:7:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 5036, "src": "1636:7:3"}, "id": 770, "nodeType": "InheritanceSpecifier", "src": "1636:7:3"}], "canonicalName": "VoteWeightingFuzzing", "contractDependencies": [], "contractKind": "contract", "fullyImplemented": true, "id": 2180, "linearizedBaseContracts": [2180, 5036], "name": "VoteWeightingFuzzing", "nameLocation": "1612:20:3", "nodeType": "ContractDefinition", "nodes": [{"anonymous": false, "eventSelector": "c31589ba73ca3915e1e951947eba1527bede132b65c665567a38e2623cb9f887", "id": 780, "name": "NewNomineeWeight", "nameLocation": "1656:16:3", "nodeType": "EventDefinition", "parameters": {"id": 779, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 772, "indexed": true, "mutability": "mutable", "name": "nominee", "nameLocation": "1689:7:3", "nodeType": "VariableDeclaration", "scope": 780, "src": "1673:23:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 771, "name": "address", "nodeType": "ElementaryTypeName", "src": "1673:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 774, "indexed": false, "mutability": "mutable", "name": "chainId", "nameLocation": "1706:7:3", "nodeType": "VariableDeclaration", "scope": 780, "src": "1698:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 773, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1698:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 776, "indexed": false, "mutability": "mutable", "name": "weight", "nameLocation": "1723:6:3", "nodeType": "VariableDeclaration", "scope": 780, "src": "1715:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 775, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1715:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 778, "indexed": false, "mutability": "mutable", "name": "totalWeight", "nameLocation": "1739:11:3", "nodeType": "VariableDeclaration", "scope": 780, "src": "1731:19:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 777, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1731:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1672:79:3"}, "src": "1650:102:3"}, {"anonymous": false, "eventSelector": "491b1e1a0c99eaa02d3b9e779fea23f086f3b4f723b1633a89121774de05512f", "id": 790, "name": "VoteForNominee", "nameLocation": "1763:14:3", "nodeType": "EventDefinition", "parameters": {"id": 789, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 782, "indexed": true, "mutability": "mutable", "name": "user", "nameLocation": "1794:4:3", "nodeType": "VariableDeclaration", "scope": 790, "src": "1778:20:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 781, "name": "address", "nodeType": "ElementaryTypeName", "src": "1778:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 784, "indexed": true, "mutability": "mutable", "name": "nominee", "nameLocation": "1816:7:3", "nodeType": "VariableDeclaration", "scope": 790, "src": "1800:23:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 783, "name": "address", "nodeType": "ElementaryTypeName", "src": "1800:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 786, "indexed": false, "mutability": "mutable", "name": "chainId", "nameLocation": "1833:7:3", "nodeType": "VariableDeclaration", "scope": 790, "src": "1825:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 785, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1825:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 788, "indexed": false, "mutability": "mutable", "name": "weight", "nameLocation": "1850:6:3", "nodeType": "VariableDeclaration", "scope": 790, "src": "1842:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 787, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1842:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1777:80:3"}, "src": "1757:101:3"}, {"anonymous": false, "eventSelector": "1bc65a439335898028ac09fe90754a5ef59b65314198d75e6cdd5f9deaa50767", "id": 796, "name": "NewNominee", "nameLocation": "1869:10:3", "nodeType": "EventDefinition", "parameters": {"id": 795, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 792, "indexed": false, "mutability": "mutable", "name": "nominee", "nameLocation": "1888:7:3", "nodeType": "VariableDeclaration", "scope": 796, "src": "1880:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 791, "name": "address", "nodeType": "ElementaryTypeName", "src": "1880:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 794, "indexed": false, "mutability": "mutable", "name": "chainId", "nameLocation": "1905:7:3", "nodeType": "VariableDeclaration", "scope": 796, "src": "1897:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 793, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1897:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1879:34:3"}, "src": "1863:51:3"}, {"constant": true, "functionSelector": "f4359ce5", "id": 799, "mutability": "constant", "name": "WEEK", "nameLocation": "2008:4:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "1984:38:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 797, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1984:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "3630345f383030", "id": 798, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2015:7:3", "typeDescriptions": {"typeIdentifier": "t_rational_604800_by_1", "typeString": "int_const 604800"}, "value": "604_800"}, "visibility": "public"}, {"constant": true, "functionSelector": "4f6ffd07", "id": 802, "mutability": "constant", "name": "WEIGHT_VOTE_DELAY", "nameLocation": "2118:17:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2094:51:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 800, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2094:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "3836345f303030", "id": 801, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2138:7:3", "typeDescriptions": {"typeIdentifier": "t_rational_864000_by_1", "typeString": "int_const 864000"}, "value": "864_000"}, "visibility": "public"}, {"constant": true, "functionSelector": "e4a28a52", "id": 805, "mutability": "constant", "name": "MAX_WEIGHT", "nameLocation": "2200:10:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2176:43:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 803, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2176:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"hexValue": "31305f303030", "id": 804, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2213:6:3", "typeDescriptions": {"typeIdentifier": "t_rational_10000_by_1", "typeString": "int_const 10000"}, "value": "10_000"}, "visibility": "public"}, {"constant": true, "functionSelector": "5bc105c0", "id": 816, "mutability": "constant", "name": "MAX_CHAIN_ID", "nameLocation": "2290:12:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2266:64:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 806, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2266:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 815, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 813, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"expression": {"arguments": [{"id": 809, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "2310:6:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 808, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "2310:6:3", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}], "id": 807, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "2305:4:3", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 810, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2305:12:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint64", "typeString": "type(uint64)"}}, "id": 811, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "2318:3:3", "memberName": "max", "nodeType": "MemberAccess", "src": "2305:16:3", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"hexValue": "32", "id": 812, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2324:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_2_by_1", "typeString": "int_const 2"}, "value": "2"}, "src": "2305:20:3", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "3336", "id": 814, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "2328:2:3", "typeDescriptions": {"typeIdentifier": "t_rational_36_by_1", "typeString": "int_const 36"}, "value": "36"}, "src": "2305:25:3", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "public"}, {"constant": false, "functionSelector": "1f850716", "id": 818, "mutability": "immutable", "name": "ve", "nameLocation": "2392:2:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2367:27:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 817, "name": "address", "nodeType": "ElementaryTypeName", "src": "2367:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "public"}, {"constant": false, "functionSelector": "9faacf7c", "id": 821, "mutability": "mutable", "name": "callVoteForNomineeWeights", "nameLocation": "2413:25:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2401:45:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 819, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2401:4:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "value": {"hexValue": "66616c7365", "id": 820, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "2441:5:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "false"}, "visibility": "public"}, {"constant": false, "functionSelector": "3b766b3d", "id": 824, "mutability": "mutable", "name": "setNominees", "nameLocation": "2545:11:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2528:28:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[]"}, "typeName": {"baseType": {"id": 822, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2528:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 823, "nodeType": "ArrayTypeName", "src": "2528:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", "typeString": "uint256[]"}}, "visibility": "public"}, {"constant": false, "functionSelector": "635b8591", "id": 828, "mutability": "mutable", "name": "mapNomineeIds", "nameLocation": "2649:13:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2614:48:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "typeName": {"id": 827, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 825, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2622:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "2614:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 826, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2633:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "861bd2a0", "id": 835, "mutability": "mutable", "name": "voteUserSlopes", "nameLocation": "2776:14:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2718:72:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$_$", "typeString": "mapping(address => mapping(uint256 => struct VotedSlope))"}, "typeName": {"id": 834, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 829, "name": "address", "nodeType": "ElementaryTypeName", "src": "2726:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "2718:50:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$_$", "typeString": "mapping(address => mapping(uint256 => struct VotedSlope))"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 833, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 830, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2745:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "2737:30:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$", "typeString": "mapping(uint256 => struct VotedSlope)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 832, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 831, "name": "VotedSlope", "nameLocations": ["2756:10:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 768, "src": "2756:10:3"}, "referencedDeclaration": 768, "src": "2756:10:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage_ptr", "typeString": "struct VotedSlope"}}}}, "visibility": "public"}, {"constant": false, "functionSelector": "ec73d906", "id": 839, "mutability": "mutable", "name": "voteUserPower", "nameLocation": "2868:13:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2833:48:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "typeName": {"id": 838, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 836, "name": "address", "nodeType": "ElementaryTypeName", "src": "2841:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "2833:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 837, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2852:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "66ab8ac6", "id": 845, "mutability": "mutable", "name": "lastUserVote", "nameLocation": "3005:12:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "2950:67:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}, "typeName": {"id": 844, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 840, "name": "address", "nodeType": "ElementaryTypeName", "src": "2958:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "2950:47:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 843, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 841, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2977:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "2969:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 842, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2988:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}}, "visibility": "public"}, {"constant": false, "functionSelector": "6010185d", "id": 852, "mutability": "mutable", "name": "pointsWeight", "nameLocation": "3379:12:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3326:65:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point))"}, "typeName": {"id": 851, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 846, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3334:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3326:45:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point))"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 850, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 847, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3353:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3345:25:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 849, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 848, "name": "Point", "nameLocations": ["3364:5:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 761, "src": "3364:5:3"}, "referencedDeclaration": 761, "src": "3364:5:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage_ptr", "typeString": "struct Point"}}}}, "visibility": "public"}, {"constant": false, "functionSelector": "9e5d842e", "id": 858, "mutability": "mutable", "name": "changesWeight", "nameLocation": "3496:13:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3441:68:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(uint256 => mapping(uint256 => uint256))"}, "typeName": {"id": 857, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 853, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3449:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3441:47:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(uint256 => mapping(uint256 => uint256))"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 856, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 854, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3468:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3460:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 855, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3479:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}}, "visibility": "public"}, {"constant": false, "functionSelector": "4efafacf", "id": 862, "mutability": "mutable", "name": "timeWeight", "nameLocation": "3612:10:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3577:45:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "typeName": {"id": 861, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 859, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3585:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3577:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 860, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3596:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "9d175053", "id": 867, "mutability": "mutable", "name": "pointsSum", "nameLocation": "3683:9:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3650:42:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point)"}, "typeName": {"id": 866, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 863, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3658:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3650:25:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 865, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 864, "name": "Point", "nameLocations": ["3669:5:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 761, "src": "3669:5:3"}, "referencedDeclaration": 761, "src": "3669:5:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage_ptr", "typeString": "struct Point"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "0c423201", "id": 871, "mutability": "mutable", "name": "changesSum", "nameLocation": "3754:10:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3719:45:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "typeName": {"id": 870, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 868, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3727:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "3719:27:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 869, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3738:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "48264997", "id": 873, "mutability": "mutable", "name": "timeSum", "nameLocation": "3824:7:3", "nodeType": "VariableDeclaration", "scope": 2180, "src": "3809:22:3", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 872, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3809:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "public"}, {"body": {"id": 909, "nodeType": "Block", "src": "3950:253:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 884, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 879, "name": "_ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 876, "src": "4002:3:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 882, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4017:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 881, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "4009:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 880, "name": "address", "nodeType": "ElementaryTypeName", "src": "4009:7:3", "typeDescriptions": {}}}, "id": 883, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4009:10:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "4002:17:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 889, "nodeType": "IfStatement", "src": "3998:68:3", "trueBody": {"id": 888, "nodeType": "Block", "src": "4021:45:3", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 885, "name": "ZeroAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4943, "src": "4042:11:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 886, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4042:13:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 887, "nodeType": "RevertStatement", "src": "4035:20:3"}]}}, {"expression": {"id": 892, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 890, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 818, "src": "4110:2:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 891, "name": "_ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 876, "src": "4115:3:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "4110:8:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 893, "nodeType": "ExpressionStatement", "src": "4110:8:3"}, {"expression": {"id": 901, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 894, "name": "timeSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 873, "src": "4128:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 900, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 898, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 895, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "4138:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 896, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4144:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "4138:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 897, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "4156:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4138:22:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 899, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "4163:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4138:29:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4128:39:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 902, "nodeType": "ExpressionStatement", "src": "4128:39:3"}, {"expression": {"arguments": [{"hexValue": "30", "id": 906, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4194:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "expression": {"id": 903, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "4177:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 905, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4189:4:3", "memberName": "push", "nodeType": "MemberAccess", "src": "4177:16:3", "typeDescriptions": {"typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_uint256_$dyn_storage_ptr_$_t_uint256_$returns$__$attached_to$_t_array$_t_uint256_$dyn_storage_ptr_$", "typeString": "function (uint256[] storage pointer,uint256)"}}, "id": 907, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4177:19:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 908, "nodeType": "ExpressionStatement", "src": "4177:19:3"}]}, "documentation": {"id": 874, "nodeType": "StructuredDocumentation", "src": "3838:82:3", "text": "@dev Contract constructor.\n @param _ve `VotingEscrow` contract address."}, "id": 910, "implemented": true, "kind": "constructor", "modifiers": [], "name": "", "nameLocation": "-1:-1:-1", "nodeType": "FunctionDefinition", "parameters": {"id": 877, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 876, "mutability": "mutable", "name": "_ve", "nameLocation": "3945:3:3", "nodeType": "VariableDeclaration", "scope": 910, "src": "3937:11:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 875, "name": "address", "nodeType": "ElementaryTypeName", "src": "3937:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "3936:13:3"}, "returnParameters": {"id": 878, "nodeType": "ParameterList", "parameters": [], "src": "3950:0:3"}, "scope": 2180, "src": "3925:278:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "public"}, {"body": {"id": 1013, "nodeType": "Block", "src": "4421:718:3", "statements": [{"assignments": [917], "declarations": [{"constant": false, "id": 917, "mutability": "mutable", "name": "t", "nameLocation": "4498:1:3", "nodeType": "VariableDeclaration", "scope": 1013, "src": "4490:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 916, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4490:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 919, "initialValue": {"id": 918, "name": "timeSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 873, "src": "4502:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "4490:19:3"}, {"assignments": [922], "declarations": [{"constant": false, "id": 922, "mutability": "mutable", "name": "pt", "nameLocation": "4532:2:3", "nodeType": "VariableDeclaration", "scope": 1013, "src": "4519:15:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point"}, "typeName": {"id": 921, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 920, "name": "Point", "nameLocations": ["4519:5:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 761, "src": "4519:5:3"}, "referencedDeclaration": 761, "src": "4519:5:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage_ptr", "typeString": "struct Point"}}, "visibility": "internal"}], "id": 926, "initialValue": {"baseExpression": {"id": 923, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "4537:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 925, "indexExpression": {"id": 924, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "4547:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "4537:12:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "4519:30:3"}, {"body": {"id": 1008, "nodeType": "Block", "src": "4593:516:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 940, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 937, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "4611:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 938, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "4615:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 939, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4621:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "4615:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4611:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 943, "nodeType": "IfStatement", "src": "4607:63:3", "trueBody": {"id": 942, "nodeType": "Block", "src": "4632:38:3", "statements": [{"id": 941, "nodeType": "Break", "src": "4650:5:3"}]}}, {"expression": {"id": 946, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 944, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "4683:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 945, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "4688:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4683:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 947, "nodeType": "ExpressionStatement", "src": "4683:9:3"}, {"assignments": [949], "declarations": [{"constant": false, "id": 949, "mutability": "mutable", "name": "dBias", "nameLocation": "4714:5:3", "nodeType": "VariableDeclaration", "scope": 1008, "src": "4706:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 948, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4706:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 954, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 953, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 950, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4722:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 951, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "4725:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "4722:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 952, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "4733:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4722:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "4706:31:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 958, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 955, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4755:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 956, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "4758:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "4755:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 957, "name": "dBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 949, "src": "4765:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4755:15:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 990, "nodeType": "Block", "src": "4911:74:3", "statements": [{"expression": {"id": 982, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 978, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4929:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 980, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "4932:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "4929:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 981, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4939:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "4929:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 983, "nodeType": "ExpressionStatement", "src": "4929:11:3"}, {"expression": {"id": 988, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 984, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4958:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 986, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "4961:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "4958:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 987, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4969:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "4958:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 989, "nodeType": "ExpressionStatement", "src": "4958:12:3"}]}, "id": 991, "nodeType": "IfStatement", "src": "4751:234:3", "trueBody": {"id": 977, "nodeType": "Block", "src": "4772:133:3", "statements": [{"expression": {"id": 963, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 959, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4790:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 961, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "4793:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "4790:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 962, "name": "dBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 949, "src": "4801:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4790:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 964, "nodeType": "ExpressionStatement", "src": "4790:16:3"}, {"assignments": [966], "declarations": [{"constant": false, "id": 966, "mutability": "mutable", "name": "dSlope", "nameLocation": "4832:6:3", "nodeType": "VariableDeclaration", "scope": 977, "src": "4824:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 965, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4824:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 970, "initialValue": {"baseExpression": {"id": 967, "name": "changesSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 871, "src": "4841:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 969, "indexExpression": {"id": 968, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "4852:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "4841:13:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "4824:30:3"}, {"expression": {"id": 975, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 971, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "4872:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 973, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "4875:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "4872:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 974, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 966, "src": "4884:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4872:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 976, "nodeType": "ExpressionStatement", "src": "4872:18:3"}]}}, {"expression": {"id": 996, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 992, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "4999:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 994, "indexExpression": {"id": 993, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "5009:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "4999:12:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 995, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "5014:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "src": "4999:17:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 997, "nodeType": "ExpressionStatement", "src": "4999:17:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1001, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 998, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "5034:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 999, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "5038:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1000, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5044:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "5038:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5034:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1007, "nodeType": "IfStatement", "src": "5030:69:3", "trueBody": {"id": 1006, "nodeType": "Block", "src": "5055:44:3", "statements": [{"expression": {"id": 1004, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1002, "name": "timeSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 873, "src": "5073:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1003, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 917, "src": "5083:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5073:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1005, "nodeType": "ExpressionStatement", "src": "5073:11:3"}]}}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 933, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 931, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 928, "src": "4579:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "353030", "id": 932, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4583:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_500_by_1", "typeString": "int_const 500"}, "value": "500"}, "src": "4579:7:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1009, "initializationExpression": {"assignments": [928], "declarations": [{"constant": false, "id": 928, "mutability": "mutable", "name": "i", "nameLocation": "4572:1:3", "nodeType": "VariableDeclaration", "scope": 1009, "src": "4564:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 927, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4564:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 930, "initialValue": {"hexValue": "30", "id": 929, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "4576:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "4564:13:3"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 935, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": false, "src": "4588:3:3", "subExpression": {"id": 934, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 928, "src": "4588:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 936, "nodeType": "ExpressionStatement", "src": "4588:3:3"}, "nodeType": "ForStatement", "src": "4559:550:3"}, {"expression": {"expression": {"id": 1010, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 922, "src": "5125:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1011, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "5128:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "5125:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 915, "id": 1012, "nodeType": "Return", "src": "5118:14:3"}]}, "documentation": {"id": 911, "nodeType": "StructuredDocumentation", "src": "4209:161:3", "text": "@dev Fill sum of nominee weights for the same type week-over-week for missed checkins and return the sum for the future week.\n @return Sum of weights."}, "id": 1014, "implemented": true, "kind": "function", "modifiers": [], "name": "_getSum", "nameLocation": "4384:7:3", "nodeType": "FunctionDefinition", "parameters": {"id": 912, "nodeType": "ParameterList", "parameters": [], "src": "4391:2:3"}, "returnParameters": {"id": 915, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 914, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1014, "src": "4412:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 913, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4412:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4411:9:3"}, "scope": 2180, "src": "4375:764:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal"}, {"body": {"id": 1159, "nodeType": "Block", "src": "5458:1286:3", "statements": [{"assignments": [1025], "declarations": [{"constant": false, "id": 1025, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "5621:14:3", "nodeType": "VariableDeclaration", "scope": 1159, "src": "5613:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1024, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5613:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1033, "initialValue": {"arguments": [{"arguments": [{"id": 1030, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1017, "src": "5654:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1029, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "5646:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1028, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "5646:7:3", "typeDescriptions": {}}}, "id": 1031, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5646:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1027, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "5638:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1026, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5638:7:3", "typeDescriptions": {}}}, "id": 1032, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5638:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "5613:50:3"}, {"expression": {"id": 1038, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1034, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "5728:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1037, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1035, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1019, "src": "5746:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1036, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5757:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "5746:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5728:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1039, "nodeType": "ExpressionStatement", "src": "5728:32:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1044, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"baseExpression": {"id": 1040, "name": "mapNomineeIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 828, "src": "5816:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1042, "indexExpression": {"id": 1041, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "5830:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "5816:29:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 1043, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5849:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "5816:34:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1051, "nodeType": "IfStatement", "src": "5812:109:3", "trueBody": {"id": 1050, "nodeType": "Block", "src": "5852:69:3", "statements": [{"errorCall": {"arguments": [{"id": 1046, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1017, "src": "5893:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1047, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1019, "src": "5902:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1045, "name": "NomineeDoesNotExist", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 742, "src": "5873:19:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) pure"}}, "id": 1048, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5873:37:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1049, "nodeType": "RevertStatement", "src": "5866:44:3"}]}}, {"assignments": [1053], "declarations": [{"constant": false, "id": 1053, "mutability": "mutable", "name": "t", "nameLocation": "6008:1:3", "nodeType": "VariableDeclaration", "scope": 1159, "src": "6000:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1052, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6000:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1057, "initialValue": {"baseExpression": {"id": 1054, "name": "timeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 862, "src": "6012:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1056, "indexExpression": {"id": 1055, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "6023:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6012:26:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "6000:38:3"}, {"assignments": [1060], "declarations": [{"constant": false, "id": 1060, "mutability": "mutable", "name": "pt", "nameLocation": "6061:2:3", "nodeType": "VariableDeclaration", "scope": 1159, "src": "6048:15:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point"}, "typeName": {"id": 1059, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 1058, "name": "Point", "nameLocations": ["6048:5:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 761, "src": "6048:5:3"}, "referencedDeclaration": 761, "src": "6048:5:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage_ptr", "typeString": "struct Point"}}, "visibility": "internal"}], "id": 1066, "initialValue": {"baseExpression": {"baseExpression": {"id": 1061, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "6066:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1063, "indexExpression": {"id": 1062, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "6079:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6066:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1065, "indexExpression": {"id": 1064, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6095:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6066:31:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "6048:49:3"}, {"body": {"id": 1154, "nodeType": "Block", "src": "6141:573:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1080, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1077, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6159:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 1078, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "6163:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1079, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "6169:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "6163:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6159:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1083, "nodeType": "IfStatement", "src": "6155:63:3", "trueBody": {"id": 1082, "nodeType": "Block", "src": "6180:38:3", "statements": [{"id": 1081, "nodeType": "Break", "src": "6198:5:3"}]}}, {"expression": {"id": 1086, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1084, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6231:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 1085, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "6236:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6231:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1087, "nodeType": "ExpressionStatement", "src": "6231:9:3"}, {"assignments": [1089], "declarations": [{"constant": false, "id": 1089, "mutability": "mutable", "name": "dBias", "nameLocation": "6262:5:3", "nodeType": "VariableDeclaration", "scope": 1154, "src": "6254:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1088, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6254:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1094, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1093, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1090, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6270:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1091, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "6273:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "6270:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1092, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "6281:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6270:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "6254:31:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1098, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1095, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6303:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1096, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "6306:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "6303:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1097, "name": "dBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1089, "src": "6313:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6303:15:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 1132, "nodeType": "Block", "src": "6478:74:3", "statements": [{"expression": {"id": 1124, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 1120, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6496:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1122, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "6499:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "6496:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 1123, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6506:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "6496:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1125, "nodeType": "ExpressionStatement", "src": "6496:11:3"}, {"expression": {"id": 1130, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 1126, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6525:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1128, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "6528:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "6525:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 1129, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6536:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "6525:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1131, "nodeType": "ExpressionStatement", "src": "6525:12:3"}]}, "id": 1133, "nodeType": "IfStatement", "src": "6299:253:3", "trueBody": {"id": 1119, "nodeType": "Block", "src": "6320:152:3", "statements": [{"expression": {"id": 1103, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 1099, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6338:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1101, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "6341:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "6338:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 1102, "name": "dBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1089, "src": "6349:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6338:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1104, "nodeType": "ExpressionStatement", "src": "6338:16:3"}, {"assignments": [1106], "declarations": [{"constant": false, "id": 1106, "mutability": "mutable", "name": "dSlope", "nameLocation": "6380:6:3", "nodeType": "VariableDeclaration", "scope": 1119, "src": "6372:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1105, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6372:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1112, "initialValue": {"baseExpression": {"baseExpression": {"id": 1107, "name": "changesWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 858, "src": "6389:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(uint256 => mapping(uint256 => uint256))"}}, "id": 1109, "indexExpression": {"id": 1108, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "6403:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6389:29:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1111, "indexExpression": {"id": 1110, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6419:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6389:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "6372:49:3"}, {"expression": {"id": 1117, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 1113, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6439:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1115, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "6442:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "6439:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 1116, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1106, "src": "6451:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6439:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1118, "nodeType": "ExpressionStatement", "src": "6439:18:3"}]}}, {"expression": {"id": 1140, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 1134, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "6566:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1137, "indexExpression": {"id": 1135, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "6579:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6566:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1138, "indexExpression": {"id": 1136, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6595:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "6566:31:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1139, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6600:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "src": "6566:36:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1141, "nodeType": "ExpressionStatement", "src": "6566:36:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1145, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1142, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6620:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 1143, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "6624:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1144, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "6630:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "6624:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6620:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1153, "nodeType": "IfStatement", "src": "6616:88:3", "trueBody": {"id": 1152, "nodeType": "Block", "src": "6641:63:3", "statements": [{"expression": {"id": 1150, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1146, "name": "timeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 862, "src": "6659:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1148, "indexExpression": {"id": 1147, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1025, "src": "6670:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "6659:26:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1149, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1053, "src": "6688:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6659:30:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1151, "nodeType": "ExpressionStatement", "src": "6659:30:3"}]}}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1073, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1071, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1068, "src": "6127:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "353030", "id": 1072, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6131:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_500_by_1", "typeString": "int_const 500"}, "value": "500"}, "src": "6127:7:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1155, "initializationExpression": {"assignments": [1068], "declarations": [{"constant": false, "id": 1068, "mutability": "mutable", "name": "i", "nameLocation": "6120:1:3", "nodeType": "VariableDeclaration", "scope": 1155, "src": "6112:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1067, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6112:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1070, "initialValue": {"hexValue": "30", "id": 1069, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6124:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "6112:13:3"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 1075, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": false, "src": "6136:3:3", "subExpression": {"id": 1074, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1068, "src": "6136:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1076, "nodeType": "ExpressionStatement", "src": "6136:3:3"}, "nodeType": "ForStatement", "src": "6107:607:3"}, {"expression": {"expression": {"id": 1156, "name": "pt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1060, "src": "6730:2:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_memory_ptr", "typeString": "struct Point memory"}}, "id": 1157, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "6733:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "6730:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 1023, "id": 1158, "nodeType": "Return", "src": "6723:14:3"}]}, "documentation": {"id": 1015, "nodeType": "StructuredDocumentation", "src": "5145:227:3", "text": "@dev Fill historic nominee weights week-over-week for missed checkins and return the total for the future week.\n @param nominee Address of the nominee.\n @param chainId Chain Id.\n @return Nominee weight."}, "id": 1160, "implemented": true, "kind": "function", "modifiers": [], "name": "_getWeight", "nameLocation": "5386:10:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1020, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1017, "mutability": "mutable", "name": "nominee", "nameLocation": "5405:7:3", "nodeType": "VariableDeclaration", "scope": 1160, "src": "5397:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1016, "name": "address", "nodeType": "ElementaryTypeName", "src": "5397:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1019, "mutability": "mutable", "name": "chainId", "nameLocation": "5422:7:3", "nodeType": "VariableDeclaration", "scope": 1160, "src": "5414:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1018, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5414:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "5396:34:3"}, "returnParameters": {"id": 1023, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1022, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1160, "src": "5449:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1021, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5449:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "5448:9:3"}, "scope": 2180, "src": "5377:1367:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal"}, {"body": {"id": 1261, "nodeType": "Block", "src": "6951:1064:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 1173, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1168, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1163, "src": "7003:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 1171, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "7022:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 1170, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "7014:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 1169, "name": "address", "nodeType": "ElementaryTypeName", "src": "7014:7:3", "typeDescriptions": {}}}, "id": 1172, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7014:10:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "7003:21:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1178, "nodeType": "IfStatement", "src": "6999:72:3", "trueBody": {"id": 1177, "nodeType": "Block", "src": "7026:45:3", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 1174, "name": "ZeroAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4943, "src": "7047:11:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 1175, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7047:13:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1176, "nodeType": "RevertStatement", "src": "7040:20:3"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1181, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1179, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "7119:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 1180, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "7130:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "7119:12:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1188, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1186, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "7194:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1187, "name": "MAX_CHAIN_ID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 816, "src": "7204:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7194:22:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1195, "nodeType": "IfStatement", "src": "7190:91:3", "trueBody": {"id": 1194, "nodeType": "Block", "src": "7218:63:3", "statements": [{"errorCall": {"arguments": [{"id": 1190, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "7248:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1191, "name": "MAX_CHAIN_ID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 816, "src": "7257:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1189, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "7239:8:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 1192, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7239:31:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1193, "nodeType": "RevertStatement", "src": "7232:38:3"}]}}, "id": 1196, "nodeType": "IfStatement", "src": "7115:166:3", "trueBody": {"id": 1185, "nodeType": "Block", "src": "7133:43:3", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 1182, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "7154:9:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 1183, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7154:11:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1184, "nodeType": "RevertStatement", "src": "7147:18:3"}]}}, {"assignments": [1198], "declarations": [{"constant": false, "id": 1198, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "7404:14:3", "nodeType": "VariableDeclaration", "scope": 1261, "src": "7396:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1197, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "7396:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1206, "initialValue": {"arguments": [{"arguments": [{"id": 1203, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1163, "src": "7437:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1202, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "7429:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1201, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "7429:7:3", "typeDescriptions": {}}}, "id": 1204, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7429:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1200, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "7421:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1199, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "7421:7:3", "typeDescriptions": {}}}, "id": 1205, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7421:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "7396:50:3"}, {"expression": {"id": 1211, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1207, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1198, "src": "7511:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1210, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1208, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "7529:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1209, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "7540:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "7529:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7511:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1212, "nodeType": "ExpressionStatement", "src": "7511:32:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1217, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"baseExpression": {"id": 1213, "name": "mapNomineeIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 828, "src": "7601:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1215, "indexExpression": {"id": 1214, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1198, "src": "7615:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "7601:29:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 1216, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "7633:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "7601:33:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1224, "nodeType": "IfStatement", "src": "7597:109:3", "trueBody": {"id": 1223, "nodeType": "Block", "src": "7636:70:3", "statements": [{"errorCall": {"arguments": [{"id": 1219, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1163, "src": "7678:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1220, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "7687:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1218, "name": "NomineeAlreadyExists", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 748, "src": "7657:20:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) pure"}}, "id": 1221, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7657:38:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1222, "nodeType": "RevertStatement", "src": "7650:45:3"}]}}, {"expression": {"id": 1230, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1225, "name": "mapNomineeIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 828, "src": "7715:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1227, "indexExpression": {"id": 1226, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1198, "src": "7729:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "7715:29:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 1228, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "7747:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 1229, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "7759:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "7747:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7715:50:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1231, "nodeType": "ExpressionStatement", "src": "7715:50:3"}, {"expression": {"arguments": [{"id": 1235, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1198, "src": "7834:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"id": 1232, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "7817:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 1234, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "7829:4:3", "memberName": "push", "nodeType": "MemberAccess", "src": "7817:16:3", "typeDescriptions": {"typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_uint256_$dyn_storage_ptr_$_t_uint256_$returns$__$attached_to$_t_array$_t_uint256_$dyn_storage_ptr_$", "typeString": "function (uint256[] storage pointer,uint256)"}}, "id": 1236, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7817:32:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1237, "nodeType": "ExpressionStatement", "src": "7817:32:3"}, {"assignments": [1239], "declarations": [{"constant": false, "id": 1239, "mutability": "mutable", "name": "nextTime", "nameLocation": "7868:8:3", "nodeType": "VariableDeclaration", "scope": 1261, "src": "7860:16:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1238, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "7860:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1249, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1248, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1246, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1243, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1240, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "7880:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1241, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "7886:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "7880:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 1242, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "7898:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7880:22:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1244, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "7879:24:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 1245, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "7906:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7879:31:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1247, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "7913:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7879:38:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "7860:57:3"}, {"expression": {"id": 1254, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1250, "name": "timeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 862, "src": "7927:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1252, "indexExpression": {"id": 1251, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1198, "src": "7938:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "7927:26:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1253, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1239, "src": "7956:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7927:37:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1255, "nodeType": "ExpressionStatement", "src": "7927:37:3"}, {"eventCall": {"arguments": [{"id": 1257, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1163, "src": "7991:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1258, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1165, "src": "8000:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1256, "name": "NewNominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 796, "src": "7980:10:3", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256)"}}, "id": 1259, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "7980:28:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1260, "nodeType": "EmitStatement", "src": "7975:33:3"}]}, "documentation": {"id": 1161, "nodeType": "StructuredDocumentation", "src": "6750:133:3", "text": "@dev Add nominee address along with the chain Id.\n @param nominee Address of the nominee.\n @param chainId Chain Id."}, "functionSelector": "dcfeeae6", "id": 1262, "implemented": true, "kind": "function", "modifiers": [], "name": "addNominee", "nameLocation": "6897:10:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1166, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1163, "mutability": "mutable", "name": "nominee", "nameLocation": "6916:7:3", "nodeType": "VariableDeclaration", "scope": 1262, "src": "6908:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1162, "name": "address", "nodeType": "ElementaryTypeName", "src": "6908:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1165, "mutability": "mutable", "name": "chainId", "nameLocation": "6933:7:3", "nodeType": "VariableDeclaration", "scope": 1262, "src": "6925:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1164, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6925:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "6907:34:3"}, "returnParameters": {"id": 1167, "nodeType": "ParameterList", "parameters": [], "src": "6951:0:3"}, "scope": 2180, "src": "6888:1127:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 1269, "nodeType": "Block", "src": "8114:26:3", "statements": [{"expression": {"arguments": [], "expression": {"argumentTypes": [], "id": 1266, "name": "_getSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1014, "src": "8124:7:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$", "typeString": "function () returns (uint256)"}}, "id": 1267, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8124:9:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1268, "nodeType": "ExpressionStatement", "src": "8124:9:3"}]}, "documentation": {"id": 1263, "nodeType": "StructuredDocumentation", "src": "8021:57:3", "text": "@dev Checkpoint to fill data common for all nominees."}, "functionSelector": "c2c4c5c1", "id": 1270, "implemented": true, "kind": "function", "modifiers": [], "name": "checkpoint", "nameLocation": "8092:10:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1264, "nodeType": "ParameterList", "parameters": [], "src": "8102:2:3"}, "returnParameters": {"id": 1265, "nodeType": "ParameterList", "parameters": [], "src": "8114:0:3"}, "scope": 2180, "src": "8083:57:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 1286, "nodeType": "Block", "src": "8390:64:3", "statements": [{"expression": {"arguments": [{"id": 1279, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1273, "src": "8411:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1280, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1275, "src": "8420:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1278, "name": "_getWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1160, "src": "8400:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (address,uint256) returns (uint256)"}}, "id": 1281, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8400:28:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1282, "nodeType": "ExpressionStatement", "src": "8400:28:3"}, {"expression": {"arguments": [], "expression": {"argumentTypes": [], "id": 1283, "name": "_getSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1014, "src": "8438:7:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$", "typeString": "function () returns (uint256)"}}, "id": 1284, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8438:9:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1285, "nodeType": "ExpressionStatement", "src": "8438:9:3"}]}, "documentation": {"id": 1271, "nodeType": "StructuredDocumentation", "src": "8146:169:3", "text": "@dev Checkpoint to fill data for both a specific nominee and common for all nominees.\n @param nominee Address of the nominee.\n @param chainId Chain Id."}, "functionSelector": "de28a19a", "id": 1287, "implemented": true, "kind": "function", "modifiers": [], "name": "checkpointNominee", "nameLocation": "8329:17:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1276, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1273, "mutability": "mutable", "name": "nominee", "nameLocation": "8355:7:3", "nodeType": "VariableDeclaration", "scope": 1287, "src": "8347:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1272, "name": "address", "nodeType": "ElementaryTypeName", "src": "8347:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1275, "mutability": "mutable", "name": "chainId", "nameLocation": "8372:7:3", "nodeType": "VariableDeclaration", "scope": 1287, "src": "8364:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1274, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "8364:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "8346:34:3"}, "returnParameters": {"id": 1277, "nodeType": "ParameterList", "parameters": [], "src": "8390:0:3"}, "scope": 2180, "src": "8320:134:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 1354, "nodeType": "Block", "src": "9130:515:3", "statements": [{"assignments": [1302], "declarations": [{"constant": false, "id": 1302, "mutability": "mutable", "name": "t", "nameLocation": "9148:1:3", "nodeType": "VariableDeclaration", "scope": 1354, "src": "9140:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1301, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9140:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1308, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1307, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1305, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1303, "name": "time", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1294, "src": "9152:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 1304, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "9159:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9152:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1306, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "9166:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9152:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "9140:30:3"}, {"expression": {"id": 1314, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1309, "name": "totalSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1299, "src": "9180:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"baseExpression": {"id": 1310, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "9191:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1312, "indexExpression": {"id": 1311, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1302, "src": "9201:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9191:12:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1313, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9204:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "9191:17:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9180:28:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1315, "nodeType": "ExpressionStatement", "src": "9180:28:3"}, {"assignments": [1317], "declarations": [{"constant": false, "id": 1317, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "9332:14:3", "nodeType": "VariableDeclaration", "scope": 1354, "src": "9324:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1316, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9324:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1325, "initialValue": {"arguments": [{"arguments": [{"id": 1322, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1290, "src": "9365:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1321, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9357:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1320, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "9357:7:3", "typeDescriptions": {}}}, "id": 1323, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9357:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1319, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9349:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1318, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9349:7:3", "typeDescriptions": {}}}, "id": 1324, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9349:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "9324:50:3"}, {"expression": {"id": 1330, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1326, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1317, "src": "9439:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1329, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1327, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1292, "src": "9457:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1328, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "9468:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "9457:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9439:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1331, "nodeType": "ExpressionStatement", "src": "9439:32:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1334, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1332, "name": "totalSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1299, "src": "9486:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 1333, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "9497:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "9486:12:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1353, "nodeType": "IfStatement", "src": "9482:157:3", "trueBody": {"id": 1352, "nodeType": "Block", "src": "9500:139:3", "statements": [{"assignments": [1336], "declarations": [{"constant": false, "id": 1336, "mutability": "mutable", "name": "nomineeWeight", "nameLocation": "9522:13:3", "nodeType": "VariableDeclaration", "scope": 1352, "src": "9514:21:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1335, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9514:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1343, "initialValue": {"expression": {"baseExpression": {"baseExpression": {"id": 1337, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "9538:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1339, "indexExpression": {"id": 1338, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1317, "src": "9551:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9538:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1341, "indexExpression": {"id": 1340, "name": "t", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1302, "src": "9567:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9538:31:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1342, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9570:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "9538:36:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "9514:60:3"}, {"expression": {"id": 1350, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1344, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1297, "src": "9588:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1349, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1347, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"hexValue": "31653138", "id": 1345, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "9597:4:3", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000_by_1", "typeString": "int_const 1000000000000000000"}, "value": "1e18"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1346, "name": "nomineeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1336, "src": "9604:13:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9597:20:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 1348, "name": "totalSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1299, "src": "9620:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9597:31:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "9588:40:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1351, "nodeType": "ExpressionStatement", "src": "9588:40:3"}]}}]}, "documentation": {"id": 1288, "nodeType": "StructuredDocumentation", "src": "8460:498:3", "text": "@dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights.\n Inflation which will be received by it is inflation_rate * relativeWeight / 1e18.\n @param nominee Address of the nominee.\n @param chainId Chain Id.\n @param time Relative weight at the specified timestamp in the past or present.\n @return weight Value of relative weight normalized to 1e18.\n @return totalSum Sum of nominee weights."}, "id": 1355, "implemented": true, "kind": "function", "modifiers": [], "name": "_nomineeRelativeWeight", "nameLocation": "8972:22:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1295, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1290, "mutability": "mutable", "name": "nominee", "nameLocation": "9012:7:3", "nodeType": "VariableDeclaration", "scope": 1355, "src": "9004:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1289, "name": "address", "nodeType": "ElementaryTypeName", "src": "9004:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1292, "mutability": "mutable", "name": "chainId", "nameLocation": "9037:7:3", "nodeType": "VariableDeclaration", "scope": 1355, "src": "9029:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1291, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9029:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1294, "mutability": "mutable", "name": "time", "nameLocation": "9062:4:3", "nodeType": "VariableDeclaration", "scope": 1355, "src": "9054:12:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1293, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9054:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "8994:78:3"}, "returnParameters": {"id": 1300, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1297, "mutability": "mutable", "name": "weight", "nameLocation": "9104:6:3", "nodeType": "VariableDeclaration", "scope": 1355, "src": "9096:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1296, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9096:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1299, "mutability": "mutable", "name": "totalSum", "nameLocation": "9120:8:3", "nodeType": "VariableDeclaration", "scope": 1355, "src": "9112:16:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1298, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "9112:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "9095:34:3"}, "scope": 2180, "src": "8963:682:3", "stateMutability": "view", "virtual": false, "visibility": "internal"}, {"body": {"id": 1379, "nodeType": "Block", "src": "10339:85:3", "statements": [{"expression": {"id": 1377, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"components": [{"id": 1369, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1365, "src": "10350:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1370, "name": "totalSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1367, "src": "10358:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1371, "isConstant": false, "isInlineArray": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "TupleExpression", "src": "10349:18:3", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", "typeString": "tuple(uint256,uint256)"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 1373, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1358, "src": "10394:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1374, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1360, "src": "10403:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1375, "name": "time", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1362, "src": "10412:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1372, "name": "_nomineeRelativeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1355, "src": "10371:22:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$", "typeString": "function (address,uint256,uint256) view returns (uint256,uint256)"}}, "id": 1376, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10371:46:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", "typeString": "tuple(uint256,uint256)"}}, "src": "10349:68:3", "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1378, "nodeType": "ExpressionStatement", "src": "10349:68:3"}]}, "documentation": {"id": 1356, "nodeType": "StructuredDocumentation", "src": "9651:517:3", "text": "@dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights.\n (e.g. 1.0 == 1e18). Inflation which will be received by it is\n inflation_rate * relativeWeight / 1e18.\n @param nominee Address of the nominee.\n @param chainId Chain Id.\n @param time Relative weight at the specified timestamp in the past or present.\n @return weight Value of relative weight normalized to 1e18.\n @return totalSum Sum of nominee weights."}, "functionSelector": "d8cac5ae", "id": 1380, "implemented": true, "kind": "function", "modifiers": [], "name": "nomineeRelativeWeight", "nameLocation": "10182:21:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1363, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1358, "mutability": "mutable", "name": "nominee", "nameLocation": "10221:7:3", "nodeType": "VariableDeclaration", "scope": 1380, "src": "10213:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1357, "name": "address", "nodeType": "ElementaryTypeName", "src": "10213:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1360, "mutability": "mutable", "name": "chainId", "nameLocation": "10246:7:3", "nodeType": "VariableDeclaration", "scope": 1380, "src": "10238:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1359, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10238:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1362, "mutability": "mutable", "name": "time", "nameLocation": "10271:4:3", "nodeType": "VariableDeclaration", "scope": 1380, "src": "10263:12:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1361, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10263:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "10203:78:3"}, "returnParameters": {"id": 1368, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1365, "mutability": "mutable", "name": "weight", "nameLocation": "10313:6:3", "nodeType": "VariableDeclaration", "scope": 1380, "src": "10305:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1364, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10305:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1367, "mutability": "mutable", "name": "totalSum", "nameLocation": "10329:8:3", "nodeType": "VariableDeclaration", "scope": 1380, "src": "10321:16:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1366, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10321:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "10304:34:3"}, "scope": 2180, "src": "10173:251:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 1412, "nodeType": "Block", "src": "11164:142:3", "statements": [{"expression": {"arguments": [{"id": 1395, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1383, "src": "11185:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1396, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1385, "src": "11194:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1394, "name": "_getWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1160, "src": "11174:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (address,uint256) returns (uint256)"}}, "id": 1397, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11174:28:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1398, "nodeType": "ExpressionStatement", "src": "11174:28:3"}, {"expression": {"arguments": [], "expression": {"argumentTypes": [], "id": 1399, "name": "_getSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1014, "src": "11212:7:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$", "typeString": "function () returns (uint256)"}}, "id": 1400, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11212:9:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1401, "nodeType": "ExpressionStatement", "src": "11212:9:3"}, {"expression": {"id": 1410, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"components": [{"id": 1402, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1390, "src": "11232:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1403, "name": "totalSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1392, "src": "11240:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1404, "isConstant": false, "isInlineArray": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "TupleExpression", "src": "11231:18:3", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", "typeString": "tuple(uint256,uint256)"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 1406, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1383, "src": "11276:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1407, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1385, "src": "11285:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1408, "name": "time", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1387, "src": "11294:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1405, "name": "_nomineeRelativeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1355, "src": "11253:22:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$", "typeString": "function (address,uint256,uint256) view returns (uint256,uint256)"}}, "id": 1409, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11253:46:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", "typeString": "tuple(uint256,uint256)"}}, "src": "11231:68:3", "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1411, "nodeType": "ExpressionStatement", "src": "11231:68:3"}]}, "documentation": {"id": 1381, "nodeType": "StructuredDocumentation", "src": "10430:563:3", "text": "@dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records.\n Also, get the total sum of all the nominee weights.\n @notice Any address can call, however nothing is recorded if the values are filled already.\n @param nominee Address of the nominee.\n @param chainId Chain Id.\n @param time Relative weight at the specified timestamp in the past or present.\n @return weight Value of relative weight normalized to 1e18.\n @return totalSum Sum of nominee weights."}, "functionSelector": "da669c6e", "id": 1413, "implemented": true, "kind": "function", "modifiers": [], "name": "nomineeRelativeWeightWrite", "nameLocation": "11007:26:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1388, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1383, "mutability": "mutable", "name": "nominee", "nameLocation": "11051:7:3", "nodeType": "VariableDeclaration", "scope": 1413, "src": "11043:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1382, "name": "address", "nodeType": "ElementaryTypeName", "src": "11043:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1385, "mutability": "mutable", "name": "chainId", "nameLocation": "11076:7:3", "nodeType": "VariableDeclaration", "scope": 1413, "src": "11068:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1384, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11068:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1387, "mutability": "mutable", "name": "time", "nameLocation": "11101:4:3", "nodeType": "VariableDeclaration", "scope": 1413, "src": "11093:12:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1386, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11093:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "11033:78:3"}, "returnParameters": {"id": 1393, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1390, "mutability": "mutable", "name": "weight", "nameLocation": "11138:6:3", "nodeType": "VariableDeclaration", "scope": 1413, "src": "11130:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1389, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11130:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1392, "mutability": "mutable", "name": "totalSum", "nameLocation": "11154:8:3", "nodeType": "VariableDeclaration", "scope": 1413, "src": "11146:16:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1391, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11146:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "11129:34:3"}, "scope": 2180, "src": "10998:308:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 1790, "nodeType": "Block", "src": "11669:3425:3", "statements": [{"assignments": [1424], "declarations": [{"constant": false, "id": 1424, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "11793:14:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "11785:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1423, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11785:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1432, "initialValue": {"arguments": [{"arguments": [{"id": 1429, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1416, "src": "11826:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1428, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11818:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1427, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "11818:7:3", "typeDescriptions": {}}}, "id": 1430, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11818:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1426, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11810:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1425, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11810:7:3", "typeDescriptions": {}}}, "id": 1431, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11810:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "11785:50:3"}, {"expression": {"id": 1437, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1433, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "11900:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1436, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1434, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1418, "src": "11918:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1435, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "11929:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "11918:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "11900:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1438, "nodeType": "ExpressionStatement", "src": "11900:32:3"}, {"assignments": [1440], "declarations": [{"constant": false, "id": 1440, "mutability": "mutable", "name": "slope", "nameLocation": "11951:5:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "11943:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1439, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11943:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1455, "initialValue": {"arguments": [{"arguments": [{"expression": {"arguments": [{"expression": {"id": 1449, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12004:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1450, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12008:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12004:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"arguments": [{"id": 1446, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 818, "src": "11983:2:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1445, "name": "IVEOLAS", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 736, "src": "11975:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IVEOLAS_$736_$", "typeString": "type(contract IVEOLAS)"}}, "id": 1447, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11975:11:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_IVEOLAS_$736", "typeString": "contract IVEOLAS"}}, "id": 1448, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "11987:16:3", "memberName": "getLastUserPoint", "nodeType": "MemberAccess", "referencedDeclaration": 735, "src": "11975:28:3", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_PointVoting_$718_memory_ptr_$", "typeString": "function (address) view external returns (struct IVEOLAS.PointVoting memory)"}}, "id": 1451, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11975:40:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$718_memory_ptr", "typeString": "struct IVEOLAS.PointVoting memory"}}, "id": 1452, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12016:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 711, "src": "11975:46:3", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int128", "typeString": "int128"}], "id": 1444, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11967:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 1443, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "11967:7:3", "typeDescriptions": {}}}, "id": 1453, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11967:55:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 1442, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11959:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1441, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11959:7:3", "typeDescriptions": {}}}, "id": 1454, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11959:64:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "11943:80:3"}, {"assignments": [1457], "declarations": [{"constant": false, "id": 1457, "mutability": "mutable", "name": "lockEnd", "nameLocation": "12041:7:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "12033:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1456, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "12033:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1465, "initialValue": {"arguments": [{"expression": {"id": 1462, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12073:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1463, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12077:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12073:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"arguments": [{"id": 1459, "name": "ve", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 818, "src": "12059:2:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1458, "name": "IVEOLAS", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 736, "src": "12051:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IVEOLAS_$736_$", "typeString": "type(contract IVEOLAS)"}}, "id": 1460, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12051:11:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_IVEOLAS_$736", "typeString": "contract IVEOLAS"}}, "id": 1461, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12063:9:3", "memberName": "lockedEnd", "nodeType": "MemberAccess", "referencedDeclaration": 726, "src": "12051:21:3", "typeDescriptions": {"typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", "typeString": "function (address) view external returns (uint256)"}}, "id": 1464, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12051:33:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "12033:51:3"}, {"assignments": [1467], "declarations": [{"constant": false, "id": 1467, "mutability": "mutable", "name": "nextTime", "nameLocation": "12102:8:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "12094:16:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1466, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "12094:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1477, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1476, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1474, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1471, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1468, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "12114:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1469, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12120:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "12114:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 1470, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "12132:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12114:22:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1472, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "12113:24:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 1473, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "12140:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12113:31:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1475, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 799, "src": "12147:4:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12113:38:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "12094:57:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1480, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1478, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "12211:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">=", "rightExpression": {"id": 1479, "name": "lockEnd", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1457, "src": "12223:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12211:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1489, "nodeType": "IfStatement", "src": "12207:99:3", "trueBody": {"id": 1488, "nodeType": "Block", "src": "12232:74:3", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 1482, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12265:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1483, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12269:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12265:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1484, "name": "lockEnd", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1457, "src": "12277:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1485, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "12286:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1481, "name": "LockExpired", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5001, "src": "12253:11:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 1486, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12253:42:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1487, "nodeType": "RevertStatement", "src": "12246:49:3"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1492, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1490, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1420, "src": "12359:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1491, "name": "MAX_WEIGHT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 805, "src": "12368:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12359:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1499, "nodeType": "IfStatement", "src": "12355:85:3", "trueBody": {"id": 1498, "nodeType": "Block", "src": "12380:60:3", "statements": [{"errorCall": {"arguments": [{"id": 1494, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1420, "src": "12410:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1495, "name": "MAX_WEIGHT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 805, "src": "12418:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1493, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "12401:8:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 1496, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12401:28:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1497, "nodeType": "RevertStatement", "src": "12394:35:3"}]}}, {"assignments": [1501], "declarations": [{"constant": false, "id": 1501, "mutability": "mutable", "name": "nextAllowedVotingTime", "nameLocation": "12500:21:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "12492:29:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1500, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "12492:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1510, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1509, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"baseExpression": {"baseExpression": {"id": 1502, "name": "lastUserVote", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 845, "src": "12524:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}}, "id": 1505, "indexExpression": {"expression": {"id": 1503, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12537:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1504, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12541:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12537:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "12524:24:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1507, "indexExpression": {"id": 1506, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "12549:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "12524:40:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 1508, "name": "WEIGHT_VOTE_DELAY", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 802, "src": "12567:17:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12524:60:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "12492:92:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1514, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1511, "name": "nextAllowedVotingTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1501, "src": "12598:21:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 1512, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "12622:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1513, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12628:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "12622:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12598:39:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1524, "nodeType": "IfStatement", "src": "12594:141:3", "trueBody": {"id": 1523, "nodeType": "Block", "src": "12639:96:3", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 1516, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12673:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1517, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12677:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12673:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 1518, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "12685:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1519, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12691:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "12685:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1520, "name": "nextAllowedVotingTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1501, "src": "12702:21:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1515, "name": "VoteTooOften", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 756, "src": "12660:12:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 1521, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12660:64:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1522, "nodeType": "RevertStatement", "src": "12653:71:3"}]}}, {"assignments": [1527], "declarations": [{"constant": false, "id": 1527, "mutability": "mutable", "name": "oldSlope", "nameLocation": "12812:8:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "12794:26:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope"}, "typeName": {"id": 1526, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 1525, "name": "VotedSlope", "nameLocations": ["12794:10:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 768, "src": "12794:10:3"}, "referencedDeclaration": 768, "src": "12794:10:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage_ptr", "typeString": "struct VotedSlope"}}, "visibility": "internal"}], "id": 1534, "initialValue": {"baseExpression": {"baseExpression": {"id": 1528, "name": "voteUserSlopes", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 835, "src": "12823:14:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$_$", "typeString": "mapping(address => mapping(uint256 => struct VotedSlope storage ref))"}}, "id": 1531, "indexExpression": {"expression": {"id": 1529, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "12838:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1530, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12842:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "12838:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "12823:26:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$", "typeString": "mapping(uint256 => struct VotedSlope storage ref)"}}, "id": 1533, "indexExpression": {"id": 1532, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "12850:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "12823:42:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage", "typeString": "struct VotedSlope storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "12794:71:3"}, {"assignments": [1536], "declarations": [{"constant": false, "id": 1536, "mutability": "mutable", "name": "oldBias", "nameLocation": "12883:7:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "12875:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1535, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "12875:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1537, "nodeType": "VariableDeclarationStatement", "src": "12875:15:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1541, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1538, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "12904:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1539, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12913:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "12904:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1540, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "12919:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12904:23:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1554, "nodeType": "IfStatement", "src": "12900:106:3", "trueBody": {"id": 1553, "nodeType": "Block", "src": "12929:77:3", "statements": [{"expression": {"id": 1551, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1542, "name": "oldBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1536, "src": "12943:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1550, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1543, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "12953:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1544, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12962:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "12953:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1548, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1545, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "12971:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1546, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12980:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "12971:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 1547, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "12986:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12971:23:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1549, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "12970:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12953:42:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12943:52:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1552, "nodeType": "ExpressionStatement", "src": "12943:52:3"}]}}, {"assignments": [1557], "declarations": [{"constant": false, "id": 1557, "mutability": "mutable", "name": "newSlope", "nameLocation": "13034:8:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "13016:26:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope"}, "typeName": {"id": 1556, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 1555, "name": "VotedSlope", "nameLocations": ["13016:10:3"], "nodeType": "IdentifierPath", "referencedDeclaration": 768, "src": "13016:10:3"}, "referencedDeclaration": 768, "src": "13016:10:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage_ptr", "typeString": "struct VotedSlope"}}, "visibility": "internal"}], "id": 1567, "initialValue": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1563, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1561, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1559, "name": "slope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1440, "src": "13077:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 1560, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1420, "src": "13085:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13077:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 1562, "name": "MAX_WEIGHT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 805, "src": "13094:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13077:27:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1564, "name": "lockEnd", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1457, "src": "13123:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1565, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1420, "src": "13151:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1558, "name": "VotedSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 768, "src": "13045:10:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_VotedSlope_$768_storage_ptr_$", "typeString": "type(struct VotedSlope storage pointer)"}}, "id": 1566, "isConstant": false, "isLValue": false, "isPure": false, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": ["13070:5:3", "13118:3:3", "13144:5:3"], "names": ["slope", "end", "power"], "nodeType": "FunctionCall", "src": "13045:123:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "nodeType": "VariableDeclarationStatement", "src": "13016:152:3"}, {"assignments": [1569], "declarations": [{"constant": false, "id": 1569, "mutability": "mutable", "name": "newBias", "nameLocation": "13187:7:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "13179:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1568, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "13179:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1577, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1576, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1570, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "13197:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1571, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13206:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "13197:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1574, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1572, "name": "lockEnd", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1457, "src": "13215:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 1573, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13225:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13215:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 1575, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "13214:20:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13197:37:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "13179:55:3"}, {"assignments": [1579], "declarations": [{"constant": false, "id": 1579, "mutability": "mutable", "name": "powerUsed", "nameLocation": "13253:9:3", "nodeType": "VariableDeclaration", "scope": 1790, "src": "13245:17:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1578, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "13245:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1584, "initialValue": {"baseExpression": {"id": 1580, "name": "voteUserPower", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 839, "src": "13265:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 1583, "indexExpression": {"expression": {"id": 1581, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "13279:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1582, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "13283:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "13279:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13265:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "13245:45:3"}, {"expression": {"id": 1593, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1585, "name": "powerUsed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1579, "src": "13300:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1592, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1589, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1586, "name": "powerUsed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1579, "src": "13312:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"expression": {"id": 1587, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "13324:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1588, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13333:5:3", "memberName": "power", "nodeType": "MemberAccess", "referencedDeclaration": 765, "src": "13324:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13312:26:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 1590, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "13341:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1591, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13350:5:3", "memberName": "power", "nodeType": "MemberAccess", "referencedDeclaration": 765, "src": "13341:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13312:43:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13300:55:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1594, "nodeType": "ExpressionStatement", "src": "13300:55:3"}, {"expression": {"id": 1600, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1595, "name": "voteUserPower", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 839, "src": "13365:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 1598, "indexExpression": {"expression": {"id": 1596, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "13379:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1597, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "13383:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "13379:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "13365:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1599, "name": "powerUsed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1579, "src": "13393:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13365:37:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1601, "nodeType": "ExpressionStatement", "src": "13365:37:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1604, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1602, "name": "powerUsed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1579, "src": "13416:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1603, "name": "MAX_WEIGHT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 805, "src": "13428:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13416:22:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1611, "nodeType": "IfStatement", "src": "13412:91:3", "trueBody": {"id": 1610, "nodeType": "Block", "src": "13440:63:3", "statements": [{"errorCall": {"arguments": [{"id": 1606, "name": "powerUsed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1579, "src": "13470:9:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1607, "name": "MAX_WEIGHT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 805, "src": "13481:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1605, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "13461:8:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 1608, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13461:31:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1609, "nodeType": "RevertStatement", "src": "13454:38:3"}]}}, {"expression": {"id": 1627, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"baseExpression": {"id": 1612, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "13673:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1615, "indexExpression": {"id": 1613, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "13686:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13673:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1616, "indexExpression": {"id": 1614, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13702:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13673:38:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1617, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13712:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "13673:43:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1624, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"id": 1620, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1416, "src": "13741:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1621, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1418, "src": "13750:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1619, "name": "_getWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1160, "src": "13730:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (address,uint256) returns (uint256)"}}, "id": 1622, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13730:28:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 1623, "name": "newBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1569, "src": "13761:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13730:38:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1625, "name": "oldBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1536, "src": "13770:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1618, "name": "_maxAndSub", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1869, "src": "13719:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (uint256,uint256) pure returns (uint256)"}}, "id": 1626, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13719:59:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13673:105:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1628, "nodeType": "ExpressionStatement", "src": "13673:105:3"}, {"expression": {"id": 1640, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"id": 1629, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "13789:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1631, "indexExpression": {"id": 1630, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13799:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13789:19:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1632, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13809:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "13789:24:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1637, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [], "expression": {"argumentTypes": [], "id": 1634, "name": "_getSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1014, "src": "13827:7:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$", "typeString": "function () returns (uint256)"}}, "id": 1635, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13827:9:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 1636, "name": "newBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1569, "src": "13839:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13827:19:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1638, "name": "oldBias", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1536, "src": "13848:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1633, "name": "_maxAndSub", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1869, "src": "13816:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (uint256,uint256) pure returns (uint256)"}}, "id": 1639, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13816:40:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13789:67:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1641, "nodeType": "ExpressionStatement", "src": "13789:67:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1645, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1642, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "13870:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1643, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13879:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "13870:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1644, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13885:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13870:23:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 1703, "nodeType": "Block", "src": "14174:144:3", "statements": [{"expression": {"id": 1693, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"baseExpression": {"id": 1685, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "14188:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1688, "indexExpression": {"id": 1686, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14201:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14188:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1689, "indexExpression": {"id": 1687, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "14217:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14188:38:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1690, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14227:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "14188:44:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"expression": {"id": 1691, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14236:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1692, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14245:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14236:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14188:62:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1694, "nodeType": "ExpressionStatement", "src": "14188:62:3"}, {"expression": {"id": 1701, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"id": 1695, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "14264:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1697, "indexExpression": {"id": 1696, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "14274:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14264:19:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1698, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14284:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "14264:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"expression": {"id": 1699, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14293:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1700, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14302:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14293:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14264:43:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1702, "nodeType": "ExpressionStatement", "src": "14264:43:3"}]}, "id": 1704, "nodeType": "IfStatement", "src": "13866:452:3", "trueBody": {"id": 1684, "nodeType": "Block", "src": "13895:273:3", "statements": [{"expression": {"id": 1665, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"baseExpression": {"id": 1646, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "13909:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1649, "indexExpression": {"id": 1647, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "13922:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13909:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1650, "indexExpression": {"id": 1648, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13938:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13909:38:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1651, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13948:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "13909:44:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1661, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"baseExpression": {"baseExpression": {"id": 1653, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "13967:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1655, "indexExpression": {"id": 1654, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "13980:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13967:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1657, "indexExpression": {"id": 1656, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "13996:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "13967:38:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1658, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14006:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "13967:44:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"expression": {"id": 1659, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14014:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1660, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14023:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14014:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13967:61:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 1662, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14030:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1663, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14039:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14030:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1652, "name": "_maxAndSub", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1869, "src": "13956:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (uint256,uint256) pure returns (uint256)"}}, "id": 1664, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13956:89:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13909:136:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1666, "nodeType": "ExpressionStatement", "src": "13909:136:3"}, {"expression": {"id": 1682, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"baseExpression": {"id": 1667, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "14059:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1669, "indexExpression": {"id": 1668, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "14069:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14059:19:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1670, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14079:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "14059:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1678, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"baseExpression": {"id": 1672, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "14098:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1674, "indexExpression": {"id": 1673, "name": "nextTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1467, "src": "14108:8:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14098:19:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1675, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14118:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 760, "src": "14098:25:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"expression": {"id": 1676, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14126:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1677, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14135:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14126:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14098:42:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 1679, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14142:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1680, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14151:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14142:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1671, "name": "_maxAndSub", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1869, "src": "14087:10:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", "typeString": "function (uint256,uint256) pure returns (uint256)"}}, "id": 1681, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "14087:70:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14059:98:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1683, "nodeType": "ExpressionStatement", "src": "14059:98:3"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1709, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1705, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14331:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1706, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14340:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "14331:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 1707, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14346:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1708, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14352:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "14346:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14331:30:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1729, "nodeType": "IfStatement", "src": "14327:246:3", "trueBody": {"id": 1728, "nodeType": "Block", "src": "14363:210:3", "statements": [{"expression": {"id": 1718, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 1710, "name": "changesWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 858, "src": "14445:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(uint256 => mapping(uint256 => uint256))"}}, "id": 1714, "indexExpression": {"id": 1711, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14459:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14445:29:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1715, "indexExpression": {"expression": {"id": 1712, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14475:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1713, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14484:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "14475:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14445:43:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"expression": {"id": 1716, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14492:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1717, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14501:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14492:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14445:61:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1719, "nodeType": "ExpressionStatement", "src": "14445:61:3"}, {"expression": {"id": 1726, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1720, "name": "changesSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 871, "src": "14520:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1723, "indexExpression": {"expression": {"id": 1721, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14531:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1722, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14540:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "14531:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14520:24:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"expression": {"id": 1724, "name": "oldSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1527, "src": "14548:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1725, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14557:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14548:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14520:42:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1727, "nodeType": "ExpressionStatement", "src": "14520:42:3"}]}}, {"expression": {"id": 1738, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 1730, "name": "changesWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 858, "src": "14626:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(uint256 => mapping(uint256 => uint256))"}}, "id": 1734, "indexExpression": {"id": 1731, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14640:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14626:29:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1735, "indexExpression": {"expression": {"id": 1732, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14656:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1733, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14665:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "14656:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14626:43:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"expression": {"id": 1736, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14673:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1737, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14682:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14673:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14626:61:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1739, "nodeType": "ExpressionStatement", "src": "14626:61:3"}, {"expression": {"id": 1746, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 1740, "name": "changesSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 871, "src": "14697:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1743, "indexExpression": {"expression": {"id": 1741, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14708:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1742, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14717:3:3", "memberName": "end", "nodeType": "MemberAccess", "referencedDeclaration": 767, "src": "14708:12:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14697:24:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"expression": {"id": 1744, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14725:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "id": 1745, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14734:5:3", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 763, "src": "14725:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14697:42:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1747, "nodeType": "ExpressionStatement", "src": "14697:42:3"}, {"expression": {"id": 1755, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 1748, "name": "voteUserSlopes", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 835, "src": "14750:14:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$_$", "typeString": "mapping(address => mapping(uint256 => struct VotedSlope storage ref))"}}, "id": 1752, "indexExpression": {"expression": {"id": 1749, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "14765:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1750, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14769:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "14765:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14750:26:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_VotedSlope_$768_storage_$", "typeString": "mapping(uint256 => struct VotedSlope storage ref)"}}, "id": 1753, "indexExpression": {"id": 1751, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14777:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14750:42:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage", "typeString": "struct VotedSlope storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 1754, "name": "newSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1557, "src": "14795:8:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_memory_ptr", "typeString": "struct VotedSlope memory"}}, "src": "14750:53:3", "typeDescriptions": {"typeIdentifier": "t_struct$_VotedSlope_$768_storage", "typeString": "struct VotedSlope storage ref"}}, "id": 1756, "nodeType": "ExpressionStatement", "src": "14750:53:3"}, {"expression": {"id": 1765, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 1757, "name": "lastUserVote", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 845, "src": "14849:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}}, "id": 1761, "indexExpression": {"expression": {"id": 1758, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "14862:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1759, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14866:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "14862:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14849:24:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1762, "indexExpression": {"id": 1760, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14874:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14849:40:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 1763, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14892:5:3", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 1764, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14898:9:3", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "14892:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14849:58:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1766, "nodeType": "ExpressionStatement", "src": "14849:58:3"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1775, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"baseExpression": {"baseExpression": {"id": 1768, "name": "lastUserVote", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 845, "src": "14924:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}}, "id": 1771, "indexExpression": {"expression": {"id": 1769, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "14937:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1770, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14941:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "14937:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14924:24:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1773, "indexExpression": {"id": 1772, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1424, "src": "14949:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "14924:40:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 1774, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "14967:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "14924:44:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}], "id": 1767, "name": "assert", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -3, "src": "14917:6:3", "typeDescriptions": {"typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", "typeString": "function (bool) pure"}}, "id": 1776, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "14917:52:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1777, "nodeType": "ExpressionStatement", "src": "14917:52:3"}, {"expression": {"id": 1780, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1778, "name": "callVoteForNomineeWeights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 821, "src": "14988:25:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "74727565", "id": 1779, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "15016:4:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "src": "14988:32:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1781, "nodeType": "ExpressionStatement", "src": "14988:32:3"}, {"eventCall": {"arguments": [{"expression": {"id": 1783, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "15050:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 1784, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15054:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "15050:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1785, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1416, "src": "15062:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 1786, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1418, "src": "15071:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1787, "name": "weight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1420, "src": "15080:6:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1782, "name": "VoteForNominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 790, "src": "15035:14:3", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256,uint256)"}}, "id": 1788, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15035:52:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1789, "nodeType": "EmitStatement", "src": "15030:57:3"}]}, "documentation": {"id": 1414, "nodeType": "StructuredDocumentation", "src": "11312:264:3", "text": "@dev Allocate voting power for changing pool weights.\n @param nominee Address of the nominee the `msg.sender` votes for.\n @param chainId Chain Id.\n @param weight Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0."}, "functionSelector": "88873907", "id": 1791, "implemented": true, "kind": "function", "modifiers": [], "name": "voteForNomineeWeights", "nameLocation": "11590:21:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1421, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1416, "mutability": "mutable", "name": "nominee", "nameLocation": "11620:7:3", "nodeType": "VariableDeclaration", "scope": 1791, "src": "11612:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1415, "name": "address", "nodeType": "ElementaryTypeName", "src": "11612:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1418, "mutability": "mutable", "name": "chainId", "nameLocation": "11637:7:3", "nodeType": "VariableDeclaration", "scope": 1791, "src": "11629:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1417, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11629:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1420, "mutability": "mutable", "name": "weight", "nameLocation": "11654:6:3", "nodeType": "VariableDeclaration", "scope": 1791, "src": "11646:14:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1419, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11646:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "11611:50:3"}, "returnParameters": {"id": 1422, "nodeType": "ParameterList", "parameters": [], "src": "11669:0:3"}, "scope": 2180, "src": "11581:3513:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "public"}, {"body": {"id": 1849, "nodeType": "Block", "src": "15553:359:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 1814, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1808, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1804, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1795, "src": "15567:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 1805, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15576:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15567:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"expression": {"id": 1806, "name": "chainIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1798, "src": "15586:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 1807, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15595:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15586:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "15567:34:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "||", "rightExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1813, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1809, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1795, "src": "15605:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 1810, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15614:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15605:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"expression": {"id": 1811, "name": "weights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1801, "src": "15624:7:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 1812, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15632:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15624:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "15605:33:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "15567:71:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1823, "nodeType": "IfStatement", "src": "15563:158:3", "trueBody": {"id": 1822, "nodeType": "Block", "src": "15640:81:3", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 1816, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1795, "src": "15678:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 1817, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15687:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15678:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 1818, "name": "weights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1801, "src": "15695:7:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 1819, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15703:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15695:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1815, "name": "WrongArrayLength", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4956, "src": "15661:16:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 1820, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15661:49:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1821, "nodeType": "RevertStatement", "src": "15654:56:3"}]}}, {"body": {"id": 1847, "nodeType": "Block", "src": "15822:84:3", "statements": [{"expression": {"arguments": [{"baseExpression": {"id": 1836, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1795, "src": "15858:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 1838, "indexExpression": {"id": 1837, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1825, "src": "15867:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "15858:11:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"baseExpression": {"id": 1839, "name": "chainIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1798, "src": "15871:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 1841, "indexExpression": {"id": 1840, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1825, "src": "15880:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "15871:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"baseExpression": {"id": 1842, "name": "weights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1801, "src": "15884:7:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 1844, "indexExpression": {"id": 1843, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1825, "src": "15892:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "15884:10:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1835, "name": "voteForNomineeWeights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1791, "src": "15836:21:3", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256)"}}, "id": 1845, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15836:59:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1846, "nodeType": "ExpressionStatement", "src": "15836:59:3"}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1831, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1828, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1825, "src": "15796:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"expression": {"id": 1829, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1795, "src": "15800:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 1830, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15809:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "15800:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "15796:19:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1848, "initializationExpression": {"assignments": [1825], "declarations": [{"constant": false, "id": 1825, "mutability": "mutable", "name": "i", "nameLocation": "15789:1:3", "nodeType": "VariableDeclaration", "scope": 1848, "src": "15781:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1824, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15781:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1827, "initialValue": {"hexValue": "30", "id": 1826, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15793:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "15781:13:3"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 1833, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "15817:3:3", "subExpression": {"id": 1832, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1825, "src": "15819:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1834, "nodeType": "ExpressionStatement", "src": "15817:3:3"}, "nodeType": "ForStatement", "src": "15776:130:3"}]}, "documentation": {"id": 1792, "nodeType": "StructuredDocumentation", "src": "15100:293:3", "text": "@dev Allocate voting power for changing pool weights in batch.\n @param nominees Set of nominees the `msg.sender` votes for.\n @param chainIds Set of corresponding chain Ids.\n @param weights Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0."}, "functionSelector": "7967d905", "id": 1850, "implemented": true, "kind": "function", "modifiers": [], "name": "voteForNomineeWeightsBatch", "nameLocation": "15407:26:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1802, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1795, "mutability": "mutable", "name": "nominees", "nameLocation": "15460:8:3", "nodeType": "VariableDeclaration", "scope": 1850, "src": "15443:25:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[]"}, "typeName": {"baseType": {"id": 1793, "name": "address", "nodeType": "ElementaryTypeName", "src": "15443:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 1794, "nodeType": "ArrayTypeName", "src": "15443:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]"}}, "visibility": "internal"}, {"constant": false, "id": 1798, "mutability": "mutable", "name": "chainIds", "nameLocation": "15495:8:3", "nodeType": "VariableDeclaration", "scope": 1850, "src": "15478:25:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[]"}, "typeName": {"baseType": {"id": 1796, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15478:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1797, "nodeType": "ArrayTypeName", "src": "15478:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", "typeString": "uint256[]"}}, "visibility": "internal"}, {"constant": false, "id": 1801, "mutability": "mutable", "name": "weights", "nameLocation": "15530:7:3", "nodeType": "VariableDeclaration", "scope": 1850, "src": "15513:24:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[]"}, "typeName": {"baseType": {"id": 1799, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15513:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1800, "nodeType": "ArrayTypeName", "src": "15513:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", "typeString": "uint256[]"}}, "visibility": "internal"}], "src": "15433:110:3"}, "returnParameters": {"id": 1803, "nodeType": "ParameterList", "parameters": [], "src": "15553:0:3"}, "scope": 2180, "src": "15398:514:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 1868, "nodeType": "Block", "src": "15992:41:3", "statements": [{"expression": {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1861, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1859, "name": "a", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1852, "src": "16009:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1860, "name": "b", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1854, "src": "16013:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "16009:5:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseExpression": {"hexValue": "30", "id": 1865, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "16025:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "id": 1866, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "Conditional", "src": "16009:17:3", "trueExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1864, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1862, "name": "a", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1852, "src": "16017:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 1863, "name": "b", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1854, "src": "16021:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "16017:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 1858, "id": 1867, "nodeType": "Return", "src": "16002:24:3"}]}, "id": 1869, "implemented": true, "kind": "function", "modifiers": [], "name": "_maxAndSub", "nameLocation": "15927:10:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1855, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1852, "mutability": "mutable", "name": "a", "nameLocation": "15946:1:3", "nodeType": "VariableDeclaration", "scope": 1869, "src": "15938:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1851, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15938:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 1854, "mutability": "mutable", "name": "b", "nameLocation": "15957:1:3", "nodeType": "VariableDeclaration", "scope": 1869, "src": "15949:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1853, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15949:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "15937:22:3"}, "returnParameters": {"id": 1858, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1857, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1869, "src": "15983:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1856, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15983:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "15982:9:3"}, "scope": 2180, "src": "15918:115:3", "stateMutability": "pure", "virtual": false, "visibility": "internal"}, {"body": {"id": 1904, "nodeType": "Block", "src": "16284:348:3", "statements": [{"assignments": [1880], "declarations": [{"constant": false, "id": 1880, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "16407:14:3", "nodeType": "VariableDeclaration", "scope": 1904, "src": "16399:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1879, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "16399:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1888, "initialValue": {"arguments": [{"arguments": [{"id": 1885, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1872, "src": "16440:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1884, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "16432:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1883, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "16432:7:3", "typeDescriptions": {}}}, "id": 1886, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16432:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1882, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "16424:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1881, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "16424:7:3", "typeDescriptions": {}}}, "id": 1887, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16424:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "16399:50:3"}, {"expression": {"id": 1893, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1889, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1880, "src": "16514:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1892, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1890, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1874, "src": "16532:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1891, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "16543:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "16532:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "16514:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1894, "nodeType": "ExpressionStatement", "src": "16514:32:3"}, {"expression": {"expression": {"baseExpression": {"baseExpression": {"id": 1895, "name": "pointsWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 852, "src": "16564:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$_$", "typeString": "mapping(uint256 => mapping(uint256 => struct Point storage ref))"}}, "id": 1897, "indexExpression": {"id": 1896, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1880, "src": "16577:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "16564:28:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1901, "indexExpression": {"baseExpression": {"id": 1898, "name": "timeWeight", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 862, "src": "16593:10:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1900, "indexExpression": {"id": 1899, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1880, "src": "16604:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "16593:26:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "16564:56:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1902, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "16621:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "16564:61:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 1878, "id": 1903, "nodeType": "Return", "src": "16557:68:3"}]}, "documentation": {"id": 1870, "nodeType": "StructuredDocumentation", "src": "16039:148:3", "text": "@dev Get current nominee weight.\n @param nominee Address of the nominee.\n @param chainId Chain Id.\n @return Nominee weight."}, "functionSelector": "7665a8ef", "id": 1905, "implemented": true, "kind": "function", "modifiers": [], "name": "getNomineeWeight", "nameLocation": "16201:16:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1875, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1872, "mutability": "mutable", "name": "nominee", "nameLocation": "16226:7:3", "nodeType": "VariableDeclaration", "scope": 1905, "src": "16218:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1871, "name": "address", "nodeType": "ElementaryTypeName", "src": "16218:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1874, "mutability": "mutable", "name": "chainId", "nameLocation": "16243:7:3", "nodeType": "VariableDeclaration", "scope": 1905, "src": "16235:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1873, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "16235:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "16217:34:3"}, "returnParameters": {"id": 1878, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1877, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1905, "src": "16275:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1876, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "16275:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "16274:9:3"}, "scope": 2180, "src": "16192:440:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 1916, "nodeType": "Block", "src": "16780:47:3", "statements": [{"expression": {"expression": {"baseExpression": {"id": 1911, "name": "pointsSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 867, "src": "16797:9:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_Point_$761_storage_$", "typeString": "mapping(uint256 => struct Point storage ref)"}}, "id": 1913, "indexExpression": {"id": 1912, "name": "timeSum", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 873, "src": "16807:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "16797:18:3", "typeDescriptions": {"typeIdentifier": "t_struct$_Point_$761_storage", "typeString": "struct Point storage ref"}}, "id": 1914, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "16816:4:3", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 758, "src": "16797:23:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 1910, "id": 1915, "nodeType": "Return", "src": "16790:30:3"}]}, "documentation": {"id": 1906, "nodeType": "StructuredDocumentation", "src": "16642:76:3", "text": "@dev Get sum of nominee weights.\n @return Sum of nominee weights."}, "functionSelector": "41597036", "id": 1917, "implemented": true, "kind": "function", "modifiers": [], "name": "getWeightsSum", "nameLocation": "16732:13:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1907, "nodeType": "ParameterList", "parameters": [], "src": "16745:2:3"}, "returnParameters": {"id": 1910, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1909, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1917, "src": "16771:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1908, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "16771:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "16770:9:3"}, "scope": 2180, "src": "16723:104:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 1928, "nodeType": "Block", "src": "17050:46:3", "statements": [{"expression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1926, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1923, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "17067:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 1924, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "17079:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "17067:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "31", "id": 1925, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "17088:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "17067:22:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 1922, "id": 1927, "nodeType": "Return", "src": "17060:29:3"}]}, "documentation": {"id": 1918, "nodeType": "StructuredDocumentation", "src": "16833:154:3", "text": "@dev Get the number of nominees.\n @notice The zero-th default nominee Id with id == 0 does not count.\n @return Total number of nominees."}, "functionSelector": "a18f99ff", "id": 1929, "implemented": true, "kind": "function", "modifiers": [], "name": "getNumNominees", "nameLocation": "17001:14:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1919, "nodeType": "ParameterList", "parameters": [], "src": "17015:2:3"}, "returnParameters": {"id": 1922, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1921, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1929, "src": "17041:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1920, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17041:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "17040:9:3"}, "scope": 2180, "src": "16992:104:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 1961, "nodeType": "Block", "src": "17406:314:3", "statements": [{"assignments": [1940], "declarations": [{"constant": false, "id": 1940, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "17529:14:3", "nodeType": "VariableDeclaration", "scope": 1961, "src": "17521:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1939, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17521:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1948, "initialValue": {"arguments": [{"arguments": [{"id": 1945, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1932, "src": "17562:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 1944, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "17554:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 1943, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "17554:7:3", "typeDescriptions": {}}}, "id": 1946, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17554:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 1942, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "17546:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 1941, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17546:7:3", "typeDescriptions": {}}}, "id": 1947, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17546:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "17521:50:3"}, {"expression": {"id": 1953, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1949, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1940, "src": "17636:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1952, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1950, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1934, "src": "17654:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 1951, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "17665:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "17654:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "17636:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1954, "nodeType": "ExpressionStatement", "src": "17636:32:3"}, {"expression": {"id": 1959, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 1955, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1937, "src": "17679:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 1956, "name": "mapNomineeIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 828, "src": "17684:13:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 1958, "indexExpression": {"id": 1957, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1940, "src": "17698:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "17684:29:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "17679:34:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 1960, "nodeType": "ExpressionStatement", "src": "17679:34:3"}]}, "documentation": {"id": 1930, "nodeType": "StructuredDocumentation", "src": "17102:208:3", "text": "@dev Gets the nominee Id in the global nominees set.\n @param nominee Nominee address.\n @param chainId Chain Id.\n @return id Nominee Id in the global set of (nominee | chainId) values."}, "functionSelector": "3d80f36f", "id": 1962, "implemented": true, "kind": "function", "modifiers": [], "name": "getNomineeId", "nameLocation": "17324:12:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1935, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1932, "mutability": "mutable", "name": "nominee", "nameLocation": "17345:7:3", "nodeType": "VariableDeclaration", "scope": 1962, "src": "17337:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1931, "name": "address", "nodeType": "ElementaryTypeName", "src": "17337:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1934, "mutability": "mutable", "name": "chainId", "nameLocation": "17362:7:3", "nodeType": "VariableDeclaration", "scope": 1962, "src": "17354:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1933, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17354:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "17336:34:3"}, "returnParameters": {"id": 1938, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1937, "mutability": "mutable", "name": "id", "nameLocation": "17402:2:3", "nodeType": "VariableDeclaration", "scope": 1962, "src": "17394:10:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1936, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17394:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "17393:12:3"}, "scope": 2180, "src": "17315:405:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2022, "nodeType": "Block", "src": "18113:563:3", "statements": [{"assignments": [1973], "declarations": [{"constant": false, "id": 1973, "mutability": "mutable", "name": "totalNumNominees", "nameLocation": "18191:16:3", "nodeType": "VariableDeclaration", "scope": 2022, "src": "18183:24:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1972, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18183:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 1978, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1977, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 1974, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "18210:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 1975, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "18222:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "18210:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "31", "id": 1976, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "18231:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "18210:22:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "18183:49:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1981, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1979, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1965, "src": "18295:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 1980, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "18301:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "18295:7:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 1988, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 1986, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1965, "src": "18357:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 1987, "name": "totalNumNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1973, "src": "18362:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "18357:21:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 1995, "nodeType": "IfStatement", "src": "18353:89:3", "trueBody": {"id": 1994, "nodeType": "Block", "src": "18380:62:3", "statements": [{"errorCall": {"arguments": [{"id": 1990, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1965, "src": "18410:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 1991, "name": "totalNumNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1973, "src": "18414:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 1989, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "18401:8:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 1992, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18401:30:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1993, "nodeType": "RevertStatement", "src": "18394:37:3"}]}}, "id": 1996, "nodeType": "IfStatement", "src": "18291:151:3", "trueBody": {"id": 1985, "nodeType": "Block", "src": "18304:43:3", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 1982, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "18325:9:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 1983, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18325:11:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 1984, "nodeType": "RevertStatement", "src": "18318:18:3"}]}}, {"assignments": [1998], "declarations": [{"constant": false, "id": 1998, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "18468:14:3", "nodeType": "VariableDeclaration", "scope": 2022, "src": "18460:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1997, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18460:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2002, "initialValue": {"baseExpression": {"id": 1999, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "18485:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 2001, "indexExpression": {"id": 2000, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1965, "src": "18497:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "18485:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "18460:40:3"}, {"expression": {"id": 2014, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2003, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1968, "src": "18549:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"arguments": [{"arguments": [{"id": 2010, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1998, "src": "18583:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2009, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "18575:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2008, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18575:7:3", "typeDescriptions": {}}}, "id": 2011, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18575:23:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2007, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "18567:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 2006, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "18567:7:3", "typeDescriptions": {}}}, "id": 2012, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18567:32:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 2005, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "18559:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2004, "name": "address", "nodeType": "ElementaryTypeName", "src": "18559:7:3", "typeDescriptions": {}}}, "id": 2013, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18559:41:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "18549:51:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 2015, "nodeType": "ExpressionStatement", "src": "18549:51:3"}, {"expression": {"id": 2020, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2016, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1970, "src": "18638:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2019, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2017, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1998, "src": "18648:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">>", "rightExpression": {"hexValue": "313630", "id": 2018, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "18666:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "18648:21:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "18638:31:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2021, "nodeType": "ExpressionStatement", "src": "18638:31:3"}]}, "documentation": {"id": 1963, "nodeType": "StructuredDocumentation", "src": "17726:293:3", "text": "@dev Get the nominee address and its corresponding chain Id.\n @notice The zero-th default nominee Id with id == 0 does not count.\n @param id Nominee Id in the global set of (nominee | chainId) values.\n @return nominee Nominee address.\n @return chainId Chain Id."}, "functionSelector": "27ebf531", "id": 2023, "implemented": true, "kind": "function", "modifiers": [], "name": "getNominee", "nameLocation": "18033:10:3", "nodeType": "FunctionDefinition", "parameters": {"id": 1966, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1965, "mutability": "mutable", "name": "id", "nameLocation": "18052:2:3", "nodeType": "VariableDeclaration", "scope": 2023, "src": "18044:10:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1964, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18044:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "18043:12:3"}, "returnParameters": {"id": 1971, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 1968, "mutability": "mutable", "name": "nominee", "nameLocation": "18087:7:3", "nodeType": "VariableDeclaration", "scope": 2023, "src": "18079:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 1967, "name": "address", "nodeType": "ElementaryTypeName", "src": "18079:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 1970, "mutability": "mutable", "name": "chainId", "nameLocation": "18104:7:3", "nodeType": "VariableDeclaration", "scope": 2023, "src": "18096:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 1969, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18096:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "18078:34:3"}, "scope": 2180, "src": "18024:652:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2133, "nodeType": "Block", "src": "19253:1020:3", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 2043, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2039, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2037, "name": "startId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2026, "src": "19316:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 2038, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "19327:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "19316:12:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "||", "rightExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2042, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2040, "name": "numNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2028, "src": "19332:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 2041, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "19347:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "19332:16:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "19316:32:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2048, "nodeType": "IfStatement", "src": "19312:81:3", "trueBody": {"id": 2047, "nodeType": "Block", "src": "19350:43:3", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 2044, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "19371:9:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 2045, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19371:11:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 2046, "nodeType": "RevertStatement", "src": "19364:18:3"}]}}, {"assignments": [2050], "declarations": [{"constant": false, "id": 2050, "mutability": "mutable", "name": "endId", "nameLocation": "19456:5:3", "nodeType": "VariableDeclaration", "scope": 2133, "src": "19448:13:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2049, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19448:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2054, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2053, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2051, "name": "startId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2026, "src": "19464:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 2052, "name": "numNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2028, "src": "19474:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "19464:21:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "19448:37:3"}, {"assignments": [2056], "declarations": [{"constant": false, "id": 2056, "mutability": "mutable", "name": "totalNumNominees", "nameLocation": "19588:16:3", "nodeType": "VariableDeclaration", "scope": 2133, "src": "19580:24:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2055, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19580:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2059, "initialValue": {"expression": {"id": 2057, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "19607:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 2058, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "19619:6:3", "memberName": "length", "nodeType": "MemberAccess", "src": "19607:18:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "19580:45:3"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2062, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2060, "name": "endId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2050, "src": "19674:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 2061, "name": "totalNumNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2056, "src": "19682:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "19674:24:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2069, "nodeType": "IfStatement", "src": "19670:95:3", "trueBody": {"id": 2068, "nodeType": "Block", "src": "19700:65:3", "statements": [{"errorCall": {"arguments": [{"id": 2064, "name": "endId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2050, "src": "19730:5:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 2065, "name": "totalNumNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2056, "src": "19737:16:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2063, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "19721:8:3", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 2066, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19721:33:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 2067, "nodeType": "RevertStatement", "src": "19714:40:3"}]}}, {"expression": {"id": 2076, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2070, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2032, "src": "19796:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 2074, "name": "numNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2028, "src": "19821:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2073, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "NewExpression", "src": "19807:13:3", "typeDescriptions": {"typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$", "typeString": "function (uint256) pure returns (address[] memory)"}, "typeName": {"baseType": {"id": 2071, "name": "address", "nodeType": "ElementaryTypeName", "src": "19811:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 2072, "nodeType": "ArrayTypeName", "src": "19811:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]"}}}, "id": 2075, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19807:26:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "src": "19796:37:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 2077, "nodeType": "ExpressionStatement", "src": "19796:37:3"}, {"expression": {"id": 2084, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2078, "name": "chainIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2035, "src": "19843:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 2082, "name": "numNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2028, "src": "19868:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2081, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "NewExpression", "src": "19854:13:3", "typeDescriptions": {"typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$", "typeString": "function (uint256) pure returns (uint256[] memory)"}, "typeName": {"baseType": {"id": 2079, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19858:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2080, "nodeType": "ArrayTypeName", "src": "19858:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", "typeString": "uint256[]"}}}, "id": 2083, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19854:26:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "src": "19843:37:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 2085, "nodeType": "ExpressionStatement", "src": "19843:37:3"}, {"body": {"id": 2131, "nodeType": "Block", "src": "19971:296:3", "statements": [{"assignments": [2097], "declarations": [{"constant": false, "id": 2097, "mutability": "mutable", "name": "id", "nameLocation": "19993:2:3", "nodeType": "VariableDeclaration", "scope": 2131, "src": "19985:10:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2096, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19985:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2101, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2100, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2098, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2087, "src": "19998:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 2099, "name": "startId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2026, "src": "20002:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "19998:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "19985:24:3"}, {"assignments": [2103], "declarations": [{"constant": false, "id": 2103, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "20031:14:3", "nodeType": "VariableDeclaration", "scope": 2131, "src": "20023:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2102, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20023:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2107, "initialValue": {"baseExpression": {"id": 2104, "name": "setNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 824, "src": "20048:11:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage", "typeString": "uint256[] storage ref"}}, "id": 2106, "indexExpression": {"id": 2105, "name": "id", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2097, "src": "20060:2:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "20048:15:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "20023:40:3"}, {"expression": {"id": 2121, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2108, "name": "nominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2032, "src": "20120:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory"}}, "id": 2110, "indexExpression": {"id": 2109, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2087, "src": "20129:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "20120:11:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"arguments": [{"arguments": [{"id": 2117, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2103, "src": "20158:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2116, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20150:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2115, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20150:7:3", "typeDescriptions": {}}}, "id": 2118, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20150:23:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2114, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20142:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 2113, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "20142:7:3", "typeDescriptions": {}}}, "id": 2119, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20142:32:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 2112, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20134:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2111, "name": "address", "nodeType": "ElementaryTypeName", "src": "20134:7:3", "typeDescriptions": {}}}, "id": 2120, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20134:41:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "20120:55:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 2122, "nodeType": "ExpressionStatement", "src": "20120:55:3"}, {"expression": {"id": 2129, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2123, "name": "chainIds", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2035, "src": "20221:8:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[] memory"}}, "id": 2125, "indexExpression": {"id": 2124, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2087, "src": "20230:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "20221:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2128, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2126, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2103, "src": "20235:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">>", "rightExpression": {"hexValue": "313630", "id": 2127, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "20253:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "20235:21:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20221:35:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2130, "nodeType": "ExpressionStatement", "src": "20221:35:3"}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2092, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2090, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2087, "src": "19949:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"id": 2091, "name": "numNominees", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2028, "src": "19953:11:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "19949:15:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2132, "initializationExpression": {"assignments": [2087], "declarations": [{"constant": false, "id": 2087, "mutability": "mutable", "name": "i", "nameLocation": "19942:1:3", "nodeType": "VariableDeclaration", "scope": 2132, "src": "19934:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2086, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19934:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2089, "initialValue": {"hexValue": "30", "id": 2088, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "19946:1:3", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "19934:13:3"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 2094, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "19966:3:3", "subExpression": {"id": 2093, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2087, "src": "19968:1:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2095, "nodeType": "ExpressionStatement", "src": "19966:3:3"}, "nodeType": "ForStatement", "src": "19929:338:3"}]}, "documentation": {"id": 2024, "nodeType": "StructuredDocumentation", "src": "18682:404:3", "text": "@dev Get the set of nominee addresses and corresponding chain Ids.\n @notice The zero-th default nominee Id with id == 0 does not count.\n @param startId Start Id of the nominee in the global set of (nominee | chainId) values.\n @param numNominees Number of nominees to get.\n @return nominees Set of nominee addresses.\n @return chainIds Set of corresponding chain Ids."}, "functionSelector": "0092a596", "id": 2134, "implemented": true, "kind": "function", "modifiers": [], "name": "getNominees", "nameLocation": "19100:11:3", "nodeType": "FunctionDefinition", "parameters": {"id": 2029, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2026, "mutability": "mutable", "name": "startId", "nameLocation": "19129:7:3", "nodeType": "VariableDeclaration", "scope": 2134, "src": "19121:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2025, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19121:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 2028, "mutability": "mutable", "name": "numNominees", "nameLocation": "19154:11:3", "nodeType": "VariableDeclaration", "scope": 2134, "src": "19146:19:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2027, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19146:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "19111:60:3"}, "returnParameters": {"id": 2036, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2032, "mutability": "mutable", "name": "nominees", "nameLocation": "19212:8:3", "nodeType": "VariableDeclaration", "scope": 2134, "src": "19195:25:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[]"}, "typeName": {"baseType": {"id": 2030, "name": "address", "nodeType": "ElementaryTypeName", "src": "19195:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 2031, "nodeType": "ArrayTypeName", "src": "19195:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]"}}, "visibility": "internal"}, {"constant": false, "id": 2035, "mutability": "mutable", "name": "chainIds", "nameLocation": "19239:8:3", "nodeType": "VariableDeclaration", "scope": 2134, "src": "19222:25:3", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", "typeString": "uint256[]"}, "typeName": {"baseType": {"id": 2033, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19222:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2034, "nodeType": "ArrayTypeName", "src": "19222:9:3", "typeDescriptions": {"typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", "typeString": "uint256[]"}}, "visibility": "internal"}], "src": "19194:54:3"}, "scope": 2180, "src": "19091:1182:3", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2144, "nodeType": "Block", "src": "20367:49:3", "statements": [{"expression": {"id": 2142, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2140, "name": "callVoteForNomineeWeights", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 821, "src": "20377:25:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2141, "name": "flag", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2137, "src": "20405:4:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "20377:32:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2143, "nodeType": "ExpressionStatement", "src": "20377:32:3"}]}, "documentation": {"id": 2135, "nodeType": "StructuredDocumentation", "src": "20279:25:3", "text": "@dev For fuzzing only"}, "functionSelector": "289da14e", "id": 2145, "implemented": true, "kind": "function", "modifiers": [], "name": "setCallVoteForNomineeWeights", "nameLocation": "20318:28:3", "nodeType": "FunctionDefinition", "parameters": {"id": 2138, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2137, "mutability": "mutable", "name": "flag", "nameLocation": "20352:4:3", "nodeType": "VariableDeclaration", "scope": 2145, "src": "20347:9:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 2136, "name": "bool", "nodeType": "ElementaryTypeName", "src": "20347:4:3", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "20346:11:3"}, "returnParameters": {"id": 2139, "nodeType": "ParameterList", "parameters": [], "src": "20367:0:3"}, "scope": 2180, "src": "20309:107:3", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 2178, "nodeType": "Block", "src": "20542:326:3", "statements": [{"assignments": [2156], "declarations": [{"constant": false, "id": 2156, "mutability": "mutable", "name": "nomineeChainId", "nameLocation": "20665:14:3", "nodeType": "VariableDeclaration", "scope": 2178, "src": "20657:22:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2155, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20657:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2164, "initialValue": {"arguments": [{"arguments": [{"id": 2161, "name": "nominee", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2148, "src": "20698:7:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 2160, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20690:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint160_$", "typeString": "type(uint160)"}, "typeName": {"id": 2159, "name": "uint160", "nodeType": "ElementaryTypeName", "src": "20690:7:3", "typeDescriptions": {}}}, "id": 2162, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20690:16:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint160", "typeString": "uint160"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint160", "typeString": "uint160"}], "id": 2158, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20682:7:3", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2157, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20682:7:3", "typeDescriptions": {}}}, "id": 2163, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20682:25:3", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "20657:50:3"}, {"expression": {"id": 2169, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2165, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2156, "src": "20772:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "|=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2168, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2166, "name": "chainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2150, "src": "20790:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<<", "rightExpression": {"hexValue": "313630", "id": 2167, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "20801:3:3", "typeDescriptions": {"typeIdentifier": "t_rational_160_by_1", "typeString": "int_const 160"}, "value": "160"}, "src": "20790:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20772:32:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2170, "nodeType": "ExpressionStatement", "src": "20772:32:3"}, {"expression": {"baseExpression": {"baseExpression": {"id": 2171, "name": "lastUserVote", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 845, "src": "20821:12:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$", "typeString": "mapping(address => mapping(uint256 => uint256))"}}, "id": 2174, "indexExpression": {"expression": {"id": 2172, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "20834:3:3", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 2173, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20838:6:3", "memberName": "sender", "nodeType": "MemberAccess", "src": "20834:10:3", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "20821:24:3", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$", "typeString": "mapping(uint256 => uint256)"}}, "id": 2176, "indexExpression": {"id": 2175, "name": "nomineeChainId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2156, "src": "20846:14:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "20821:40:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 2154, "id": 2177, "nodeType": "Return", "src": "20814:47:3"}]}, "documentation": {"id": 2146, "nodeType": "StructuredDocumentation", "src": "20421:25:3", "text": "@dev For fuzzing only"}, "functionSelector": "1d0a06b6", "id": 2179, "implemented": true, "kind": "function", "modifiers": [], "name": "getlastUserVote", "nameLocation": "20460:15:3", "nodeType": "FunctionDefinition", "parameters": {"id": 2151, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2148, "mutability": "mutable", "name": "nominee", "nameLocation": "20484:7:3", "nodeType": "VariableDeclaration", "scope": 2179, "src": "20476:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2147, "name": "address", "nodeType": "ElementaryTypeName", "src": "20476:7:3", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2150, "mutability": "mutable", "name": "chainId", "nameLocation": "20501:7:3", "nodeType": "VariableDeclaration", "scope": 2179, "src": "20493:15:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2149, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20493:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "20475:34:3"}, "returnParameters": {"id": 2154, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2153, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 2179, "src": "20533:7:3", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2152, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20533:7:3", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "20532:9:3"}, "scope": 2180, "src": "20451:417:3", "stateMutability": "view", "virtual": false, "visibility": "external"}], "scope": 2181, "src": "1603:19267:3", "usedErrors": [742, 748, 756, 4940, 4943, 4946, 4949, 4956, 4963, 4968, 4973, 4980, 4985, 4992, 5001, 5010, 5019, 5028, 5035], "usedEvents": [780, 790, 796]}], "src": "32:20838:3"}}, "/home/andrey/valory/autonolas-governance/contracts/veOLAS.sol": {"AST": {"absolutePath": "contracts/veOLAS.sol", "exportedSymbols": {"IERC165": [5204], "IERC20": [5192], "IErrors": [5036], "IVotes": [5114], "LockedBalance": [2192], "PointVoting": [2203], "veOLAS": [4542]}, "id": 4543, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 2182, "literals": ["solidity", "^", "0.8", ".15"], "nodeType": "PragmaDirective", "src": "32:24:4"}, {"absolutePath": "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol", "file": "@openzeppelin/contracts/governance/utils/IVotes.sol", "id": 2183, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 4543, "sourceUnit": 5115, "src": "58:61:4", "symbolAliases": [], "unitAlias": ""}, {"absolutePath": "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol", "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol", "id": 2184, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 4543, "sourceUnit": 5193, "src": "120:56:4", "symbolAliases": [], "unitAlias": ""}, {"absolutePath": "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol", "file": "@openzeppelin/contracts/utils/introspection/IERC165.sol", "id": 2185, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 4543, "sourceUnit": 5205, "src": "177:65:4", "symbolAliases": [], "unitAlias": ""}, {"absolutePath": "contracts/interfaces/IErrors.sol", "file": "./interfaces/IErrors.sol", "id": 2186, "nameLocation": "-1:-1:-1", "nodeType": "ImportDirective", "scope": 4543, "sourceUnit": 5037, "src": "243:34:4", "symbolAliases": [], "unitAlias": ""}, {"canonicalName": "LockedBalance", "documentation": {"id": 2187, "nodeType": "StructuredDocumentation", "src": "1070:348:4", "text": "@title Voting Escrow OLAS - the workflow is ported from Curve Finance Vyper implementation\n @author Aleksandr Kuperman - \n Code ported from: https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy\n and: https://github.com/solidlyexchange/solidly/blob/master/contracts/ve.sol"}, "id": 2192, "members": [{"constant": false, "id": 2189, "mutability": "mutable", "name": "amount", "nameLocation": "3739:6:4", "nodeType": "VariableDeclaration", "scope": 2192, "src": "3731:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 2188, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "3731:7:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}, {"constant": false, "id": 2191, "mutability": "mutable", "name": "endTime", "nameLocation": "3814:7:4", "nodeType": "VariableDeclaration", "scope": 2192, "src": "3807:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2190, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "3807:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "name": "LockedBalance", "nameLocation": "3508:13:4", "nodeType": "StructDefinition", "scope": 4543, "src": "3501:323:4", "visibility": "public"}, {"canonicalName": "PointVoting", "id": 2203, "members": [{"constant": false, "id": 2194, "mutability": "mutable", "name": "bias", "nameLocation": "4007:4:4", "nodeType": "VariableDeclaration", "scope": 2203, "src": "4000:11:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2193, "name": "int128", "nodeType": "ElementaryTypeName", "src": "4000:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}, {"constant": false, "id": 2196, "mutability": "mutable", "name": "slope", "nameLocation": "4051:5:4", "nodeType": "VariableDeclaration", "scope": 2203, "src": "4044:12:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2195, "name": "int128", "nodeType": "ElementaryTypeName", "src": "4044:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}, {"constant": false, "id": 2198, "mutability": "mutable", "name": "ts", "nameLocation": "4137:2:4", "nodeType": "VariableDeclaration", "scope": 2203, "src": "4130:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2197, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "4130:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}, {"constant": false, "id": 2200, "mutability": "mutable", "name": "blockNumber", "nameLocation": "4214:11:4", "nodeType": "VariableDeclaration", "scope": 2203, "src": "4207:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2199, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "4207:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}, {"constant": false, "id": 2202, "mutability": "mutable", "name": "balance", "nameLocation": "4442:7:4", "nodeType": "VariableDeclaration", "scope": 2203, "src": "4434:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 2201, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "4434:7:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}], "name": "PointVoting", "nameLocation": "3954:11:4", "nodeType": "StructDefinition", "scope": 4543, "src": "3947:505:4", "visibility": "public"}, {"abstract": false, "baseContracts": [{"baseName": {"id": 2205, "name": "IErrors", "nameLocations": ["4576:7:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 5036, "src": "4576:7:4"}, "id": 2206, "nodeType": "InheritanceSpecifier", "src": "4576:7:4"}, {"baseName": {"id": 2207, "name": "IVotes", "nameLocations": ["4585:6:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 5114, "src": "4585:6:4"}, "id": 2208, "nodeType": "InheritanceSpecifier", "src": "4585:6:4"}, {"baseName": {"id": 2209, "name": "IERC20", "nameLocations": ["4593:6:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 5192, "src": "4593:6:4"}, "id": 2210, "nodeType": "InheritanceSpecifier", "src": "4593:6:4"}, {"baseName": {"id": 2211, "name": "IERC165", "nameLocations": ["4601:7:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 5204, "src": "4601:7:4"}, "id": 2212, "nodeType": "InheritanceSpecifier", "src": "4601:7:4"}], "canonicalName": "veOLAS", "contractDependencies": [], "contractKind": "contract", "documentation": {"id": 2204, "nodeType": "StructuredDocumentation", "src": "4454:103:4", "text": "@notice This token supports the ERC20 interface specifications except for transfers and approvals."}, "fullyImplemented": true, "id": 4542, "linearizedBaseContracts": [4542, 5204, 5192, 5114, 5036], "name": "veOLAS", "nameLocation": "4566:6:4", "nodeType": "ContractDefinition", "nodes": [{"canonicalName": "veOLAS.DepositType", "id": 2217, "members": [{"id": 2213, "name": "DEPOSIT_FOR_TYPE", "nameLocation": "4642:16:4", "nodeType": "EnumValue", "src": "4642:16:4"}, {"id": 2214, "name": "CREATE_LOCK_TYPE", "nameLocation": "4668:16:4", "nodeType": "EnumValue", "src": "4668:16:4"}, {"id": 2215, "name": "INCREASE_LOCK_AMOUNT", "nameLocation": "4694:20:4", "nodeType": "EnumValue", "src": "4694:20:4"}, {"id": 2216, "name": "INCREASE_UNLOCK_TIME", "nameLocation": "4724:20:4", "nodeType": "EnumValue", "src": "4724:20:4"}], "name": "DepositType", "nameLocation": "4620:11:4", "nodeType": "EnumDefinition", "src": "4615:135:4"}, {"anonymous": false, "eventSelector": "be9cf0e939c614fad640a623a53ba0a807c8cb503c4c4c8dacabe27b86ff2dd5", "id": 2230, "name": "Deposit", "nameLocation": "4762:7:4", "nodeType": "EventDefinition", "parameters": {"id": 2229, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2219, "indexed": true, "mutability": "mutable", "name": "account", "nameLocation": "4786:7:4", "nodeType": "VariableDeclaration", "scope": 2230, "src": "4770:23:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2218, "name": "address", "nodeType": "ElementaryTypeName", "src": "4770:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2221, "indexed": false, "mutability": "mutable", "name": "amount", "nameLocation": "4803:6:4", "nodeType": "VariableDeclaration", "scope": 2230, "src": "4795:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2220, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4795:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 2223, "indexed": false, "mutability": "mutable", "name": "locktime", "nameLocation": "4819:8:4", "nodeType": "VariableDeclaration", "scope": 2230, "src": "4811:16:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2222, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4811:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 2226, "indexed": false, "mutability": "mutable", "name": "depositType", "nameLocation": "4841:11:4", "nodeType": "VariableDeclaration", "scope": 2230, "src": "4829:23:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}, "typeName": {"id": 2225, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2224, "name": "DepositType", "nameLocations": ["4829:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2217, "src": "4829:11:4"}, "referencedDeclaration": 2217, "src": "4829:11:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}, "visibility": "internal"}, {"constant": false, "id": 2228, "indexed": false, "mutability": "mutable", "name": "ts", "nameLocation": "4862:2:4", "nodeType": "VariableDeclaration", "scope": 2230, "src": "4854:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2227, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4854:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4769:96:4"}, "src": "4756:110:4"}, {"anonymous": false, "eventSelector": "f279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568", "id": 2238, "name": "Withdraw", "nameLocation": "4877:8:4", "nodeType": "EventDefinition", "parameters": {"id": 2237, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2232, "indexed": true, "mutability": "mutable", "name": "account", "nameLocation": "4902:7:4", "nodeType": "VariableDeclaration", "scope": 2238, "src": "4886:23:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2231, "name": "address", "nodeType": "ElementaryTypeName", "src": "4886:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2234, "indexed": false, "mutability": "mutable", "name": "amount", "nameLocation": "4919:6:4", "nodeType": "VariableDeclaration", "scope": 2238, "src": "4911:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2233, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4911:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 2236, "indexed": false, "mutability": "mutable", "name": "ts", "nameLocation": "4935:2:4", "nodeType": "VariableDeclaration", "scope": 2238, "src": "4927:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2235, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4927:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4885:53:4"}, "src": "4871:68:4"}, {"anonymous": false, "eventSelector": "5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c", "id": 2244, "name": "Supply", "nameLocation": "4950:6:4", "nodeType": "EventDefinition", "parameters": {"id": 2243, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2240, "indexed": false, "mutability": "mutable", "name": "previousSupply", "nameLocation": "4965:14:4", "nodeType": "VariableDeclaration", "scope": 2244, "src": "4957:22:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2239, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4957:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 2242, "indexed": false, "mutability": "mutable", "name": "currentSupply", "nameLocation": "4989:13:4", "nodeType": "VariableDeclaration", "scope": 2244, "src": "4981:21:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2241, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "4981:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "4956:47:4"}, "src": "4944:60:4"}, {"constant": true, "id": 2247, "mutability": "constant", "name": "WEEK", "nameLocation": "5054:4:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5029:39:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2245, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "5029:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "value": {"hexValue": "31", "id": 2246, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5061:7:4", "subdenomination": "weeks", "typeDescriptions": {"typeIdentifier": "t_rational_604800_by_1", "typeString": "int_const 604800"}, "value": "1"}, "visibility": "internal"}, {"constant": true, "id": 2254, "mutability": "constant", "name": "MAXTIME", "nameLocation": "5135:7:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5109:51:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2248, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5109:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "value": {"commonType": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}, "id": 2253, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}, "id": 2251, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "34", "id": 2249, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5145:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_4_by_1", "typeString": "int_const 4"}, "value": "4"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "333635", "id": 2250, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5149:3:4", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "value": "365"}, "src": "5145:7:4", "typeDescriptions": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "3836343030", "id": 2252, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5155:5:4", "typeDescriptions": {"typeIdentifier": "t_rational_86400_by_1", "typeString": "int_const 86400"}, "value": "86400"}, "src": "5145:15:4", "typeDescriptions": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}}, "visibility": "internal"}, {"constant": true, "id": 2261, "mutability": "constant", "name": "IMAXTIME", "nameLocation": "5236:8:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5211:51:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2255, "name": "int128", "nodeType": "ElementaryTypeName", "src": "5211:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "value": {"commonType": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}, "id": 2260, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}, "id": 2258, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "leftExpression": {"hexValue": "34", "id": 2256, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5247:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_4_by_1", "typeString": "int_const 4"}, "value": "4"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "333635", "id": 2257, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5251:3:4", "typeDescriptions": {"typeIdentifier": "t_rational_365_by_1", "typeString": "int_const 365"}, "value": "365"}, "src": "5247:7:4", "typeDescriptions": {"typeIdentifier": "t_rational_1460_by_1", "typeString": "int_const 1460"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"hexValue": "3836343030", "id": 2259, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5257:5:4", "typeDescriptions": {"typeIdentifier": "t_rational_86400_by_1", "typeString": "int_const 86400"}, "value": "86400"}, "src": "5247:15:4", "typeDescriptions": {"typeIdentifier": "t_rational_126144000_by_1", "typeString": "int_const 126144000"}}, "visibility": "internal"}, {"constant": true, "functionSelector": "313ce567", "id": 2264, "mutability": "constant", "name": "decimals", "nameLocation": "5316:8:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5294:35:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 2262, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "5294:5:4", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "value": {"hexValue": "3138", "id": 2263, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5327:2:4", "typeDescriptions": {"typeIdentifier": "t_rational_18_by_1", "typeString": "int_const 18"}, "value": "18"}, "visibility": "public"}, {"constant": false, "functionSelector": "fc0c546a", "id": 2266, "mutability": "immutable", "name": "token", "nameLocation": "5382:5:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5357:30:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2265, "name": "address", "nodeType": "ElementaryTypeName", "src": "5357:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "public"}, {"constant": false, "functionSelector": "047fc9aa", "id": 2268, "mutability": "mutable", "name": "supply", "nameLocation": "5434:6:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5419:21:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2267, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5419:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "public"}, {"constant": false, "functionSelector": "18b21348", "id": 2273, "mutability": "mutable", "name": "mapLockedBalances", "nameLocation": "5538:17:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5497:58:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance)"}, "typeName": {"id": 2272, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 2269, "name": "address", "nodeType": "ElementaryTypeName", "src": "5505:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "5497:33:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 2271, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2270, "name": "LockedBalance", "nameLocations": ["5516:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "5516:13:4"}, "referencedDeclaration": 2192, "src": "5516:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "474177ec", "id": 2275, "mutability": "mutable", "name": "totalNumPoints", "nameLocation": "5644:14:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5629:29:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2274, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5629:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "public"}, {"constant": false, "functionSelector": "025fc7d8", "id": 2280, "mutability": "mutable", "name": "mapSupplyPoints", "nameLocation": "5739:15:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5700:54:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting)"}, "typeName": {"id": 2279, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 2276, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "5708:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Mapping", "src": "5700:31:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 2278, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2277, "name": "PointVoting", "nameLocations": ["5719:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "5719:11:4"}, "referencedDeclaration": 2203, "src": "5719:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "70ab0a84", "id": 2286, "mutability": "mutable", "name": "mapUserPoints", "nameLocation": "5860:13:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5819:54:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting[])"}, "typeName": {"id": 2285, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 2281, "name": "address", "nodeType": "ElementaryTypeName", "src": "5827:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "5819:33:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting[])"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"baseType": {"id": 2283, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2282, "name": "PointVoting", "nameLocations": ["5838:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "5838:11:4"}, "referencedDeclaration": 2203, "src": "5838:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "id": 2284, "nodeType": "ArrayTypeName", "src": "5838:13:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_ptr", "typeString": "struct PointVoting[]"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "78888dbf", "id": 2290, "mutability": "mutable", "name": "mapSlopeChanges", "nameLocation": "5958:15:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "5925:48:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}, "typeName": {"id": 2289, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 2287, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "5933:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Mapping", "src": "5925:25:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 2288, "name": "int128", "nodeType": "ElementaryTypeName", "src": "5943:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "06fdde03", "id": 2292, "mutability": "mutable", "name": "name", "nameLocation": "6019:4:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "6005:18:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string"}, "typeName": {"id": 2291, "name": "string", "nodeType": "ElementaryTypeName", "src": "6005:6:4", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "public"}, {"constant": false, "functionSelector": "95d89b41", "id": 2294, "mutability": "mutable", "name": "symbol", "nameLocation": "6070:6:4", "nodeType": "VariableDeclaration", "scope": 4542, "src": "6056:20:4", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string"}, "typeName": {"id": 2293, "name": "string", "nodeType": "ElementaryTypeName", "src": "6056:6:4", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "public"}, {"body": {"id": 2336, "nodeType": "Block", "src": "6300:330:4", "statements": [{"expression": {"id": 2306, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2304, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2266, "src": "6310:5:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2305, "name": "_token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2297, "src": "6318:6:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "6310:14:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "id": 2307, "nodeType": "ExpressionStatement", "src": "6310:14:4"}, {"expression": {"id": 2310, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2308, "name": "name", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2292, "src": "6334:4:4", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2309, "name": "_name", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2299, "src": "6341:5:4", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string memory"}}, "src": "6334:12:4", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "id": 2311, "nodeType": "ExpressionStatement", "src": "6334:12:4"}, {"expression": {"id": 2314, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2312, "name": "symbol", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2294, "src": "6356:6:4", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2313, "name": "_symbol", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2301, "src": "6365:7:4", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string memory"}}, "src": "6356:16:4", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "id": 2315, "nodeType": "ExpressionStatement", "src": "6356:16:4"}, {"expression": {"id": 2334, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2316, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "6535:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 2318, "indexExpression": {"hexValue": "30", "id": 2317, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6551:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "6535:18:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"hexValue": "30", "id": 2320, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6568:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 2321, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6571:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"arguments": [{"expression": {"id": 2324, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "6581:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2325, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "6587:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "6581:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2323, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "6574:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2322, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "6574:6:4", "typeDescriptions": {}}}, "id": 2326, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6574:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"arguments": [{"expression": {"id": 2329, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "6606:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2330, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "6612:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "6606:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2328, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "6599:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2327, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "6599:6:4", "typeDescriptions": {}}}, "id": 2331, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6599:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"hexValue": "30", "id": 2332, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6621:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2319, "name": "PointVoting", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2203, "src": "6556:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_PointVoting_$2203_storage_ptr_$", "typeString": "type(struct PointVoting storage pointer)"}}, "id": 2333, "isConstant": false, "isLValue": false, "isPure": false, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6556:67:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "src": "6535:88:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "id": 2335, "nodeType": "ExpressionStatement", "src": "6535:88:4"}]}, "documentation": {"id": 2295, "nodeType": "StructuredDocumentation", "src": "6083:136:4", "text": "@dev Contract constructor\n @param _token Token address.\n @param _name Token name.\n @param _symbol Token symbol."}, "id": 2337, "implemented": true, "kind": "constructor", "modifiers": [], "name": "", "nameLocation": "-1:-1:-1", "nodeType": "FunctionDefinition", "parameters": {"id": 2302, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2297, "mutability": "mutable", "name": "_token", "nameLocation": "6244:6:4", "nodeType": "VariableDeclaration", "scope": 2337, "src": "6236:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2296, "name": "address", "nodeType": "ElementaryTypeName", "src": "6236:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2299, "mutability": "mutable", "name": "_name", "nameLocation": "6266:5:4", "nodeType": "VariableDeclaration", "scope": 2337, "src": "6252:19:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string"}, "typeName": {"id": 2298, "name": "string", "nodeType": "ElementaryTypeName", "src": "6252:6:4", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "internal"}, {"constant": false, "id": 2301, "mutability": "mutable", "name": "_symbol", "nameLocation": "6287:7:4", "nodeType": "VariableDeclaration", "scope": 2337, "src": "6273:21:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string"}, "typeName": {"id": 2300, "name": "string", "nodeType": "ElementaryTypeName", "src": "6273:6:4", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "internal"}], "src": "6235:60:4"}, "returnParameters": {"id": 2303, "nodeType": "ParameterList", "parameters": [], "src": "6300:0:4"}, "scope": 4542, "src": "6224:406:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "public"}, {"body": {"id": 2368, "nodeType": "Block", "src": "6872:179:4", "statements": [{"assignments": [2347], "declarations": [{"constant": false, "id": 2347, "mutability": "mutable", "name": "lastPointNumber", "nameLocation": "6890:15:4", "nodeType": "VariableDeclaration", "scope": 2368, "src": "6882:23:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2346, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6882:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2352, "initialValue": {"expression": {"baseExpression": {"id": 2348, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "6908:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 2350, "indexExpression": {"id": 2349, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2340, "src": "6922:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6908:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 2351, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "6931:6:4", "memberName": "length", "nodeType": "MemberAccess", "src": "6908:29:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "6882:55:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2355, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2353, "name": "lastPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2347, "src": "6951:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 2354, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6969:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "6951:19:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2367, "nodeType": "IfStatement", "src": "6947:98:4", "trueBody": {"id": 2366, "nodeType": "Block", "src": "6972:73:4", "statements": [{"expression": {"id": 2364, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2356, "name": "pv", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2344, "src": "6986:2:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"baseExpression": {"id": 2357, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "6991:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 2359, "indexExpression": {"id": 2358, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2340, "src": "7005:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6991:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 2363, "indexExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2362, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2360, "name": "lastPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2347, "src": "7014:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "31", "id": 2361, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "7032:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "7014:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "6991:43:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "6986:48:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2365, "nodeType": "ExpressionStatement", "src": "6986:48:4"}]}}]}, "documentation": {"id": 2338, "nodeType": "StructuredDocumentation", "src": "6636:142:4", "text": "@dev Gets the most recently recorded user point for `account`.\n @param account Account address.\n @return pv Last checkpoint."}, "functionSelector": "c4698ee5", "id": 2369, "implemented": true, "kind": "function", "modifiers": [], "name": "getLastUserPoint", "nameLocation": "6792:16:4", "nodeType": "FunctionDefinition", "parameters": {"id": 2341, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2340, "mutability": "mutable", "name": "account", "nameLocation": "6817:7:4", "nodeType": "VariableDeclaration", "scope": 2369, "src": "6809:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2339, "name": "address", "nodeType": "ElementaryTypeName", "src": "6809:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "6808:17:4"}, "returnParameters": {"id": 2345, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2344, "mutability": "mutable", "name": "pv", "nameLocation": "6868:2:4", "nodeType": "VariableDeclaration", "scope": 2369, "src": "6849:21:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2343, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2342, "name": "PointVoting", "nameLocations": ["6849:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "6849:11:4"}, "referencedDeclaration": 2203, "src": "6849:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "src": "6848:23:4"}, "scope": 4542, "src": "6783:268:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2384, "nodeType": "Block", "src": "7290:65:4", "statements": [{"expression": {"id": 2382, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2377, "name": "accountNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2375, "src": "7300:16:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"baseExpression": {"id": 2378, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "7319:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 2380, "indexExpression": {"id": 2379, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2372, "src": "7333:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "7319:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 2381, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "7342:6:4", "memberName": "length", "nodeType": "MemberAccess", "src": "7319:29:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "7300:48:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2383, "nodeType": "ExpressionStatement", "src": "7300:48:4"}]}, "documentation": {"id": 2370, "nodeType": "StructuredDocumentation", "src": "7057:136:4", "text": "@dev Gets the number of user points.\n @param account Account address.\n @return accountNumPoints Number of user points."}, "functionSelector": "53acfabd", "id": 2385, "implemented": true, "kind": "function", "modifiers": [], "name": "getNumUserPoints", "nameLocation": "7207:16:4", "nodeType": "FunctionDefinition", "parameters": {"id": 2373, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2372, "mutability": "mutable", "name": "account", "nameLocation": "7232:7:4", "nodeType": "VariableDeclaration", "scope": 2385, "src": "7224:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2371, "name": "address", "nodeType": "ElementaryTypeName", "src": "7224:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "7223:17:4"}, "returnParameters": {"id": 2376, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2375, "mutability": "mutable", "name": "accountNumPoints", "nameLocation": "7272:16:4", "nodeType": "VariableDeclaration", "scope": 2385, "src": "7264:24:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2374, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "7264:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "7263:26:4"}, "scope": 4542, "src": "7198:157:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2402, "nodeType": "Block", "src": "7746:51:4", "statements": [{"expression": {"baseExpression": {"baseExpression": {"id": 2396, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "7763:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 2398, "indexExpression": {"id": 2397, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2388, "src": "7777:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "7763:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 2400, "indexExpression": {"id": 2399, "name": "idx", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2390, "src": "7786:3:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "7763:27:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "functionReturnParameters": 2395, "id": 2401, "nodeType": "Return", "src": "7756:34:4"}]}, "documentation": {"id": 2386, "nodeType": "StructuredDocumentation", "src": "7361:285:4", "text": "@dev Gets the checkpoint structure at number `idx` for `account`.\n @notice The out of bound condition is treated by the default code generation check.\n @param account User wallet address.\n @param idx User point number.\n @return The requested checkpoint."}, "functionSelector": "b0a34fdd", "id": 2403, "implemented": true, "kind": "function", "modifiers": [], "name": "getUserPoint", "nameLocation": "7660:12:4", "nodeType": "FunctionDefinition", "parameters": {"id": 2391, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2388, "mutability": "mutable", "name": "account", "nameLocation": "7681:7:4", "nodeType": "VariableDeclaration", "scope": 2403, "src": "7673:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2387, "name": "address", "nodeType": "ElementaryTypeName", "src": "7673:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2390, "mutability": "mutable", "name": "idx", "nameLocation": "7698:3:4", "nodeType": "VariableDeclaration", "scope": 2403, "src": "7690:11:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2389, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "7690:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "7672:30:4"}, "returnParameters": {"id": 2395, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2394, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 2403, "src": "7726:18:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2393, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2392, "name": "PointVoting", "nameLocations": ["7726:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "7726:11:4"}, "referencedDeclaration": 2203, "src": "7726:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "src": "7725:20:4"}, "scope": 4542, "src": "7651:146:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 2979, "nodeType": "Block", "src": "8368:6697:4", "statements": [{"assignments": [2419], "declarations": [{"constant": false, "id": 2419, "mutability": "mutable", "name": "uOld", "nameLocation": "8397:4:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "8378:23:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2418, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2417, "name": "PointVoting", "nameLocations": ["8378:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "8378:11:4"}, "referencedDeclaration": 2203, "src": "8378:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 2420, "nodeType": "VariableDeclarationStatement", "src": "8378:23:4"}, {"assignments": [2423], "declarations": [{"constant": false, "id": 2423, "mutability": "mutable", "name": "uNew", "nameLocation": "8430:4:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "8411:23:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2422, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2421, "name": "PointVoting", "nameLocations": ["8411:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "8411:11:4"}, "referencedDeclaration": 2203, "src": "8411:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 2424, "nodeType": "VariableDeclarationStatement", "src": "8411:23:4"}, {"assignments": [2426], "declarations": [{"constant": false, "id": 2426, "mutability": "mutable", "name": "oldDSlope", "nameLocation": "8451:9:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "8444:16:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2425, "name": "int128", "nodeType": "ElementaryTypeName", "src": "8444:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}], "id": 2427, "nodeType": "VariableDeclarationStatement", "src": "8444:16:4"}, {"assignments": [2429], "declarations": [{"constant": false, "id": 2429, "mutability": "mutable", "name": "newDSlope", "nameLocation": "8477:9:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "8470:16:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2428, "name": "int128", "nodeType": "ElementaryTypeName", "src": "8470:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}], "id": 2430, "nodeType": "VariableDeclarationStatement", "src": "8470:16:4"}, {"assignments": [2432], "declarations": [{"constant": false, "id": 2432, "mutability": "mutable", "name": "curNumPoint", "nameLocation": "8504:11:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "8496:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2431, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "8496:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2434, "initialValue": {"id": 2433, "name": "totalNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2275, "src": "8518:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "8496:36:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 2440, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2435, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2406, "src": "8547:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"arguments": [{"hexValue": "30", "id": 2438, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "8566:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2437, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "8558:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2436, "name": "address", "nodeType": "ElementaryTypeName", "src": "8558:7:4", "typeDescriptions": {}}}, "id": 2439, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8558:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "8547:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2566, "nodeType": "IfStatement", "src": "8543:1215:4", "trueBody": {"id": 2565, "nodeType": "Block", "src": "8570:1188:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 2450, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2445, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2441, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "8677:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2442, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8687:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "8677:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2443, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "8697:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2444, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "8703:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "8697:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "8677:35:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "&&", "rightExpression": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 2449, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2446, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "8716:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2447, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8726:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "8716:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 2448, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "8735:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "8716:20:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "8677:59:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2486, "nodeType": "IfStatement", "src": "8673:249:4", "trueBody": {"id": 2485, "nodeType": "Block", "src": "8738:184:4", "statements": [{"expression": {"id": 2461, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2451, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "8756:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2453, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "8761:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "8756:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2460, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"expression": {"id": 2456, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "8776:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2457, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8786:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "8776:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 2455, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "8769:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 2454, "name": "int128", "nodeType": "ElementaryTypeName", "src": "8769:6:4", "typeDescriptions": {}}}, "id": 2458, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8769:24:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 2459, "name": "IMAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2261, "src": "8796:8:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "8769:35:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "8756:48:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2462, "nodeType": "ExpressionStatement", "src": "8756:48:4"}, {"expression": {"id": 2483, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2463, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "8822:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2465, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "8827:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "8822:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2482, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2466, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "8834:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2467, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8839:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "8834:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"arguments": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2479, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2472, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "8862:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2473, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8872:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "8862:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"arguments": [{"expression": {"id": 2476, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "8889:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2477, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "8895:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "8889:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2475, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "8882:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2474, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "8882:6:4", "typeDescriptions": {}}}, "id": 2478, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8882:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "8862:43:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 2471, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "8854:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 2470, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "8854:7:4", "typeDescriptions": {}}}, "id": 2480, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8854:52:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 2469, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "8847:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 2468, "name": "int128", "nodeType": "ElementaryTypeName", "src": "8847:6:4", "typeDescriptions": {}}}, "id": 2481, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "8847:60:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "8834:73:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "8822:85:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2484, "nodeType": "ExpressionStatement", "src": "8822:85:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 2496, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2491, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2487, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "8939:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2488, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8949:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "8939:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2489, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "8959:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2490, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "8965:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "8959:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "8939:35:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "&&", "rightExpression": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 2495, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2492, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "8978:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2493, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "8988:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "8978:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 2494, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "8997:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "8978:20:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "8939:59:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2532, "nodeType": "IfStatement", "src": "8935:249:4", "trueBody": {"id": 2531, "nodeType": "Block", "src": "9000:184:4", "statements": [{"expression": {"id": 2507, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2497, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "9018:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2499, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "9023:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "9018:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2506, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"expression": {"id": 2502, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "9038:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2503, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9048:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "9038:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 2501, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9031:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 2500, "name": "int128", "nodeType": "ElementaryTypeName", "src": "9031:6:4", "typeDescriptions": {}}}, "id": 2504, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9031:24:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 2505, "name": "IMAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2261, "src": "9058:8:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9031:35:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9018:48:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2508, "nodeType": "ExpressionStatement", "src": "9018:48:4"}, {"expression": {"id": 2529, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2509, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "9084:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2511, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "9089:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "9084:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2528, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2512, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "9096:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2513, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9101:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "9096:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"arguments": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2525, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2518, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "9124:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2519, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9134:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9124:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"arguments": [{"expression": {"id": 2522, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "9151:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2523, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "9157:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "9151:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2521, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9144:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2520, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "9144:6:4", "typeDescriptions": {}}}, "id": 2524, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9144:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "9124:43:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 2517, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9116:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 2516, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "9116:7:4", "typeDescriptions": {}}}, "id": 2526, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9116:52:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 2515, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "9109:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 2514, "name": "int128", "nodeType": "ElementaryTypeName", "src": "9109:6:4", "typeDescriptions": {}}}, "id": 2527, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "9109:60:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9096:73:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9084:85:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2530, "nodeType": "ExpressionStatement", "src": "9084:85:4"}]}}, {"expression": {"id": 2538, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2533, "name": "oldDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2426, "src": "9430:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 2534, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "9442:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 2537, "indexExpression": {"expression": {"id": 2535, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "9458:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2536, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9468:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9458:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9442:34:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9430:46:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2539, "nodeType": "ExpressionStatement", "src": "9430:46:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2543, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2540, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "9494:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2541, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9504:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9494:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 2542, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "9514:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "9494:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2564, "nodeType": "IfStatement", "src": "9490:258:4", "trueBody": {"id": 2563, "nodeType": "Block", "src": "9517:231:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2548, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2544, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "9539:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2545, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9549:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9539:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"id": 2546, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "9560:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2547, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9570:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9560:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "9539:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 2561, "nodeType": "Block", "src": "9647:87:4", "statements": [{"expression": {"id": 2559, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2554, "name": "newDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2429, "src": "9669:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 2555, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "9681:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 2558, "indexExpression": {"expression": {"id": 2556, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "9697:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2557, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "9707:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "9697:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9681:34:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9669:46:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2560, "nodeType": "ExpressionStatement", "src": "9669:46:4"}]}, "id": 2562, "nodeType": "IfStatement", "src": "9535:199:4", "trueBody": {"id": 2553, "nodeType": "Block", "src": "9579:62:4", "statements": [{"expression": {"id": 2551, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2549, "name": "newDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2429, "src": "9601:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2550, "name": "oldDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2426, "src": "9613:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "9601:21:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2552, "nodeType": "ExpressionStatement", "src": "9601:21:4"}]}}]}}]}}, {"assignments": [2569], "declarations": [{"constant": false, "id": 2569, "mutability": "mutable", "name": "lastPoint", "nameLocation": "9787:9:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "9768:28:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2568, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2567, "name": "PointVoting", "nameLocations": ["9768:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "9768:11:4"}, "referencedDeclaration": 2203, "src": "9768:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 2570, "nodeType": "VariableDeclarationStatement", "src": "9768:28:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2573, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2571, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "9810:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 2572, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "9824:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "9810:15:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 2599, "nodeType": "Block", "src": "9898:192:4", "statements": [{"expression": {"id": 2597, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2581, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10000:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"hexValue": "30", "id": 2583, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "10024:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 2584, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "10027:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"arguments": [{"expression": {"id": 2587, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "10037:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2588, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "10043:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "10037:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2586, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "10030:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2585, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "10030:6:4", "typeDescriptions": {}}}, "id": 2589, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10030:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"arguments": [{"expression": {"id": 2592, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "10062:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2593, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "10068:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "10062:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2591, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "10055:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2590, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "10055:6:4", "typeDescriptions": {}}}, "id": 2594, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10055:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"hexValue": "30", "id": 2595, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "10077:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2582, "name": "PointVoting", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2203, "src": "10012:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_PointVoting_$2203_storage_ptr_$", "typeString": "type(struct PointVoting storage pointer)"}}, "id": 2596, "isConstant": false, "isLValue": false, "isPure": false, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10012:67:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "src": "10000:79:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2598, "nodeType": "ExpressionStatement", "src": "10000:79:4"}]}, "id": 2600, "nodeType": "IfStatement", "src": "9806:284:4", "trueBody": {"id": 2580, "nodeType": "Block", "src": "9827:65:4", "statements": [{"expression": {"id": 2578, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2574, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "9841:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 2575, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "9853:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 2577, "indexExpression": {"id": 2576, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "9869:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "9853:28:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "9841:40:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2579, "nodeType": "ExpressionStatement", "src": "9841:40:4"}]}}, {"assignments": [2602], "declarations": [{"constant": false, "id": 2602, "mutability": "mutable", "name": "lastCheckpoint", "nameLocation": "10106:14:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "10099:21:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2601, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "10099:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "id": 2605, "initialValue": {"expression": {"id": 2603, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10123:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2604, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "10133:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "10123:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "VariableDeclarationStatement", "src": "10099:36:4"}, {"assignments": [2608], "declarations": [{"constant": false, "id": 2608, "mutability": "mutable", "name": "initialPoint", "nameLocation": "10342:12:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "10323:31:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 2607, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2606, "name": "PointVoting", "nameLocations": ["10323:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "10323:11:4"}, "referencedDeclaration": 2203, "src": "10323:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 2610, "initialValue": {"id": 2609, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10357:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "VariableDeclarationStatement", "src": "10323:43:4"}, {"assignments": [2612], "declarations": [{"constant": false, "id": 2612, "mutability": "mutable", "name": "block_slope", "nameLocation": "10384:11:4", "nodeType": "VariableDeclaration", "scope": 2979, "src": "10376:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2611, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10376:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2613, "nodeType": "VariableDeclarationStatement", "src": "10376:19:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2618, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2614, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "10422:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2615, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "10428:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "10422:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2616, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10440:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2617, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "10450:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "10440:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "10422:30:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2643, "nodeType": "IfStatement", "src": "10418:364:4", "trueBody": {"id": 2642, "nodeType": "Block", "src": "10454:328:4", "statements": [{"expression": {"id": 2640, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2619, "name": "block_slope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2612, "src": "10661:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2639, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2629, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"hexValue": "31653138", "id": 2620, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "10676:4:4", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000_by_1", "typeString": "int_const 1000000000000000000"}, "value": "1e18"}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2627, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2623, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "10691:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2624, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "10697:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "10691:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 2625, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10706:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2626, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "10716:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "10706:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "10691:36:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2622, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "10683:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2621, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10683:7:4", "typeDescriptions": {}}}, "id": 2628, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10683:45:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "10676:52:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 2630, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "10675:54:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2637, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2633, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "10740:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2634, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "10746:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "10740:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 2635, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "10758:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2636, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "10768:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "10758:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "10740:30:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2632, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "10732:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2631, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "10732:7:4", "typeDescriptions": {}}}, "id": 2638, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "10732:39:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "10675:96:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "10661:110:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2641, "nodeType": "ExpressionStatement", "src": "10661:110:4"}]}}, {"id": 2816, "nodeType": "Block", "src": "10999:2205:4", "statements": [{"assignments": [2645], "declarations": [{"constant": false, "id": 2645, "mutability": "mutable", "name": "tStep", "nameLocation": "11083:5:4", "nodeType": "VariableDeclaration", "scope": 2816, "src": "11076:12:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 2644, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "11076:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "id": 2652, "initialValue": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2651, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2648, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2646, "name": "lastCheckpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2602, "src": "11092:14:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 2647, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "11109:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "11092:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "id": 2649, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "11091:23:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 2650, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "11117:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "11091:30:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "VariableDeclarationStatement", "src": "11076:45:4"}, {"body": {"id": 2814, "nodeType": "Block", "src": "11169:2025:4", "statements": [{"id": 2667, "nodeType": "UncheckedBlock", "src": "11417:64:4", "statements": [{"expression": {"id": 2665, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2663, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "11449:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 2664, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "11458:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "11449:13:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2666, "nodeType": "ExpressionStatement", "src": "11449:13:4"}]}, {"assignments": [2669], "declarations": [{"constant": false, "id": 2669, "mutability": "mutable", "name": "dSlope", "nameLocation": "11505:6:4", "nodeType": "VariableDeclaration", "scope": 2814, "src": "11498:13:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 2668, "name": "int128", "nodeType": "ElementaryTypeName", "src": "11498:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}], "id": 2670, "nodeType": "VariableDeclarationStatement", "src": "11498:13:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2674, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2671, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "11533:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2672, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "11541:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2673, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "11547:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "11541:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "11533:23:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 2690, "nodeType": "Block", "src": "11636:72:4", "statements": [{"expression": {"id": 2688, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2684, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2669, "src": "11658:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 2685, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "11667:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 2687, "indexExpression": {"id": 2686, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "11683:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "11667:22:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "11658:31:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2689, "nodeType": "ExpressionStatement", "src": "11658:31:4"}]}, "id": 2691, "nodeType": "IfStatement", "src": "11529:179:4", "trueBody": {"id": 2683, "nodeType": "Block", "src": "11558:72:4", "statements": [{"expression": {"id": 2681, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2675, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "11580:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 2678, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "11595:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2679, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "11601:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "11595:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2677, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11588:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2676, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "11588:6:4", "typeDescriptions": {}}}, "id": 2680, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11588:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "11580:31:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2682, "nodeType": "ExpressionStatement", "src": "11580:31:4"}]}}, {"expression": {"id": 2707, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2692, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "11725:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2694, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "11735:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "11725:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2706, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2695, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "11743:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2696, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "11753:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "11743:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"arguments": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2703, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2701, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "11774:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 2702, "name": "lastCheckpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2602, "src": "11782:14:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "11774:22:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 2700, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11768:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 2699, "name": "int64", "nodeType": "ElementaryTypeName", "src": "11768:5:4", "typeDescriptions": {}}}, "id": 2704, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11768:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int64", "typeString": "int64"}], "id": 2698, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "11761:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 2697, "name": "int128", "nodeType": "ElementaryTypeName", "src": "11761:6:4", "typeDescriptions": {}}}, "id": 2705, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "11761:37:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "11743:55:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "11725:73:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2708, "nodeType": "ExpressionStatement", "src": "11725:73:4"}, {"expression": {"id": 2713, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2709, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "11816:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2711, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "11826:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "11816:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 2712, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2669, "src": "11835:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "11816:25:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2714, "nodeType": "ExpressionStatement", "src": "11816:25:4"}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2718, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2715, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "11863:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2716, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "11873:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "11863:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "30", "id": 2717, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "11880:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "11863:18:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2726, "nodeType": "IfStatement", "src": "11859:190:4", "trueBody": {"id": 2725, "nodeType": "Block", "src": "11883:166:4", "statements": [{"expression": {"id": 2723, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2719, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12012:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2721, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12022:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "12012:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 2722, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "12029:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "12012:18:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2724, "nodeType": "ExpressionStatement", "src": "12012:18:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2730, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2727, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12070:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2728, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12080:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "12070:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "30", "id": 2729, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "12088:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "12070:19:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2738, "nodeType": "IfStatement", "src": "12066:175:4", "trueBody": {"id": 2737, "nodeType": "Block", "src": "12091:150:4", "statements": [{"expression": {"id": 2735, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2731, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12203:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2733, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12213:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "12203:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 2734, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "12221:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "12203:19:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2736, "nodeType": "ExpressionStatement", "src": "12203:19:4"}]}}, {"expression": {"id": 2741, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2739, "name": "lastCheckpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2602, "src": "12258:14:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2740, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "12275:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12258:22:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2742, "nodeType": "ExpressionStatement", "src": "12258:22:4"}, {"expression": {"id": 2747, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2743, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12298:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2745, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12308:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "12298:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2746, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "12313:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12298:20:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2748, "nodeType": "ExpressionStatement", "src": "12298:20:4"}, {"expression": {"id": 2770, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2749, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12411:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2751, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12421:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "12411:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2769, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2752, "name": "initialPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2608, "src": "12435:12:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2753, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12448:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "12435:24:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2767, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2764, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2756, "name": "block_slope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2612, "src": "12470:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2762, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2759, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "12492:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 2760, "name": "initialPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2608, "src": "12500:12:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2761, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12513:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "12500:15:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12492:23:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 2758, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "12484:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 2757, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "12484:7:4", "typeDescriptions": {}}}, "id": 2763, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12484:32:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12470:46:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 2765, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "12469:48:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"hexValue": "31653138", "id": 2766, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "12520:4:4", "typeDescriptions": {"typeIdentifier": "t_rational_1000000000000000000_by_1", "typeString": "int_const 1000000000000000000"}, "value": "1e18"}, "src": "12469:55:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2755, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "12462:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2754, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "12462:6:4", "typeDescriptions": {}}}, "id": 2768, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12462:63:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12435:90:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12411:114:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2771, "nodeType": "ExpressionStatement", "src": "12411:114:4"}, {"expression": {"id": 2777, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2772, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12543:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2774, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12553:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "12543:17:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 2775, "name": "initialPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2608, "src": "12563:12:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2776, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "12576:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "12563:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "src": "12543:40:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "id": 2778, "nodeType": "ExpressionStatement", "src": "12543:40:4"}, {"id": 2783, "nodeType": "UncheckedBlock", "src": "12812:71:4", "statements": [{"expression": {"id": 2781, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2779, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "12844:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"hexValue": "31", "id": 2780, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "12859:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "12844:16:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2782, "nodeType": "ExpressionStatement", "src": "12844:16:4"}]}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2787, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2784, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2645, "src": "12904:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"id": 2785, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "12913:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2786, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12919:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "12913:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "12904:24:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 2812, "nodeType": "Block", "src": "13099:81:4", "statements": [{"expression": {"id": 2810, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2806, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "13121:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 2808, "indexExpression": {"id": 2807, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "13137:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "13121:28:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2809, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13152:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "src": "13121:40:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "id": 2811, "nodeType": "ExpressionStatement", "src": "13121:40:4"}]}, "id": 2813, "nodeType": "IfStatement", "src": "12900:280:4", "trueBody": {"id": 2805, "nodeType": "Block", "src": "12930:163:4", "statements": [{"expression": {"id": 2796, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2788, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "12952:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2790, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "12962:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "12952:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 2793, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "12983:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2794, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "12989:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "12983:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2792, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "12976:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2791, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "12976:6:4", "typeDescriptions": {}}}, "id": 2795, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "12976:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "12952:44:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2797, "nodeType": "ExpressionStatement", "src": "12952:44:4"}, {"expression": {"id": 2802, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2798, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13018:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2800, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13028:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "13018:17:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2801, "name": "curSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2414, "src": "13038:9:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "src": "13018:29:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "id": 2803, "nodeType": "ExpressionStatement", "src": "13018:29:4"}, {"id": 2804, "nodeType": "Break", "src": "13069:5:4"}]}}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2659, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2657, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2654, "src": "11155:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "323535", "id": 2658, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "11159:3:4", "typeDescriptions": {"typeIdentifier": "t_rational_255_by_1", "typeString": "int_const 255"}, "value": "255"}, "src": "11155:7:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2815, "initializationExpression": {"assignments": [2654], "declarations": [{"constant": false, "id": 2654, "mutability": "mutable", "name": "i", "nameLocation": "11148:1:4", "nodeType": "VariableDeclaration", "scope": 2815, "src": "11140:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 2653, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "11140:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 2656, "initialValue": {"hexValue": "30", "id": 2655, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "11152:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "11140:13:4"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 2661, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "11164:3:4", "subExpression": {"id": 2660, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2654, "src": "11166:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2662, "nodeType": "ExpressionStatement", "src": "11164:3:4"}, "nodeType": "ForStatement", "src": "11135:2059:4"}]}, {"expression": {"id": 2819, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2817, "name": "totalNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2275, "src": "13214:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2818, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "13231:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "13214:28:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 2820, "nodeType": "ExpressionStatement", "src": "13214:28:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 2826, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2821, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2406, "src": "13317:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"arguments": [{"hexValue": "30", "id": 2824, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13336:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2823, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "13328:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2822, "name": "address", "nodeType": "ElementaryTypeName", "src": "13328:7:4", "typeDescriptions": {}}}, "id": 2825, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13328:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "13317:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2874, "nodeType": "IfStatement", "src": "13313:452:4", "trueBody": {"id": 2873, "nodeType": "Block", "src": "13340:425:4", "statements": [{"expression": {"id": 2836, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2827, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13477:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2829, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13487:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "13477:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"components": [{"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2834, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2830, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "13497:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2831, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13502:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "13497:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 2832, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "13510:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2833, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13515:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "13510:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "13497:23:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "id": 2835, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "13496:25:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "13477:44:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2837, "nodeType": "ExpressionStatement", "src": "13477:44:4"}, {"expression": {"id": 2847, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2838, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13535:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2840, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13545:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "13535:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"components": [{"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2845, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2841, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "13554:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2842, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13559:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "13554:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 2843, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "13566:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2844, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13571:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "13566:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "13554:21:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "id": 2846, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "13553:23:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "13535:41:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2848, "nodeType": "ExpressionStatement", "src": "13535:41:4"}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2852, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2849, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13594:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2850, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13604:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "13594:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "30", "id": 2851, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13612:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "13594:19:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2860, "nodeType": "IfStatement", "src": "13590:77:4", "trueBody": {"id": 2859, "nodeType": "Block", "src": "13615:52:4", "statements": [{"expression": {"id": 2857, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2853, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13633:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2855, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13643:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "13633:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 2856, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13651:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "13633:19:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2858, "nodeType": "ExpressionStatement", "src": "13633:19:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 2864, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2861, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13684:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2862, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "13694:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "13684:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "30", "id": 2863, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13701:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "13684:18:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2872, "nodeType": "IfStatement", "src": "13680:75:4", "trueBody": {"id": 2871, "nodeType": "Block", "src": "13704:51:4", "statements": [{"expression": {"id": 2869, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2865, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13722:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2867, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "13732:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "13722:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"hexValue": "30", "id": 2868, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13739:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "13722:18:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2870, "nodeType": "ExpressionStatement", "src": "13722:18:4"}]}}]}}, {"expression": {"id": 2879, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2875, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "13816:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 2877, "indexExpression": {"id": 2876, "name": "curNumPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2432, "src": "13832:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "13816:28:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2878, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2569, "src": "13847:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "src": "13816:40:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "id": 2880, "nodeType": "ExpressionStatement", "src": "13816:40:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 2886, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 2881, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2406, "src": "13871:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"arguments": [{"hexValue": "30", "id": 2884, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "13890:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2883, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "13882:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2882, "name": "address", "nodeType": "ElementaryTypeName", "src": "13882:7:4", "typeDescriptions": {}}}, "id": 2885, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "13882:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "13871:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2978, "nodeType": "IfStatement", "src": "13867:1192:4", "trueBody": {"id": 2977, "nodeType": "Block", "src": "13894:1165:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2891, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2887, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "14104:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2888, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14114:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14104:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2889, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14124:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2890, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14130:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "14124:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14104:35:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2917, "nodeType": "IfStatement", "src": "14100:402:4", "trueBody": {"id": 2916, "nodeType": "Block", "src": "14141:361:4", "statements": [{"expression": {"id": 2895, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2892, "name": "oldDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2426, "src": "14236:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"expression": {"id": 2893, "name": "uOld", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2419, "src": "14249:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2894, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14254:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "14249:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "14236:23:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2896, "nodeType": "ExpressionStatement", "src": "14236:23:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2901, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2897, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "14281:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2898, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14291:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14281:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"id": 2899, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "14302:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2900, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14312:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14302:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "14281:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2908, "nodeType": "IfStatement", "src": "14277:147:4", "trueBody": {"id": 2907, "nodeType": "Block", "src": "14321:103:4", "statements": [{"expression": {"id": 2905, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2902, "name": "oldDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2426, "src": "14343:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"expression": {"id": 2903, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "14356:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2904, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14361:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "14356:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "14343:23:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2906, "nodeType": "ExpressionStatement", "src": "14343:23:4"}]}}, {"expression": {"id": 2914, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2909, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "14441:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 2912, "indexExpression": {"expression": {"id": 2910, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "14457:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2911, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14467:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14457:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14441:34:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2913, "name": "oldDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2426, "src": "14478:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "14441:46:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2915, "nodeType": "ExpressionStatement", "src": "14441:46:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 2928, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 2922, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2918, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "14520:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2919, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14530:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14520:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2920, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14540:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2921, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14546:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "14540:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "14520:35:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "&&", "rightExpression": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 2927, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 2923, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "14559:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2924, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14569:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14559:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 2925, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2409, "src": "14579:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2926, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14589:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14579:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "14559:37:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "14520:76:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 2942, "nodeType": "IfStatement", "src": "14516:302:4", "trueBody": {"id": 2941, "nodeType": "Block", "src": "14598:220:4", "statements": [{"expression": {"id": 2932, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 2929, "name": "newDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2429, "src": "14616:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"expression": {"id": 2930, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "14629:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2931, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14634:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "14629:10:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "14616:23:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2933, "nodeType": "ExpressionStatement", "src": "14616:23:4"}, {"expression": {"id": 2939, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 2934, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "14696:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 2937, "indexExpression": {"expression": {"id": 2935, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "14712:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2936, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14722:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "14712:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "14696:34:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 2938, "name": "newDSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2429, "src": "14733:9:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "14696:46:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 2940, "nodeType": "ExpressionStatement", "src": "14696:46:4"}]}}, {"expression": {"id": 2951, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2943, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "14870:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2945, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14875:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "14870:7:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 2948, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14887:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2949, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14893:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "14887:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2947, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "14880:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2946, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "14880:6:4", "typeDescriptions": {}}}, "id": 2950, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "14880:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "14870:33:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2952, "nodeType": "ExpressionStatement", "src": "14870:33:4"}, {"expression": {"id": 2961, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2953, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "14917:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2955, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14922:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "14917:16:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 2958, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "14943:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 2959, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "14949:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "14943:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2957, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "14936:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 2956, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "14936:6:4", "typeDescriptions": {}}}, "id": 2960, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "14936:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "14917:39:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 2962, "nodeType": "ExpressionStatement", "src": "14917:39:4"}, {"expression": {"id": 2968, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 2963, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "14970:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 2965, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "14975:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "14970:12:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 2966, "name": "newLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2412, "src": "14985:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 2967, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "14995:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "14985:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "src": "14970:31:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "id": 2969, "nodeType": "ExpressionStatement", "src": "14970:31:4"}, {"expression": {"arguments": [{"id": 2974, "name": "uNew", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2423, "src": "15043:4:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}], "expression": {"baseExpression": {"id": 2970, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "15015:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 2972, "indexExpression": {"id": 2971, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2406, "src": "15029:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "15015:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 2973, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "15038:4:4", "memberName": "push", "nodeType": "MemberAccess", "src": "15015:27:4", "typeDescriptions": {"typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_ptr_$_t_struct$_PointVoting_$2203_storage_$returns$__$attached_to$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_ptr_$", "typeString": "function (struct PointVoting storage ref[] storage pointer,struct PointVoting storage ref)"}}, "id": 2975, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15015:33:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 2976, "nodeType": "ExpressionStatement", "src": "15015:33:4"}]}}]}, "documentation": {"id": 2404, "nodeType": "StructuredDocumentation", "src": "7803:392:4", "text": "@dev Record global and per-user data to checkpoint.\n @param account Account address. User checkpoint is skipped if the address is zero.\n @param oldLocked Previous locked amount / end lock time for the user.\n @param newLocked New locked amount / end lock time for the user.\n @param curSupply Current total supply (to avoid using a storage total supply variable)"}, "id": 2980, "implemented": true, "kind": "function", "modifiers": [], "name": "_checkpoint", "nameLocation": "8209:11:4", "nodeType": "FunctionDefinition", "parameters": {"id": 2415, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 2406, "mutability": "mutable", "name": "account", "nameLocation": "8238:7:4", "nodeType": "VariableDeclaration", "scope": 2980, "src": "8230:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 2405, "name": "address", "nodeType": "ElementaryTypeName", "src": "8230:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 2409, "mutability": "mutable", "name": "oldLocked", "nameLocation": "8276:9:4", "nodeType": "VariableDeclaration", "scope": 2980, "src": "8255:30:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 2408, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2407, "name": "LockedBalance", "nameLocations": ["8255:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "8255:13:4"}, "referencedDeclaration": 2192, "src": "8255:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}, {"constant": false, "id": 2412, "mutability": "mutable", "name": "newLocked", "nameLocation": "8316:9:4", "nodeType": "VariableDeclaration", "scope": 2980, "src": "8295:30:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 2411, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 2410, "name": "LockedBalance", "nameLocations": ["8295:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "8295:13:4"}, "referencedDeclaration": 2192, "src": "8295:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}, {"constant": false, "id": 2414, "mutability": "mutable", "name": "curSupply", "nameLocation": "8343:9:4", "nodeType": "VariableDeclaration", "scope": 2980, "src": "8335:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "typeName": {"id": 2413, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "8335:7:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "visibility": "internal"}], "src": "8220:138:4"}, "returnParameters": {"id": 2416, "nodeType": "ParameterList", "parameters": [], "src": "8368:0:4"}, "scope": 4542, "src": "8200:6865:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal"}, {"body": {"id": 3003, "nodeType": "Block", "src": "15149:99:4", "statements": [{"expression": {"arguments": [{"arguments": [{"hexValue": "30", "id": 2987, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15179:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2986, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "15171:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 2985, "name": "address", "nodeType": "ElementaryTypeName", "src": "15171:7:4", "typeDescriptions": {}}}, "id": 2988, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15171:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"hexValue": "30", "id": 2990, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15197:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 2991, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15200:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2989, "name": "LockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2192, "src": "15183:13:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_LockedBalance_$2192_storage_ptr_$", "typeString": "type(struct LockedBalance storage pointer)"}}, "id": 2992, "isConstant": false, "isLValue": false, "isPure": true, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15183:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"arguments": [{"hexValue": "30", "id": 2994, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15218:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 2995, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "15221:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 2993, "name": "LockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2192, "src": "15204:13:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_LockedBalance_$2192_storage_ptr_$", "typeString": "type(struct LockedBalance storage pointer)"}}, "id": 2996, "isConstant": false, "isLValue": false, "isPure": true, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15204:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"arguments": [{"id": 2999, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "15233:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 2998, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "15225:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 2997, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "15225:7:4", "typeDescriptions": {}}}, "id": 3000, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15225:15:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 2984, "name": "_checkpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2980, "src": "15159:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_uint128_$returns$__$", "typeString": "function (address,struct LockedBalance memory,struct LockedBalance memory,uint128)"}}, "id": 3001, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "15159:82:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3002, "nodeType": "ExpressionStatement", "src": "15159:82:4"}]}, "documentation": {"id": 2981, "nodeType": "StructuredDocumentation", "src": "15071:42:4", "text": "@dev Record global data to checkpoint."}, "functionSelector": "c2c4c5c1", "id": 3004, "implemented": true, "kind": "function", "modifiers": [], "name": "checkpoint", "nameLocation": "15127:10:4", "nodeType": "FunctionDefinition", "parameters": {"id": 2982, "nodeType": "ParameterList", "parameters": [], "src": "15137:2:4"}, "returnParameters": {"id": 2983, "nodeType": "ParameterList", "parameters": [], "src": "15149:0:4"}, "scope": 4542, "src": "15118:130:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3128, "nodeType": "Block", "src": "15796:1490:4", "statements": [{"assignments": [3021], "declarations": [{"constant": false, "id": 3021, "mutability": "mutable", "name": "supplyBefore", "nameLocation": "15814:12:4", "nodeType": "VariableDeclaration", "scope": 3128, "src": "15806:20:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3020, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15806:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3023, "initialValue": {"id": 3022, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "15829:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "15806:29:4"}, {"assignments": [3025], "declarations": [{"constant": false, "id": 3025, "mutability": "mutable", "name": "supplyAfter", "nameLocation": "15853:11:4", "nodeType": "VariableDeclaration", "scope": 3128, "src": "15845:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3024, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15845:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3026, "nodeType": "VariableDeclarationStatement", "src": "15845:19:4"}, {"id": 3037, "nodeType": "UncheckedBlock", "src": "15937:104:4", "statements": [{"expression": {"id": 3031, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3027, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3025, "src": "15961:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3030, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3028, "name": "supplyBefore", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3021, "src": "15975:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3029, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3009, "src": "15990:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "15975:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "15961:35:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3032, "nodeType": "ExpressionStatement", "src": "15961:35:4"}, {"expression": {"id": 3035, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3033, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "16010:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 3034, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3025, "src": "16019:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "16010:20:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3036, "nodeType": "ExpressionStatement", "src": "16010:20:4"}]}, {"assignments": [3040], "declarations": [{"constant": false, "id": 3040, "mutability": "mutable", "name": "oldLocked", "nameLocation": "16106:9:4", "nodeType": "VariableDeclaration", "scope": 3128, "src": "16085:30:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3039, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3038, "name": "LockedBalance", "nameLocations": ["16085:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "16085:13:4"}, "referencedDeclaration": 2192, "src": "16085:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3041, "nodeType": "VariableDeclarationStatement", "src": "16085:30:4"}, {"expression": {"id": 3053, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"components": [{"expression": {"id": 3042, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3040, "src": "16126:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3044, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "16136:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "16126:16:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, {"expression": {"id": 3045, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3040, "src": "16144:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3046, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "16154:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "16144:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "id": 3047, "isConstant": false, "isInlineArray": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "TupleExpression", "src": "16125:37:4", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint128_$_t_uint64_$", "typeString": "tuple(uint128,uint64)"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"components": [{"expression": {"id": 3048, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16166:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3049, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "16180:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "16166:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, {"expression": {"id": 3050, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16188:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3051, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "16202:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "16188:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "id": 3052, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "16165:45:4", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_uint128_$_t_uint64_$", "typeString": "tuple(uint128,uint64)"}}, "src": "16125:85:4", "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3054, "nodeType": "ExpressionStatement", "src": "16125:85:4"}, {"id": 3064, "nodeType": "UncheckedBlock", "src": "16360:74:4", "statements": [{"expression": {"id": 3062, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 3055, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16384:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3057, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "16398:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "16384:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"arguments": [{"id": 3060, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3009, "src": "16416:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3059, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "16408:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 3058, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "16408:7:4", "typeDescriptions": {}}}, "id": 3061, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16408:15:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "src": "16384:39:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "id": 3063, "nodeType": "ExpressionStatement", "src": "16384:39:4"}]}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3067, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3065, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3011, "src": "16447:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 3066, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "16460:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "16447:14:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3078, "nodeType": "IfStatement", "src": "16443:87:4", "trueBody": {"id": 3077, "nodeType": "Block", "src": "16463:67:4", "statements": [{"expression": {"id": 3075, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 3068, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16477:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3070, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "16491:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "16477:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 3073, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3011, "src": "16508:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3072, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "16501:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 3071, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "16501:6:4", "typeDescriptions": {}}}, "id": 3074, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16501:18:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "16477:42:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 3076, "nodeType": "ExpressionStatement", "src": "16477:42:4"}]}}, {"expression": {"id": 3083, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 3079, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "16539:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3081, "indexExpression": {"id": 3080, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3007, "src": "16557:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "16539:26:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 3082, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16568:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "src": "16539:42:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "id": 3084, "nodeType": "ExpressionStatement", "src": "16539:42:4"}, {"expression": {"arguments": [{"id": 3086, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3007, "src": "16854:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3087, "name": "oldLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3040, "src": "16863:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"id": 3088, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "16874:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"arguments": [{"id": 3091, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3025, "src": "16897:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3090, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "16889:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 3089, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "16889:7:4", "typeDescriptions": {}}}, "id": 3092, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16889:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3085, "name": "_checkpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2980, "src": "16842:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_uint128_$returns$__$", "typeString": "function (address,struct LockedBalance memory,struct LockedBalance memory,uint128)"}}, "id": 3093, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "16842:68:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3094, "nodeType": "ExpressionStatement", "src": "16842:68:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3097, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3095, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3009, "src": "16924:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 3096, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "16933:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "16924:10:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3112, "nodeType": "IfStatement", "src": "16920:219:4", "trueBody": {"id": 3111, "nodeType": "Block", "src": "16936:203:4", "statements": [{"expression": {"arguments": [{"expression": {"id": 3102, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "17094:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3103, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "17098:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "17094:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"id": 3106, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "17114:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 3105, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "17106:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 3104, "name": "address", "nodeType": "ElementaryTypeName", "src": "17106:7:4", "typeDescriptions": {}}}, "id": 3107, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17106:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3108, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3009, "src": "17121:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"arguments": [{"id": 3099, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2266, "src": "17074:5:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 3098, "name": "IERC20", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5192, "src": "17067:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IERC20_$5192_$", "typeString": "type(contract IERC20)"}}, "id": 3100, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17067:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_IERC20_$5192", "typeString": "contract IERC20"}}, "id": 3101, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "17081:12:4", "memberName": "transferFrom", "nodeType": "MemberAccess", "referencedDeclaration": 5191, "src": "17067:26:4", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,address,uint256) external returns (bool)"}}, "id": 3109, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17067:61:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3110, "nodeType": "ExpressionStatement", "src": "17067:61:4"}]}}, {"eventCall": {"arguments": [{"id": 3114, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3007, "src": "17162:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3115, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3009, "src": "17171:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 3116, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3014, "src": "17179:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3117, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "17193:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "17179:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"id": 3118, "name": "depositType", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3017, "src": "17202:11:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}, {"expression": {"id": 3119, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "17215:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3120, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "17221:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "17215:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3113, "name": "Deposit", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2230, "src": "17154:7:4", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_enum$_DepositType_$2217_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256,enum veOLAS.DepositType,uint256)"}}, "id": 3121, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17154:77:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3122, "nodeType": "EmitStatement", "src": "17149:82:4"}, {"eventCall": {"arguments": [{"id": 3124, "name": "supplyBefore", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3021, "src": "17253:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3125, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3025, "src": "17267:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3123, "name": "Supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2244, "src": "17246:6:4", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256)"}}, "id": 3126, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17246:33:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3127, "nodeType": "EmitStatement", "src": "17241:38:4"}]}, "documentation": {"id": 3005, "nodeType": "StructuredDocumentation", "src": "15254:347:4", "text": "@dev Deposits and locks tokens for a specified account.\n @param account Target address for the locked amount.\n @param amount Amount to deposit.\n @param unlockTime New time when to unlock the tokens, or 0 if unchanged.\n @param lockedBalance Previous locked amount / end time.\n @param depositType Deposit type."}, "id": 3129, "implemented": true, "kind": "function", "modifiers": [], "name": "_depositFor", "nameLocation": "15615:11:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3018, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3007, "mutability": "mutable", "name": "account", "nameLocation": "15644:7:4", "nodeType": "VariableDeclaration", "scope": 3129, "src": "15636:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3006, "name": "address", "nodeType": "ElementaryTypeName", "src": "15636:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3009, "mutability": "mutable", "name": "amount", "nameLocation": "15669:6:4", "nodeType": "VariableDeclaration", "scope": 3129, "src": "15661:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3008, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15661:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3011, "mutability": "mutable", "name": "unlockTime", "nameLocation": "15693:10:4", "nodeType": "VariableDeclaration", "scope": 3129, "src": "15685:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3010, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "15685:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3014, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "15734:13:4", "nodeType": "VariableDeclaration", "scope": 3129, "src": "15713:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3013, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3012, "name": "LockedBalance", "nameLocations": ["15713:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "15713:13:4"}, "referencedDeclaration": 2192, "src": "15713:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}, {"constant": false, "id": 3017, "mutability": "mutable", "name": "depositType", "nameLocation": "15769:11:4", "nodeType": "VariableDeclaration", "scope": 3129, "src": "15757:23:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}, "typeName": {"id": 3016, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3015, "name": "DepositType", "nameLocations": ["15757:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2217, "src": "15757:11:4"}, "referencedDeclaration": 2217, "src": "15757:11:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}, "visibility": "internal"}], "src": "15626:160:4"}, "returnParameters": {"id": 3019, "nodeType": "ParameterList", "parameters": [], "src": "15796:0:4"}, "scope": 4542, "src": "15606:1680:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal"}, {"body": {"id": 3208, "nodeType": "Block", "src": "17659:949:4", "statements": [{"assignments": [3139], "declarations": [{"constant": false, "id": 3139, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "17690:13:4", "nodeType": "VariableDeclaration", "scope": 3208, "src": "17669:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3138, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3137, "name": "LockedBalance", "nameLocations": ["17669:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "17669:13:4"}, "referencedDeclaration": 2192, "src": "17669:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3143, "initialValue": {"baseExpression": {"id": 3140, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "17706:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3142, "indexExpression": {"id": 3141, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3132, "src": "17724:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "17706:26:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "17669:63:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3146, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3144, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3134, "src": "17785:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3145, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "17795:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "17785:11:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3151, "nodeType": "IfStatement", "src": "17781:60:4", "trueBody": {"id": 3150, "nodeType": "Block", "src": "17798:43:4", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 3147, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "17819:9:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3148, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17819:11:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3149, "nodeType": "RevertStatement", "src": "17812:18:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 3155, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3152, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3139, "src": "17903:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3153, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "17917:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "17903:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3154, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "17927:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "17903:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3161, "nodeType": "IfStatement", "src": "17899:85:4", "trueBody": {"id": 3160, "nodeType": "Block", "src": "17930:54:4", "statements": [{"errorCall": {"arguments": [{"id": 3157, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3132, "src": "17965:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 3156, "name": "NoValueLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4985, "src": "17951:13:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 3158, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "17951:22:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3159, "nodeType": "RevertStatement", "src": "17944:29:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3169, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3162, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3139, "src": "18030:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3163, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "18044:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "18030:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3167, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3164, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "18055:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3165, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "18061:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "18055:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3166, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "18073:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "18055:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3168, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "18054:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "18030:45:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3180, "nodeType": "IfStatement", "src": "18026:146:4", "trueBody": {"id": 3179, "nodeType": "Block", "src": "18077:95:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3171, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "18110:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3172, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "18114:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "18110:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3173, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3139, "src": "18122:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3174, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "18136:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "18122:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"expression": {"id": 3175, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "18145:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3176, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "18151:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "18145:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3170, "name": "LockExpired", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5001, "src": "18098:11:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3177, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18098:63:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3178, "nodeType": "RevertStatement", "src": "18091:70:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3187, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3181, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3134, "src": "18422:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"arguments": [{"id": 3184, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "18436:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3183, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "18436:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3182, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "18431:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3185, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18431:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3186, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "18444:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "18431:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}, "src": "18422:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3198, "nodeType": "IfStatement", "src": "18418:97:4", "trueBody": {"id": 3197, "nodeType": "Block", "src": "18449:66:4", "statements": [{"errorCall": {"arguments": [{"id": 3189, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3134, "src": "18479:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"arguments": [{"id": 3192, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "18492:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3191, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "18492:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3190, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "18487:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3193, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18487:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3194, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "18500:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "18487:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint96", "typeString": "uint96"}], "id": 3188, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "18470:8:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 3195, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18470:34:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3196, "nodeType": "RevertStatement", "src": "18463:41:4"}]}}, {"expression": {"arguments": [{"id": 3200, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3132, "src": "18537:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3201, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3134, "src": "18546:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"hexValue": "30", "id": 3202, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "18554:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"id": 3203, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3139, "src": "18557:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"expression": {"id": 3204, "name": "DepositType", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2217, "src": "18572:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_enum$_DepositType_$2217_$", "typeString": "type(enum veOLAS.DepositType)"}}, "id": 3205, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "18584:16:4", "memberName": "DEPOSIT_FOR_TYPE", "nodeType": "MemberAccess", "referencedDeclaration": 2213, "src": "18572:28:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}], "id": 3199, "name": "_depositFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3129, "src": "18525:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_enum$_DepositType_$2217_$returns$__$", "typeString": "function (address,uint256,uint256,struct LockedBalance memory,enum veOLAS.DepositType)"}}, "id": 3206, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18525:76:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3207, "nodeType": "ExpressionStatement", "src": "18525:76:4"}]}, "documentation": {"id": 3130, "nodeType": "StructuredDocumentation", "src": "17292:300:4", "text": "@dev Deposits `amount` tokens for `account` and adds to the lock.\n @dev Anyone (even a smart contract) can deposit for someone else, but\n cannot extend their locktime and deposit for a brand new user.\n @param account Account address.\n @param amount Amount to add."}, "functionSelector": "2f4f21e2", "id": 3209, "implemented": true, "kind": "function", "modifiers": [], "name": "depositFor", "nameLocation": "17606:10:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3135, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3132, "mutability": "mutable", "name": "account", "nameLocation": "17625:7:4", "nodeType": "VariableDeclaration", "scope": 3209, "src": "17617:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3131, "name": "address", "nodeType": "ElementaryTypeName", "src": "17617:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3134, "mutability": "mutable", "name": "amount", "nameLocation": "17642:6:4", "nodeType": "VariableDeclaration", "scope": 3209, "src": "17634:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3133, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "17634:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "17616:33:4"}, "returnParameters": {"id": 3136, "nodeType": "ParameterList", "parameters": [], "src": "17659:0:4"}, "scope": 4542, "src": "17597:1011:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3224, "nodeType": "Block", "src": "18884:63:4", "statements": [{"expression": {"arguments": [{"expression": {"id": 3218, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "18909:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3219, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "18913:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "18909:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3220, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3212, "src": "18921:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3221, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3214, "src": "18929:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3217, "name": "_createLockFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3368, "src": "18894:14:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256)"}}, "id": 3222, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "18894:46:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3223, "nodeType": "ExpressionStatement", "src": "18894:46:4"}]}, "documentation": {"id": 3210, "nodeType": "StructuredDocumentation", "src": "18614:200:4", "text": "@dev Deposits `amount` tokens for `msg.sender` and locks for `unlockTime`.\n @param amount Amount to deposit.\n @param unlockTime Time when tokens unlock, rounded down to a whole week."}, "functionSelector": "b52c05fe", "id": 3225, "implemented": true, "kind": "function", "modifiers": [], "name": "createLock", "nameLocation": "18828:10:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3215, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3212, "mutability": "mutable", "name": "amount", "nameLocation": "18847:6:4", "nodeType": "VariableDeclaration", "scope": 3225, "src": "18839:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3211, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18839:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3214, "mutability": "mutable", "name": "unlockTime", "nameLocation": "18863:10:4", "nodeType": "VariableDeclaration", "scope": 3225, "src": "18855:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3213, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "18855:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "18838:36:4"}, "returnParameters": {"id": 3216, "nodeType": "ParameterList", "parameters": [], "src": "18884:0:4"}, "scope": 4542, "src": "18819:128:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3252, "nodeType": "Block", "src": "19342:190:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 3240, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3235, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3228, "src": "19404:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 3238, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "19423:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3237, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "19415:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 3236, "name": "address", "nodeType": "ElementaryTypeName", "src": "19415:7:4", "typeDescriptions": {}}}, "id": 3239, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19415:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "19404:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3245, "nodeType": "IfStatement", "src": "19400:72:4", "trueBody": {"id": 3244, "nodeType": "Block", "src": "19427:45:4", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 3241, "name": "ZeroAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4943, "src": "19448:11:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3242, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19448:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3243, "nodeType": "RevertStatement", "src": "19441:20:4"}]}}, {"expression": {"arguments": [{"id": 3247, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3228, "src": "19497:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3248, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3230, "src": "19506:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3249, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3232, "src": "19514:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3246, "name": "_createLockFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3368, "src": "19482:14:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256)"}}, "id": 3250, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "19482:43:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3251, "nodeType": "ExpressionStatement", "src": "19482:43:4"}]}, "documentation": {"id": 3226, "nodeType": "StructuredDocumentation", "src": "18953:299:4", "text": "@dev Deposits `amount` tokens for `account` and locks for `unlockTime`.\n @notice Tokens are taken from `msg.sender`'s balance.\n @param account Account address.\n @param amount Amount to deposit.\n @param unlockTime Time when tokens unlock, rounded down to a whole week."}, "functionSelector": "29b55ca7", "id": 3253, "implemented": true, "kind": "function", "modifiers": [], "name": "createLockFor", "nameLocation": "19266:13:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3233, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3228, "mutability": "mutable", "name": "account", "nameLocation": "19288:7:4", "nodeType": "VariableDeclaration", "scope": 3253, "src": "19280:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3227, "name": "address", "nodeType": "ElementaryTypeName", "src": "19280:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3230, "mutability": "mutable", "name": "amount", "nameLocation": "19305:6:4", "nodeType": "VariableDeclaration", "scope": 3253, "src": "19297:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3229, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19297:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3232, "mutability": "mutable", "name": "unlockTime", "nameLocation": "19321:10:4", "nodeType": "VariableDeclaration", "scope": 3253, "src": "19313:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3231, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19313:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "19279:53:4"}, "returnParameters": {"id": 3234, "nodeType": "ParameterList", "parameters": [], "src": "19342:0:4"}, "scope": 4542, "src": "19257:275:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3367, "nodeType": "Block", "src": "19927:1355:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3265, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3263, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3258, "src": "19980:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3264, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "19990:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "19980:11:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3270, "nodeType": "IfStatement", "src": "19976:60:4", "trueBody": {"id": 3269, "nodeType": "Block", "src": "19993:43:4", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 3266, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "20014:9:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3267, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20014:11:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3268, "nodeType": "RevertStatement", "src": "20007:18:4"}]}}, {"id": 3284, "nodeType": "UncheckedBlock", "src": "20191:94:4", "statements": [{"expression": {"id": 3282, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3271, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20215:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3281, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3278, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3275, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3272, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "20230:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3273, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20236:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "20230:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3274, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20248:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20230:28:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3276, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "20229:30:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 3277, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "20262:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "20229:37:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3279, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "20228:39:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 3280, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "20270:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "20228:46:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20215:59:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3283, "nodeType": "ExpressionStatement", "src": "20215:59:4"}]}, {"assignments": [3287], "declarations": [{"constant": false, "id": 3287, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "20315:13:4", "nodeType": "VariableDeclaration", "scope": 3367, "src": "20294:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3286, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3285, "name": "LockedBalance", "nameLocations": ["20294:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "20294:13:4"}, "referencedDeclaration": 2192, "src": "20294:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3291, "initialValue": {"baseExpression": {"id": 3288, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "20331:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3290, "indexExpression": {"id": 3289, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3256, "src": "20349:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "20331:26:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "20294:63:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 3295, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3292, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3287, "src": "20441:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3293, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "20455:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "20441:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 3294, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "20464:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "20441:24:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3306, "nodeType": "IfStatement", "src": "20437:120:4", "trueBody": {"id": 3305, "nodeType": "Block", "src": "20467:90:4", "statements": [{"errorCall": {"arguments": [{"id": 3297, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3256, "src": "20507:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"expression": {"id": 3300, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3287, "src": "20524:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3301, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "20538:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "20524:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3299, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "20516:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3298, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "20516:7:4", "typeDescriptions": {}}}, "id": 3302, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20516:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3296, "name": "LockedValueNotZero", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4992, "src": "20488:18:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,uint256) pure"}}, "id": 3303, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20488:58:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3304, "nodeType": "RevertStatement", "src": "20481:65:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3313, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3307, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20617:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3311, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3308, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "20631:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3309, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20637:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "20631:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3310, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "20649:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "20631:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3312, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "20630:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20617:34:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3322, "nodeType": "IfStatement", "src": "20613:129:4", "trueBody": {"id": 3321, "nodeType": "Block", "src": "20653:89:4", "statements": [{"errorCall": {"arguments": [{"id": 3315, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3256, "src": "20694:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3316, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "20703:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3317, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20709:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "20703:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3318, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20720:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3314, "name": "UnlockTimeIncorrect", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5019, "src": "20674:19:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3319, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20674:57:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3320, "nodeType": "RevertStatement", "src": "20667:64:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3328, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3323, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20816:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3327, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3324, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "20829:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3325, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20835:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "20829:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3326, "name": "MAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2254, "src": "20847:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20829:25:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20816:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3339, "nodeType": "IfStatement", "src": "20812:144:4", "trueBody": {"id": 3338, "nodeType": "Block", "src": "20856:100:4", "statements": [{"errorCall": {"arguments": [{"id": 3330, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3256, "src": "20898:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3334, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3331, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "20907:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3332, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "20913:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "20907:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3333, "name": "MAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2254, "src": "20925:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "20907:25:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3335, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "20934:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3329, "name": "MaxUnlockTimeReached", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5028, "src": "20877:20:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3336, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "20877:68:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3337, "nodeType": "RevertStatement", "src": "20870:75:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3346, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3340, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3258, "src": "21087:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"arguments": [{"id": 3343, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "21101:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3342, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "21101:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3341, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "21096:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3344, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21096:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3345, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "21109:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "21096:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}, "src": "21087:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3357, "nodeType": "IfStatement", "src": "21083:97:4", "trueBody": {"id": 3356, "nodeType": "Block", "src": "21114:66:4", "statements": [{"errorCall": {"arguments": [{"id": 3348, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3258, "src": "21144:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"arguments": [{"id": 3351, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "21157:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3350, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "21157:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3349, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "21152:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3352, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21152:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3353, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "21165:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "21152:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint96", "typeString": "uint96"}], "id": 3347, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "21135:8:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 3354, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21135:34:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3355, "nodeType": "RevertStatement", "src": "21128:41:4"}]}}, {"expression": {"arguments": [{"id": 3359, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3256, "src": "21202:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3360, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3258, "src": "21211:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3361, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3260, "src": "21219:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3362, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3287, "src": "21231:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"expression": {"id": 3363, "name": "DepositType", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2217, "src": "21246:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_enum$_DepositType_$2217_$", "typeString": "type(enum veOLAS.DepositType)"}}, "id": 3364, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "21258:16:4", "memberName": "CREATE_LOCK_TYPE", "nodeType": "MemberAccess", "referencedDeclaration": 2214, "src": "21246:28:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}], "id": 3358, "name": "_depositFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3129, "src": "21190:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_enum$_DepositType_$2217_$returns$__$", "typeString": "function (address,uint256,uint256,struct LockedBalance memory,enum veOLAS.DepositType)"}}, "id": 3365, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21190:85:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3366, "nodeType": "ExpressionStatement", "src": "21190:85:4"}]}, "documentation": {"id": 3254, "nodeType": "StructuredDocumentation", "src": "19538:299:4", "text": "@dev Deposits `amount` tokens for `account` and locks for `unlockTime`.\n @notice Tokens are taken from `msg.sender`'s balance.\n @param account Account address.\n @param amount Amount to deposit.\n @param unlockTime Time when tokens unlock, rounded down to a whole week."}, "id": 3368, "implemented": true, "kind": "function", "modifiers": [], "name": "_createLockFor", "nameLocation": "19851:14:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3261, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3256, "mutability": "mutable", "name": "account", "nameLocation": "19874:7:4", "nodeType": "VariableDeclaration", "scope": 3368, "src": "19866:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3255, "name": "address", "nodeType": "ElementaryTypeName", "src": "19866:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3258, "mutability": "mutable", "name": "amount", "nameLocation": "19891:6:4", "nodeType": "VariableDeclaration", "scope": 3368, "src": "19883:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3257, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19883:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3260, "mutability": "mutable", "name": "unlockTime", "nameLocation": "19907:10:4", "nodeType": "VariableDeclaration", "scope": 3368, "src": "19899:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3259, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "19899:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "19865:53:4"}, "returnParameters": {"id": 3262, "nodeType": "ParameterList", "parameters": [], "src": "19927:0:4"}, "scope": 4542, "src": "19842:1440:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "private"}, {"body": {"id": 3448, "nodeType": "Block", "src": "21509:932:4", "statements": [{"assignments": [3376], "declarations": [{"constant": false, "id": 3376, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "21540:13:4", "nodeType": "VariableDeclaration", "scope": 3448, "src": "21519:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3375, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3374, "name": "LockedBalance", "nameLocations": ["21519:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "21519:13:4"}, "referencedDeclaration": 2192, "src": "21519:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3381, "initialValue": {"baseExpression": {"id": 3377, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "21556:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3380, "indexExpression": {"expression": {"id": 3378, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "21574:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3379, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "21578:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "21574:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "21556:29:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "21519:66:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3384, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3382, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3371, "src": "21638:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3383, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "21648:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "21638:11:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3389, "nodeType": "IfStatement", "src": "21634:60:4", "trueBody": {"id": 3388, "nodeType": "Block", "src": "21651:43:4", "statements": [{"errorCall": {"arguments": [], "expression": {"argumentTypes": [], "id": 3385, "name": "ZeroValue", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4946, "src": "21672:9:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3386, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21672:11:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3387, "nodeType": "RevertStatement", "src": "21665:18:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 3393, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3390, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3376, "src": "21756:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3391, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "21770:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "21756:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3392, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "21780:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "21756:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3400, "nodeType": "IfStatement", "src": "21752:88:4", "trueBody": {"id": 3399, "nodeType": "Block", "src": "21783:57:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3395, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "21818:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3396, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "21822:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "21818:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 3394, "name": "NoValueLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4985, "src": "21804:13:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 3397, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21804:25:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3398, "nodeType": "RevertStatement", "src": "21797:32:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3408, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3401, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3376, "src": "21886:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3402, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "21900:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "21886:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3406, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3403, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "21911:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3404, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "21917:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "21911:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3405, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "21929:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "21911:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3407, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "21910:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "21886:45:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3419, "nodeType": "IfStatement", "src": "21882:146:4", "trueBody": {"id": 3418, "nodeType": "Block", "src": "21933:95:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3410, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "21966:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3411, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "21970:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "21966:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3412, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3376, "src": "21978:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3413, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "21992:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "21978:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"expression": {"id": 3414, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "22001:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3415, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "22007:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "22001:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3409, "name": "LockExpired", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5001, "src": "21954:11:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3416, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "21954:63:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3417, "nodeType": "RevertStatement", "src": "21947:70:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3426, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3420, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3371, "src": "22248:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"arguments": [{"id": 3423, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "22262:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3422, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "22262:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3421, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "22257:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3424, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "22257:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3425, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "22270:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "22257:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}, "src": "22248:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3437, "nodeType": "IfStatement", "src": "22244:97:4", "trueBody": {"id": 3436, "nodeType": "Block", "src": "22275:66:4", "statements": [{"errorCall": {"arguments": [{"id": 3428, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3371, "src": "22305:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"arguments": [{"id": 3431, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "22318:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}, "typeName": {"id": 3430, "name": "uint96", "nodeType": "ElementaryTypeName", "src": "22318:6:4", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint96_$", "typeString": "type(uint96)"}], "id": 3429, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "22313:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 3432, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "22313:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint96", "typeString": "type(uint96)"}}, "id": 3433, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "22326:3:4", "memberName": "max", "nodeType": "MemberAccess", "src": "22313:16:4", "typeDescriptions": {"typeIdentifier": "t_uint96", "typeString": "uint96"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint96", "typeString": "uint96"}], "id": 3427, "name": "Overflow", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4963, "src": "22296:8:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 3434, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "22296:34:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3435, "nodeType": "RevertStatement", "src": "22289:41:4"}]}}, {"expression": {"arguments": [{"expression": {"id": 3439, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "22363:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3440, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "22367:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "22363:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3441, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3371, "src": "22375:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"hexValue": "30", "id": 3442, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "22383:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"id": 3443, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3376, "src": "22386:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"expression": {"id": 3444, "name": "DepositType", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2217, "src": "22401:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_enum$_DepositType_$2217_$", "typeString": "type(enum veOLAS.DepositType)"}}, "id": 3445, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "22413:20:4", "memberName": "INCREASE_LOCK_AMOUNT", "nodeType": "MemberAccess", "referencedDeclaration": 2215, "src": "22401:32:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}], "id": 3438, "name": "_depositFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3129, "src": "22351:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_enum$_DepositType_$2217_$returns$__$", "typeString": "function (address,uint256,uint256,struct LockedBalance memory,enum veOLAS.DepositType)"}}, "id": 3446, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "22351:83:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3447, "nodeType": "ExpressionStatement", "src": "22351:83:4"}]}, "documentation": {"id": 3369, "nodeType": "StructuredDocumentation", "src": "21288:167:4", "text": "@dev Deposits `amount` additional tokens for `msg.sender` without modifying the unlock time.\n @param amount Amount of tokens to deposit and add to the lock."}, "functionSelector": "15456eba", "id": 3449, "implemented": true, "kind": "function", "modifiers": [], "name": "increaseAmount", "nameLocation": "21469:14:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3372, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3371, "mutability": "mutable", "name": "amount", "nameLocation": "21492:6:4", "nodeType": "VariableDeclaration", "scope": 3449, "src": "21484:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3370, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "21484:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "21483:16:4"}, "returnParameters": {"id": 3373, "nodeType": "ParameterList", "parameters": [], "src": "21509:0:4"}, "scope": 4542, "src": "21460:981:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3552, "nodeType": "Block", "src": "22592:1135:4", "statements": [{"assignments": [3457], "declarations": [{"constant": false, "id": 3457, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "22623:13:4", "nodeType": "VariableDeclaration", "scope": 3552, "src": "22602:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3456, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3455, "name": "LockedBalance", "nameLocations": ["22602:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "22602:13:4"}, "referencedDeclaration": 2192, "src": "22602:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3462, "initialValue": {"baseExpression": {"id": 3458, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "22639:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3461, "indexExpression": {"expression": {"id": 3459, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "22657:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3460, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "22661:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "22657:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "22639:29:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "22602:66:4"}, {"id": 3476, "nodeType": "UncheckedBlock", "src": "22778:94:4", "statements": [{"expression": {"id": 3474, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3463, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "22802:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3473, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3470, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3467, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3464, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "22817:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3465, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "22823:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "22817:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3466, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "22835:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "22817:28:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3468, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "22816:30:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 3469, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "22849:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "22816:37:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3471, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "22815:39:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 3472, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "22857:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "22815:46:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "22802:59:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3475, "nodeType": "ExpressionStatement", "src": "22802:59:4"}]}, {"condition": {"commonType": {"typeIdentifier": "t_uint128", "typeString": "uint128"}, "id": 3480, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3477, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "22934:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3478, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "22948:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "22934:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3479, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "22958:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "22934:25:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3487, "nodeType": "IfStatement", "src": "22930:88:4", "trueBody": {"id": 3486, "nodeType": "Block", "src": "22961:57:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3482, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "22996:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3483, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23000:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "22996:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 3481, "name": "NoValueLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4985, "src": "22982:13:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 3484, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "22982:25:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3485, "nodeType": "RevertStatement", "src": "22975:32:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3495, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3488, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "23064:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3489, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "23078:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "23064:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3493, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3490, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "23089:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3491, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23095:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "23089:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3492, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "23107:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "23089:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3494, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "23088:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "23064:45:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3506, "nodeType": "IfStatement", "src": "23060:146:4", "trueBody": {"id": 3505, "nodeType": "Block", "src": "23111:95:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3497, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "23144:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3498, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23148:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "23144:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3499, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "23156:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3500, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "23170:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "23156:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"expression": {"id": 3501, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "23179:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3502, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23185:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "23179:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3496, "name": "LockExpired", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5001, "src": "23132:11:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3503, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "23132:63:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3504, "nodeType": "RevertStatement", "src": "23125:70:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3513, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3507, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "23266:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 3511, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3508, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "23280:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3509, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "23294:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "23280:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3510, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "23304:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "23280:25:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "id": 3512, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "23279:27:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "23266:40:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3523, "nodeType": "IfStatement", "src": "23262:144:4", "trueBody": {"id": 3522, "nodeType": "Block", "src": "23308:98:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3515, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "23349:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3516, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23353:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "23349:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3517, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "23361:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3518, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "23375:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "23361:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"id": 3519, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "23384:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3514, "name": "UnlockTimeIncorrect", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5019, "src": "23329:19:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3520, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "23329:66:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3521, "nodeType": "RevertStatement", "src": "23322:73:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3529, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3524, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "23480:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3528, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3525, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "23493:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3526, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23499:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "23493:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3527, "name": "MAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2254, "src": "23511:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "23493:25:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "23480:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3541, "nodeType": "IfStatement", "src": "23476:147:4", "trueBody": {"id": 3540, "nodeType": "Block", "src": "23520:103:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3531, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "23562:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3532, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23566:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "23562:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3536, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3533, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "23574:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3534, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23580:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "23574:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3535, "name": "MAXTIME", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2254, "src": "23592:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "23574:25:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3537, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "23601:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3530, "name": "MaxUnlockTimeReached", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5028, "src": "23541:20:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3538, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "23541:71:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3539, "nodeType": "RevertStatement", "src": "23534:78:4"}]}}, {"expression": {"arguments": [{"expression": {"id": 3543, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "23645:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3544, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23649:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "23645:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"hexValue": "30", "id": 3545, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "23657:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"id": 3546, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3452, "src": "23660:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3547, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3457, "src": "23672:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"expression": {"id": 3548, "name": "DepositType", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2217, "src": "23687:11:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_enum$_DepositType_$2217_$", "typeString": "type(enum veOLAS.DepositType)"}}, "id": 3549, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "23699:20:4", "memberName": "INCREASE_UNLOCK_TIME", "nodeType": "MemberAccess", "referencedDeclaration": 2216, "src": "23687:32:4", "typeDescriptions": {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_enum$_DepositType_$2217", "typeString": "enum veOLAS.DepositType"}], "id": 3542, "name": "_depositFor", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3129, "src": "23633:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_enum$_DepositType_$2217_$returns$__$", "typeString": "function (address,uint256,uint256,struct LockedBalance memory,enum veOLAS.DepositType)"}}, "id": 3550, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "23633:87:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3551, "nodeType": "ExpressionStatement", "src": "23633:87:4"}]}, "documentation": {"id": 3450, "nodeType": "StructuredDocumentation", "src": "22447:83:4", "text": "@dev Extends the unlock time.\n @param unlockTime New tokens unlock time."}, "functionSelector": "7c616fe6", "id": 3553, "implemented": true, "kind": "function", "modifiers": [], "name": "increaseUnlockTime", "nameLocation": "22544:18:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3453, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3452, "mutability": "mutable", "name": "unlockTime", "nameLocation": "22571:10:4", "nodeType": "VariableDeclaration", "scope": 3553, "src": "22563:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3451, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "22563:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "22562:20:4"}, "returnParameters": {"id": 3454, "nodeType": "ParameterList", "parameters": [], "src": "22592:0:4"}, "scope": 4542, "src": "22535:1192:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3653, "nodeType": "Block", "src": "23853:1102:4", "statements": [{"assignments": [3559], "declarations": [{"constant": false, "id": 3559, "mutability": "mutable", "name": "lockedBalance", "nameLocation": "23884:13:4", "nodeType": "VariableDeclaration", "scope": 3653, "src": "23863:34:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance"}, "typeName": {"id": 3558, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3557, "name": "LockedBalance", "nameLocations": ["23863:13:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2192, "src": "23863:13:4"}, "referencedDeclaration": 2192, "src": "23863:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage_ptr", "typeString": "struct LockedBalance"}}, "visibility": "internal"}], "id": 3564, "initialValue": {"baseExpression": {"id": 3560, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "23900:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3563, "indexExpression": {"expression": {"id": 3561, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "23918:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3562, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23922:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "23918:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "23900:29:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "23863:66:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3569, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3565, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3559, "src": "23943:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3566, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "23957:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "23943:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 3567, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "23967:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3568, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "23973:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "23967:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "23943:39:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3580, "nodeType": "IfStatement", "src": "23939:143:4", "trueBody": {"id": 3579, "nodeType": "Block", "src": "23984:98:4", "statements": [{"errorCall": {"arguments": [{"expression": {"id": 3571, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "24020:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3572, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24024:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "24020:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"expression": {"id": 3573, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3559, "src": "24032:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3574, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "24046:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "24032:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, {"expression": {"id": 3575, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "24055:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3576, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24061:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "24055:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3570, "name": "LockNotExpired", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5010, "src": "24005:14:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256) pure"}}, "id": 3577, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24005:66:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3578, "nodeType": "RevertStatement", "src": "23998:73:4"}]}}, {"assignments": [3582], "declarations": [{"constant": false, "id": 3582, "mutability": "mutable", "name": "amount", "nameLocation": "24099:6:4", "nodeType": "VariableDeclaration", "scope": 3653, "src": "24091:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3581, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "24091:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3588, "initialValue": {"arguments": [{"expression": {"id": 3585, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3559, "src": "24116:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "id": 3586, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "24130:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "24116:20:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3584, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "24108:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3583, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "24108:7:4", "typeDescriptions": {}}}, "id": 3587, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24108:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "24091:46:4"}, {"expression": {"id": 3597, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 3589, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "24148:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3592, "indexExpression": {"expression": {"id": 3590, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "24166:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3591, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24170:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "24166:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "24148:29:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"hexValue": "30", "id": 3594, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "24194:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 3595, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "24197:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3593, "name": "LockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2192, "src": "24180:13:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_LockedBalance_$2192_storage_ptr_$", "typeString": "type(struct LockedBalance storage pointer)"}}, "id": 3596, "isConstant": false, "isLValue": false, "isPure": true, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24180:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, "src": "24148:51:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "id": 3598, "nodeType": "ExpressionStatement", "src": "24148:51:4"}, {"assignments": [3600], "declarations": [{"constant": false, "id": 3600, "mutability": "mutable", "name": "supplyBefore", "nameLocation": "24217:12:4", "nodeType": "VariableDeclaration", "scope": 3653, "src": "24209:20:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3599, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "24209:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3602, "initialValue": {"id": 3601, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "24232:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "24209:29:4"}, {"assignments": [3604], "declarations": [{"constant": false, "id": 3604, "mutability": "mutable", "name": "supplyAfter", "nameLocation": "24256:11:4", "nodeType": "VariableDeclaration", "scope": 3653, "src": "24248:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3603, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "24248:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3605, "nodeType": "VariableDeclarationStatement", "src": "24248:19:4"}, {"id": 3616, "nodeType": "UncheckedBlock", "src": "24336:104:4", "statements": [{"expression": {"id": 3610, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3606, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3604, "src": "24360:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3609, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3607, "name": "supplyBefore", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3600, "src": "24374:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 3608, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3582, "src": "24389:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "24374:21:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "24360:35:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3611, "nodeType": "ExpressionStatement", "src": "24360:35:4"}, {"expression": {"id": 3614, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3612, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "24409:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 3613, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3604, "src": "24418:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "24409:20:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3615, "nodeType": "ExpressionStatement", "src": "24409:20:4"}]}, {"expression": {"arguments": [{"expression": {"id": 3618, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "24608:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3619, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24612:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "24608:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3620, "name": "lockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3559, "src": "24620:13:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"arguments": [{"hexValue": "30", "id": 3622, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "24649:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, {"hexValue": "30", "id": 3623, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "24652:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3621, "name": "LockedBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2192, "src": "24635:13:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_struct$_LockedBalance_$2192_storage_ptr_$", "typeString": "type(struct LockedBalance storage pointer)"}}, "id": 3624, "isConstant": false, "isLValue": false, "isPure": true, "kind": "structConstructorCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24635:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}}, {"arguments": [{"id": 3627, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3604, "src": "24664:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3626, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "24656:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 3625, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "24656:7:4", "typeDescriptions": {}}}, "id": 3628, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24656:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_struct$_LockedBalance_$2192_memory_ptr", "typeString": "struct LockedBalance memory"}, {"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3617, "name": "_checkpoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2980, "src": "24596:11:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_struct$_LockedBalance_$2192_memory_ptr_$_t_uint128_$returns$__$", "typeString": "function (address,struct LockedBalance memory,struct LockedBalance memory,uint128)"}}, "id": 3629, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24596:81:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3630, "nodeType": "ExpressionStatement", "src": "24596:81:4"}, {"eventCall": {"arguments": [{"expression": {"id": 3632, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "24702:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3633, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24706:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "24702:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3634, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3582, "src": "24714:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 3635, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "24722:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3636, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24728:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "24722:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3631, "name": "Withdraw", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2238, "src": "24693:8:4", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (address,uint256,uint256)"}}, "id": 3637, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24693:45:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3638, "nodeType": "EmitStatement", "src": "24688:50:4"}, {"eventCall": {"arguments": [{"id": 3640, "name": "supplyBefore", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3600, "src": "24760:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3641, "name": "supplyAfter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3604, "src": "24774:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3639, "name": "Supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2244, "src": "24753:6:4", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256)"}}, "id": 3642, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24753:33:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3643, "nodeType": "EmitStatement", "src": "24748:38:4"}, {"expression": {"arguments": [{"expression": {"id": 3648, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "24929:3:4", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 3649, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24933:6:4", "memberName": "sender", "nodeType": "MemberAccess", "src": "24929:10:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 3650, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3582, "src": "24941:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"arguments": [{"id": 3645, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2266, "src": "24913:5:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 3644, "name": "IERC20", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5192, "src": "24906:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IERC20_$5192_$", "typeString": "type(contract IERC20)"}}, "id": 3646, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24906:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_contract$_IERC20_$5192", "typeString": "contract IERC20"}}, "id": 3647, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "24920:8:4", "memberName": "transfer", "nodeType": "MemberAccess", "referencedDeclaration": 5159, "src": "24906:22:4", "typeDescriptions": {"typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,uint256) external returns (bool)"}}, "id": 3651, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "24906:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3652, "nodeType": "ExpressionStatement", "src": "24906:42:4"}]}, "documentation": {"id": 3554, "nodeType": "StructuredDocumentation", "src": "23733:86:4", "text": "@dev Withdraws all tokens for `msg.sender`. Only possible if the lock has expired."}, "functionSelector": "3ccfd60b", "id": 3654, "implemented": true, "kind": "function", "modifiers": [], "name": "withdraw", "nameLocation": "23833:8:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3555, "nodeType": "ParameterList", "parameters": [], "src": "23841:2:4"}, "returnParameters": {"id": 3556, "nodeType": "ParameterList", "parameters": [], "src": "23853:0:4"}, "scope": 4542, "src": "23824:1131:4", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"body": {"id": 3802, "nodeType": "Block", "src": "25411:1374:4", "statements": [{"assignments": [3668], "declarations": [{"constant": false, "id": 3668, "mutability": "mutable", "name": "maxPointNumber", "nameLocation": "25476:14:4", "nodeType": "VariableDeclaration", "scope": 3802, "src": "25468:22:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3667, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "25468:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3669, "nodeType": "VariableDeclarationStatement", "src": "25468:22:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 3675, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3670, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "25504:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 3673, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "25523:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3672, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "25515:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 3671, "name": "address", "nodeType": "ElementaryTypeName", "src": "25515:7:4", "typeDescriptions": {}}}, "id": 3674, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "25515:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "25504:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 3702, "nodeType": "Block", "src": "25589:299:4", "statements": [{"expression": {"id": 3686, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3681, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "25603:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"baseExpression": {"id": 3682, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "25620:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 3684, "indexExpression": {"id": 3683, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "25634:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "25620:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 3685, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "25643:6:4", "memberName": "length", "nodeType": "MemberAccess", "src": "25620:29:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "25603:46:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3687, "nodeType": "ExpressionStatement", "src": "25603:46:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3690, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3688, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "25667:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"hexValue": "30", "id": 3689, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "25685:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "25667:19:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3696, "nodeType": "IfStatement", "src": "25663:88:4", "trueBody": {"id": 3695, "nodeType": "Block", "src": "25688:63:4", "statements": [{"expression": {"components": [{"id": 3691, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "25714:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, {"id": 3692, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "25721:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3693, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "25713:23:4", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "functionReturnParameters": 3666, "id": 3694, "nodeType": "Return", "src": "25706:30:4"}]}}, {"id": 3701, "nodeType": "UncheckedBlock", "src": "25816:62:4", "statements": [{"expression": {"id": 3699, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3697, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "25844:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"hexValue": "31", "id": 3698, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "25862:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "25844:19:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3700, "nodeType": "ExpressionStatement", "src": "25844:19:4"}]}]}, "id": 3703, "nodeType": "IfStatement", "src": "25500:388:4", "trueBody": {"id": 3680, "nodeType": "Block", "src": "25527:56:4", "statements": [{"expression": {"id": 3678, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3676, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "25541:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 3677, "name": "totalNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2275, "src": "25558:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "25541:31:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3679, "nodeType": "ExpressionStatement", "src": "25541:31:4"}]}}, {"body": {"id": 3777, "nodeType": "Block", "src": "26004:566:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3719, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3716, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3714, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "26023:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3715, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26040:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "26023:18:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3717, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "26022:20:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 3718, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "26045:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "26022:37:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3722, "nodeType": "IfStatement", "src": "26018:81:4", "trueBody": {"id": 3721, "nodeType": "Block", "src": "26061:38:4", "statements": [{"id": 3720, "nodeType": "Break", "src": "26079:5:4"}]}}, {"assignments": [3724], "declarations": [{"constant": false, "id": 3724, "mutability": "mutable", "name": "mid", "nameLocation": "26120:3:4", "nodeType": "VariableDeclaration", "scope": 3777, "src": "26112:11:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3723, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "26112:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3733, "initialValue": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3732, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3729, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3727, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3725, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "26127:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"id": 3726, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "26144:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "26127:31:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3728, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26161:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "26127:35:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3730, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "26126:37:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"hexValue": "32", "id": 3731, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26166:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_2_by_1", "typeString": "int_const 2"}, "value": "2"}, "src": "26126:41:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "26112:55:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 3739, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3734, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "26229:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 3737, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26248:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3736, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "26240:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 3735, "name": "address", "nodeType": "ElementaryTypeName", "src": "26240:7:4", "typeDescriptions": {}}}, "id": 3738, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "26240:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "26229:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 3755, "nodeType": "Block", "src": "26319:68:4", "statements": [{"expression": {"id": 3753, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3747, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "26337:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"baseExpression": {"id": 3748, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "26345:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 3750, "indexExpression": {"id": 3749, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "26359:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26345:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 3752, "indexExpression": {"id": 3751, "name": "mid", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3724, "src": "26368:3:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26345:27:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "26337:35:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3754, "nodeType": "ExpressionStatement", "src": "26337:35:4"}]}, "id": 3756, "nodeType": "IfStatement", "src": "26225:162:4", "trueBody": {"id": 3746, "nodeType": "Block", "src": "26252:61:4", "statements": [{"expression": {"id": 3744, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3740, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "26270:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 3741, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "26278:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 3743, "indexExpression": {"id": 3742, "name": "mid", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3724, "src": "26294:3:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26278:20:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "26270:28:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3745, "nodeType": "ExpressionStatement", "src": "26270:28:4"}]}}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3763, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3757, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "26405:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3758, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "26411:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "26405:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3761, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3759, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3657, "src": "26426:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3760, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26440:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "26426:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3762, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "26425:17:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "26405:37:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 3775, "nodeType": "Block", "src": "26503:57:4", "statements": [{"expression": {"id": 3773, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3769, "name": "maxPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3668, "src": "26521:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3772, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3770, "name": "mid", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3724, "src": "26538:3:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "31", "id": 3771, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26544:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "26538:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "26521:24:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3774, "nodeType": "ExpressionStatement", "src": "26521:24:4"}]}, "id": 3776, "nodeType": "IfStatement", "src": "26401:159:4", "trueBody": {"id": 3768, "nodeType": "Block", "src": "26444:53:4", "statements": [{"expression": {"id": 3766, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3764, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "26462:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 3765, "name": "mid", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3724, "src": "26479:3:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "26462:20:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3767, "nodeType": "ExpressionStatement", "src": "26462:20:4"}]}}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3710, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3708, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3705, "src": "25990:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "313238", "id": 3709, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "25994:3:4", "typeDescriptions": {"typeIdentifier": "t_rational_128_by_1", "typeString": "int_const 128"}, "value": "128"}, "src": "25990:7:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3778, "initializationExpression": {"assignments": [3705], "declarations": [{"constant": false, "id": 3705, "mutability": "mutable", "name": "i", "nameLocation": "25983:1:4", "nodeType": "VariableDeclaration", "scope": 3778, "src": "25975:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3704, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "25975:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3707, "initialValue": {"hexValue": "30", "id": 3706, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "25987:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "25975:13:4"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 3712, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "25999:3:4", "subExpression": {"id": 3711, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3705, "src": "26001:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3713, "nodeType": "ExpressionStatement", "src": "25999:3:4"}, "nodeType": "ForStatement", "src": "25970:600:4"}, {"condition": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 3784, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3779, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "26615:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"arguments": [{"hexValue": "30", "id": 3782, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "26634:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 3781, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "26626:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 3780, "name": "address", "nodeType": "ElementaryTypeName", "src": "26626:7:4", "typeDescriptions": {}}}, "id": 3783, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "26626:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "26615:21:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 3800, "nodeType": "Block", "src": "26708:71:4", "statements": [{"expression": {"id": 3798, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3792, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "26722:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"baseExpression": {"id": 3793, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "26730:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 3795, "indexExpression": {"id": 3794, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3659, "src": "26744:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26730:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 3797, "indexExpression": {"id": 3796, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "26753:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26730:38:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "26722:46:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3799, "nodeType": "ExpressionStatement", "src": "26722:46:4"}]}, "id": 3801, "nodeType": "IfStatement", "src": "26611:168:4", "trueBody": {"id": 3791, "nodeType": "Block", "src": "26638:64:4", "statements": [{"expression": {"id": 3789, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3785, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3663, "src": "26652:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 3786, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "26660:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 3788, "indexExpression": {"id": 3787, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3665, "src": "26676:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "26660:31:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "src": "26652:39:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3790, "nodeType": "ExpressionStatement", "src": "26652:39:4"}]}}]}, "documentation": {"id": 3655, "nodeType": "StructuredDocumentation", "src": "24961:295:4", "text": "@dev Finds a closest point that has a specified block number.\n @param blockNumber Block to find.\n @param account Account address for user points.\n @return point Point with the approximate index number for the specified block.\n @return minPointNumber Point number."}, "id": 3803, "implemented": true, "kind": "function", "modifiers": [], "name": "_findPointByBlock", "nameLocation": "25270:17:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3660, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3657, "mutability": "mutable", "name": "blockNumber", "nameLocation": "25296:11:4", "nodeType": "VariableDeclaration", "scope": 3803, "src": "25288:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3656, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "25288:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 3659, "mutability": "mutable", "name": "account", "nameLocation": "25317:7:4", "nodeType": "VariableDeclaration", "scope": 3803, "src": "25309:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3658, "name": "address", "nodeType": "ElementaryTypeName", "src": "25309:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "25287:38:4"}, "returnParameters": {"id": 3666, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3663, "mutability": "mutable", "name": "point", "nameLocation": "25376:5:4", "nodeType": "VariableDeclaration", "scope": 3803, "src": "25357:24:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 3662, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3661, "name": "PointVoting", "nameLocations": ["25357:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "25357:11:4"}, "referencedDeclaration": 2203, "src": "25357:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, {"constant": false, "id": 3665, "mutability": "mutable", "name": "minPointNumber", "nameLocation": "25391:14:4", "nodeType": "VariableDeclaration", "scope": 3803, "src": "25383:22:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3664, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "25383:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "25356:50:4"}, "scope": 4542, "src": "25261:1524:4", "stateMutability": "view", "virtual": false, "visibility": "internal"}, {"body": {"id": 3874, "nodeType": "Block", "src": "27086:376:4", "statements": [{"assignments": [3814], "declarations": [{"constant": false, "id": 3814, "mutability": "mutable", "name": "pointNumber", "nameLocation": "27104:11:4", "nodeType": "VariableDeclaration", "scope": 3874, "src": "27096:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3813, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27096:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3819, "initialValue": {"expression": {"baseExpression": {"id": 3815, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "27118:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 3817, "indexExpression": {"id": 3816, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3806, "src": "27132:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "27118:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 3818, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "27141:6:4", "memberName": "length", "nodeType": "MemberAccess", "src": "27118:29:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "27096:51:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3822, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3820, "name": "pointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3814, "src": "27161:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 3821, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "27175:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "27161:15:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3873, "nodeType": "IfStatement", "src": "27157:299:4", "trueBody": {"id": 3872, "nodeType": "Block", "src": "27178:278:4", "statements": [{"assignments": [3825], "declarations": [{"constant": false, "id": 3825, "mutability": "mutable", "name": "uPoint", "nameLocation": "27211:6:4", "nodeType": "VariableDeclaration", "scope": 3872, "src": "27192:25:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 3824, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3823, "name": "PointVoting", "nameLocations": ["27192:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "27192:11:4"}, "referencedDeclaration": 2203, "src": "27192:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 3833, "initialValue": {"baseExpression": {"baseExpression": {"id": 3826, "name": "mapUserPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2286, "src": "27220:13:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage_$", "typeString": "mapping(address => struct PointVoting storage ref[] storage ref)"}}, "id": 3828, "indexExpression": {"id": 3827, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3806, "src": "27234:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "27220:22:4", "typeDescriptions": {"typeIdentifier": "t_array$_t_struct$_PointVoting_$2203_storage_$dyn_storage", "typeString": "struct PointVoting storage ref[] storage ref"}}, "id": 3832, "indexExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3831, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3829, "name": "pointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3814, "src": "27243:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"hexValue": "31", "id": 3830, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "27257:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "27243:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "27220:39:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "27192:67:4"}, {"expression": {"id": 3853, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 3834, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3825, "src": "27273:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3836, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "27280:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "27273:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 3852, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3837, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3825, "src": "27288:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3838, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "27295:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "27288:12:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_int64", "typeString": "int64"}, "id": 3850, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"id": 3843, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3808, "src": "27316:2:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 3842, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27310:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 3841, "name": "int64", "nodeType": "ElementaryTypeName", "src": "27310:5:4", "typeDescriptions": {}}}, "id": 3844, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27310:9:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"arguments": [{"expression": {"id": 3847, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3825, "src": "27328:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3848, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "27335:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "27328:9:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 3846, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27322:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 3845, "name": "int64", "nodeType": "ElementaryTypeName", "src": "27322:5:4", "typeDescriptions": {}}}, "id": 3849, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27322:16:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "src": "27310:28:4", "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int64", "typeString": "int64"}], "id": 3840, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27303:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 3839, "name": "int128", "nodeType": "ElementaryTypeName", "src": "27303:6:4", "typeDescriptions": {}}}, "id": 3851, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27303:36:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "27288:51:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "27273:66:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 3854, "nodeType": "ExpressionStatement", "src": "27273:66:4"}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 3858, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3855, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3825, "src": "27357:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3856, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "27364:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "27357:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 3857, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "27371:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "27357:15:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3871, "nodeType": "IfStatement", "src": "27353:93:4", "trueBody": {"id": 3870, "nodeType": "Block", "src": "27374:72:4", "statements": [{"expression": {"id": 3868, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3859, "name": "vBalance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3811, "src": "27392:8:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"arguments": [{"expression": {"id": 3864, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3825, "src": "27418:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3865, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "27425:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "27418:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int128", "typeString": "int128"}], "id": 3863, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27411:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int256_$", "typeString": "type(int256)"}, "typeName": {"id": 3862, "name": "int256", "nodeType": "ElementaryTypeName", "src": "27411:6:4", "typeDescriptions": {}}}, "id": 3866, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27411:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int256", "typeString": "int256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int256", "typeString": "int256"}], "id": 3861, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27403:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3860, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27403:7:4", "typeDescriptions": {}}}, "id": 3867, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27403:28:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "27392:39:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3869, "nodeType": "ExpressionStatement", "src": "27392:39:4"}]}}]}}]}, "documentation": {"id": 3804, "nodeType": "StructuredDocumentation", "src": "26791:195:4", "text": "@dev Gets the voting power for an `account` at time `ts`.\n @param account Account address.\n @param ts Time to get voting power at.\n @return vBalance Account voting power."}, "id": 3875, "implemented": true, "kind": "function", "modifiers": [], "name": "_balanceOfLocked", "nameLocation": "27000:16:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3809, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3806, "mutability": "mutable", "name": "account", "nameLocation": "27025:7:4", "nodeType": "VariableDeclaration", "scope": 3875, "src": "27017:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3805, "name": "address", "nodeType": "ElementaryTypeName", "src": "27017:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3808, "mutability": "mutable", "name": "ts", "nameLocation": "27041:2:4", "nodeType": "VariableDeclaration", "scope": 3875, "src": "27034:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 3807, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "27034:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "src": "27016:28:4"}, "returnParameters": {"id": 3812, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3811, "mutability": "mutable", "name": "vBalance", "nameLocation": "27076:8:4", "nodeType": "VariableDeclaration", "scope": 3875, "src": "27068:16:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3810, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27068:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "27067:18:4"}, "scope": 4542, "src": "26991:471:4", "stateMutability": "view", "virtual": false, "visibility": "internal"}, {"baseFunctions": [5149], "body": {"id": 3894, "nodeType": "Block", "src": "27687:69:4", "statements": [{"expression": {"id": 3892, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3884, "name": "balance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3882, "src": "27697:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"baseExpression": {"id": 3887, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "27715:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3889, "indexExpression": {"id": 3888, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3878, "src": "27733:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "27715:26:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "id": 3890, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "27742:6:4", "memberName": "amount", "nodeType": "MemberAccess", "referencedDeclaration": 2189, "src": "27715:33:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3886, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27707:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3885, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27707:7:4", "typeDescriptions": {}}}, "id": 3891, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27707:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "27697:52:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3893, "nodeType": "ExpressionStatement", "src": "27697:52:4"}]}, "documentation": {"id": 3876, "nodeType": "StructuredDocumentation", "src": "27468:131:4", "text": "@dev Gets the account balance in native token.\n @param account Account address.\n @return balance Account balance."}, "functionSelector": "70a08231", "id": 3895, "implemented": true, "kind": "function", "modifiers": [], "name": "balanceOf", "nameLocation": "27613:9:4", "nodeType": "FunctionDefinition", "overrides": {"id": 3880, "nodeType": "OverrideSpecifier", "overrides": [], "src": "27652:8:4"}, "parameters": {"id": 3879, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3878, "mutability": "mutable", "name": "account", "nameLocation": "27631:7:4", "nodeType": "VariableDeclaration", "scope": 3895, "src": "27623:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3877, "name": "address", "nodeType": "ElementaryTypeName", "src": "27623:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "27622:17:4"}, "returnParameters": {"id": 3883, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3882, "mutability": "mutable", "name": "balance", "nameLocation": "27678:7:4", "nodeType": "VariableDeclaration", "scope": 3895, "src": "27670:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3881, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27670:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "27669:17:4"}, "scope": 4542, "src": "27604:152:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 3913, "nodeType": "Block", "src": "27972:73:4", "statements": [{"expression": {"id": 3911, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3903, "name": "unlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3901, "src": "27982:10:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"baseExpression": {"id": 3906, "name": "mapLockedBalances", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2273, "src": "28003:17:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_struct$_LockedBalance_$2192_storage_$", "typeString": "mapping(address => struct LockedBalance storage ref)"}}, "id": 3908, "indexExpression": {"id": 3907, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3898, "src": "28021:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "28003:26:4", "typeDescriptions": {"typeIdentifier": "t_struct$_LockedBalance_$2192_storage", "typeString": "struct LockedBalance storage ref"}}, "id": 3909, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "28030:7:4", "memberName": "endTime", "nodeType": "MemberAccess", "referencedDeclaration": 2191, "src": "28003:34:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 3905, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "27995:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3904, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27995:7:4", "typeDescriptions": {}}}, "id": 3910, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "27995:43:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "27982:56:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3912, "nodeType": "ExpressionStatement", "src": "27982:56:4"}]}, "documentation": {"id": 3896, "nodeType": "StructuredDocumentation", "src": "27762:126:4", "text": "@dev Gets the `account`'s lock end time.\n @param account Account address.\n @return unlockTime Lock end time."}, "functionSelector": "4deafcae", "id": 3914, "implemented": true, "kind": "function", "modifiers": [], "name": "lockedEnd", "nameLocation": "27902:9:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3899, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3898, "mutability": "mutable", "name": "account", "nameLocation": "27920:7:4", "nodeType": "VariableDeclaration", "scope": 3914, "src": "27912:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3897, "name": "address", "nodeType": "ElementaryTypeName", "src": "27912:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "27911:17:4"}, "returnParameters": {"id": 3902, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3901, "mutability": "mutable", "name": "unlockTime", "nameLocation": "27960:10:4", "nodeType": "VariableDeclaration", "scope": 3914, "src": "27952:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3900, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "27952:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "27951:20:4"}, "scope": 4542, "src": "27893:152:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 3949, "nodeType": "Block", "src": "28338:385:4", "statements": [{"assignments": [3926, null], "declarations": [{"constant": false, "id": 3926, "mutability": "mutable", "name": "uPoint", "nameLocation": "28440:6:4", "nodeType": "VariableDeclaration", "scope": 3949, "src": "28421:25:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 3925, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3924, "name": "PointVoting", "nameLocations": ["28421:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "28421:11:4"}, "referencedDeclaration": 2203, "src": "28421:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, null], "id": 3931, "initialValue": {"arguments": [{"id": 3928, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3919, "src": "28470:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 3929, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3917, "src": "28483:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 3927, "name": "_findPointByBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3803, "src": "28452:17:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$_t_address_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256,address) view returns (struct PointVoting memory,uint256)"}}, "id": 3930, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "28452:39:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "VariableDeclarationStatement", "src": "28420:71:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3938, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 3932, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3926, "src": "28619:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3933, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "28626:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "28619:18:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3936, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3934, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3919, "src": "28641:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 3935, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "28655:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "28641:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3937, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "28640:17:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "28619:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3948, "nodeType": "IfStatement", "src": "28615:102:4", "trueBody": {"id": 3947, "nodeType": "Block", "src": "28659:58:4", "statements": [{"expression": {"id": 3945, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 3939, "name": "balance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3922, "src": "28673:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 3942, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3926, "src": "28691:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 3943, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "28698:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "28691:14:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 3941, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "28683:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 3940, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "28683:7:4", "typeDescriptions": {}}}, "id": 3944, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "28683:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "28673:33:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 3946, "nodeType": "ExpressionStatement", "src": "28673:33:4"}]}}]}, "documentation": {"id": 3915, "nodeType": "StructuredDocumentation", "src": "28051:183:4", "text": "@dev Gets the account balance at a specific block number.\n @param account Account address.\n @param blockNumber Block number.\n @return balance Account balance."}, "functionSelector": "4ee2cd7e", "id": 3950, "implemented": true, "kind": "function", "modifiers": [], "name": "balanceOfAt", "nameLocation": "28248:11:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3920, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3917, "mutability": "mutable", "name": "account", "nameLocation": "28268:7:4", "nodeType": "VariableDeclaration", "scope": 3950, "src": "28260:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3916, "name": "address", "nodeType": "ElementaryTypeName", "src": "28260:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 3919, "mutability": "mutable", "name": "blockNumber", "nameLocation": "28285:11:4", "nodeType": "VariableDeclaration", "scope": 3950, "src": "28277:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3918, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "28277:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "28259:38:4"}, "returnParameters": {"id": 3923, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3922, "mutability": "mutable", "name": "balance", "nameLocation": "28329:7:4", "nodeType": "VariableDeclaration", "scope": 3950, "src": "28321:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3921, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "28321:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "28320:17:4"}, "scope": 4542, "src": "28239:484:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"baseFunctions": [5065], "body": {"id": 3968, "nodeType": "Block", "src": "28879:74:4", "statements": [{"expression": {"arguments": [{"id": 3960, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3953, "src": "28913:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"expression": {"id": 3963, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "28929:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3964, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "28935:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "28929:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3962, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "28922:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 3961, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "28922:6:4", "typeDescriptions": {}}}, "id": 3965, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "28922:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 3959, "name": "_balanceOfLocked", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3875, "src": "28896:16:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_address_$_t_uint64_$returns$_t_uint256_$", "typeString": "function (address,uint64) view returns (uint256)"}}, "id": 3966, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "28896:50:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 3958, "id": 3967, "nodeType": "Return", "src": "28889:57:4"}]}, "documentation": {"id": 3951, "nodeType": "StructuredDocumentation", "src": "28729:71:4", "text": "@dev Gets the voting power.\n @param account Account address."}, "functionSelector": "9ab24eb0", "id": 3969, "implemented": true, "kind": "function", "modifiers": [], "name": "getVotes", "nameLocation": "28814:8:4", "nodeType": "FunctionDefinition", "overrides": {"id": 3955, "nodeType": "OverrideSpecifier", "overrides": [], "src": "28852:8:4"}, "parameters": {"id": 3954, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3953, "mutability": "mutable", "name": "account", "nameLocation": "28831:7:4", "nodeType": "VariableDeclaration", "scope": 3969, "src": "28823:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 3952, "name": "address", "nodeType": "ElementaryTypeName", "src": "28823:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "28822:17:4"}, "returnParameters": {"id": 3958, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3957, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 3969, "src": "28870:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3956, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "28870:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "28869:9:4"}, "scope": 4542, "src": "28805:148:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 4083, "nodeType": "Block", "src": "29494:937:4", "statements": [{"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 3983, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 3980, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3972, "src": "29590:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"expression": {"id": 3981, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "29604:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3982, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "29610:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "29604:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "29590:26:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 3991, "nodeType": "IfStatement", "src": "29586:107:4", "trueBody": {"id": 3990, "nodeType": "Block", "src": "29618:75:4", "statements": [{"errorCall": {"arguments": [{"id": 3985, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3972, "src": "29656:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"expression": {"id": 3986, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "29669:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 3987, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "29675:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "29669:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 3984, "name": "WrongBlockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5035, "src": "29639:16:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", "typeString": "function (uint256,uint256) pure"}}, "id": 3988, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "29639:43:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 3989, "nodeType": "RevertStatement", "src": "29632:50:4"}]}}, {"assignments": [3993], "declarations": [{"constant": false, "id": 3993, "mutability": "mutable", "name": "minPointNumber", "nameLocation": "29785:14:4", "nodeType": "VariableDeclaration", "scope": 4083, "src": "29777:22:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3992, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "29777:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 3994, "nodeType": "VariableDeclarationStatement", "src": "29777:22:4"}, {"expression": {"id": 4005, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"components": [{"id": 3995, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "29810:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, {"id": 3996, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3993, "src": "29817:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 3997, "isConstant": false, "isInlineArray": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "TupleExpression", "src": "29809:23:4", "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"id": 3999, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3972, "src": "29853:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"arguments": [{"hexValue": "30", "id": 4002, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "29874:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 4001, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "29866:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4000, "name": "address", "nodeType": "ElementaryTypeName", "src": "29866:7:4", "typeDescriptions": {}}}, "id": 4003, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "29866:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 3998, "name": "_findPointByBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3803, "src": "29835:17:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$_t_address_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256,address) view returns (struct PointVoting memory,uint256)"}}, "id": 4004, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "29835:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "src": "29809:68:4", "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4006, "nodeType": "ExpressionStatement", "src": "29809:68:4"}, {"assignments": [4008], "declarations": [{"constant": false, "id": 4008, "mutability": "mutable", "name": "dBlock", "nameLocation": "29896:6:4", "nodeType": "VariableDeclaration", "scope": 4083, "src": "29888:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4007, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "29888:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4009, "nodeType": "VariableDeclarationStatement", "src": "29888:14:4"}, {"assignments": [4011], "declarations": [{"constant": false, "id": 4011, "mutability": "mutable", "name": "dt", "nameLocation": "29920:2:4", "nodeType": "VariableDeclaration", "scope": 4083, "src": "29912:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4010, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "29912:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4012, "nodeType": "VariableDeclarationStatement", "src": "29912:10:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4015, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4013, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3993, "src": "29936:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"id": 4014, "name": "totalNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2275, "src": "29953:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "29936:31:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 4058, "nodeType": "Block", "src": "30172:111:4", "statements": [{"expression": {"id": 4048, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4042, "name": "dBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4008, "src": "30186:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4047, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4043, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "30195:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4044, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "30201:6:4", "memberName": "number", "nodeType": "MemberAccess", "src": "30195:12:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 4045, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30210:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4046, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30216:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "30210:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30195:32:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "30186:41:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4049, "nodeType": "ExpressionStatement", "src": "30186:41:4"}, {"expression": {"id": 4056, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4050, "name": "dt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4011, "src": "30241:2:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4055, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4051, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "30246:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4052, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "30252:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "30246:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 4053, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30264:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4054, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30270:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "30264:8:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30246:26:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "30241:31:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4057, "nodeType": "ExpressionStatement", "src": "30241:31:4"}]}, "id": 4059, "nodeType": "IfStatement", "src": "29932:351:4", "trueBody": {"id": 4041, "nodeType": "Block", "src": "29969:197:4", "statements": [{"assignments": [4018], "declarations": [{"constant": false, "id": 4018, "mutability": "mutable", "name": "pointNext", "nameLocation": "30002:9:4", "nodeType": "VariableDeclaration", "scope": 4041, "src": "29983:28:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4017, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4016, "name": "PointVoting", "nameLocations": ["29983:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "29983:11:4"}, "referencedDeclaration": 2203, "src": "29983:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 4024, "initialValue": {"baseExpression": {"id": 4019, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "30014:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 4023, "indexExpression": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4022, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4020, "name": "minPointNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3993, "src": "30030:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 4021, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "30047:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "30030:18:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "30014:35:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "29983:66:4"}, {"expression": {"id": 4031, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4025, "name": "dBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4008, "src": "30063:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4030, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4026, "name": "pointNext", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4018, "src": "30072:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4027, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30082:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "30072:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 4028, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30096:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4029, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30102:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "30096:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30072:41:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30063:50:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4032, "nodeType": "ExpressionStatement", "src": "30063:50:4"}, {"expression": {"id": 4039, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4033, "name": "dt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4011, "src": "30127:2:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4038, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4034, "name": "pointNext", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4018, "src": "30132:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4035, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30142:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "30132:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 4036, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30147:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4037, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30153:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "30147:8:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30132:23:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30127:28:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4040, "nodeType": "ExpressionStatement", "src": "30127:28:4"}]}}, {"expression": {"id": 4063, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4060, "name": "blockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3978, "src": "30292:9:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 4061, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30304:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4062, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30310:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "30304:8:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30292:20:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4064, "nodeType": "ExpressionStatement", "src": "30292:20:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4067, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4065, "name": "dBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4008, "src": "30326:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 4066, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "30335:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "30326:10:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4082, "nodeType": "IfStatement", "src": "30322:103:4", "trueBody": {"id": 4081, "nodeType": "Block", "src": "30338:87:4", "statements": [{"expression": {"id": 4079, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4068, "name": "blockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3978, "src": "30352:9:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4078, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4075, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4069, "name": "dt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4011, "src": "30366:2:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4073, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4070, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3972, "src": "30372:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"expression": {"id": 4071, "name": "point", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3976, "src": "30386:5:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4072, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "30392:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "30386:17:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "30372:31:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 4074, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "30371:33:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "30366:38:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 4076, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "30365:40:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 4077, "name": "dBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4008, "src": "30408:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "30365:49:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "30352:62:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4080, "nodeType": "ExpressionStatement", "src": "30352:62:4"}]}}]}, "documentation": {"id": 3970, "nodeType": "StructuredDocumentation", "src": "28959:418:4", "text": "@dev Gets the block time adjustment for two neighboring points.\n @notice `blockNumber` must not be lower than the contract deployment block number,\n as the behavior and the return value is undefined.\n @param blockNumber Block number.\n @return point Point with the specified block number (or closest to it).\n @return blockTime Adjusted block time of the neighboring point."}, "id": 4084, "implemented": true, "kind": "function", "modifiers": [], "name": "_getBlockTime", "nameLocation": "29391:13:4", "nodeType": "FunctionDefinition", "parameters": {"id": 3973, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3972, "mutability": "mutable", "name": "blockNumber", "nameLocation": "29413:11:4", "nodeType": "VariableDeclaration", "scope": 4084, "src": "29405:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3971, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "29405:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "29404:21:4"}, "returnParameters": {"id": 3979, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 3976, "mutability": "mutable", "name": "point", "nameLocation": "29468:5:4", "nodeType": "VariableDeclaration", "scope": 4084, "src": "29449:24:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 3975, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 3974, "name": "PointVoting", "nameLocations": ["29449:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "29449:11:4"}, "referencedDeclaration": 2203, "src": "29449:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, {"constant": false, "id": 3978, "mutability": "mutable", "name": "blockTime", "nameLocation": "29483:9:4", "nodeType": "VariableDeclaration", "scope": 4084, "src": "29475:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 3977, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "29475:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "29448:45:4"}, "scope": 4542, "src": "29382:1049:4", "stateMutability": "view", "virtual": false, "visibility": "internal"}, {"baseFunctions": [5075], "body": {"id": 4150, "nodeType": "Block", "src": "30732:482:4", "statements": [{"assignments": [4097, null], "declarations": [{"constant": false, "id": 4097, "mutability": "mutable", "name": "uPoint", "nameLocation": "30823:6:4", "nodeType": "VariableDeclaration", "scope": 4150, "src": "30804:25:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4096, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4095, "name": "PointVoting", "nameLocations": ["30804:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "30804:11:4"}, "referencedDeclaration": 2203, "src": "30804:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, null], "id": 4102, "initialValue": {"arguments": [{"id": 4099, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4089, "src": "30853:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 4100, "name": "account", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4087, "src": "30866:7:4", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 4098, "name": "_findPointByBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3803, "src": "30835:17:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$_t_address_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256,address) view returns (struct PointVoting memory,uint256)"}}, "id": 4101, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "30835:39:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "VariableDeclarationStatement", "src": "30803:71:4"}, {"assignments": [null, 4104], "declarations": [null, {"constant": false, "id": 4104, "mutability": "mutable", "name": "blockTime", "nameLocation": "30934:9:4", "nodeType": "VariableDeclaration", "scope": 4150, "src": "30926:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4103, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "30926:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4108, "initialValue": {"arguments": [{"id": 4106, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4089, "src": "30961:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4105, "name": "_getBlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4084, "src": "30947:13:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256) view returns (struct PointVoting memory,uint256)"}}, "id": 4107, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "30947:26:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "VariableDeclarationStatement", "src": "30923:50:4"}, {"expression": {"id": 4131, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 4109, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4097, "src": "31032:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4111, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "31039:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "31032:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 4130, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4112, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4097, "src": "31047:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4113, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "31054:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "31047:12:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_int64", "typeString": "int64"}, "id": 4128, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"arguments": [{"id": 4120, "name": "blockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4104, "src": "31082:9:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4119, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31075:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 4118, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "31075:6:4", "typeDescriptions": {}}}, "id": 4121, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31075:17:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4117, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31069:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 4116, "name": "int64", "nodeType": "ElementaryTypeName", "src": "31069:5:4", "typeDescriptions": {}}}, "id": 4122, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31069:24:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"arguments": [{"expression": {"id": 4125, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4097, "src": "31102:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4126, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "31109:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "31102:9:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4124, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31096:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 4123, "name": "int64", "nodeType": "ElementaryTypeName", "src": "31096:5:4", "typeDescriptions": {}}}, "id": 4127, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31096:16:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "src": "31069:43:4", "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int64", "typeString": "int64"}], "id": 4115, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31062:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 4114, "name": "int128", "nodeType": "ElementaryTypeName", "src": "31062:6:4", "typeDescriptions": {}}}, "id": 4129, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31062:51:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "31047:66:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "31032:81:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 4132, "nodeType": "ExpressionStatement", "src": "31032:81:4"}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 4136, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4133, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4097, "src": "31127:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4134, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "31134:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "31127:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 4135, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "31141:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "31127:15:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4149, "nodeType": "IfStatement", "src": "31123:85:4", "trueBody": {"id": 4148, "nodeType": "Block", "src": "31144:64:4", "statements": [{"expression": {"id": 4146, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4137, "name": "balance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4093, "src": "31158:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"arguments": [{"expression": {"id": 4142, "name": "uPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4097, "src": "31184:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4143, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "31191:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "31184:11:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int128", "typeString": "int128"}], "id": 4141, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31176:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 4140, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "31176:7:4", "typeDescriptions": {}}}, "id": 4144, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31176:20:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 4139, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "31168:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 4138, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "31168:7:4", "typeDescriptions": {}}}, "id": 4145, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "31168:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "31158:39:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4147, "nodeType": "ExpressionStatement", "src": "31158:39:4"}]}}]}, "documentation": {"id": 4085, "nodeType": "StructuredDocumentation", "src": "30437:183:4", "text": "@dev Gets voting power at a specific block number.\n @param account Account address.\n @param blockNumber Block number.\n @return balance Voting balance / power."}, "functionSelector": "3a46b1a8", "id": 4151, "implemented": true, "kind": "function", "modifiers": [], "name": "getPastVotes", "nameLocation": "30634:12:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4091, "nodeType": "OverrideSpecifier", "overrides": [], "src": "30697:8:4"}, "parameters": {"id": 4090, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4087, "mutability": "mutable", "name": "account", "nameLocation": "30655:7:4", "nodeType": "VariableDeclaration", "scope": 4151, "src": "30647:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4086, "name": "address", "nodeType": "ElementaryTypeName", "src": "30647:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4089, "mutability": "mutable", "name": "blockNumber", "nameLocation": "30672:11:4", "nodeType": "VariableDeclaration", "scope": 4151, "src": "30664:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4088, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "30664:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "30646:38:4"}, "returnParameters": {"id": 4094, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4093, "mutability": "mutable", "name": "balance", "nameLocation": "30723:7:4", "nodeType": "VariableDeclaration", "scope": 4151, "src": "30715:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4092, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "30715:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "30714:17:4"}, "scope": 4542, "src": "30625:589:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 4264, "nodeType": "Block", "src": "31589:786:4", "statements": [{"assignments": [4163], "declarations": [{"constant": false, "id": 4163, "mutability": "mutable", "name": "tStep", "nameLocation": "31655:5:4", "nodeType": "VariableDeclaration", "scope": 4264, "src": "31648:12:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 4162, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "31648:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "id": 4171, "initialValue": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4170, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4167, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4164, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "31664:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4165, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "31674:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "31664:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "/", "rightExpression": {"id": 4166, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "31679:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "31664:19:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "id": 4168, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "31663:21:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"id": 4169, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "31687:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "31663:28:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "VariableDeclarationStatement", "src": "31648:43:4"}, {"body": {"id": 4245, "nodeType": "Block", "src": "31735:533:4", "statements": [{"id": 4186, "nodeType": "UncheckedBlock", "src": "31800:56:4", "statements": [{"expression": {"id": 4184, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4182, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "31828:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4183, "name": "WEEK", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2247, "src": "31837:4:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "31828:13:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 4185, "nodeType": "ExpressionStatement", "src": "31828:13:4"}]}, {"assignments": [4188], "declarations": [{"constant": false, "id": 4188, "mutability": "mutable", "name": "dSlope", "nameLocation": "31876:6:4", "nodeType": "VariableDeclaration", "scope": 4245, "src": "31869:13:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}, "typeName": {"id": 4187, "name": "int128", "nodeType": "ElementaryTypeName", "src": "31869:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "visibility": "internal"}], "id": 4189, "nodeType": "VariableDeclarationStatement", "src": "31869:13:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4192, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4190, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "31900:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"id": 4191, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4157, "src": "31908:2:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "31900:10:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseBody": {"id": 4204, "nodeType": "Block", "src": "31961:64:4", "statements": [{"expression": {"id": 4202, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4198, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4188, "src": "31979:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"baseExpression": {"id": 4199, "name": "mapSlopeChanges", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2290, "src": "31988:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint64_$_t_int128_$", "typeString": "mapping(uint64 => int128)"}}, "id": 4201, "indexExpression": {"id": 4200, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "32004:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "31988:22:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "31979:31:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 4203, "nodeType": "ExpressionStatement", "src": "31979:31:4"}]}, "id": 4205, "nodeType": "IfStatement", "src": "31896:129:4", "trueBody": {"id": 4197, "nodeType": "Block", "src": "31912:43:4", "statements": [{"expression": {"id": 4195, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4193, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "31930:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4194, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4157, "src": "31938:2:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "31930:10:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 4196, "nodeType": "ExpressionStatement", "src": "31930:10:4"}]}}, {"expression": {"id": 4225, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 4206, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32038:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4208, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "32048:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "32038:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 4224, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4209, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32056:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4210, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "32066:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "32056:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": "*", "rightExpression": {"arguments": [{"commonType": {"typeIdentifier": "t_int64", "typeString": "int64"}, "id": 4222, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"arguments": [{"id": 4215, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "32087:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4214, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32081:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 4213, "name": "int64", "nodeType": "ElementaryTypeName", "src": "32081:5:4", "typeDescriptions": {}}}, "id": 4216, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32081:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"arguments": [{"expression": {"id": 4219, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32102:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4220, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "32112:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "32102:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4218, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32096:5:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int64_$", "typeString": "type(int64)"}, "typeName": {"id": 4217, "name": "int64", "nodeType": "ElementaryTypeName", "src": "32096:5:4", "typeDescriptions": {}}}, "id": 4221, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32096:19:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}, "src": "32081:34:4", "typeDescriptions": {"typeIdentifier": "t_int64", "typeString": "int64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int64", "typeString": "int64"}], "id": 4212, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32074:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_int128_$", "typeString": "type(int128)"}, "typeName": {"id": 4211, "name": "int128", "nodeType": "ElementaryTypeName", "src": "32074:6:4", "typeDescriptions": {}}}, "id": 4223, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32074:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "32056:60:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "32038:78:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 4226, "nodeType": "ExpressionStatement", "src": "32038:78:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "id": 4229, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4227, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "32134:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"id": 4228, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4157, "src": "32143:2:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "32134:11:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4232, "nodeType": "IfStatement", "src": "32130:55:4", "trueBody": {"id": 4231, "nodeType": "Block", "src": "32147:38:4", "statements": [{"id": 4230, "nodeType": "Break", "src": "32165:5:4"}]}}, {"expression": {"id": 4237, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 4233, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32198:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4235, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "32208:5:4", "memberName": "slope", "nodeType": "MemberAccess", "referencedDeclaration": 2196, "src": "32198:15:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4236, "name": "dSlope", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4188, "src": "32217:6:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "src": "32198:25:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "id": 4238, "nodeType": "ExpressionStatement", "src": "32198:25:4"}, {"expression": {"id": 4243, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"expression": {"id": 4239, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32237:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4241, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "32247:2:4", "memberName": "ts", "nodeType": "MemberAccess", "referencedDeclaration": 2198, "src": "32237:12:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4242, "name": "tStep", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4163, "src": "32252:5:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "src": "32237:20:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "id": 4244, "nodeType": "ExpressionStatement", "src": "32237:20:4"}]}, "condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4178, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4176, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4173, "src": "31721:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"hexValue": "323535", "id": 4177, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "31725:3:4", "typeDescriptions": {"typeIdentifier": "t_rational_255_by_1", "typeString": "int_const 255"}, "value": "255"}, "src": "31721:7:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4246, "initializationExpression": {"assignments": [4173], "declarations": [{"constant": false, "id": 4173, "mutability": "mutable", "name": "i", "nameLocation": "31714:1:4", "nodeType": "VariableDeclaration", "scope": 4246, "src": "31706:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4172, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "31706:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4175, "initialValue": {"hexValue": "30", "id": 4174, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "31718:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "nodeType": "VariableDeclarationStatement", "src": "31706:13:4"}, "isSimpleCounterLoop": true, "loopExpression": {"expression": {"id": 4180, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": true, "src": "31730:3:4", "subExpression": {"id": 4179, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4173, "src": "31732:1:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4181, "nodeType": "ExpressionStatement", "src": "31730:3:4"}, "nodeType": "ForStatement", "src": "31701:567:4"}, {"condition": {"commonType": {"typeIdentifier": "t_int128", "typeString": "int128"}, "id": 4250, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4247, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32282:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4248, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "32292:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "32282:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": {"hexValue": "30", "id": 4249, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "32299:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}, "src": "32282:18:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4263, "nodeType": "IfStatement", "src": "32278:91:4", "trueBody": {"id": 4262, "nodeType": "Block", "src": "32302:67:4", "statements": [{"expression": {"id": 4260, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4251, "name": "vSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4160, "src": "32316:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"arguments": [{"expression": {"id": 4256, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4155, "src": "32342:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4257, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "32352:4:4", "memberName": "bias", "nodeType": "MemberAccess", "referencedDeclaration": 2194, "src": "32342:14:4", "typeDescriptions": {"typeIdentifier": "t_int128", "typeString": "int128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_int128", "typeString": "int128"}], "id": 4255, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32334:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint128_$", "typeString": "type(uint128)"}, "typeName": {"id": 4254, "name": "uint128", "nodeType": "ElementaryTypeName", "src": "32334:7:4", "typeDescriptions": {}}}, "id": 4258, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32334:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 4253, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32326:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 4252, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "32326:7:4", "typeDescriptions": {}}}, "id": 4259, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32326:32:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "32316:42:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4261, "nodeType": "ExpressionStatement", "src": "32316:42:4"}]}}]}, "documentation": {"id": 4152, "nodeType": "StructuredDocumentation", "src": "31220:258:4", "text": "@dev Calculate total voting power at some point in the past.\n @param lastPoint The point (bias/slope) to start the search from.\n @param ts Time to calculate the total voting power at.\n @return vSupply Total voting power at that time."}, "id": 4265, "implemented": true, "kind": "function", "modifiers": [], "name": "_supplyLockedAt", "nameLocation": "31492:15:4", "nodeType": "FunctionDefinition", "parameters": {"id": 4158, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4155, "mutability": "mutable", "name": "lastPoint", "nameLocation": "31527:9:4", "nodeType": "VariableDeclaration", "scope": 4265, "src": "31508:28:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4154, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4153, "name": "PointVoting", "nameLocations": ["31508:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "31508:11:4"}, "referencedDeclaration": 2203, "src": "31508:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, {"constant": false, "id": 4157, "mutability": "mutable", "name": "ts", "nameLocation": "31545:2:4", "nodeType": "VariableDeclaration", "scope": 4265, "src": "31538:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}, "typeName": {"id": 4156, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "31538:6:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "visibility": "internal"}], "src": "31507:41:4"}, "returnParameters": {"id": 4161, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4160, "mutability": "mutable", "name": "vSupply", "nameLocation": "31580:7:4", "nodeType": "VariableDeclaration", "scope": 4265, "src": "31572:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4159, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "31572:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "31571:17:4"}, "scope": 4542, "src": "31483:892:4", "stateMutability": "view", "virtual": false, "visibility": "internal"}, {"baseFunctions": [5141], "body": {"id": 4274, "nodeType": "Block", "src": "32517:30:4", "statements": [{"expression": {"id": 4272, "name": "supply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2268, "src": "32534:6:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 4271, "id": 4273, "nodeType": "Return", "src": "32527:13:4"}]}, "documentation": {"id": 4266, "nodeType": "StructuredDocumentation", "src": "32381:69:4", "text": "@dev Gets total token supply.\n @return Total token supply."}, "functionSelector": "18160ddd", "id": 4275, "implemented": true, "kind": "function", "modifiers": [], "name": "totalSupply", "nameLocation": "32464:11:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4268, "nodeType": "OverrideSpecifier", "overrides": [], "src": "32490:8:4"}, "parameters": {"id": 4267, "nodeType": "ParameterList", "parameters": [], "src": "32475:2:4"}, "returnParameters": {"id": 4271, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4270, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4275, "src": "32508:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4269, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "32508:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "32507:9:4"}, "scope": 4542, "src": "32455:92:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 4311, "nodeType": "Block", "src": "32807:389:4", "statements": [{"assignments": [4285, null], "declarations": [{"constant": false, "id": 4285, "mutability": "mutable", "name": "sPoint", "nameLocation": "32909:6:4", "nodeType": "VariableDeclaration", "scope": 4311, "src": "32890:25:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4284, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4283, "name": "PointVoting", "nameLocations": ["32890:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "32890:11:4"}, "referencedDeclaration": 2203, "src": "32890:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, null], "id": 4293, "initialValue": {"arguments": [{"id": 4287, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4278, "src": "32939:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"arguments": [{"hexValue": "30", "id": 4290, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "32960:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 4289, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "32952:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4288, "name": "address", "nodeType": "ElementaryTypeName", "src": "32952:7:4", "typeDescriptions": {}}}, "id": 4291, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32952:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_address", "typeString": "address"}], "id": 4286, "name": "_findPointByBlock", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3803, "src": "32921:17:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$_t_address_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256,address) view returns (struct PointVoting memory,uint256)"}}, "id": 4292, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "32921:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "VariableDeclarationStatement", "src": "32889:74:4"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4300, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4294, "name": "sPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4285, "src": "33091:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4295, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "33098:11:4", "memberName": "blockNumber", "nodeType": "MemberAccess", "referencedDeclaration": 2200, "src": "33091:18:4", "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": {"components": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4298, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4296, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4278, "src": "33113:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "+", "rightExpression": {"hexValue": "31", "id": 4297, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "33127:1:4", "typeDescriptions": {"typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1"}, "value": "1"}, "src": "33113:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "id": 4299, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "33112:17:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "33091:38:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4310, "nodeType": "IfStatement", "src": "33087:103:4", "trueBody": {"id": 4309, "nodeType": "Block", "src": "33131:59:4", "statements": [{"expression": {"id": 4307, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4301, "name": "supplyAt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4281, "src": "33145:8:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [{"expression": {"id": 4304, "name": "sPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4285, "src": "33164:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, "id": 4305, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "33171:7:4", "memberName": "balance", "nodeType": "MemberAccess", "referencedDeclaration": 2202, "src": "33164:14:4", "typeDescriptions": {"typeIdentifier": "t_uint128", "typeString": "uint128"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint128", "typeString": "uint128"}], "id": 4303, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "33156:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 4302, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "33156:7:4", "typeDescriptions": {}}}, "id": 4306, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "33156:23:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "33145:34:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4308, "nodeType": "ExpressionStatement", "src": "33145:34:4"}]}}]}, "documentation": {"id": 4276, "nodeType": "StructuredDocumentation", "src": "32553:164:4", "text": "@dev Gets total token supply at a specific block number.\n @param blockNumber Block number.\n @return supplyAt Supply at the specified block number."}, "functionSelector": "981b24d0", "id": 4312, "implemented": true, "kind": "function", "modifiers": [], "name": "totalSupplyAt", "nameLocation": "32731:13:4", "nodeType": "FunctionDefinition", "parameters": {"id": 4279, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4278, "mutability": "mutable", "name": "blockNumber", "nameLocation": "32753:11:4", "nodeType": "VariableDeclaration", "scope": 4312, "src": "32745:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4277, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "32745:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "32744:21:4"}, "returnParameters": {"id": 4282, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4281, "mutability": "mutable", "name": "supplyAt", "nameLocation": "32797:8:4", "nodeType": "VariableDeclaration", "scope": 4312, "src": "32789:16:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4280, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "32789:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "32788:18:4"}, "scope": 4542, "src": "32722:474:4", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"body": {"id": 4335, "nodeType": "Block", "src": "33420:134:4", "statements": [{"assignments": [4322], "declarations": [{"constant": false, "id": 4322, "mutability": "mutable", "name": "lastPoint", "nameLocation": "33449:9:4", "nodeType": "VariableDeclaration", "scope": 4335, "src": "33430:28:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4321, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4320, "name": "PointVoting", "nameLocations": ["33430:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "33430:11:4"}, "referencedDeclaration": 2203, "src": "33430:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}], "id": 4326, "initialValue": {"baseExpression": {"id": 4323, "name": "mapSupplyPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2280, "src": "33461:15:4", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PointVoting_$2203_storage_$", "typeString": "mapping(uint256 => struct PointVoting storage ref)"}}, "id": 4325, "indexExpression": {"id": 4324, "name": "totalNumPoints", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2275, "src": "33477:14:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "33461:31:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage", "typeString": "struct PointVoting storage ref"}}, "nodeType": "VariableDeclarationStatement", "src": "33430:62:4"}, {"expression": {"arguments": [{"id": 4328, "name": "lastPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4322, "src": "33525:9:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, {"arguments": [{"id": 4331, "name": "ts", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4315, "src": "33543:2:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4330, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "33536:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 4329, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "33536:6:4", "typeDescriptions": {}}}, "id": 4332, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "33536:10:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4327, "name": "_supplyLockedAt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4265, "src": "33509:15:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint64_$returns$_t_uint256_$", "typeString": "function (struct PointVoting memory,uint64) view returns (uint256)"}}, "id": 4333, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "33509:38:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 4319, "id": 4334, "nodeType": "Return", "src": "33502:45:4"}]}, "documentation": {"id": 4313, "nodeType": "StructuredDocumentation", "src": "33202:141:4", "text": "@dev Calculates total voting power at time `ts`.\n @param ts Time to get total voting power at.\n @return Total voting power."}, "functionSelector": "b18f2702", "id": 4336, "implemented": true, "kind": "function", "modifiers": [], "name": "totalSupplyLockedAtT", "nameLocation": "33357:20:4", "nodeType": "FunctionDefinition", "parameters": {"id": 4316, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4315, "mutability": "mutable", "name": "ts", "nameLocation": "33386:2:4", "nodeType": "VariableDeclaration", "scope": 4336, "src": "33378:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4314, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "33378:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "33377:12:4"}, "returnParameters": {"id": 4319, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4318, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4336, "src": "33411:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4317, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "33411:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "33410:9:4"}, "scope": 4542, "src": "33348:206:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"body": {"id": 4347, "nodeType": "Block", "src": "33707:61:4", "statements": [{"expression": {"arguments": [{"expression": {"id": 4343, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "33745:5:4", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4344, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "33751:9:4", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "33745:15:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4342, "name": "totalSupplyLockedAtT", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4336, "src": "33724:20:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", "typeString": "function (uint256) view returns (uint256)"}}, "id": 4345, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "33724:37:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 4341, "id": 4346, "nodeType": "Return", "src": "33717:44:4"}]}, "documentation": {"id": 4337, "nodeType": "StructuredDocumentation", "src": "33560:83:4", "text": "@dev Calculates current total voting power.\n @return Total voting power."}, "functionSelector": "58341922", "id": 4348, "implemented": true, "kind": "function", "modifiers": [], "name": "totalSupplyLocked", "nameLocation": "33657:17:4", "nodeType": "FunctionDefinition", "parameters": {"id": 4338, "nodeType": "ParameterList", "parameters": [], "src": "33674:2:4"}, "returnParameters": {"id": 4341, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4340, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4348, "src": "33698:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4339, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "33698:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "33697:9:4"}, "scope": 4542, "src": "33648:120:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"baseFunctions": [5083], "body": {"id": 4374, "nodeType": "Block", "src": "34047:218:4", "statements": [{"assignments": [4359, 4361], "declarations": [{"constant": false, "id": 4359, "mutability": "mutable", "name": "sPoint", "nameLocation": "34077:6:4", "nodeType": "VariableDeclaration", "scope": 4374, "src": "34058:25:4", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting"}, "typeName": {"id": 4358, "nodeType": "UserDefinedTypeName", "pathNode": {"id": 4357, "name": "PointVoting", "nameLocations": ["34058:11:4"], "nodeType": "IdentifierPath", "referencedDeclaration": 2203, "src": "34058:11:4"}, "referencedDeclaration": 2203, "src": "34058:11:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_storage_ptr", "typeString": "struct PointVoting"}}, "visibility": "internal"}, {"constant": false, "id": 4361, "mutability": "mutable", "name": "blockTime", "nameLocation": "34093:9:4", "nodeType": "VariableDeclaration", "scope": 4374, "src": "34085:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4360, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "34085:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4365, "initialValue": {"arguments": [{"id": 4363, "name": "blockNumber", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4351, "src": "34120:11:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4362, "name": "_getBlockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4084, "src": "34106:13:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "function (uint256) view returns (struct PointVoting memory,uint256)"}}, "id": 4364, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34106:26:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint256_$", "typeString": "tuple(struct PointVoting memory,uint256)"}}, "nodeType": "VariableDeclarationStatement", "src": "34057:75:4"}, {"expression": {"arguments": [{"id": 4367, "name": "sPoint", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4359, "src": "34232:6:4", "typeDescriptions": {"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}}, {"arguments": [{"id": 4370, "name": "blockTime", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4361, "src": "34247:9:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4369, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "34240:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint64_$", "typeString": "type(uint64)"}, "typeName": {"id": 4368, "name": "uint64", "nodeType": "ElementaryTypeName", "src": "34240:6:4", "typeDescriptions": {}}}, "id": 4371, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34240:17:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint64", "typeString": "uint64"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_struct$_PointVoting_$2203_memory_ptr", "typeString": "struct PointVoting memory"}, {"typeIdentifier": "t_uint64", "typeString": "uint64"}], "id": 4366, "name": "_supplyLockedAt", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4265, "src": "34216:15:4", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$_t_struct$_PointVoting_$2203_memory_ptr_$_t_uint64_$returns$_t_uint256_$", "typeString": "function (struct PointVoting memory,uint64) view returns (uint256)"}}, "id": 4372, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34216:42:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "functionReturnParameters": 4356, "id": 4373, "nodeType": "Return", "src": "34209:49:4"}]}, "documentation": {"id": 4349, "nodeType": "StructuredDocumentation", "src": "33774:180:4", "text": "@dev Calculate total voting power at some point in the past.\n @param blockNumber Block number to calculate the total voting power at.\n @return Total voting power."}, "functionSelector": "8e539e8c", "id": 4375, "implemented": true, "kind": "function", "modifiers": [], "name": "getPastTotalSupply", "nameLocation": "33968:18:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4353, "nodeType": "OverrideSpecifier", "overrides": [], "src": "34020:8:4"}, "parameters": {"id": 4352, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4351, "mutability": "mutable", "name": "blockNumber", "nameLocation": "33995:11:4", "nodeType": "VariableDeclaration", "scope": 4375, "src": "33987:19:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4350, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "33987:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "33986:21:4"}, "returnParameters": {"id": 4356, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4355, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4375, "src": "34038:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4354, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "34038:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "34037:9:4"}, "scope": 4542, "src": "33959:306:4", "stateMutability": "view", "virtual": false, "visibility": "public"}, {"baseFunctions": [5203], "body": {"id": 4405, "nodeType": "Block", "src": "34561:162:4", "statements": [{"expression": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 4403, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 4396, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}, "id": 4389, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4384, "name": "interfaceId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4378, "src": "34578:11:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"arguments": [{"id": 4386, "name": "IERC20", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5192, "src": "34598:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IERC20_$5192_$", "typeString": "type(contract IERC20)"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_contract$_IERC20_$5192_$", "typeString": "type(contract IERC20)"}], "id": 4385, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "34593:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 4387, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34593:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_contract$_IERC20_$5192", "typeString": "type(contract IERC20)"}}, "id": 4388, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "34606:11:4", "memberName": "interfaceId", "nodeType": "MemberAccess", "src": "34593:24:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "src": "34578:39:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "||", "rightExpression": {"commonType": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}, "id": 4395, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4390, "name": "interfaceId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4378, "src": "34621:11:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"arguments": [{"id": 4392, "name": "IVotes", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5114, "src": "34641:6:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IVotes_$5114_$", "typeString": "type(contract IVotes)"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_contract$_IVotes_$5114_$", "typeString": "type(contract IVotes)"}], "id": 4391, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "34636:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 4393, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34636:12:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_contract$_IVotes_$5114", "typeString": "type(contract IVotes)"}}, "id": 4394, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "34649:11:4", "memberName": "interfaceId", "nodeType": "MemberAccess", "src": "34636:24:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "src": "34621:39:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "34578:82:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "||", "rightExpression": {"commonType": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}, "id": 4402, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4397, "name": "interfaceId", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4378, "src": "34676:11:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"expression": {"arguments": [{"id": 4399, "name": "IERC165", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 5204, "src": "34696:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_contract$_IERC165_$5204_$", "typeString": "type(contract IERC165)"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_contract$_IERC165_$5204_$", "typeString": "type(contract IERC165)"}], "id": 4398, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "34691:4:4", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 4400, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34691:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_contract$_IERC165_$5204", "typeString": "type(contract IERC165)"}}, "id": 4401, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "34705:11:4", "memberName": "interfaceId", "nodeType": "MemberAccess", "src": "34691:25:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "src": "34676:40:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "34578:138:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "functionReturnParameters": 4383, "id": 4404, "nodeType": "Return", "src": "34571:145:4"}]}, "documentation": {"id": 4376, "nodeType": "StructuredDocumentation", "src": "34271:194:4", "text": "@dev Gets information about the interface support.\n @param interfaceId A specified interface Id.\n @return True if this contract implements the interface defined by interfaceId."}, "functionSelector": "01ffc9a7", "id": 4406, "implemented": true, "kind": "function", "modifiers": [], "name": "supportsInterface", "nameLocation": "34479:17:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4380, "nodeType": "OverrideSpecifier", "overrides": [], "src": "34537:8:4"}, "parameters": {"id": 4379, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4378, "mutability": "mutable", "name": "interfaceId", "nameLocation": "34504:11:4", "nodeType": "VariableDeclaration", "scope": 4406, "src": "34497:18:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}, "typeName": {"id": 4377, "name": "bytes4", "nodeType": "ElementaryTypeName", "src": "34497:6:4", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "visibility": "internal"}], "src": "34496:20:4"}, "returnParameters": {"id": 4383, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4382, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4406, "src": "34555:4:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4381, "name": "bool", "nodeType": "ElementaryTypeName", "src": "34555:4:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "34554:6:4"}, "scope": 4542, "src": "34470:253:4", "stateMutability": "view", "virtual": true, "visibility": "public"}, {"baseFunctions": [5159], "body": {"id": 4424, "nodeType": "Block", "src": "34865:54:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4420, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "34906:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4419, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "34898:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4418, "name": "address", "nodeType": "ElementaryTypeName", "src": "34898:7:4", "typeDescriptions": {}}}, "id": 4421, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34898:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4417, "name": "NonTransferable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4968, "src": "34882:15:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4422, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "34882:30:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4423, "nodeType": "RevertStatement", "src": "34875:37:4"}]}, "documentation": {"id": 4407, "nodeType": "StructuredDocumentation", "src": "34729:44:4", "text": "@dev Reverts the transfer of this token."}, "functionSelector": "a9059cbb", "id": 4425, "implemented": true, "kind": "function", "modifiers": [], "name": "transfer", "nameLocation": "34787:8:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4413, "nodeType": "OverrideSpecifier", "overrides": [], "src": "34841:8:4"}, "parameters": {"id": 4412, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4409, "mutability": "mutable", "name": "to", "nameLocation": "34804:2:4", "nodeType": "VariableDeclaration", "scope": 4425, "src": "34796:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4408, "name": "address", "nodeType": "ElementaryTypeName", "src": "34796:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4411, "mutability": "mutable", "name": "amount", "nameLocation": "34816:6:4", "nodeType": "VariableDeclaration", "scope": 4425, "src": "34808:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4410, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "34808:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "34795:28:4"}, "returnParameters": {"id": 4416, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4415, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4425, "src": "34859:4:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4414, "name": "bool", "nodeType": "ElementaryTypeName", "src": "34859:4:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "34858:6:4"}, "scope": 4542, "src": "34778:141:4", "stateMutability": "nonpayable", "virtual": true, "visibility": "external"}, {"baseFunctions": [5179], "body": {"id": 4443, "nodeType": "Block", "src": "35065:54:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4439, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "35106:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4438, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "35098:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4437, "name": "address", "nodeType": "ElementaryTypeName", "src": "35098:7:4", "typeDescriptions": {}}}, "id": 4440, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35098:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4436, "name": "NonTransferable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4968, "src": "35082:15:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4441, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35082:30:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4442, "nodeType": "RevertStatement", "src": "35075:37:4"}]}, "documentation": {"id": 4426, "nodeType": "StructuredDocumentation", "src": "34925:44:4", "text": "@dev Reverts the approval of this token."}, "functionSelector": "095ea7b3", "id": 4444, "implemented": true, "kind": "function", "modifiers": [], "name": "approve", "nameLocation": "34983:7:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4432, "nodeType": "OverrideSpecifier", "overrides": [], "src": "35041:8:4"}, "parameters": {"id": 4431, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4428, "mutability": "mutable", "name": "spender", "nameLocation": "34999:7:4", "nodeType": "VariableDeclaration", "scope": 4444, "src": "34991:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4427, "name": "address", "nodeType": "ElementaryTypeName", "src": "34991:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4430, "mutability": "mutable", "name": "amount", "nameLocation": "35016:6:4", "nodeType": "VariableDeclaration", "scope": 4444, "src": "35008:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4429, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "35008:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "34990:33:4"}, "returnParameters": {"id": 4435, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4434, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4444, "src": "35059:4:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4433, "name": "bool", "nodeType": "ElementaryTypeName", "src": "35059:4:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "35058:6:4"}, "scope": 4542, "src": "34974:145:4", "stateMutability": "nonpayable", "virtual": true, "visibility": "external"}, {"baseFunctions": [5191], "body": {"id": 4464, "nodeType": "Block", "src": "35283:54:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4460, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "35324:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4459, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "35316:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4458, "name": "address", "nodeType": "ElementaryTypeName", "src": "35316:7:4", "typeDescriptions": {}}}, "id": 4461, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35316:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4457, "name": "NonTransferable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4968, "src": "35300:15:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4462, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35300:30:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4463, "nodeType": "RevertStatement", "src": "35293:37:4"}]}, "documentation": {"id": 4445, "nodeType": "StructuredDocumentation", "src": "35125:48:4", "text": "@dev Reverts the transferFrom of this token."}, "functionSelector": "23b872dd", "id": 4465, "implemented": true, "kind": "function", "modifiers": [], "name": "transferFrom", "nameLocation": "35187:12:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4453, "nodeType": "OverrideSpecifier", "overrides": [], "src": "35259:8:4"}, "parameters": {"id": 4452, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4447, "mutability": "mutable", "name": "from", "nameLocation": "35208:4:4", "nodeType": "VariableDeclaration", "scope": 4465, "src": "35200:12:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4446, "name": "address", "nodeType": "ElementaryTypeName", "src": "35200:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4449, "mutability": "mutable", "name": "to", "nameLocation": "35222:2:4", "nodeType": "VariableDeclaration", "scope": 4465, "src": "35214:10:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4448, "name": "address", "nodeType": "ElementaryTypeName", "src": "35214:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4451, "mutability": "mutable", "name": "amount", "nameLocation": "35234:6:4", "nodeType": "VariableDeclaration", "scope": 4465, "src": "35226:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4450, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "35226:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "35199:42:4"}, "returnParameters": {"id": 4456, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4455, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4465, "src": "35277:4:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4454, "name": "bool", "nodeType": "ElementaryTypeName", "src": "35277:4:4", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "35276:6:4"}, "scope": 4542, "src": "35178:159:4", "stateMutability": "nonpayable", "virtual": true, "visibility": "external"}, {"baseFunctions": [5169], "body": {"id": 4483, "nodeType": "Block", "src": "35497:54:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4479, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "35538:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4478, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "35530:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4477, "name": "address", "nodeType": "ElementaryTypeName", "src": "35530:7:4", "typeDescriptions": {}}}, "id": 4480, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35530:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4476, "name": "NonTransferable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4968, "src": "35514:15:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4481, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35514:30:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4482, "nodeType": "RevertStatement", "src": "35507:37:4"}]}, "documentation": {"id": 4466, "nodeType": "StructuredDocumentation", "src": "35343:45:4", "text": "@dev Reverts the allowance of this token."}, "functionSelector": "dd62ed3e", "id": 4484, "implemented": true, "kind": "function", "modifiers": [], "name": "allowance", "nameLocation": "35402:9:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4472, "nodeType": "OverrideSpecifier", "overrides": [], "src": "35466:8:4"}, "parameters": {"id": 4471, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4468, "mutability": "mutable", "name": "owner", "nameLocation": "35420:5:4", "nodeType": "VariableDeclaration", "scope": 4484, "src": "35412:13:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4467, "name": "address", "nodeType": "ElementaryTypeName", "src": "35412:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4470, "mutability": "mutable", "name": "spender", "nameLocation": "35435:7:4", "nodeType": "VariableDeclaration", "scope": 4484, "src": "35427:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4469, "name": "address", "nodeType": "ElementaryTypeName", "src": "35427:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "35411:32:4"}, "returnParameters": {"id": 4475, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4474, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4484, "src": "35484:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4473, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "35484:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "35483:9:4"}, "scope": 4542, "src": "35393:158:4", "stateMutability": "view", "virtual": true, "visibility": "external"}, {"baseFunctions": [5091], "body": {"id": 4500, "nodeType": "Block", "src": "35692:53:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4496, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "35732:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4495, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "35724:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4494, "name": "address", "nodeType": "ElementaryTypeName", "src": "35724:7:4", "typeDescriptions": {}}}, "id": 4497, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35724:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4493, "name": "NonDelegatable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4973, "src": "35709:14:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4498, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35709:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4499, "nodeType": "RevertStatement", "src": "35702:36:4"}]}, "documentation": {"id": 4485, "nodeType": "StructuredDocumentation", "src": "35557:41:4", "text": "@dev Reverts delegates of this token."}, "functionSelector": "587cde1e", "id": 4501, "implemented": true, "kind": "function", "modifiers": [], "name": "delegates", "nameLocation": "35612:9:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4489, "nodeType": "OverrideSpecifier", "overrides": [], "src": "35661:8:4"}, "parameters": {"id": 4488, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4487, "mutability": "mutable", "name": "account", "nameLocation": "35630:7:4", "nodeType": "VariableDeclaration", "scope": 4501, "src": "35622:15:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4486, "name": "address", "nodeType": "ElementaryTypeName", "src": "35622:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "35621:17:4"}, "returnParameters": {"id": 4492, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4491, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4501, "src": "35679:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4490, "name": "address", "nodeType": "ElementaryTypeName", "src": "35679:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "35678:9:4"}, "scope": 4542, "src": "35603:142:4", "stateMutability": "view", "virtual": true, "visibility": "external"}, {"baseFunctions": [5097], "body": {"id": 4515, "nodeType": "Block", "src": "35864:53:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4511, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "35904:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4510, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "35896:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4509, "name": "address", "nodeType": "ElementaryTypeName", "src": "35896:7:4", "typeDescriptions": {}}}, "id": 4512, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35896:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4508, "name": "NonDelegatable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4973, "src": "35881:14:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4513, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "35881:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4514, "nodeType": "RevertStatement", "src": "35874:36:4"}]}, "documentation": {"id": 4502, "nodeType": "StructuredDocumentation", "src": "35751:41:4", "text": "@dev Reverts delegate for this token."}, "functionSelector": "5c19a95c", "id": 4516, "implemented": true, "kind": "function", "modifiers": [], "name": "delegate", "nameLocation": "35806:8:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4506, "nodeType": "OverrideSpecifier", "overrides": [], "src": "35851:8:4"}, "parameters": {"id": 4505, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4504, "mutability": "mutable", "name": "delegatee", "nameLocation": "35823:9:4", "nodeType": "VariableDeclaration", "scope": 4516, "src": "35815:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4503, "name": "address", "nodeType": "ElementaryTypeName", "src": "35815:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "35814:19:4"}, "returnParameters": {"id": 4507, "nodeType": "ParameterList", "parameters": [], "src": "35864:0:4"}, "scope": 4542, "src": "35797:120:4", "stateMutability": "nonpayable", "virtual": true, "visibility": "external"}, {"baseFunctions": [5113], "body": {"id": 4540, "nodeType": "Block", "src": "36112:53:4", "statements": [{"errorCall": {"arguments": [{"arguments": [{"id": 4536, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "36152:4:4", "typeDescriptions": {"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_veOLAS_$4542", "typeString": "contract veOLAS"}], "id": 4535, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "36144:7:4", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4534, "name": "address", "nodeType": "ElementaryTypeName", "src": "36144:7:4", "typeDescriptions": {}}}, "id": 4537, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "36144:13:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}], "id": 4533, "name": "NonDelegatable", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4973, "src": "36129:14:4", "typeDescriptions": {"typeIdentifier": "t_function_error_pure$_t_address_$returns$__$", "typeString": "function (address) pure"}}, "id": 4538, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "36129:29:4", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4539, "nodeType": "RevertStatement", "src": "36122:36:4"}]}, "documentation": {"id": 4517, "nodeType": "StructuredDocumentation", "src": "35923:46:4", "text": "@dev Reverts delegateBySig for this token."}, "functionSelector": "c3cda520", "id": 4541, "implemented": true, "kind": "function", "modifiers": [], "name": "delegateBySig", "nameLocation": "35983:13:4", "nodeType": "FunctionDefinition", "overrides": {"id": 4531, "nodeType": "OverrideSpecifier", "overrides": [], "src": "36099:8:4"}, "parameters": {"id": 4530, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4519, "mutability": "mutable", "name": "delegatee", "nameLocation": "36005:9:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "35997:17:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4518, "name": "address", "nodeType": "ElementaryTypeName", "src": "35997:7:4", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4521, "mutability": "mutable", "name": "nonce", "nameLocation": "36024:5:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "36016:13:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4520, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "36016:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4523, "mutability": "mutable", "name": "expiry", "nameLocation": "36039:6:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "36031:14:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4522, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "36031:7:4", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4525, "mutability": "mutable", "name": "v", "nameLocation": "36053:1:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "36047:7:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 4524, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "36047:5:4", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "visibility": "internal"}, {"constant": false, "id": 4527, "mutability": "mutable", "name": "r", "nameLocation": "36064:1:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "36056:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4526, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "36056:7:4", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}, {"constant": false, "id": 4529, "mutability": "mutable", "name": "s", "nameLocation": "36075:1:4", "nodeType": "VariableDeclaration", "scope": 4541, "src": "36067:9:4", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4528, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "36067:7:4", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}], "src": "35996:81:4"}, "returnParameters": {"id": 4532, "nodeType": "ParameterList", "parameters": [], "src": "36112:0:4"}, "scope": 4542, "src": "35974:191:4", "stateMutability": "nonpayable", "virtual": true, "visibility": "external"}], "scope": 4543, "src": "4557:31610:4", "usedErrors": [4940, 4943, 4946, 4949, 4956, 4963, 4968, 4973, 4980, 4985, 4992, 5001, 5010, 5019, 5028, 5035], "usedEvents": [2230, 2238, 2244, 5048, 5057, 5126, 5135]}], "src": "32:36136:4"}}, "/home/andrey/valory/autonolas-governance/lib/solmate/src/tokens/ERC20.sol": {"AST": {"absolutePath": "lib/solmate/src/tokens/ERC20.sol", "exportedSymbols": {"ERC20": [4930]}, "id": 4931, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 4544, "literals": ["solidity", ">=", "0.8", ".0"], "nodeType": "PragmaDirective", "src": "32:24:5"}, {"abstract": true, "baseContracts": [], "canonicalName": "ERC20", "contractDependencies": [], "contractKind": "contract", "documentation": {"id": 4545, "nodeType": "StructuredDocumentation", "src": "58:403:5", "text": "@notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\n @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it."}, "fullyImplemented": true, "id": 4930, "linearizedBaseContracts": [4930], "name": "ERC20", "nameLocation": "479:5:5", "nodeType": "ContractDefinition", "nodes": [{"anonymous": false, "eventSelector": "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "id": 4553, "name": "Transfer", "nameLocation": "676:8:5", "nodeType": "EventDefinition", "parameters": {"id": 4552, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4547, "indexed": true, "mutability": "mutable", "name": "from", "nameLocation": "701:4:5", "nodeType": "VariableDeclaration", "scope": 4553, "src": "685:20:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4546, "name": "address", "nodeType": "ElementaryTypeName", "src": "685:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4549, "indexed": true, "mutability": "mutable", "name": "to", "nameLocation": "723:2:5", "nodeType": "VariableDeclaration", "scope": 4553, "src": "707:18:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4548, "name": "address", "nodeType": "ElementaryTypeName", "src": "707:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4551, "indexed": false, "mutability": "mutable", "name": "amount", "nameLocation": "735:6:5", "nodeType": "VariableDeclaration", "scope": 4553, "src": "727:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4550, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "727:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "684:58:5"}, "src": "670:73:5"}, {"anonymous": false, "eventSelector": "8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", "id": 4561, "name": "Approval", "nameLocation": "755:8:5", "nodeType": "EventDefinition", "parameters": {"id": 4560, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4555, "indexed": true, "mutability": "mutable", "name": "owner", "nameLocation": "780:5:5", "nodeType": "VariableDeclaration", "scope": 4561, "src": "764:21:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4554, "name": "address", "nodeType": "ElementaryTypeName", "src": "764:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4557, "indexed": true, "mutability": "mutable", "name": "spender", "nameLocation": "803:7:5", "nodeType": "VariableDeclaration", "scope": 4561, "src": "787:23:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4556, "name": "address", "nodeType": "ElementaryTypeName", "src": "787:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4559, "indexed": false, "mutability": "mutable", "name": "amount", "nameLocation": "820:6:5", "nodeType": "VariableDeclaration", "scope": 4561, "src": "812:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4558, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "812:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "763:64:5"}, "src": "749:79:5"}, {"constant": false, "functionSelector": "06fdde03", "id": 4563, "mutability": "mutable", "name": "name", "nameLocation": "1032:4:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1018:18:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string"}, "typeName": {"id": 4562, "name": "string", "nodeType": "ElementaryTypeName", "src": "1018:6:5", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "public"}, {"constant": false, "functionSelector": "95d89b41", "id": 4565, "mutability": "mutable", "name": "symbol", "nameLocation": "1057:6:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1043:20:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string"}, "typeName": {"id": 4564, "name": "string", "nodeType": "ElementaryTypeName", "src": "1043:6:5", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "public"}, {"constant": false, "functionSelector": "313ce567", "id": 4567, "mutability": "immutable", "name": "decimals", "nameLocation": "1093:8:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1070:31:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 4566, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "1070:5:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "visibility": "public"}, {"constant": false, "functionSelector": "18160ddd", "id": 4569, "mutability": "mutable", "name": "totalSupply", "nameLocation": "1306:11:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1291:26:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4568, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1291:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "public"}, {"constant": false, "functionSelector": "70a08231", "id": 4573, "mutability": "mutable", "name": "balanceOf", "nameLocation": "1359:9:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1324:44:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "typeName": {"id": 4572, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 4570, "name": "address", "nodeType": "ElementaryTypeName", "src": "1332:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "1324:27:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 4571, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1343:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"constant": false, "functionSelector": "dd62ed3e", "id": 4579, "mutability": "mutable", "name": "allowance", "nameLocation": "1430:9:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1375:64:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}, "typeName": {"id": 4578, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 4574, "name": "address", "nodeType": "ElementaryTypeName", "src": "1383:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "1375:47:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 4577, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 4575, "name": "address", "nodeType": "ElementaryTypeName", "src": "1402:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "1394:27:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 4576, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1413:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}}, "visibility": "public"}, {"constant": false, "id": 4581, "mutability": "immutable", "name": "INITIAL_CHAIN_ID", "nameLocation": "1657:16:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1630:43:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4580, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1630:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4583, "mutability": "immutable", "name": "INITIAL_DOMAIN_SEPARATOR", "nameLocation": "1707:24:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1680:51:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4582, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "1680:7:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}, {"constant": false, "functionSelector": "7ecebe00", "id": 4587, "mutability": "mutable", "name": "nonces", "nameLocation": "1773:6:5", "nodeType": "VariableDeclaration", "scope": 4930, "src": "1738:41:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "typeName": {"id": 4586, "keyName": "", "keyNameLocation": "-1:-1:-1", "keyType": {"id": 4584, "name": "address", "nodeType": "ElementaryTypeName", "src": "1746:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "Mapping", "src": "1738:27:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}, "valueName": "", "valueNameLocation": "-1:-1:-1", "valueType": {"id": 4585, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1757:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}}, "visibility": "public"}, {"body": {"id": 4618, "nodeType": "Block", "src": "2071:189:5", "statements": [{"expression": {"id": 4598, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4596, "name": "name", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4563, "src": "2081:4:5", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4597, "name": "_name", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4589, "src": "2088:5:5", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string memory"}}, "src": "2081:12:5", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "id": 4599, "nodeType": "ExpressionStatement", "src": "2081:12:5"}, {"expression": {"id": 4602, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4600, "name": "symbol", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4565, "src": "2103:6:5", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4601, "name": "_symbol", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4591, "src": "2112:7:5", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string memory"}}, "src": "2103:16:5", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}, "id": 4603, "nodeType": "ExpressionStatement", "src": "2103:16:5"}, {"expression": {"id": 4606, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4604, "name": "decimals", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4567, "src": "2129:8:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4605, "name": "_decimals", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4593, "src": "2140:9:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "src": "2129:20:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "id": 4607, "nodeType": "ExpressionStatement", "src": "2129:20:5"}, {"expression": {"id": 4611, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4608, "name": "INITIAL_CHAIN_ID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4581, "src": "2160:16:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"expression": {"id": 4609, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "2179:5:5", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4610, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2185:7:5", "memberName": "chainid", "nodeType": "MemberAccess", "src": "2179:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "2160:32:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4612, "nodeType": "ExpressionStatement", "src": "2160:32:5"}, {"expression": {"id": 4616, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4613, "name": "INITIAL_DOMAIN_SEPARATOR", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4583, "src": "2202:24:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"arguments": [], "expression": {"argumentTypes": [], "id": 4614, "name": "computeDomainSeparator", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4873, "src": "2229:22:5", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", "typeString": "function () view returns (bytes32)"}}, "id": 4615, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2229:24:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "src": "2202:51:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "id": 4617, "nodeType": "ExpressionStatement", "src": "2202:51:5"}]}, "id": 4619, "implemented": true, "kind": "constructor", "modifiers": [], "name": "", "nameLocation": "-1:-1:-1", "nodeType": "FunctionDefinition", "parameters": {"id": 4594, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4589, "mutability": "mutable", "name": "_name", "nameLocation": "2003:5:5", "nodeType": "VariableDeclaration", "scope": 4619, "src": "1989:19:5", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string"}, "typeName": {"id": 4588, "name": "string", "nodeType": "ElementaryTypeName", "src": "1989:6:5", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "internal"}, {"constant": false, "id": 4591, "mutability": "mutable", "name": "_symbol", "nameLocation": "2032:7:5", "nodeType": "VariableDeclaration", "scope": 4619, "src": "2018:21:5", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": {"typeIdentifier": "t_string_memory_ptr", "typeString": "string"}, "typeName": {"id": 4590, "name": "string", "nodeType": "ElementaryTypeName", "src": "2018:6:5", "typeDescriptions": {"typeIdentifier": "t_string_storage_ptr", "typeString": "string"}}, "visibility": "internal"}, {"constant": false, "id": 4593, "mutability": "mutable", "name": "_decimals", "nameLocation": "2055:9:5", "nodeType": "VariableDeclaration", "scope": 4619, "src": "2049:15:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 4592, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "2049:5:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "visibility": "internal"}], "src": "1979:91:5"}, "returnParameters": {"id": 4595, "nodeType": "ParameterList", "parameters": [], "src": "2071:0:5"}, "scope": 4930, "src": "1968:292:5", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal"}, {"body": {"id": 4646, "nodeType": "Block", "src": "2528:131:5", "statements": [{"expression": {"id": 4635, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 4628, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "2538:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 4632, "indexExpression": {"expression": {"id": 4629, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2548:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4630, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2552:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "2548:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "2538:21:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4633, "indexExpression": {"id": 4631, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4621, "src": "2560:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "2538:30:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4634, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4623, "src": "2571:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "2538:39:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4636, "nodeType": "ExpressionStatement", "src": "2538:39:5"}, {"eventCall": {"arguments": [{"expression": {"id": 4638, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2602:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4639, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2606:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "2602:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4640, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4621, "src": "2614:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4641, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4623, "src": "2623:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4637, "name": "Approval", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4561, "src": "2593:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4642, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2593:37:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4643, "nodeType": "EmitStatement", "src": "2588:42:5"}, {"expression": {"hexValue": "74727565", "id": 4644, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "2648:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "functionReturnParameters": 4627, "id": 4645, "nodeType": "Return", "src": "2641:11:5"}]}, "functionSelector": "095ea7b3", "id": 4647, "implemented": true, "kind": "function", "modifiers": [], "name": "approve", "nameLocation": "2457:7:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4624, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4621, "mutability": "mutable", "name": "spender", "nameLocation": "2473:7:5", "nodeType": "VariableDeclaration", "scope": 4647, "src": "2465:15:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4620, "name": "address", "nodeType": "ElementaryTypeName", "src": "2465:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4623, "mutability": "mutable", "name": "amount", "nameLocation": "2490:6:5", "nodeType": "VariableDeclaration", "scope": 4647, "src": "2482:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4622, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2482:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2464:33:5"}, "returnParameters": {"id": 4627, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4626, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4647, "src": "2522:4:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4625, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2522:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "2521:6:5"}, "scope": 4930, "src": "2448:211:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "public"}, {"body": {"id": 4679, "nodeType": "Block", "src": "2741:297:5", "statements": [{"expression": {"id": 4661, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4656, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "2751:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4659, "indexExpression": {"expression": {"id": 4657, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2761:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4658, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2765:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "2761:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "2751:21:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 4660, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4651, "src": "2776:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "2751:31:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4662, "nodeType": "ExpressionStatement", "src": "2751:31:5"}, {"id": 4669, "nodeType": "UncheckedBlock", "src": "2904:58:5", "statements": [{"expression": {"id": 4667, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4663, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "2928:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4665, "indexExpression": {"id": 4664, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4649, "src": "2938:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "2928:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4666, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4651, "src": "2945:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "2928:23:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4668, "nodeType": "ExpressionStatement", "src": "2928:23:5"}]}, {"eventCall": {"arguments": [{"expression": {"id": 4671, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "2986:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4672, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "2990:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "2986:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4673, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4649, "src": "2998:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4674, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4651, "src": "3002:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4670, "name": "Transfer", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4553, "src": "2977:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4675, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "2977:32:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4676, "nodeType": "EmitStatement", "src": "2972:37:5"}, {"expression": {"hexValue": "74727565", "id": 4677, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "3027:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "functionReturnParameters": 4655, "id": 4678, "nodeType": "Return", "src": "3020:11:5"}]}, "functionSelector": "a9059cbb", "id": 4680, "implemented": true, "kind": "function", "modifiers": [], "name": "transfer", "nameLocation": "2674:8:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4652, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4649, "mutability": "mutable", "name": "to", "nameLocation": "2691:2:5", "nodeType": "VariableDeclaration", "scope": 4680, "src": "2683:10:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4648, "name": "address", "nodeType": "ElementaryTypeName", "src": "2683:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4651, "mutability": "mutable", "name": "amount", "nameLocation": "2703:6:5", "nodeType": "VariableDeclaration", "scope": 4680, "src": "2695:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4650, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2695:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2682:28:5"}, "returnParameters": {"id": 4655, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4654, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4680, "src": "2735:4:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4653, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2735:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "2734:6:5"}, "scope": 4930, "src": "2665:373:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "public"}, {"body": {"id": 4740, "nodeType": "Block", "src": "3168:468:5", "statements": [{"assignments": [4692], "declarations": [{"constant": false, "id": 4692, "mutability": "mutable", "name": "allowed", "nameLocation": "3186:7:5", "nodeType": "VariableDeclaration", "scope": 4740, "src": "3178:15:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4691, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3178:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "id": 4699, "initialValue": {"baseExpression": {"baseExpression": {"id": 4693, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "3196:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 4695, "indexExpression": {"id": 4694, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4682, "src": "3206:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "3196:15:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4698, "indexExpression": {"expression": {"id": 4696, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "3212:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4697, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "3216:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "3212:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "3196:27:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "VariableDeclarationStatement", "src": "3178:45:5"}, {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4706, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4700, "name": "allowed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4692, "src": "3274:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"expression": {"arguments": [{"id": 4703, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "3290:7:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}, "typeName": {"id": 4702, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3290:7:5", "typeDescriptions": {}}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_type$_t_uint256_$", "typeString": "type(uint256)"}], "id": 4701, "name": "type", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -27, "src": "3285:4:5", "typeDescriptions": {"typeIdentifier": "t_function_metatype_pure$__$returns$__$", "typeString": "function () pure"}}, "id": 4704, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "3285:13:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_magic_meta_type_t_uint256", "typeString": "type(uint256)"}}, "id": 4705, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "3299:3:5", "memberName": "max", "nodeType": "MemberAccess", "src": "3285:17:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3274:28:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "id": 4718, "nodeType": "IfStatement", "src": "3270:80:5", "trueBody": {"expression": {"id": 4716, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 4707, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "3304:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 4711, "indexExpression": {"id": 4708, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4682, "src": "3314:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "3304:15:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4712, "indexExpression": {"expression": {"id": 4709, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "3320:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_message", "typeString": "msg"}}, "id": 4710, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "3324:6:5", "memberName": "sender", "nodeType": "MemberAccess", "src": "3320:10:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "3304:27:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4715, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4713, "name": "allowed", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4692, "src": "3334:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": {"id": 4714, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4686, "src": "3344:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3334:16:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3304:46:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4717, "nodeType": "ExpressionStatement", "src": "3304:46:5"}}, {"expression": {"id": 4723, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4719, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "3361:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4721, "indexExpression": {"id": 4720, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4682, "src": "3371:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "3361:15:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 4722, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4686, "src": "3380:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3361:25:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4724, "nodeType": "ExpressionStatement", "src": "3361:25:5"}, {"id": 4731, "nodeType": "UncheckedBlock", "src": "3508:58:5", "statements": [{"expression": {"id": 4729, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4725, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "3532:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4727, "indexExpression": {"id": 4726, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4684, "src": "3542:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "3532:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4728, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4686, "src": "3549:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "3532:23:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4730, "nodeType": "ExpressionStatement", "src": "3532:23:5"}]}, {"eventCall": {"arguments": [{"id": 4733, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4682, "src": "3590:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4734, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4684, "src": "3596:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4735, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4686, "src": "3600:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4732, "name": "Transfer", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4553, "src": "3581:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4736, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "3581:26:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4737, "nodeType": "EmitStatement", "src": "3576:31:5"}, {"expression": {"hexValue": "74727565", "id": 4738, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "3625:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "value": "true"}, "functionReturnParameters": 4690, "id": 4739, "nodeType": "Return", "src": "3618:11:5"}]}, "functionSelector": "23b872dd", "id": 4741, "implemented": true, "kind": "function", "modifiers": [], "name": "transferFrom", "nameLocation": "3053:12:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4687, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4682, "mutability": "mutable", "name": "from", "nameLocation": "3083:4:5", "nodeType": "VariableDeclaration", "scope": 4741, "src": "3075:12:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4681, "name": "address", "nodeType": "ElementaryTypeName", "src": "3075:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4684, "mutability": "mutable", "name": "to", "nameLocation": "3105:2:5", "nodeType": "VariableDeclaration", "scope": 4741, "src": "3097:10:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4683, "name": "address", "nodeType": "ElementaryTypeName", "src": "3097:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4686, "mutability": "mutable", "name": "amount", "nameLocation": "3125:6:5", "nodeType": "VariableDeclaration", "scope": 4741, "src": "3117:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4685, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3117:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "3065:72:5"}, "returnParameters": {"id": 4690, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4689, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4741, "src": "3162:4:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 4688, "name": "bool", "nodeType": "ElementaryTypeName", "src": "3162:4:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "3161:6:5"}, "scope": 4930, "src": "3044:592:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "public"}, {"body": {"id": 4827, "nodeType": "Block", "src": "4014:1294:5", "statements": [{"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4762, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4759, "name": "deadline", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4749, "src": "4032:8:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": ">=", "rightExpression": {"expression": {"id": 4760, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "4044:5:5", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4761, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "4050:9:5", "memberName": "timestamp", "nodeType": "MemberAccess", "src": "4044:15:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "4032:27:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, {"hexValue": "5045524d49545f444541444c494e455f45585049524544", "id": 4763, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "4061:25:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e", "typeString": "literal_string \"PERMIT_DEADLINE_EXPIRED\""}, "value": "PERMIT_DEADLINE_EXPIRED"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}, {"typeIdentifier": "t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e", "typeString": "literal_string \"PERMIT_DEADLINE_EXPIRED\""}], "id": 4758, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "4024:7:5", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", "typeString": "function (bool,string memory) pure"}}, "id": 4764, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4024:63:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4765, "nodeType": "ExpressionStatement", "src": "4024:63:5"}, {"id": 4820, "nodeType": "UncheckedBlock", "src": "4228:1027:5", "statements": [{"assignments": [4767], "declarations": [{"constant": false, "id": 4767, "mutability": "mutable", "name": "recoveredAddress", "nameLocation": "4260:16:5", "nodeType": "VariableDeclaration", "scope": 4820, "src": "4252:24:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4766, "name": "address", "nodeType": "ElementaryTypeName", "src": "4252:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "id": 4797, "initialValue": {"arguments": [{"arguments": [{"arguments": [{"hexValue": "1901", "id": 4772, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "4379:10:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", "typeString": "literal_string hex\"1901\""}, "value": "\u0019\u0001"}, {"arguments": [], "expression": {"argumentTypes": [], "id": 4773, "name": "DOMAIN_SEPARATOR", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4843, "src": "4415:16:5", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", "typeString": "function () view returns (bytes32)"}}, "id": 4774, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4415:18:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"arguments": [{"arguments": [{"arguments": [{"hexValue": "5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529", "id": 4779, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "4589:84:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""}, "value": "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""}], "id": 4778, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "4542:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4780, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4542:165:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"id": 4781, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4743, "src": "4741:5:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4782, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4745, "src": "4780:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4783, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4747, "src": "4821:5:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 4787, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "UnaryOperation", "operator": "++", "prefix": false, "src": "4860:15:5", "subExpression": {"baseExpression": {"id": 4784, "name": "nonces", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4587, "src": "4860:6:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4786, "indexExpression": {"id": 4785, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4743, "src": "4867:5:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "4860:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"id": 4788, "name": "deadline", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4749, "src": "4909:8:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "expression": {"id": 4776, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -1, "src": "4498:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_abi", "typeString": "abi"}}, "id": 4777, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "4502:6:5", "memberName": "encode", "nodeType": "MemberAccess", "src": "4498:10:5", "typeDescriptions": {"typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", "typeString": "function () pure returns (bytes memory)"}}, "id": 4789, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4498:449:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}], "id": 4775, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "4459:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4790, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4459:514:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", "typeString": "literal_string hex\"1901\""}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}], "expression": {"id": 4770, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -1, "src": "4337:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_abi", "typeString": "abi"}}, "id": 4771, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "4341:12:5", "memberName": "encodePacked", "nodeType": "MemberAccess", "src": "4337:16:5", "typeDescriptions": {"typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", "typeString": "function () pure returns (bytes memory)"}}, "id": 4791, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4337:658:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}], "id": 4769, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "4306:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4792, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4306:707:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"id": 4793, "name": "v", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4751, "src": "5031:1:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, {"id": 4794, "name": "r", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4753, "src": "5050:1:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"id": 4795, "name": "s", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4755, "src": "5069:1:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_uint8", "typeString": "uint8"}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}], "id": 4768, "name": "ecrecover", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -6, "src": "4279:9:5", "typeDescriptions": {"typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$", "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}}, "id": 4796, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "4279:805:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "VariableDeclarationStatement", "src": "4252:832:5"}, {"expression": {"arguments": [{"commonType": {"typeIdentifier": "t_bool", "typeString": "bool"}, "id": 4808, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 4804, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4799, "name": "recoveredAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4767, "src": "5107:16:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": {"arguments": [{"hexValue": "30", "id": 4802, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "5135:1:5", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 4801, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "5127:7:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4800, "name": "address", "nodeType": "ElementaryTypeName", "src": "5127:7:5", "typeDescriptions": {}}}, "id": 4803, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5127:10:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "5107:30:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "nodeType": "BinaryOperation", "operator": "&&", "rightExpression": {"commonType": {"typeIdentifier": "t_address", "typeString": "address"}, "id": 4807, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"id": 4805, "name": "recoveredAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4767, "src": "5141:16:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"id": 4806, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4743, "src": "5161:5:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "src": "5141:25:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "src": "5107:59:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, {"hexValue": "494e56414c49445f5349474e4552", "id": 4809, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "5168:16:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c", "typeString": "literal_string \"INVALID_SIGNER\""}, "value": "INVALID_SIGNER"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bool", "typeString": "bool"}, {"typeIdentifier": "t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c", "typeString": "literal_string \"INVALID_SIGNER\""}], "id": 4798, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [-18, -18], "referencedDeclaration": -18, "src": "5099:7:5", "typeDescriptions": {"typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", "typeString": "function (bool,string memory) pure"}}, "id": 4810, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5099:86:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4811, "nodeType": "ExpressionStatement", "src": "5099:86:5"}, {"expression": {"id": 4818, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"baseExpression": {"id": 4812, "name": "allowance", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4579, "src": "5200:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", "typeString": "mapping(address => mapping(address => uint256))"}}, "id": 4815, "indexExpression": {"id": 4813, "name": "recoveredAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4767, "src": "5210:16:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "5200:27:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4816, "indexExpression": {"id": 4814, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4745, "src": "5228:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "5200:36:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "=", "rightHandSide": {"id": 4817, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4747, "src": "5239:5:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5200:44:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4819, "nodeType": "ExpressionStatement", "src": "5200:44:5"}]}, {"eventCall": {"arguments": [{"id": 4822, "name": "owner", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4743, "src": "5279:5:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4823, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4745, "src": "5286:7:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4824, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4747, "src": "5295:5:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4821, "name": "Approval", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4561, "src": "5270:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4825, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5270:31:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4826, "nodeType": "EmitStatement", "src": "5265:36:5"}]}, "functionSelector": "d505accf", "id": 4828, "implemented": true, "kind": "function", "modifiers": [], "name": "permit", "nameLocation": "3834:6:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4756, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4743, "mutability": "mutable", "name": "owner", "nameLocation": "3858:5:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3850:13:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4742, "name": "address", "nodeType": "ElementaryTypeName", "src": "3850:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4745, "mutability": "mutable", "name": "spender", "nameLocation": "3881:7:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3873:15:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4744, "name": "address", "nodeType": "ElementaryTypeName", "src": "3873:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4747, "mutability": "mutable", "name": "value", "nameLocation": "3906:5:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3898:13:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4746, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3898:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4749, "mutability": "mutable", "name": "deadline", "nameLocation": "3929:8:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3921:16:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4748, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "3921:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 4751, "mutability": "mutable", "name": "v", "nameLocation": "3953:1:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3947:7:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 4750, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "3947:5:5", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "visibility": "internal"}, {"constant": false, "id": 4753, "mutability": "mutable", "name": "r", "nameLocation": "3972:1:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3964:9:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4752, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "3964:7:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}, {"constant": false, "id": 4755, "mutability": "mutable", "name": "s", "nameLocation": "3991:1:5", "nodeType": "VariableDeclaration", "scope": 4828, "src": "3983:9:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4754, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "3983:7:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}], "src": "3840:158:5"}, "returnParameters": {"id": 4757, "nodeType": "ParameterList", "parameters": [], "src": "4014:0:5"}, "scope": 4930, "src": "3825:1483:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "public"}, {"body": {"id": 4842, "nodeType": "Block", "src": "5380:111:5", "statements": [{"expression": {"condition": {"commonType": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "id": 4836, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": {"expression": {"id": 4833, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "5397:5:5", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4834, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5403:7:5", "memberName": "chainid", "nodeType": "MemberAccess", "src": "5397:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": {"id": 4835, "name": "INITIAL_CHAIN_ID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4581, "src": "5414:16:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "5397:33:5", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "falseExpression": {"arguments": [], "expression": {"argumentTypes": [], "id": 4838, "name": "computeDomainSeparator", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4873, "src": "5460:22:5", "typeDescriptions": {"typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", "typeString": "function () view returns (bytes32)"}}, "id": 4839, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5460:24:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "id": 4840, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "Conditional", "src": "5397:87:5", "trueExpression": {"id": 4837, "name": "INITIAL_DOMAIN_SEPARATOR", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4583, "src": "5433:24:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "functionReturnParameters": 4832, "id": 4841, "nodeType": "Return", "src": "5390:94:5"}]}, "functionSelector": "3644e515", "id": 4843, "implemented": true, "kind": "function", "modifiers": [], "name": "DOMAIN_SEPARATOR", "nameLocation": "5323:16:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4829, "nodeType": "ParameterList", "parameters": [], "src": "5339:2:5"}, "returnParameters": {"id": 4832, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4831, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4843, "src": "5371:7:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4830, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "5371:7:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}], "src": "5370:9:5"}, "scope": 4930, "src": "5314:177:5", "stateMutability": "view", "virtual": true, "visibility": "public"}, {"body": {"id": 4872, "nodeType": "Block", "src": "5571:372:5", "statements": [{"expression": {"arguments": [{"arguments": [{"arguments": [{"hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429", "id": 4852, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "5669:84:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f", "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""}, "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f", "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""}], "id": 4851, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "5659:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4853, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5659:95:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"arguments": [{"arguments": [{"id": 4857, "name": "name", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4563, "src": "5792:4:5", "typeDescriptions": {"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_string_storage", "typeString": "string storage ref"}], "id": 4856, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "5786:5:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_bytes_storage_ptr_$", "typeString": "type(bytes storage pointer)"}, "typeName": {"id": 4855, "name": "bytes", "nodeType": "ElementaryTypeName", "src": "5786:5:5", "typeDescriptions": {}}}, "id": 4858, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5786:11:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes_storage_ptr", "typeString": "bytes storage pointer"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes_storage_ptr", "typeString": "bytes storage pointer"}], "id": 4854, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "5776:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4859, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5776:22:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"arguments": [{"hexValue": "31", "id": 4861, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "5830:3:5", "typeDescriptions": {"typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "typeString": "literal_string \"1\""}, "value": "1"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "typeString": "literal_string \"1\""}], "id": 4860, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "5820:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4862, "isConstant": false, "isLValue": false, "isPure": true, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5820:14:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, {"expression": {"id": 4863, "name": "block", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -4, "src": "5856:5:5", "typeDescriptions": {"typeIdentifier": "t_magic_block", "typeString": "block"}}, "id": 4864, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberLocation": "5862:7:5", "memberName": "chainid", "nodeType": "MemberAccess", "src": "5856:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, {"arguments": [{"id": 4867, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -28, "src": "5899:4:5", "typeDescriptions": {"typeIdentifier": "t_contract$_ERC20_$4930", "typeString": "contract ERC20"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_contract$_ERC20_$4930", "typeString": "contract ERC20"}], "id": 4866, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "5891:7:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4865, "name": "address", "nodeType": "ElementaryTypeName", "src": "5891:7:5", "typeDescriptions": {}}}, "id": 4868, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5891:13:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}, {"typeIdentifier": "t_address", "typeString": "address"}], "expression": {"id": 4849, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -1, "src": "5627:3:5", "typeDescriptions": {"typeIdentifier": "t_magic_abi", "typeString": "abi"}}, "id": 4850, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberLocation": "5631:6:5", "memberName": "encode", "nodeType": "MemberAccess", "src": "5627:10:5", "typeDescriptions": {"typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", "typeString": "function () pure returns (bytes memory)"}}, "id": 4869, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5627:295:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory"}], "id": 4848, "name": "keccak256", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -8, "src": "5600:9:5", "typeDescriptions": {"typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", "typeString": "function (bytes memory) pure returns (bytes32)"}}, "id": 4870, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "5600:336:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "functionReturnParameters": 4847, "id": 4871, "nodeType": "Return", "src": "5581:355:5"}]}, "id": 4873, "implemented": true, "kind": "function", "modifiers": [], "name": "computeDomainSeparator", "nameLocation": "5506:22:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4844, "nodeType": "ParameterList", "parameters": [], "src": "5528:2:5"}, "returnParameters": {"id": 4847, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4846, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 4873, "src": "5562:7:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 4845, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "5562:7:5", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}], "src": "5561:9:5"}, "scope": 4930, "src": "5497:446:5", "stateMutability": "view", "virtual": true, "visibility": "internal"}, {"body": {"id": 4900, "nodeType": "Block", "src": "6197:265:5", "statements": [{"expression": {"id": 4882, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4880, "name": "totalSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4569, "src": "6207:11:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4881, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4877, "src": "6222:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6207:21:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4883, "nodeType": "ExpressionStatement", "src": "6207:21:5"}, {"id": 4890, "nodeType": "UncheckedBlock", "src": "6350:58:5", "statements": [{"expression": {"id": 4888, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4884, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "6374:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4886, "indexExpression": {"id": 4885, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4875, "src": "6384:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "6374:13:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "+=", "rightHandSide": {"id": 4887, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4877, "src": "6391:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6374:23:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4889, "nodeType": "ExpressionStatement", "src": "6374:23:5"}]}, {"eventCall": {"arguments": [{"arguments": [{"hexValue": "30", "id": 4894, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6440:1:5", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 4893, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "6432:7:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4892, "name": "address", "nodeType": "ElementaryTypeName", "src": "6432:7:5", "typeDescriptions": {}}}, "id": 4895, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6432:10:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4896, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4875, "src": "6444:2:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4897, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4877, "src": "6448:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4891, "name": "Transfer", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4553, "src": "6423:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4898, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6423:32:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4899, "nodeType": "EmitStatement", "src": "6418:37:5"}]}, "id": 4901, "implemented": true, "kind": "function", "modifiers": [], "name": "_mint", "nameLocation": "6146:5:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4878, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4875, "mutability": "mutable", "name": "to", "nameLocation": "6160:2:5", "nodeType": "VariableDeclaration", "scope": 4901, "src": "6152:10:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4874, "name": "address", "nodeType": "ElementaryTypeName", "src": "6152:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4877, "mutability": "mutable", "name": "amount", "nameLocation": "6172:6:5", "nodeType": "VariableDeclaration", "scope": 4901, "src": "6164:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4876, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6164:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "6151:28:5"}, "returnParameters": {"id": 4879, "nodeType": "ParameterList", "parameters": [], "src": "6197:0:5"}, "scope": 4930, "src": "6137:325:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "internal"}, {"body": {"id": 4928, "nodeType": "Block", "src": "6530:266:5", "statements": [{"expression": {"id": 4912, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"baseExpression": {"id": 4908, "name": "balanceOf", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4573, "src": "6540:9:5", "typeDescriptions": {"typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", "typeString": "mapping(address => uint256)"}}, "id": 4910, "indexExpression": {"id": 4909, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4903, "src": "6550:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "6540:15:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 4911, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4905, "src": "6559:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6540:25:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4913, "nodeType": "ExpressionStatement", "src": "6540:25:5"}, {"id": 4918, "nodeType": "UncheckedBlock", "src": "6684:56:5", "statements": [{"expression": {"id": 4916, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": {"id": 4914, "name": "totalSupply", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4569, "src": "6708:11:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "nodeType": "Assignment", "operator": "-=", "rightHandSide": {"id": 4915, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4905, "src": "6723:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "src": "6708:21:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "id": 4917, "nodeType": "ExpressionStatement", "src": "6708:21:5"}]}, {"eventCall": {"arguments": [{"id": 4920, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4903, "src": "6764:4:5", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"arguments": [{"hexValue": "30", "id": 4923, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "6778:1:5", "typeDescriptions": {"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}, "value": "0"}], "expression": {"argumentTypes": [{"typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0"}], "id": 4922, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "6770:7:5", "typeDescriptions": {"typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)"}, "typeName": {"id": 4921, "name": "address", "nodeType": "ElementaryTypeName", "src": "6770:7:5", "typeDescriptions": {}}}, "id": 4924, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6770:10:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, {"id": 4925, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4905, "src": "6782:6:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}], "expression": {"argumentTypes": [{"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_address", "typeString": "address"}, {"typeIdentifier": "t_uint256", "typeString": "uint256"}], "id": 4919, "name": "Transfer", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4553, "src": "6755:8:5", "typeDescriptions": {"typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", "typeString": "function (address,address,uint256)"}}, "id": 4926, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "6755:34:5", "tryCall": false, "typeDescriptions": {"typeIdentifier": "t_tuple$__$", "typeString": "tuple()"}}, "id": 4927, "nodeType": "EmitStatement", "src": "6750:39:5"}]}, "id": 4929, "implemented": true, "kind": "function", "modifiers": [], "name": "_burn", "nameLocation": "6477:5:5", "nodeType": "FunctionDefinition", "parameters": {"id": 4906, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 4903, "mutability": "mutable", "name": "from", "nameLocation": "6491:4:5", "nodeType": "VariableDeclaration", "scope": 4929, "src": "6483:12:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 4902, "name": "address", "nodeType": "ElementaryTypeName", "src": "6483:7:5", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 4905, "mutability": "mutable", "name": "amount", "nameLocation": "6505:6:5", "nodeType": "VariableDeclaration", "scope": 4929, "src": "6497:14:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 4904, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "6497:7:5", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "6482:30:5"}, "returnParameters": {"id": 4907, "nodeType": "ParameterList", "parameters": [], "src": "6530:0:5"}, "scope": 4930, "src": "6468:328:5", "stateMutability": "nonpayable", "virtual": true, "visibility": "internal"}], "scope": 4931, "src": "461:6337:5", "usedErrors": [], "usedEvents": [4553, 4561]}], "src": "32:6767:5"}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": {"AST": {"absolutePath": "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol", "exportedSymbols": {"IVotes": [5114]}, "id": 5115, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 5038, "literals": ["solidity", "^", "0.8", ".0"], "nodeType": "PragmaDirective", "src": "110:23:6"}, {"abstract": false, "baseContracts": [], "canonicalName": "IVotes", "contractDependencies": [], "contractKind": "interface", "documentation": {"id": 5039, "nodeType": "StructuredDocumentation", "src": "135:132:6", "text": " @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n _Available since v4.5._"}, "fullyImplemented": false, "id": 5114, "linearizedBaseContracts": [5114], "name": "IVotes", "nameLocation": "278:6:6", "nodeType": "ContractDefinition", "nodes": [{"anonymous": false, "documentation": {"id": 5040, "nodeType": "StructuredDocumentation", "src": "291:71:6", "text": " @dev Emitted when an account changes their delegate."}, "eventSelector": "3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f", "id": 5048, "name": "DelegateChanged", "nameLocation": "373:15:6", "nodeType": "EventDefinition", "parameters": {"id": 5047, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5042, "indexed": true, "mutability": "mutable", "name": "delegator", "nameLocation": "405:9:6", "nodeType": "VariableDeclaration", "scope": 5048, "src": "389:25:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5041, "name": "address", "nodeType": "ElementaryTypeName", "src": "389:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5044, "indexed": true, "mutability": "mutable", "name": "fromDelegate", "nameLocation": "432:12:6", "nodeType": "VariableDeclaration", "scope": 5048, "src": "416:28:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5043, "name": "address", "nodeType": "ElementaryTypeName", "src": "416:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5046, "indexed": true, "mutability": "mutable", "name": "toDelegate", "nameLocation": "462:10:6", "nodeType": "VariableDeclaration", "scope": 5048, "src": "446:26:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5045, "name": "address", "nodeType": "ElementaryTypeName", "src": "446:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "388:85:6"}, "src": "367:107:6"}, {"anonymous": false, "documentation": {"id": 5049, "nodeType": "StructuredDocumentation", "src": "480:124:6", "text": " @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes."}, "eventSelector": "dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", "id": 5057, "name": "DelegateVotesChanged", "nameLocation": "615:20:6", "nodeType": "EventDefinition", "parameters": {"id": 5056, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5051, "indexed": true, "mutability": "mutable", "name": "delegate", "nameLocation": "652:8:6", "nodeType": "VariableDeclaration", "scope": 5057, "src": "636:24:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5050, "name": "address", "nodeType": "ElementaryTypeName", "src": "636:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5053, "indexed": false, "mutability": "mutable", "name": "previousBalance", "nameLocation": "670:15:6", "nodeType": "VariableDeclaration", "scope": 5057, "src": "662:23:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5052, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "662:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5055, "indexed": false, "mutability": "mutable", "name": "newBalance", "nameLocation": "695:10:6", "nodeType": "VariableDeclaration", "scope": 5057, "src": "687:18:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5054, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "687:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "635:71:6"}, "src": "609:98:6"}, {"documentation": {"id": 5058, "nodeType": "StructuredDocumentation", "src": "713:79:6", "text": " @dev Returns the current amount of votes that `account` has."}, "functionSelector": "9ab24eb0", "id": 5065, "implemented": false, "kind": "function", "modifiers": [], "name": "getVotes", "nameLocation": "806:8:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5061, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5060, "mutability": "mutable", "name": "account", "nameLocation": "823:7:6", "nodeType": "VariableDeclaration", "scope": 5065, "src": "815:15:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5059, "name": "address", "nodeType": "ElementaryTypeName", "src": "815:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "814:17:6"}, "returnParameters": {"id": 5064, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5063, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5065, "src": "855:7:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5062, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "855:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "854:9:6"}, "scope": 5114, "src": "797:67:6", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5066, "nodeType": "StructuredDocumentation", "src": "870:114:6", "text": " @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`)."}, "functionSelector": "3a46b1a8", "id": 5075, "implemented": false, "kind": "function", "modifiers": [], "name": "getPastVotes", "nameLocation": "998:12:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5071, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5068, "mutability": "mutable", "name": "account", "nameLocation": "1019:7:6", "nodeType": "VariableDeclaration", "scope": 5075, "src": "1011:15:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5067, "name": "address", "nodeType": "ElementaryTypeName", "src": "1011:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5070, "mutability": "mutable", "name": "blockNumber", "nameLocation": "1036:11:6", "nodeType": "VariableDeclaration", "scope": 5075, "src": "1028:19:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5069, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1028:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1010:38:6"}, "returnParameters": {"id": 5074, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5073, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5075, "src": "1072:7:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5072, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1072:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1071:9:6"}, "scope": 5114, "src": "989:92:6", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5076, "nodeType": "StructuredDocumentation", "src": "1087:365:6", "text": " @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n Votes that have not been delegated are still part of total supply, even though they would not participate in a\n vote."}, "functionSelector": "8e539e8c", "id": 5083, "implemented": false, "kind": "function", "modifiers": [], "name": "getPastTotalSupply", "nameLocation": "1466:18:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5079, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5078, "mutability": "mutable", "name": "blockNumber", "nameLocation": "1493:11:6", "nodeType": "VariableDeclaration", "scope": 5083, "src": "1485:19:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5077, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1485:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1484:21:6"}, "returnParameters": {"id": 5082, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5081, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5083, "src": "1529:7:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5080, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1529:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1528:9:6"}, "scope": 5114, "src": "1457:81:6", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5084, "nodeType": "StructuredDocumentation", "src": "1544:71:6", "text": " @dev Returns the delegate that `account` has chosen."}, "functionSelector": "587cde1e", "id": 5091, "implemented": false, "kind": "function", "modifiers": [], "name": "delegates", "nameLocation": "1629:9:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5087, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5086, "mutability": "mutable", "name": "account", "nameLocation": "1647:7:6", "nodeType": "VariableDeclaration", "scope": 5091, "src": "1639:15:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5085, "name": "address", "nodeType": "ElementaryTypeName", "src": "1639:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1638:17:6"}, "returnParameters": {"id": 5090, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5089, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5091, "src": "1679:7:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5088, "name": "address", "nodeType": "ElementaryTypeName", "src": "1679:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1678:9:6"}, "scope": 5114, "src": "1620:68:6", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5092, "nodeType": "StructuredDocumentation", "src": "1694:71:6", "text": " @dev Delegates votes from the sender to `delegatee`."}, "functionSelector": "5c19a95c", "id": 5097, "implemented": false, "kind": "function", "modifiers": [], "name": "delegate", "nameLocation": "1779:8:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5095, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5094, "mutability": "mutable", "name": "delegatee", "nameLocation": "1796:9:6", "nodeType": "VariableDeclaration", "scope": 5097, "src": "1788:17:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5093, "name": "address", "nodeType": "ElementaryTypeName", "src": "1788:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1787:19:6"}, "returnParameters": {"id": 5096, "nodeType": "ParameterList", "parameters": [], "src": "1815:0:6"}, "scope": 5114, "src": "1770:46:6", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5098, "nodeType": "StructuredDocumentation", "src": "1822:67:6", "text": " @dev Delegates votes from signer to `delegatee`."}, "functionSelector": "c3cda520", "id": 5113, "implemented": false, "kind": "function", "modifiers": [], "name": "delegateBySig", "nameLocation": "1903:13:6", "nodeType": "FunctionDefinition", "parameters": {"id": 5111, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5100, "mutability": "mutable", "name": "delegatee", "nameLocation": "1934:9:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "1926:17:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5099, "name": "address", "nodeType": "ElementaryTypeName", "src": "1926:7:6", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5102, "mutability": "mutable", "name": "nonce", "nameLocation": "1961:5:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "1953:13:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5101, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1953:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5104, "mutability": "mutable", "name": "expiry", "nameLocation": "1984:6:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "1976:14:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5103, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1976:7:6", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}, {"constant": false, "id": 5106, "mutability": "mutable", "name": "v", "nameLocation": "2006:1:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "2000:7:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}, "typeName": {"id": 5105, "name": "uint8", "nodeType": "ElementaryTypeName", "src": "2000:5:6", "typeDescriptions": {"typeIdentifier": "t_uint8", "typeString": "uint8"}}, "visibility": "internal"}, {"constant": false, "id": 5108, "mutability": "mutable", "name": "r", "nameLocation": "2025:1:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "2017:9:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 5107, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "2017:7:6", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}, {"constant": false, "id": 5110, "mutability": "mutable", "name": "s", "nameLocation": "2044:1:6", "nodeType": "VariableDeclaration", "scope": 5113, "src": "2036:9:6", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}, "typeName": {"id": 5109, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "2036:7:6", "typeDescriptions": {"typeIdentifier": "t_bytes32", "typeString": "bytes32"}}, "visibility": "internal"}], "src": "1916:135:6"}, "returnParameters": {"id": 5112, "nodeType": "ParameterList", "parameters": [], "src": "2060:0:6"}, "scope": 5114, "src": "1894:167:6", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}], "scope": 5115, "src": "268:1795:6", "usedErrors": [], "usedEvents": [5048, 5057]}], "src": "110:1954:6"}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {"AST": {"absolutePath": "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol", "exportedSymbols": {"IERC20": [5192]}, "id": 5193, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 5116, "literals": ["solidity", "^", "0.8", ".0"], "nodeType": "PragmaDirective", "src": "106:23:7"}, {"abstract": false, "baseContracts": [], "canonicalName": "IERC20", "contractDependencies": [], "contractKind": "interface", "documentation": {"id": 5117, "nodeType": "StructuredDocumentation", "src": "131:70:7", "text": " @dev Interface of the ERC20 standard as defined in the EIP."}, "fullyImplemented": false, "id": 5192, "linearizedBaseContracts": [5192], "name": "IERC20", "nameLocation": "212:6:7", "nodeType": "ContractDefinition", "nodes": [{"anonymous": false, "documentation": {"id": 5118, "nodeType": "StructuredDocumentation", "src": "225:158:7", "text": " @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."}, "eventSelector": "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "id": 5126, "name": "Transfer", "nameLocation": "394:8:7", "nodeType": "EventDefinition", "parameters": {"id": 5125, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5120, "indexed": true, "mutability": "mutable", "name": "from", "nameLocation": "419:4:7", "nodeType": "VariableDeclaration", "scope": 5126, "src": "403:20:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5119, "name": "address", "nodeType": "ElementaryTypeName", "src": "403:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5122, "indexed": true, "mutability": "mutable", "name": "to", "nameLocation": "441:2:7", "nodeType": "VariableDeclaration", "scope": 5126, "src": "425:18:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5121, "name": "address", "nodeType": "ElementaryTypeName", "src": "425:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5124, "indexed": false, "mutability": "mutable", "name": "value", "nameLocation": "453:5:7", "nodeType": "VariableDeclaration", "scope": 5126, "src": "445:13:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5123, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "445:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "402:57:7"}, "src": "388:72:7"}, {"anonymous": false, "documentation": {"id": 5127, "nodeType": "StructuredDocumentation", "src": "466:148:7", "text": " @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."}, "eventSelector": "8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", "id": 5135, "name": "Approval", "nameLocation": "625:8:7", "nodeType": "EventDefinition", "parameters": {"id": 5134, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5129, "indexed": true, "mutability": "mutable", "name": "owner", "nameLocation": "650:5:7", "nodeType": "VariableDeclaration", "scope": 5135, "src": "634:21:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5128, "name": "address", "nodeType": "ElementaryTypeName", "src": "634:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5131, "indexed": true, "mutability": "mutable", "name": "spender", "nameLocation": "673:7:7", "nodeType": "VariableDeclaration", "scope": 5135, "src": "657:23:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5130, "name": "address", "nodeType": "ElementaryTypeName", "src": "657:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5133, "indexed": false, "mutability": "mutable", "name": "value", "nameLocation": "690:5:7", "nodeType": "VariableDeclaration", "scope": 5135, "src": "682:13:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5132, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "682:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "633:63:7"}, "src": "619:78:7"}, {"documentation": {"id": 5136, "nodeType": "StructuredDocumentation", "src": "703:66:7", "text": " @dev Returns the amount of tokens in existence."}, "functionSelector": "18160ddd", "id": 5141, "implemented": false, "kind": "function", "modifiers": [], "name": "totalSupply", "nameLocation": "783:11:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5137, "nodeType": "ParameterList", "parameters": [], "src": "794:2:7"}, "returnParameters": {"id": 5140, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5139, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5141, "src": "820:7:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5138, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "820:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "819:9:7"}, "scope": 5192, "src": "774:55:7", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5142, "nodeType": "StructuredDocumentation", "src": "835:72:7", "text": " @dev Returns the amount of tokens owned by `account`."}, "functionSelector": "70a08231", "id": 5149, "implemented": false, "kind": "function", "modifiers": [], "name": "balanceOf", "nameLocation": "921:9:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5145, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5144, "mutability": "mutable", "name": "account", "nameLocation": "939:7:7", "nodeType": "VariableDeclaration", "scope": 5149, "src": "931:15:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5143, "name": "address", "nodeType": "ElementaryTypeName", "src": "931:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "930:17:7"}, "returnParameters": {"id": 5148, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5147, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5149, "src": "971:7:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5146, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "971:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "970:9:7"}, "scope": 5192, "src": "912:68:7", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5150, "nodeType": "StructuredDocumentation", "src": "986:202:7", "text": " @dev Moves `amount` tokens from the caller's account to `to`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."}, "functionSelector": "a9059cbb", "id": 5159, "implemented": false, "kind": "function", "modifiers": [], "name": "transfer", "nameLocation": "1202:8:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5155, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5152, "mutability": "mutable", "name": "to", "nameLocation": "1219:2:7", "nodeType": "VariableDeclaration", "scope": 5159, "src": "1211:10:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5151, "name": "address", "nodeType": "ElementaryTypeName", "src": "1211:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5154, "mutability": "mutable", "name": "amount", "nameLocation": "1231:6:7", "nodeType": "VariableDeclaration", "scope": 5159, "src": "1223:14:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5153, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1223:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1210:28:7"}, "returnParameters": {"id": 5158, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5157, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5159, "src": "1257:4:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 5156, "name": "bool", "nodeType": "ElementaryTypeName", "src": "1257:4:7", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "1256:6:7"}, "scope": 5192, "src": "1193:70:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5160, "nodeType": "StructuredDocumentation", "src": "1269:264:7", "text": " @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."}, "functionSelector": "dd62ed3e", "id": 5169, "implemented": false, "kind": "function", "modifiers": [], "name": "allowance", "nameLocation": "1547:9:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5165, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5162, "mutability": "mutable", "name": "owner", "nameLocation": "1565:5:7", "nodeType": "VariableDeclaration", "scope": 5169, "src": "1557:13:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5161, "name": "address", "nodeType": "ElementaryTypeName", "src": "1557:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5164, "mutability": "mutable", "name": "spender", "nameLocation": "1580:7:7", "nodeType": "VariableDeclaration", "scope": 5169, "src": "1572:15:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5163, "name": "address", "nodeType": "ElementaryTypeName", "src": "1572:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}], "src": "1556:32:7"}, "returnParameters": {"id": 5168, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5167, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5169, "src": "1612:7:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5166, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1612:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "1611:9:7"}, "scope": 5192, "src": "1538:83:7", "stateMutability": "view", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5170, "nodeType": "StructuredDocumentation", "src": "1627:642:7", "text": " @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."}, "functionSelector": "095ea7b3", "id": 5179, "implemented": false, "kind": "function", "modifiers": [], "name": "approve", "nameLocation": "2283:7:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5175, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5172, "mutability": "mutable", "name": "spender", "nameLocation": "2299:7:7", "nodeType": "VariableDeclaration", "scope": 5179, "src": "2291:15:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5171, "name": "address", "nodeType": "ElementaryTypeName", "src": "2291:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5174, "mutability": "mutable", "name": "amount", "nameLocation": "2316:6:7", "nodeType": "VariableDeclaration", "scope": 5179, "src": "2308:14:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5173, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2308:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2290:33:7"}, "returnParameters": {"id": 5178, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5177, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5179, "src": "2342:4:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 5176, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2342:4:7", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "2341:6:7"}, "scope": 5192, "src": "2274:74:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}, {"documentation": {"id": 5180, "nodeType": "StructuredDocumentation", "src": "2354:287:7", "text": " @dev Moves `amount` tokens from `from` to `to` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."}, "functionSelector": "23b872dd", "id": 5191, "implemented": false, "kind": "function", "modifiers": [], "name": "transferFrom", "nameLocation": "2655:12:7", "nodeType": "FunctionDefinition", "parameters": {"id": 5187, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5182, "mutability": "mutable", "name": "from", "nameLocation": "2685:4:7", "nodeType": "VariableDeclaration", "scope": 5191, "src": "2677:12:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5181, "name": "address", "nodeType": "ElementaryTypeName", "src": "2677:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5184, "mutability": "mutable", "name": "to", "nameLocation": "2707:2:7", "nodeType": "VariableDeclaration", "scope": 5191, "src": "2699:10:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}, "typeName": {"id": 5183, "name": "address", "nodeType": "ElementaryTypeName", "src": "2699:7:7", "stateMutability": "nonpayable", "typeDescriptions": {"typeIdentifier": "t_address", "typeString": "address"}}, "visibility": "internal"}, {"constant": false, "id": 5186, "mutability": "mutable", "name": "amount", "nameLocation": "2727:6:7", "nodeType": "VariableDeclaration", "scope": 5191, "src": "2719:14:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}, "typeName": {"id": 5185, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "2719:7:7", "typeDescriptions": {"typeIdentifier": "t_uint256", "typeString": "uint256"}}, "visibility": "internal"}], "src": "2667:72:7"}, "returnParameters": {"id": 5190, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5189, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5191, "src": "2758:4:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 5188, "name": "bool", "nodeType": "ElementaryTypeName", "src": "2758:4:7", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "2757:6:7"}, "scope": 5192, "src": "2646:118:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "external"}], "scope": 5193, "src": "202:2564:7", "usedErrors": [], "usedEvents": [5126, 5135]}], "src": "106:2661:7"}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": {"AST": {"absolutePath": "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol", "exportedSymbols": {"IERC165": [5204]}, "id": 5205, "license": "MIT", "nodeType": "SourceUnit", "nodes": [{"id": 5194, "literals": ["solidity", "^", "0.8", ".0"], "nodeType": "PragmaDirective", "src": "100:23:8"}, {"abstract": false, "baseContracts": [], "canonicalName": "IERC165", "contractDependencies": [], "contractKind": "interface", "documentation": {"id": 5195, "nodeType": "StructuredDocumentation", "src": "125:279:8", "text": " @dev Interface of the ERC165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[EIP].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."}, "fullyImplemented": false, "id": 5204, "linearizedBaseContracts": [5204], "name": "IERC165", "nameLocation": "415:7:8", "nodeType": "ContractDefinition", "nodes": [{"documentation": {"id": 5196, "nodeType": "StructuredDocumentation", "src": "429:340:8", "text": " @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."}, "functionSelector": "01ffc9a7", "id": 5203, "implemented": false, "kind": "function", "modifiers": [], "name": "supportsInterface", "nameLocation": "783:17:8", "nodeType": "FunctionDefinition", "parameters": {"id": 5199, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5198, "mutability": "mutable", "name": "interfaceId", "nameLocation": "808:11:8", "nodeType": "VariableDeclaration", "scope": 5203, "src": "801:18:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}, "typeName": {"id": 5197, "name": "bytes4", "nodeType": "ElementaryTypeName", "src": "801:6:8", "typeDescriptions": {"typeIdentifier": "t_bytes4", "typeString": "bytes4"}}, "visibility": "internal"}], "src": "800:20:8"}, "returnParameters": {"id": 5202, "nodeType": "ParameterList", "parameters": [{"constant": false, "id": 5201, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 5203, "src": "844:4:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}, "typeName": {"id": 5200, "name": "bool", "nodeType": "ElementaryTypeName", "src": "844:4:8", "typeDescriptions": {"typeIdentifier": "t_bool", "typeString": "bool"}}, "visibility": "internal"}], "src": "843:6:8"}, "scope": 5204, "src": "774:76:8", "stateMutability": "view", "virtual": false, "visibility": "external"}], "scope": 5205, "src": "405:447:8", "usedErrors": [], "usedEvents": []}], "src": "100:753:8"}}}, "sourceList": ["/home/andrey/valory/autonolas-governance/contracts/OLAS.sol", "/home/andrey/valory/autonolas-governance/contracts/interfaces/IErrors.sol", "/home/andrey/valory/autonolas-governance/contracts/test/EchidnaVoteWeightingAssert.sol", "/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol", "/home/andrey/valory/autonolas-governance/contracts/veOLAS.sol", "/home/andrey/valory/autonolas-governance/lib/solmate/src/tokens/ERC20.sol", "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol", "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol", "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol"], "contracts": {"/home/andrey/valory/autonolas-governance/contracts/OLAS.sol:OLAS": {"srcmap": "508:5182:0:-:0;;;1144:147;;;;;;;;;;1968:292:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1185:2:0;2088:5:5;2081:4;:12;;;;;;:::i;:::-;;2112:7;2103:6;:16;;;;;;:::i;:::-;;2140:9;2129:20;;;;;;;;;;2179:13;2160:32;;;;;;2229:24;:22;;;:24;;:::i;:::-;2202:51;;;;;;1968:292;;;1207:10:0::1;1199:5;;:18;;;;;;;;;;;;;;;;;;1236:10;1227:6;;:19;;;;;;;;;;;;;;;;;;1269:15;1256:28;;;;::::0;::::1;508:5182:::0;;5497:446:5;5562:7;5659:95;5792:4;5776:22;;;;;;:::i;:::-;;;;;;;;5820:14;5856:13;5899:4;5627:295;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5600:336;;;;;;5581:355;;5497:446;:::o;7:99:9:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:180::-;160:77;157:1;150:88;257:4;254:1;247:15;281:4;278:1;271:15;298:180;346:77;343:1;336:88;443:4;440:1;433:15;467:4;464:1;457:15;484:320;528:6;565:1;559:4;555:12;545:22;;612:1;606:4;602:12;633:18;623:81;;689:4;681:6;677:17;667:27;;623:81;751:2;743:6;740:14;720:18;717:38;714:84;;770:18;;:::i;:::-;714:84;535:269;484:320;;;:::o;810:141::-;859:4;882:3;874:11;;905:3;902:1;895:14;939:4;936:1;926:18;918:26;;810:141;;;:::o;957:93::-;994:6;1041:2;1036;1029:5;1025:14;1021:23;1011:33;;957:93;;;:::o;1056:107::-;1100:8;1150:5;1144:4;1140:16;1119:37;;1056:107;;;;:::o;1169:393::-;1238:6;1288:1;1276:10;1272:18;1311:97;1341:66;1330:9;1311:97;:::i;:::-;1429:39;1459:8;1448:9;1429:39;:::i;:::-;1417:51;;1501:4;1497:9;1490:5;1486:21;1477:30;;1550:4;1540:8;1536:19;1529:5;1526:30;1516:40;;1245:317;;1169:393;;;;;:::o;1568:77::-;1605:7;1634:5;1623:16;;1568:77;;;:::o;1651:60::-;1679:3;1700:5;1693:12;;1651:60;;;:::o;1717:142::-;1767:9;1800:53;1818:34;1827:24;1845:5;1827:24;:::i;:::-;1818:34;:::i;:::-;1800:53;:::i;:::-;1787:66;;1717:142;;;:::o;1865:75::-;1908:3;1929:5;1922:12;;1865:75;;;:::o;1946:269::-;2056:39;2087:7;2056:39;:::i;:::-;2117:91;2166:41;2190:16;2166:41;:::i;:::-;2158:6;2151:4;2145:11;2117:91;:::i;:::-;2111:4;2104:105;2022:193;1946:269;;;:::o;2221:73::-;2266:3;2221:73;:::o;2300:189::-;2377:32;;:::i;:::-;2418:65;2476:6;2468;2462:4;2418:65;:::i;:::-;2353:136;2300:189;;:::o;2495:186::-;2555:120;2572:3;2565:5;2562:14;2555:120;;;2626:39;2663:1;2656:5;2626:39;:::i;:::-;2599:1;2592:5;2588:13;2579:22;;2555:120;;;2495:186;;:::o;2687:543::-;2788:2;2783:3;2780:11;2777:446;;;2822:38;2854:5;2822:38;:::i;:::-;2906:29;2924:10;2906:29;:::i;:::-;2896:8;2892:44;3089:2;3077:10;3074:18;3071:49;;;3110:8;3095:23;;3071:49;3133:80;3189:22;3207:3;3189:22;:::i;:::-;3179:8;3175:37;3162:11;3133:80;:::i;:::-;2792:431;;2777:446;2687:543;;;:::o;3236:117::-;3290:8;3340:5;3334:4;3330:16;3309:37;;3236:117;;;;:::o;3359:169::-;3403:6;3436:51;3484:1;3480:6;3472:5;3469:1;3465:13;3436:51;:::i;:::-;3432:56;3517:4;3511;3507:15;3497:25;;3410:118;3359:169;;;;:::o;3533:295::-;3609:4;3755:29;3780:3;3774:4;3755:29;:::i;:::-;3747:37;;3817:3;3814:1;3810:11;3804:4;3801:21;3793:29;;3533:295;;;;:::o;3833:1395::-;3950:37;3983:3;3950:37;:::i;:::-;4052:18;4044:6;4041:30;4038:56;;;4074:18;;:::i;:::-;4038:56;4118:38;4150:4;4144:11;4118:38;:::i;:::-;4203:67;4263:6;4255;4249:4;4203:67;:::i;:::-;4297:1;4321:4;4308:17;;4353:2;4345:6;4342:14;4370:1;4365:618;;;;5027:1;5044:6;5041:77;;;5093:9;5088:3;5084:19;5078:26;5069:35;;5041:77;5144:67;5204:6;5197:5;5144:67;:::i;:::-;5138:4;5131:81;5000:222;4335:887;;4365:618;4417:4;4413:9;4405:6;4401:22;4451:37;4483:4;4451:37;:::i;:::-;4510:1;4524:208;4538:7;4535:1;4532:14;4524:208;;;4617:9;4612:3;4608:19;4602:26;4594:6;4587:42;4668:1;4660:6;4656:14;4646:24;;4715:2;4704:9;4700:18;4687:31;;4561:4;4558:1;4554:12;4549:17;;4524:208;;;4760:6;4751:7;4748:19;4745:179;;;4818:9;4813:3;4809:19;4803:26;4861:48;4903:4;4895:6;4891:17;4880:9;4861:48;:::i;:::-;4853:6;4846:64;4768:156;4745:179;4970:1;4966;4958:6;4954:14;4950:22;4944:4;4937:36;4372:611;;;4335:887;;3925:1303;;;3833:1395;;:::o;5234:147::-;5335:11;5372:3;5357:18;;5234:147;;;;:::o;5387:144::-;5439:4;5462:3;5454:11;;5485:3;5482:1;5475:14;5519:4;5516:1;5506:18;5498:26;;5387:144;;;:::o;5559:878::-;5664:3;5701:5;5695:12;5730:36;5756:9;5730:36;:::i;:::-;5782:88;5863:6;5858:3;5782:88;:::i;:::-;5775:95;;5901:1;5890:9;5886:17;5917:1;5912:166;;;;6092:1;6087:344;;;;5879:552;;5912:166;5996:4;5992:9;5981;5977:25;5972:3;5965:38;6058:6;6051:14;6044:22;6036:6;6032:35;6027:3;6023:45;6016:52;;5912:166;;6087:344;6154:41;6189:5;6154:41;:::i;:::-;6217:1;6231:154;6245:6;6242:1;6239:13;6231:154;;;6319:7;6313:14;6309:1;6304:3;6300:11;6293:35;6369:1;6360:7;6356:15;6345:26;;6267:4;6264:1;6260:12;6255:17;;6231:154;;;6414:6;6409:3;6405:16;6398:23;;6094:337;;5879:552;;5668:769;;5559:878;;;;:::o;6443:273::-;6574:3;6596:94;6686:3;6677:6;6596:94;:::i;:::-;6589:101;;6707:3;6700:10;;6443:273;;;;:::o;6722:77::-;6759:7;6788:5;6777:16;;6722:77;;;:::o;6805:118::-;6892:24;6910:5;6892:24;:::i;:::-;6887:3;6880:37;6805:118;;:::o;6929:::-;7016:24;7034:5;7016:24;:::i;:::-;7011:3;7004:37;6929:118;;:::o;7053:126::-;7090:7;7130:42;7123:5;7119:54;7108:65;;7053:126;;;:::o;7185:96::-;7222:7;7251:24;7269:5;7251:24;:::i;:::-;7240:35;;7185:96;;;:::o;7287:118::-;7374:24;7392:5;7374:24;:::i;:::-;7369:3;7362:37;7287:118;;:::o;7411:664::-;7616:4;7654:3;7643:9;7639:19;7631:27;;7668:71;7736:1;7725:9;7721:17;7712:6;7668:71;:::i;:::-;7749:72;7817:2;7806:9;7802:18;7793:6;7749:72;:::i;:::-;7831;7899:2;7888:9;7884:18;7875:6;7831:72;:::i;:::-;7913;7981:2;7970:9;7966:18;7957:6;7913:72;:::i;:::-;7995:73;8063:3;8052:9;8048:19;8039:6;7995:73;:::i;:::-;7411:664;;;;;;;;:::o;508:5182:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "srcmap-runtime": "508:5182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:18:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1116:21:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2448:211:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;785:59:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1291:26:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3044:592;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1780:305:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1070:31:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5314:177;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5350:338:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2327:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4079:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;904:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2917:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1324:44:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1738:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1068:20:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1005:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1043:20:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4604:413:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1385:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2665:373:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3197:795:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3825:1483:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1375:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;659:46:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1018:18:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1116:21:0:-;;;;;;;;;;;;;:::o;2448:211:5:-;2522:4;2571:6;2538:9;:21;2548:10;2538:21;;;;;;;;;;;;;;;:30;2560:7;2538:30;;;;;;;;;;;;;;;:39;;;;2614:7;2593:37;;2602:10;2593:37;;;2623:6;2593:37;;;;;;:::i;:::-;;;;;;;;2648:4;2641:11;;2448:211;;;;:::o;785:59:0:-;828:16;785:59;:::o;1291:26:5:-;;;;:::o;3044:592::-;3162:4;3178:15;3196:9;:15;3206:4;3196:15;;;;;;;;;;;;;;;:27;3212:10;3196:27;;;;;;;;;;;;;;;;3178:45;;3285:17;3274:7;:28;3270:80;;3344:6;3334:7;:16;;;;:::i;:::-;3304:9;:15;3314:4;3304:15;;;;;;;;;;;;;;;:27;3320:10;3304:27;;;;;;;;;;;;;;;:46;;;;3270:80;3380:6;3361:9;:15;3371:4;3361:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;3549:6;3532:9;:13;3542:2;3532:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;3596:2;3581:26;;3590:4;3581:26;;;3600:6;3581:26;;;;;;:::i;:::-;;;;;;;;3625:4;3618:11;;;3044:592;;;;;:::o;1780:305:0:-;1858:5;;;;;;;;;;;1844:19;;:10;:19;;;1840:87;;1898:10;1910:5;;;;;;;;;;;1886:30;;;;;;;;;;;;:::i;:::-;;;;;;;;1840:87;1962:1;1941:23;;:9;:23;;;1937:74;;1987:13;;;;;;;;;;;;;;1937:74;2030:9;2021:6;;:18;;;;;;;;;;;;;;;;;;2068:9;2054:24;;;;;;;;;;;;1780:305;:::o;1070:31:5:-;;;:::o;5314:177::-;5371:7;5414:16;5397:13;:33;:87;;5460:24;:22;:24::i;:::-;5397:87;;;5433:24;5397:87;5390:94;;5314:177;:::o;5350:338:0:-;5428:4;5444:24;5471:9;:21;5481:10;5471:21;;;;;;;;;;;;;;;:30;5493:7;5471:30;;;;;;;;;;;;;;;;5444:57;;5532:6;5512:26;;;;;:::i;:::-;;;5581:16;5548:9;:21;5558:10;5548:21;;;;;;;;;;;;;;;:30;5570:7;5548:30;;;;;;;;;;;;;;;:49;;;;5633:7;5612:47;;5621:10;5612:47;;;5642:16;5612:47;;;;;;:::i;:::-;;;;;;;;5677:4;5670:11;;;5350:338;;;;:::o;2327:323::-;2437:6;;;;;;;;;;;2423:20;;:10;:20;;;2419:89;;2478:10;2490:6;;;;;;;;;;;2466:31;;;;;;;;;;;;:::i;:::-;;;;;;;;2419:89;2571:24;2588:6;2571:16;:24::i;:::-;2567:77;;;2611:22;2617:7;2626:6;2611:5;:22::i;:::-;2567:77;2327:323;;:::o;4079:81::-;4128:25;4134:10;4146:6;4128:5;:25::i;:::-;4079:81;:::o;904:46::-;949:1;904:46;:::o;2917:164::-;2980:4;2996:17;3016:20;:18;:20::i;:::-;2996:40;;3064:9;3054:6;:19;;3046:28;;;2917:164;;;:::o;1324:44:5:-;;;;;;;;;;;;;;;;;:::o;1738:41::-;;;;;;;;;;;;;;;;;:::o;1068:20:0:-;;;;;;;;;;;;;:::o;1005:35::-;;;:::o;1043:20:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4604:413:0:-;4682:4;4698:24;4725:9;:21;4735:10;4725:21;;;;;;;;;;;;;;;:30;4747:7;4725:30;;;;;;;;;;;;;;;;4698:57;;4790:17;4770:16;:37;4766:223;;4843:6;4823:26;;;;;:::i;:::-;;;4896:16;4863:9;:21;4873:10;4863:21;;;;;;;;;;;;;;;:30;4885:7;4863:30;;;;;;;;;;;;;;;:49;;;;4952:7;4931:47;;4940:10;4931:47;;;4961:16;4931:47;;;;;;:::i;:::-;;;;;;;;4766:223;5006:4;4999:11;;;4604:413;;;;:::o;1385:298::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1443:87;;1501:10;1513:5;;;;;;;;;;;1489:30;;;;;;;;;;;;:::i;:::-;;;;;;;;1443:87;1564:1;1544:22;;:8;:22;;;1540:73;;1589:13;;;;;;;;;;;;;;1540:73;1631:8;1623:5;;:16;;;;;;;;;;;;;;;;;;1667:8;1654:22;;;;;;;;;;;;1385:298;:::o;2665:373:5:-;2735:4;2776:6;2751:9;:21;2761:10;2751:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;2945:6;2928:9;:13;2938:2;2928:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;2998:2;2977:32;;2986:10;2977:32;;;3002:6;2977:32;;;;;;:::i;:::-;;;;;;;;3027:4;3020:11;;2665:373;;;;:::o;3197:795:0:-;3248:17;3277:20;3300:11;;3277:34;;3345:16;693:12;3383:10;3365:15;:28;;;;:::i;:::-;3364:40;;;;:::i;:::-;3345:59;;3463:17;828:16;3463:36;;3630:1;3619:8;:12;3615:276;;;3743:1;3731:13;;;;;:::i;:::-;;;3763:9;3758:123;3782:8;3778:1;:12;3758:123;;;3863:3;949:1;3829:9;:30;;;;:::i;:::-;3828:38;;;;:::i;:::-;3815:51;;;;;:::i;:::-;;;3792:3;;;;;3758:123;;;;3615:276;3973:12;3961:9;:24;;;;:::i;:::-;3949:36;;3267:725;;;3197:795;:::o;3825:1483:5:-;4044:15;4032:8;:27;;4024:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4252:24;4279:805;4415:18;:16;:18::i;:::-;4542:165;4741:5;4780:7;4821:5;4860:6;:13;4867:5;4860:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;4909:8;4498:449;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4459:514;;;;;;4337:658;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4306:707;;;;;;5031:1;5050;5069;4279:805;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4252:832;;5135:1;5107:30;;:16;:30;;;;:59;;;;;5161:5;5141:25;;:16;:25;;;5107:59;5099:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;5239:5;5200:9;:27;5210:16;5200:27;;;;;;;;;;;;;;;:36;5228:7;5200:36;;;;;;;;;;;;;;;:44;;;;4228:1027;5286:7;5270:31;;5279:5;5270:31;;;5295:5;5270:31;;;;;;:::i;:::-;;;;;;;;3825:1483;;;;;;;:::o;1375:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;659:46:0:-;693:12;659:46;:::o;5497:446:5:-;5562:7;5659:95;5792:4;5776:22;;;;;;:::i;:::-;;;;;;;;5820:14;5856:13;5899:4;5627:295;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5600:336;;;;;;5581:355;;5497:446;:::o;6137:325::-;6222:6;6207:11;;:21;;;;;;;:::i;:::-;;;;;;;;6391:6;6374:9;:13;6384:2;6374:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6444:2;6423:32;;6440:1;6423:32;;;6448:6;6423:32;;;;;;:::i;:::-;;;;;;;;6137:325;;:::o;6468:328::-;6559:6;6540:9;:15;6550:4;6540:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;6723:6;6708:11;;:21;;;;;;;;;;;6778:1;6755:34;;6764:4;6755:34;;;6782:6;6755:34;;;;;;:::i;:::-;;;;;;;;6468:328;;:::o;7:99:9:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:126::-;1386:7;1426:42;1419:5;1415:54;1404:65;;1349:126;;;:::o;1481:96::-;1518:7;1547:24;1565:5;1547:24;:::i;:::-;1536:35;;1481:96;;;:::o;1583:118::-;1670:24;1688:5;1670:24;:::i;:::-;1665:3;1658:37;1583:118;;:::o;1707:222::-;1800:4;1838:2;1827:9;1823:18;1815:26;;1851:71;1919:1;1908:9;1904:17;1895:6;1851:71;:::i;:::-;1707:222;;;;:::o;2016:117::-;2125:1;2122;2115:12;2262:122;2335:24;2353:5;2335:24;:::i;:::-;2328:5;2325:35;2315:63;;2374:1;2371;2364:12;2315:63;2262:122;:::o;2390:139::-;2436:5;2474:6;2461:20;2452:29;;2490:33;2517:5;2490:33;:::i;:::-;2390:139;;;;:::o;2535:77::-;2572:7;2601:5;2590:16;;2535:77;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:118::-;3885:24;3903:5;3885:24;:::i;:::-;3880:3;3873:37;3798:118;;:::o;3922:222::-;4015:4;4053:2;4042:9;4038:18;4030:26;;4066:71;4134:1;4123:9;4119:17;4110:6;4066:71;:::i;:::-;3922:222;;;;:::o;4150:619::-;4227:6;4235;4243;4292:2;4280:9;4271:7;4267:23;4263:32;4260:119;;;4298:79;;:::i;:::-;4260:119;4418:1;4443:53;4488:7;4479:6;4468:9;4464:22;4443:53;:::i;:::-;4433:63;;4389:117;4545:2;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4516:118;4673:2;4699:53;4744:7;4735:6;4724:9;4720:22;4699:53;:::i;:::-;4689:63;;4644:118;4150:619;;;;;:::o;4775:329::-;4834:6;4883:2;4871:9;4862:7;4858:23;4854:32;4851:119;;;4889:79;;:::i;:::-;4851:119;5009:1;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4980:117;4775:329;;;;:::o;5110:86::-;5145:7;5185:4;5178:5;5174:16;5163:27;;5110:86;;;:::o;5202:112::-;5285:22;5301:5;5285:22;:::i;:::-;5280:3;5273:35;5202:112;;:::o;5320:214::-;5409:4;5447:2;5436:9;5432:18;5424:26;;5460:67;5524:1;5513:9;5509:17;5500:6;5460:67;:::i;:::-;5320:214;;;;:::o;5540:77::-;5577:7;5606:5;5595:16;;5540:77;;;:::o;5623:118::-;5710:24;5728:5;5710:24;:::i;:::-;5705:3;5698:37;5623:118;;:::o;5747:222::-;5840:4;5878:2;5867:9;5863:18;5855:26;;5891:71;5959:1;5948:9;5944:17;5935:6;5891:71;:::i;:::-;5747:222;;;;:::o;5975:329::-;6034:6;6083:2;6071:9;6062:7;6058:23;6054:32;6051:119;;;6089:79;;:::i;:::-;6051:119;6209:1;6234:53;6279:7;6270:6;6259:9;6255:22;6234:53;:::i;:::-;6224:63;;6180:117;5975:329;;;;:::o;6310:118::-;6381:22;6397:5;6381:22;:::i;:::-;6374:5;6371:33;6361:61;;6418:1;6415;6408:12;6361:61;6310:118;:::o;6434:135::-;6478:5;6516:6;6503:20;6494:29;;6532:31;6557:5;6532:31;:::i;:::-;6434:135;;;;:::o;6575:122::-;6648:24;6666:5;6648:24;:::i;:::-;6641:5;6638:35;6628:63;;6687:1;6684;6677:12;6628:63;6575:122;:::o;6703:139::-;6749:5;6787:6;6774:20;6765:29;;6803:33;6830:5;6803:33;:::i;:::-;6703:139;;;;:::o;6848:1199::-;6959:6;6967;6975;6983;6991;6999;7007;7056:3;7044:9;7035:7;7031:23;7027:33;7024:120;;;7063:79;;:::i;:::-;7024:120;7183:1;7208:53;7253:7;7244:6;7233:9;7229:22;7208:53;:::i;:::-;7198:63;;7154:117;7310:2;7336:53;7381:7;7372:6;7361:9;7357:22;7336:53;:::i;:::-;7326:63;;7281:118;7438:2;7464:53;7509:7;7500:6;7489:9;7485:22;7464:53;:::i;:::-;7454:63;;7409:118;7566:2;7592:53;7637:7;7628:6;7617:9;7613:22;7592:53;:::i;:::-;7582:63;;7537:118;7694:3;7721:51;7764:7;7755:6;7744:9;7740:22;7721:51;:::i;:::-;7711:61;;7665:117;7821:3;7848:53;7893:7;7884:6;7873:9;7869:22;7848:53;:::i;:::-;7838:63;;7792:119;7950:3;7977:53;8022:7;8013:6;8002:9;7998:22;7977:53;:::i;:::-;7967:63;;7921:119;6848:1199;;;;;;;;;;:::o;8053:474::-;8121:6;8129;8178:2;8166:9;8157:7;8153:23;8149:32;8146:119;;;8184:79;;:::i;:::-;8146:119;8304:1;8329:53;8374:7;8365:6;8354:9;8350:22;8329:53;:::i;:::-;8319:63;;8275:117;8431:2;8457:53;8502:7;8493:6;8482:9;8478:22;8457:53;:::i;:::-;8447:63;;8402:118;8053:474;;;;;:::o;8533:180::-;8581:77;8578:1;8571:88;8678:4;8675:1;8668:15;8702:4;8699:1;8692:15;8719:320;8763:6;8800:1;8794:4;8790:12;8780:22;;8847:1;8841:4;8837:12;8868:18;8858:81;;8924:4;8916:6;8912:17;8902:27;;8858:81;8986:2;8978:6;8975:14;8955:18;8952:38;8949:84;;9005:18;;:::i;:::-;8949:84;8770:269;8719:320;;;:::o;9045:180::-;9093:77;9090:1;9083:88;9190:4;9187:1;9180:15;9214:4;9211:1;9204:15;9231:194;9271:4;9291:20;9309:1;9291:20;:::i;:::-;9286:25;;9325:20;9343:1;9325:20;:::i;:::-;9320:25;;9369:1;9366;9362:9;9354:17;;9393:1;9387:4;9384:11;9381:37;;;9398:18;;:::i;:::-;9381:37;9231:194;;;;:::o;9431:332::-;9552:4;9590:2;9579:9;9575:18;9567:26;;9603:71;9671:1;9660:9;9656:17;9647:6;9603:71;:::i;:::-;9684:72;9752:2;9741:9;9737:18;9728:6;9684:72;:::i;:::-;9431:332;;;;;:::o;9769:191::-;9809:3;9828:20;9846:1;9828:20;:::i;:::-;9823:25;;9862:20;9880:1;9862:20;:::i;:::-;9857:25;;9905:1;9902;9898:9;9891:16;;9926:3;9923:1;9920:10;9917:36;;;9933:18;;:::i;:::-;9917:36;9769:191;;;;:::o;9966:180::-;10014:77;10011:1;10004:88;10111:4;10108:1;10101:15;10135:4;10132:1;10125:15;10152:185;10192:1;10209:20;10227:1;10209:20;:::i;:::-;10204:25;;10243:20;10261:1;10243:20;:::i;:::-;10238:25;;10282:1;10272:35;;10287:18;;:::i;:::-;10272:35;10329:1;10326;10322:9;10317:14;;10152:185;;;;:::o;10343:410::-;10383:7;10406:20;10424:1;10406:20;:::i;:::-;10401:25;;10440:20;10458:1;10440:20;:::i;:::-;10435:25;;10495:1;10492;10488:9;10517:30;10535:11;10517:30;:::i;:::-;10506:41;;10696:1;10687:7;10683:15;10680:1;10677:22;10657:1;10650:9;10630:83;10607:139;;10726:18;;:::i;:::-;10607:139;10391:362;10343:410;;;;:::o;10759:173::-;10899:25;10895:1;10887:6;10883:14;10876:49;10759:173;:::o;10938:366::-;11080:3;11101:67;11165:2;11160:3;11101:67;:::i;:::-;11094:74;;11177:93;11266:3;11177:93;:::i;:::-;11295:2;11290:3;11286:12;11279:19;;10938:366;;;:::o;11310:419::-;11476:4;11514:2;11503:9;11499:18;11491:26;;11563:9;11557:4;11553:20;11549:1;11538:9;11534:17;11527:47;11591:131;11717:4;11591:131;:::i;:::-;11583:139;;11310:419;;;:::o;11735:775::-;11968:4;12006:3;11995:9;11991:19;11983:27;;12020:71;12088:1;12077:9;12073:17;12064:6;12020:71;:::i;:::-;12101:72;12169:2;12158:9;12154:18;12145:6;12101:72;:::i;:::-;12183;12251:2;12240:9;12236:18;12227:6;12183:72;:::i;:::-;12265;12333:2;12322:9;12318:18;12309:6;12265:72;:::i;:::-;12347:73;12415:3;12404:9;12400:19;12391:6;12347:73;:::i;:::-;12430;12498:3;12487:9;12483:19;12474:6;12430:73;:::i;:::-;11735:775;;;;;;;;;:::o;12516:148::-;12618:11;12655:3;12640:18;;12516:148;;;;:::o;12670:214::-;12810:66;12806:1;12798:6;12794:14;12787:90;12670:214;:::o;12890:400::-;13050:3;13071:84;13153:1;13148:3;13071:84;:::i;:::-;13064:91;;13164:93;13253:3;13164:93;:::i;:::-;13282:1;13277:3;13273:11;13266:18;;12890:400;;;:::o;13296:79::-;13335:7;13364:5;13353:16;;13296:79;;;:::o;13381:157::-;13486:45;13506:24;13524:5;13506:24;:::i;:::-;13486:45;:::i;:::-;13481:3;13474:58;13381:157;;:::o;13544:663::-;13785:3;13807:148;13951:3;13807:148;:::i;:::-;13800:155;;13965:75;14036:3;14027:6;13965:75;:::i;:::-;14065:2;14060:3;14056:12;14049:19;;14078:75;14149:3;14140:6;14078:75;:::i;:::-;14178:2;14173:3;14169:12;14162:19;;14198:3;14191:10;;13544:663;;;;;:::o;14213:545::-;14386:4;14424:3;14413:9;14409:19;14401:27;;14438:71;14506:1;14495:9;14491:17;14482:6;14438:71;:::i;:::-;14519:68;14583:2;14572:9;14568:18;14559:6;14519:68;:::i;:::-;14597:72;14665:2;14654:9;14650:18;14641:6;14597:72;:::i;:::-;14679;14747:2;14736:9;14732:18;14723:6;14679:72;:::i;:::-;14213:545;;;;;;;:::o;14764:164::-;14904:16;14900:1;14892:6;14888:14;14881:40;14764:164;:::o;14934:366::-;15076:3;15097:67;15161:2;15156:3;15097:67;:::i;:::-;15090:74;;15173:93;15262:3;15173:93;:::i;:::-;15291:2;15286:3;15282:12;15275:19;;14934:366;;;:::o;15306:419::-;15472:4;15510:2;15499:9;15495:18;15487:26;;15559:9;15553:4;15549:20;15545:1;15534:9;15530:17;15523:47;15587:131;15713:4;15587:131;:::i;:::-;15579:139;;15306:419;;;:::o;15731:147::-;15832:11;15869:3;15854:18;;15731:147;;;;:::o;15884:144::-;15936:4;15959:3;15951:11;;15982:3;15979:1;15972:14;16016:4;16013:1;16003:18;15995:26;;15884:144;;;:::o;16056:878::-;16161:3;16198:5;16192:12;16227:36;16253:9;16227:36;:::i;:::-;16279:88;16360:6;16355:3;16279:88;:::i;:::-;16272:95;;16398:1;16387:9;16383:17;16414:1;16409:166;;;;16589:1;16584:344;;;;16376:552;;16409:166;16493:4;16489:9;16478;16474:25;16469:3;16462:38;16555:6;16548:14;16541:22;16533:6;16529:35;16524:3;16520:45;16513:52;;16409:166;;16584:344;16651:41;16686:5;16651:41;:::i;:::-;16714:1;16728:154;16742:6;16739:1;16736:13;16728:154;;;16816:7;16810:14;16806:1;16801:3;16797:11;16790:35;16866:1;16857:7;16853:15;16842:26;;16764:4;16761:1;16757:12;16752:17;;16728:154;;;16911:6;16906:3;16902:16;16895:23;;16591:337;;16376:552;;16165:769;;16056:878;;;;:::o;16940:273::-;17071:3;17093:94;17183:3;17174:6;17093:94;:::i;:::-;17086:101;;17204:3;17197:10;;16940:273;;;;:::o;17219:664::-;17424:4;17462:3;17451:9;17447:19;17439:27;;17476:71;17544:1;17533:9;17529:17;17520:6;17476:71;:::i;:::-;17557:72;17625:2;17614:9;17610:18;17601:6;17557:72;:::i;:::-;17639;17707:2;17696:9;17692:18;17683:6;17639:72;:::i;:::-;17721;17789:2;17778:9;17774:18;17765:6;17721:72;:::i;:::-;17803:73;17871:3;17860:9;17856:19;17847:6;17803:73;:::i;:::-;17219:664;;;;;;;;:::o", "abi": "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"ManagerOnly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MinterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMinter\",\"type\":\"address\"}],\"name\":\"changeMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"inflationControl\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inflationRemainder\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remainder\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxMintCapFraction\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oneYear\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tenYearSupplyCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeLaunch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", "bin": "61010060405234801562000011575f80fd5b506040518060400160405280600981526020017f4175746f6e6f6c617300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f4c4153000000000000000000000000000000000000000000000000000000008152506012825f908162000090919062000453565b508160019081620000a2919062000453565b508060ff1660808160ff16815250504660a08181525050620000c96200016160201b60201c565b60c081815250505050503360065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260e08181525050620006c0565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051620001939190620005df565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001620001d495949392919062000665565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200026b57607f821691505b60208210810362000281576200028062000226565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620002e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002a8565b620002f18683620002a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200033b620003356200032f8462000309565b62000312565b62000309565b9050919050565b5f819050919050565b62000356836200031b565b6200036e620003658262000342565b848454620002b4565b825550505050565b5f90565b6200038462000376565b620003918184846200034b565b505050565b5b81811015620003b857620003ac5f826200037a565b60018101905062000397565b5050565b601f8211156200040757620003d18162000287565b620003dc8462000299565b81016020851015620003ec578190505b62000404620003fb8562000299565b83018262000396565b50505b505050565b5f82821c905092915050565b5f620004295f19846008026200040c565b1980831691505092915050565b5f62000443838362000418565b9150826002028217905092915050565b6200045e82620001ef565b67ffffffffffffffff8111156200047a5762000479620001f9565b5b62000486825462000253565b62000493828285620003bc565b5f60209050601f831160018114620004c9575f8415620004b4578287015190505b620004c0858262000436565b8655506200052f565b601f198416620004d98662000287565b5f5b828110156200050257848901518255600182019150602085019450602081019050620004db565b868310156200052257848901516200051e601f89168262000418565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620005618162000253565b6200056d818662000537565b9450600182165f81146200058a5760018114620005a057620005d6565b60ff1983168652811515820286019350620005d6565b620005ab8562000541565b5f5b83811015620005ce57815481890152600182019150602081019050620005ad565b838801955050505b50505092915050565b5f620005ec828462000553565b915081905092915050565b5f819050919050565b6200060b81620005f7565b82525050565b6200061c8162000309565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200064d8262000622565b9050919050565b6200065f8162000641565b82525050565b5f60a0820190506200067a5f83018862000600565b62000689602083018762000600565b62000698604083018662000600565b620006a7606083018562000611565b620006b6608083018462000654565b9695505050505050565b60805160a05160c05160e051612232620006fb5f395f8181610e05015261130e01525f610b1c01525f610ae801525f610ac301526122325ff3fe608060405234801561000f575f80fd5b506004361061018c575f3560e01c80636e79265c116100dc578063a457c2d711610095578063b091dab31161006f578063b091dab3146104ac578063d505accf146104ca578063dd62ed3e146104e6578063f27c3bf6146105165761018c565b8063a457c2d714610430578063a6f9dae114610460578063a9059cbb1461047c5761018c565b80636e79265c1461034657806370a08231146103765780637ecebe00146103a65780638da5cb5b146103d65780638e4a8379146103f457806395d89b41146104125761018c565b80632c4d4d1811610149578063395093511161012357806339509351146102c057806340c10f19146102f057806342966c681461030c5780635ff99e9d146103285761018c565b80632c4d4d1814610268578063313ce567146102845780633644e515146102a25761018c565b806306fdde031461019057806307546172146101ae578063095ea7b3146101cc5780630a8ded1d146101fc57806318160ddd1461021a57806323b872dd14610238575b5f80fd5b610198610534565b6040516101a5919061197c565b60405180910390f35b6101b66105bf565b6040516101c391906119db565b60405180910390f35b6101e660048036038101906101e19190611a55565b6105e4565b6040516101f39190611aad565b60405180910390f35b6102046106d1565b6040516102119190611ad5565b60405180910390f35b6102226106e1565b60405161022f9190611ad5565b60405180910390f35b610252600480360381019061024d9190611aee565b6106e7565b60405161025f9190611aad565b60405180910390f35b610282600480360381019061027d9190611b3e565b610922565b005b61028c610ac1565b6040516102999190611b84565b60405180910390f35b6102aa610ae5565b6040516102b79190611bb5565b60405180910390f35b6102da60048036038101906102d59190611a55565b610b41565b6040516102e79190611aad565b60405180910390f35b61030a60048036038101906103059190611a55565b610cb9565b005b61032660048036038101906103219190611bce565b610d8a565b005b610330610d97565b60405161033d9190611ad5565b60405180910390f35b610360600480360381019061035b9190611bce565b610d9c565b60405161036d9190611aad565b60405180910390f35b610390600480360381019061038b9190611b3e565b610db4565b60405161039d9190611ad5565b60405180910390f35b6103c060048036038101906103bb9190611b3e565b610dc9565b6040516103cd9190611ad5565b60405180910390f35b6103de610dde565b6040516103eb91906119db565b60405180910390f35b6103fc610e03565b6040516104099190611ad5565b60405180910390f35b61041a610e27565b604051610427919061197c565b60405180910390f35b61044a60048036038101906104459190611a55565b610eb3565b6040516104579190611aad565b60405180910390f35b61047a60048036038101906104759190611b3e565b611053565b005b61049660048036038101906104919190611a55565b6111f2565b6040516104a39190611aad565b60405180910390f35b6104b46112ff565b6040516104c19190611ad5565b60405180910390f35b6104e460048036038101906104df9190611c4d565b6113bd565b005b61050060048036038101906104fb9190611cea565b6116aa565b60405161050d9190611ad5565b60405180910390f35b61051e6116ca565b60405161052b9190611ad5565b60405180910390f35b5f805461054090611d55565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90611d55565b80156105b75780601f1061058e576101008083540402835291602001916105b7565b820191905f5260205f20905b81548152906001019060200180831161059a57829003601f168201915b505050505081565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106bf9190611ad5565b60405180910390a36001905092915050565b6b033b2e3c9fd0803ce800000081565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108145782816107979190611db2565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108609190611db2565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161090e9190611ad5565b60405180910390a360019150509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d6573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016109cd929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b1a57610b156116d2565b610b3c565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281610bca9190611e0c565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ca69190611ad5565b60405180910390a3600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6d573360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe000000000000000000000000000000000000000000000000000000008152600401610d64929190611de5565b60405180910390fd5b610d7681610d9c565b15610d8657610d85828261175c565b5b5050565b610d943382611827565b50565b600281565b5f80610da66112ff565b905080831115915050919050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60018054610e3490611d55565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090611d55565b8015610eab5780601f10610e8257610100808354040283529160200191610eab565b820191905f5260205f20905b815481529060010190602001808311610e8e57829003601f168201915b505050505081565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611048578281610f639190611db2565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161103f9190611ad5565b60405180910390a35b600191505092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611107573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016110fe929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b60405160405180910390a250565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461123f9190611db2565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112ed9190611ad5565b60405180910390a36001905092915050565b5f8060025490505f6301e133807f0000000000000000000000000000000000000000000000000000000000000000426113389190611db2565b6113429190611e6c565b90505f6b033b2e3c9fd0803ce8000000905060098211156113a95760098261136a9190611db2565b91505f5b828110156113a75760646002836113859190611e9c565b61138f9190611e6c565b8261139a9190611e0c565b915080600101905061136e565b505b82816113b59190611db2565b935050505090565b42841015611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790611f27565b60405180910390fd5b5f600161140b610ae5565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b60405160200161149096959493929190611f45565b604051602081830303815290604052805190602001206040516020016114b7929190612018565b604051602081830303815290604052805190602001208585856040515f81526020016040526040516114ec949392919061204e565b6020604051602081039080840390855afa15801561150c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561157f57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b5906120db565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116999190611ad5565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b6301e1338081565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516117029190612195565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016117419594939291906121ab565b60405160208183030381529060405280519060200120905090565b8060025f82825461176d9190611e0c565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181b9190611ad5565b60405180910390a35050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546118739190611db2565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118e69190611ad5565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561192957808201518184015260208101905061190e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61194e826118f2565b61195881856118fc565b935061196881856020860161190c565b61197181611934565b840191505092915050565b5f6020820190508181035f8301526119948184611944565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119c58261199c565b9050919050565b6119d5816119bb565b82525050565b5f6020820190506119ee5f8301846119cc565b92915050565b5f80fd5b611a01816119bb565b8114611a0b575f80fd5b50565b5f81359050611a1c816119f8565b92915050565b5f819050919050565b611a3481611a22565b8114611a3e575f80fd5b50565b5f81359050611a4f81611a2b565b92915050565b5f8060408385031215611a6b57611a6a6119f4565b5b5f611a7885828601611a0e565b9250506020611a8985828601611a41565b9150509250929050565b5f8115159050919050565b611aa781611a93565b82525050565b5f602082019050611ac05f830184611a9e565b92915050565b611acf81611a22565b82525050565b5f602082019050611ae85f830184611ac6565b92915050565b5f805f60608486031215611b0557611b046119f4565b5b5f611b1286828701611a0e565b9350506020611b2386828701611a0e565b9250506040611b3486828701611a41565b9150509250925092565b5f60208284031215611b5357611b526119f4565b5b5f611b6084828501611a0e565b91505092915050565b5f60ff82169050919050565b611b7e81611b69565b82525050565b5f602082019050611b975f830184611b75565b92915050565b5f819050919050565b611baf81611b9d565b82525050565b5f602082019050611bc85f830184611ba6565b92915050565b5f60208284031215611be357611be26119f4565b5b5f611bf084828501611a41565b91505092915050565b611c0281611b69565b8114611c0c575f80fd5b50565b5f81359050611c1d81611bf9565b92915050565b611c2c81611b9d565b8114611c36575f80fd5b50565b5f81359050611c4781611c23565b92915050565b5f805f805f805f60e0888a031215611c6857611c676119f4565b5b5f611c758a828b01611a0e565b9750506020611c868a828b01611a0e565b9650506040611c978a828b01611a41565b9550506060611ca88a828b01611a41565b9450506080611cb98a828b01611c0f565b93505060a0611cca8a828b01611c39565b92505060c0611cdb8a828b01611c39565b91505092959891949750929550565b5f8060408385031215611d0057611cff6119f4565b5b5f611d0d85828601611a0e565b9250506020611d1e85828601611a0e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d6c57607f821691505b602082108103611d7f57611d7e611d28565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611dbc82611a22565b9150611dc783611a22565b9250828203905081811115611ddf57611dde611d85565b5b92915050565b5f604082019050611df85f8301856119cc565b611e0560208301846119cc565b9392505050565b5f611e1682611a22565b9150611e2183611a22565b9250828201905080821115611e3957611e38611d85565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611e7682611a22565b9150611e8183611a22565b925082611e9157611e90611e3f565b5b828204905092915050565b5f611ea682611a22565b9150611eb183611a22565b9250828202611ebf81611a22565b91508282048414831517611ed657611ed5611d85565b5b5092915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f611f116017836118fc565b9150611f1c82611edd565b602082019050919050565b5f6020820190508181035f830152611f3e81611f05565b9050919050565b5f60c082019050611f585f830189611ba6565b611f6560208301886119cc565b611f7260408301876119cc565b611f7f6060830186611ac6565b611f8c6080830185611ac6565b611f9960a0830184611ac6565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611fe2600283611fa4565b9150611fed82611fae565b600282019050919050565b5f819050919050565b61201261200d82611b9d565b611ff8565b82525050565b5f61202282611fd6565b915061202e8285612001565b60208201915061203e8284612001565b6020820191508190509392505050565b5f6080820190506120615f830187611ba6565b61206e6020830186611b75565b61207b6040830185611ba6565b6120886060830184611ba6565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f6120c5600e836118fc565b91506120d082612091565b602082019050919050565b5f6020820190508181035f8301526120f2816120b9565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461212181611d55565b61212b81866120f9565b9450600182165f8114612145576001811461215a5761218c565b60ff198316865281151582028601935061218c565b61216385612103565b5f5b8381101561218457815481890152600182019150602081019050612165565b838801955050505b50505092915050565b5f6121a08284612115565b915081905092915050565b5f60a0820190506121be5f830188611ba6565b6121cb6020830187611ba6565b6121d86040830186611ba6565b6121e56060830185611ac6565b6121f260808301846119cc565b969550505050505056fea264697066735822122006b9fd148fb1557c4bd1726128b4110b5b432c8b886f5764034a792d2fbbef9564736f6c63430008170033", "bin-runtime": "608060405234801561000f575f80fd5b506004361061018c575f3560e01c80636e79265c116100dc578063a457c2d711610095578063b091dab31161006f578063b091dab3146104ac578063d505accf146104ca578063dd62ed3e146104e6578063f27c3bf6146105165761018c565b8063a457c2d714610430578063a6f9dae114610460578063a9059cbb1461047c5761018c565b80636e79265c1461034657806370a08231146103765780637ecebe00146103a65780638da5cb5b146103d65780638e4a8379146103f457806395d89b41146104125761018c565b80632c4d4d1811610149578063395093511161012357806339509351146102c057806340c10f19146102f057806342966c681461030c5780635ff99e9d146103285761018c565b80632c4d4d1814610268578063313ce567146102845780633644e515146102a25761018c565b806306fdde031461019057806307546172146101ae578063095ea7b3146101cc5780630a8ded1d146101fc57806318160ddd1461021a57806323b872dd14610238575b5f80fd5b610198610534565b6040516101a5919061197c565b60405180910390f35b6101b66105bf565b6040516101c391906119db565b60405180910390f35b6101e660048036038101906101e19190611a55565b6105e4565b6040516101f39190611aad565b60405180910390f35b6102046106d1565b6040516102119190611ad5565b60405180910390f35b6102226106e1565b60405161022f9190611ad5565b60405180910390f35b610252600480360381019061024d9190611aee565b6106e7565b60405161025f9190611aad565b60405180910390f35b610282600480360381019061027d9190611b3e565b610922565b005b61028c610ac1565b6040516102999190611b84565b60405180910390f35b6102aa610ae5565b6040516102b79190611bb5565b60405180910390f35b6102da60048036038101906102d59190611a55565b610b41565b6040516102e79190611aad565b60405180910390f35b61030a60048036038101906103059190611a55565b610cb9565b005b61032660048036038101906103219190611bce565b610d8a565b005b610330610d97565b60405161033d9190611ad5565b60405180910390f35b610360600480360381019061035b9190611bce565b610d9c565b60405161036d9190611aad565b60405180910390f35b610390600480360381019061038b9190611b3e565b610db4565b60405161039d9190611ad5565b60405180910390f35b6103c060048036038101906103bb9190611b3e565b610dc9565b6040516103cd9190611ad5565b60405180910390f35b6103de610dde565b6040516103eb91906119db565b60405180910390f35b6103fc610e03565b6040516104099190611ad5565b60405180910390f35b61041a610e27565b604051610427919061197c565b60405180910390f35b61044a60048036038101906104459190611a55565b610eb3565b6040516104579190611aad565b60405180910390f35b61047a60048036038101906104759190611b3e565b611053565b005b61049660048036038101906104919190611a55565b6111f2565b6040516104a39190611aad565b60405180910390f35b6104b46112ff565b6040516104c19190611ad5565b60405180910390f35b6104e460048036038101906104df9190611c4d565b6113bd565b005b61050060048036038101906104fb9190611cea565b6116aa565b60405161050d9190611ad5565b60405180910390f35b61051e6116ca565b60405161052b9190611ad5565b60405180910390f35b5f805461054090611d55565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90611d55565b80156105b75780601f1061058e576101008083540402835291602001916105b7565b820191905f5260205f20905b81548152906001019060200180831161059a57829003601f168201915b505050505081565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106bf9190611ad5565b60405180910390a36001905092915050565b6b033b2e3c9fd0803ce800000081565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108145782816107979190611db2565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108609190611db2565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161090e9190611ad5565b60405180910390a360019150509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d6573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016109cd929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b1a57610b156116d2565b610b3c565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281610bca9190611e0c565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ca69190611ad5565b60405180910390a3600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6d573360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe000000000000000000000000000000000000000000000000000000008152600401610d64929190611de5565b60405180910390fd5b610d7681610d9c565b15610d8657610d85828261175c565b5b5050565b610d943382611827565b50565b600281565b5f80610da66112ff565b905080831115915050919050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60018054610e3490611d55565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090611d55565b8015610eab5780601f10610e8257610100808354040283529160200191610eab565b820191905f5260205f20905b815481529060010190602001808311610e8e57829003601f168201915b505050505081565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611048578281610f639190611db2565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161103f9190611ad5565b60405180910390a35b600191505092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611107573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016110fe929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b60405160405180910390a250565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461123f9190611db2565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112ed9190611ad5565b60405180910390a36001905092915050565b5f8060025490505f6301e133807f0000000000000000000000000000000000000000000000000000000000000000426113389190611db2565b6113429190611e6c565b90505f6b033b2e3c9fd0803ce8000000905060098211156113a95760098261136a9190611db2565b91505f5b828110156113a75760646002836113859190611e9c565b61138f9190611e6c565b8261139a9190611e0c565b915080600101905061136e565b505b82816113b59190611db2565b935050505090565b42841015611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790611f27565b60405180910390fd5b5f600161140b610ae5565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b60405160200161149096959493929190611f45565b604051602081830303815290604052805190602001206040516020016114b7929190612018565b604051602081830303815290604052805190602001208585856040515f81526020016040526040516114ec949392919061204e565b6020604051602081039080840390855afa15801561150c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561157f57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b5906120db565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116999190611ad5565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b6301e1338081565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516117029190612195565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016117419594939291906121ab565b60405160208183030381529060405280519060200120905090565b8060025f82825461176d9190611e0c565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181b9190611ad5565b60405180910390a35050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546118739190611db2565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118e69190611ad5565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561192957808201518184015260208101905061190e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61194e826118f2565b61195881856118fc565b935061196881856020860161190c565b61197181611934565b840191505092915050565b5f6020820190508181035f8301526119948184611944565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119c58261199c565b9050919050565b6119d5816119bb565b82525050565b5f6020820190506119ee5f8301846119cc565b92915050565b5f80fd5b611a01816119bb565b8114611a0b575f80fd5b50565b5f81359050611a1c816119f8565b92915050565b5f819050919050565b611a3481611a22565b8114611a3e575f80fd5b50565b5f81359050611a4f81611a2b565b92915050565b5f8060408385031215611a6b57611a6a6119f4565b5b5f611a7885828601611a0e565b9250506020611a8985828601611a41565b9150509250929050565b5f8115159050919050565b611aa781611a93565b82525050565b5f602082019050611ac05f830184611a9e565b92915050565b611acf81611a22565b82525050565b5f602082019050611ae85f830184611ac6565b92915050565b5f805f60608486031215611b0557611b046119f4565b5b5f611b1286828701611a0e565b9350506020611b2386828701611a0e565b9250506040611b3486828701611a41565b9150509250925092565b5f60208284031215611b5357611b526119f4565b5b5f611b6084828501611a0e565b91505092915050565b5f60ff82169050919050565b611b7e81611b69565b82525050565b5f602082019050611b975f830184611b75565b92915050565b5f819050919050565b611baf81611b9d565b82525050565b5f602082019050611bc85f830184611ba6565b92915050565b5f60208284031215611be357611be26119f4565b5b5f611bf084828501611a41565b91505092915050565b611c0281611b69565b8114611c0c575f80fd5b50565b5f81359050611c1d81611bf9565b92915050565b611c2c81611b9d565b8114611c36575f80fd5b50565b5f81359050611c4781611c23565b92915050565b5f805f805f805f60e0888a031215611c6857611c676119f4565b5b5f611c758a828b01611a0e565b9750506020611c868a828b01611a0e565b9650506040611c978a828b01611a41565b9550506060611ca88a828b01611a41565b9450506080611cb98a828b01611c0f565b93505060a0611cca8a828b01611c39565b92505060c0611cdb8a828b01611c39565b91505092959891949750929550565b5f8060408385031215611d0057611cff6119f4565b5b5f611d0d85828601611a0e565b9250506020611d1e85828601611a0e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d6c57607f821691505b602082108103611d7f57611d7e611d28565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611dbc82611a22565b9150611dc783611a22565b9250828203905081811115611ddf57611dde611d85565b5b92915050565b5f604082019050611df85f8301856119cc565b611e0560208301846119cc565b9392505050565b5f611e1682611a22565b9150611e2183611a22565b9250828201905080821115611e3957611e38611d85565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611e7682611a22565b9150611e8183611a22565b925082611e9157611e90611e3f565b5b828204905092915050565b5f611ea682611a22565b9150611eb183611a22565b9250828202611ebf81611a22565b91508282048414831517611ed657611ed5611d85565b5b5092915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f611f116017836118fc565b9150611f1c82611edd565b602082019050919050565b5f6020820190508181035f830152611f3e81611f05565b9050919050565b5f60c082019050611f585f830189611ba6565b611f6560208301886119cc565b611f7260408301876119cc565b611f7f6060830186611ac6565b611f8c6080830185611ac6565b611f9960a0830184611ac6565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611fe2600283611fa4565b9150611fed82611fae565b600282019050919050565b5f819050919050565b61201261200d82611b9d565b611ff8565b82525050565b5f61202282611fd6565b915061202e8285612001565b60208201915061203e8284612001565b6020820191508190509392505050565b5f6080820190506120615f830187611ba6565b61206e6020830186611b75565b61207b6040830185611ba6565b6120886060830184611ba6565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f6120c5600e836118fc565b91506120d082612091565b602082019050919050565b5f6020820190508181035f8301526120f2816120b9565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461212181611d55565b61212b81866120f9565b9450600182165f8114612145576001811461215a5761218c565b60ff198316865281151582028601935061218c565b61216385612103565b5f5b8381101561218457815481890152600182019150602081019050612165565b838801955050505b50505092915050565b5f6121a08284612115565b915081905092915050565b5f60a0820190506121be5f830188611ba6565b6121cb6020830187611ba6565b6121d86040830186611ba6565b6121e56060830185611ac6565b6121f260808301846119cc565b969550505050505056fea264697066735822122006b9fd148fb1557c4bd1726128b4110b5b432c8b886f5764034a792d2fbbef9564736f6c63430008170033", "userdoc": {"methods": {"decreaseAllowance(address,uint256)": {"notice": "This implementation does not decrease spender allowance if the maximum allowance was granted.The underflow condition is treated by the default code generation check."}, "increaseAllowance(address,uint256)": {"notice": "The overflow condition is treated by the default code generation check."}, "inflationControl(uint256)": {"notice": "The `<=` check is left as is for a better code readability."}, "mint(address,uint256)": {"notice": "If the inflation control does not pass, the revert does not take place, as well as no action is performed."}}, "notice": null}, "devdoc": {"methods": {"burn(uint256)": {"author": null, "details": "Burns OLAS tokens.", "params": {"amount": "OLAS token amount to burn."}, "return": null}, "changeMinter(address)": {"author": null, "details": "Changes the minter address.", "params": {"newMinter": "Address of a new minter."}, "return": null}, "changeOwner(address)": {"author": null, "details": "Changes the owner address.", "params": {"newOwner": "Address of a new owner."}, "return": null}, "decreaseAllowance(address,uint256)": {"author": null, "details": "Decreases the allowance of another account over their tokens.", "params": {"amount": "Amount to decrease approval by.", "spender": "Account that tokens are approved for."}, "return": null}, "increaseAllowance(address,uint256)": {"author": null, "details": "Increases the allowance of another account over their tokens.", "params": {"amount": "Amount to increase approval by.", "spender": "Account that tokens are approved for."}, "return": null}, "inflationControl(uint256)": {"author": null, "details": "Provides various checks for the inflation control.", "params": {"amount": "Amount of OLAS to mint."}, "return": null}, "inflationRemainder()": {"author": null, "details": "Gets the reminder of OLAS possible for the mint.", "params": {}, "return": null}, "mint(address,uint256)": {"author": null, "details": "Mints OLAS tokens.", "params": {"account": "Account address.", "amount": "OLAS token amount."}, "return": null}}, "author": "ALAleksandr Kuperman - ", "details": null, "title": "OLAS - Smart contract for the OLAS token."}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/contracts/interfaces/IErrors.sol:IErrors": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"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\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"curTime\",\"type\":\"uint256\"}],\"name\":\"LockNotExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LockedValueNotZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"MaxUnlockTimeReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NoValueLocked\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonDelegatable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonTransferable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonZeroValue\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"UnlockTimeIncorrect\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numValues1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numValues2\",\"type\":\"uint256\"}],\"name\":\"WrongArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providedBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualBlockNumber\",\"type\":\"uint256\"}],\"name\":\"WrongBlockNumber\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValue\",\"type\":\"error\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {}, "author": null, "details": "Errors.", "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/contracts/test/EchidnaVoteWeightingAssert.sol:EchidnaVoteWeightingAssert": {"srcmap": "143:2560:2:-:0;;;642:85;;;;;;;;681:7;642:85;;;;;;;;699:7;642:85;;;;;;;;717:7;642:85;;;;;;;;;;;;;;;:::i;:::-;;773:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;766:4;;:17;;;;;;;;;;;;;;;;;;793:13;817:4;;;;;;;;;;;793:29;;848:5;837:49;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;832:2;;:54;;;;;;;;;;;;;;;;;;896:11;918:2;;;;;;;;;;;896:25;;962:3;937:29;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;932:2;;:34;;;;;;;;;;;;;;;;;;976:4;;;;;;;;;;:9;;;994:4;576:9;537:7;1000:14;;;;:::i;:::-;976:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;756:266;;143:2560;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:9:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:169::-;449:11;483:6;478:3;471:19;523:4;518:3;514:14;499:29;;365:169;;;;:::o;540:168::-;680:20;676:1;668:6;664:14;657:44;540:168;:::o;714:366::-;856:3;877:67;941:2;936:3;877:67;:::i;:::-;870:74;;953:93;1042:3;953:93;:::i;:::-;1071:2;1066:3;1062:12;1055:19;;714:366;;;:::o;1086:156::-;1226:8;1222:1;1214:6;1210:14;1203:32;1086:156;:::o;1248:365::-;1390:3;1411:66;1475:1;1470:3;1411:66;:::i;:::-;1404:73;;1486:93;1575:3;1486:93;:::i;:::-;1604:2;1599:3;1595:12;1588:19;;1248:365;;;:::o;1619:836::-;1914:4;1952:2;1941:9;1937:18;1929:26;;1965:71;2033:1;2022:9;2018:17;2009:6;1965:71;:::i;:::-;2083:9;2077:4;2073:20;2068:2;2057:9;2053:18;2046:48;2111:131;2237:4;2111:131;:::i;:::-;2103:139;;2289:9;2283:4;2279:20;2274:2;2263:9;2259:18;2252:48;2317:131;2443:4;2317:131;:::i;:::-;2309:139;;1619:836;;;;:::o;2461:222::-;2554:4;2592:2;2581:9;2577:18;2569:26;;2605:71;2673:1;2662:9;2658:17;2649:6;2605:71;:::i;:::-;2461:222;;;;:::o;2689:77::-;2726:7;2755:5;2744:16;;2689:77;;;:::o;2772:180::-;2820:77;2817:1;2810:88;2917:4;2914:1;2907:15;2941:4;2938:1;2931:15;2958:410;2998:7;3021:20;3039:1;3021:20;:::i;:::-;3016:25;;3055:20;3073:1;3055:20;:::i;:::-;3050:25;;3110:1;3107;3103:9;3132:30;3150:11;3132:30;:::i;:::-;3121:41;;3311:1;3302:7;3298:15;3295:1;3292:22;3272:1;3265:9;3245:83;3222:139;;3341:18;;:::i;:::-;3222:139;3006:362;2958:410;;;;:::o;3374:118::-;3461:24;3479:5;3461:24;:::i;:::-;3456:3;3449:37;3374:118;;:::o;3498:332::-;3619:4;3657:2;3646:9;3642:18;3634:26;;3670:71;3738:1;3727:9;3723:17;3714:6;3670:71;:::i;:::-;3751:72;3819:2;3808:9;3804:18;3795:6;3751:72;:::i;:::-;3498:332;;;;;:::o;143:2560:2:-;;;;;;;", "srcmap-runtime": "143:2560:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1105:1595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;1271:1;1253:15;:19;1245:28;;;;;;1309:2;;1291:15;:20;1283:29;;;;;;360:15;1330:10;:21;;;1322:30;;;;;;462:5;1370:6;:22;;;1362:31;;;;;;537:7;1420:3;:13;;;;:::i;:::-;1411:6;:22;1403:31;;;;;;1444:17;1464:4;;;;;;;;;;;:14;;;1487:4;1464:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1444:49;;1522:6;1510:9;:18;1503:26;;;;:::i;:::-;;1540:21;1566:2;;;;;;;;;;;:20;;;1595:4;1566:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1539:62;;;1632:1;1615:13;:18;;;1611:372;;1649:4;;;;;;;;;;:12;;;1670:2;;;;;;;;;;;1675:6;1649:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1696:2;;;;;;;;;;;:13;;;1710:6;1718:10;1696:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:20;1769:2;;;;;;;;;;;:20;;;1798:4;1769:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1743:61;;;1840:1;1825:12;:16;;;1818:24;;;;:::i;:::-;;1635:218;1611:372;;;1874:20;1899:2;;;;;;;;;;;:20;;;1928:4;1899:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1873:61;;;1970:1;1955:12;:16;;;1948:24;;;;:::i;:::-;;1859:124;1611:372;1992:2;;;;;;;;;;;:13;;;2006:7;2015;1992:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2033:10;2046:2;;;;;;;;;;;:15;;;2062:7;2071;2046:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2033:46;;2089:11;2103:2;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2089:33;;2144:1;2139:2;:6;2132:14;;;;:::i;:::-;;2169:1;2163:3;:7;2156:15;;;;:::i;:::-;;2181:2;;;;;;;;;;;:31;;;2213:5;2181:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2229:20;2252:2;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2229:53;;2318:5;2299:24;;:15;:24;;;2292:32;;;;:::i;:::-;;2334:2;;;;;;;;;;;:24;;;2359:7;2368;2377:6;2334:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2394:19;2416:2;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2394:52;;2477:4;2459:22;;:14;:22;;;2456:130;;2497:11;2511:2;;;;;;;;;;;:18;;;2530:7;2538;2511:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2497:49;;2573:1;2567:3;:7;2560:15;;;;:::i;:::-;;2483:103;2456:130;2600:15;2595:2;:20;;;;2655:2;;;;;;;;;;;:20;;;2676:7;2685;2655:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1235:1465;;;;;;1105:1595;;;;;:::o;88:117:9:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:93::-;877:7;917:10;910:5;906:22;895:33;;841:93;;;:::o;940:120::-;1012:23;1029:5;1012:23;:::i;:::-;1005:5;1002:34;992:62;;1050:1;1047;1040:12;992:62;940:120;:::o;1066:137::-;1111:5;1149:6;1136:20;1127:29;;1165:32;1191:5;1165:32;:::i;:::-;1066:137;;;;:::o;1209:89::-;1245:7;1285:6;1278:5;1274:18;1263:29;;1209:89;;;:::o;1304:120::-;1376:23;1393:5;1376:23;:::i;:::-;1369:5;1366:34;1356:62;;1414:1;1411;1404:12;1356:62;1304:120;:::o;1430:137::-;1475:5;1513:6;1500:20;1491:29;;1529:32;1555:5;1529:32;:::i;:::-;1430:137;;;;:::o;1573:77::-;1610:7;1639:5;1628:16;;1573:77;;;:::o;1656:122::-;1729:24;1747:5;1729:24;:::i;:::-;1722:5;1719:35;1709:63;;1768:1;1765;1758:12;1709:63;1656:122;:::o;1784:139::-;1830:5;1868:6;1855:20;1846:29;;1884:33;1911:5;1884:33;:::i;:::-;1784:139;;;;:::o;1929:905::-;2021:6;2029;2037;2045;2053;2102:3;2090:9;2081:7;2077:23;2073:33;2070:120;;;2109:79;;:::i;:::-;2070:120;2229:1;2254:53;2299:7;2290:6;2279:9;2275:22;2254:53;:::i;:::-;2244:63;;2200:117;2356:2;2382:52;2426:7;2417:6;2406:9;2402:22;2382:52;:::i;:::-;2372:62;;2327:117;2483:2;2509:52;2553:7;2544:6;2533:9;2529:22;2509:52;:::i;:::-;2499:62;;2454:117;2610:2;2636:53;2681:7;2672:6;2661:9;2657:22;2636:53;:::i;:::-;2626:63;;2581:118;2738:3;2765:52;2809:7;2800:6;2789:9;2785:22;2765:52;:::i;:::-;2755:62;;2709:118;1929:905;;;;;;;;:::o;2840:180::-;2888:77;2885:1;2878:88;2985:4;2982:1;2975:15;3009:4;3006:1;2999:15;3026:410;3066:7;3089:20;3107:1;3089:20;:::i;:::-;3084:25;;3123:20;3141:1;3123:20;:::i;:::-;3118:25;;3178:1;3175;3171:9;3200:30;3218:11;3200:30;:::i;:::-;3189:41;;3379:1;3370:7;3366:15;3363:1;3360:22;3340:1;3333:9;3313:83;3290:139;;3409:18;;:::i;:::-;3290:139;3074:362;3026:410;;;;:::o;3442:118::-;3529:24;3547:5;3529:24;:::i;:::-;3524:3;3517:37;3442:118;;:::o;3566:222::-;3659:4;3697:2;3686:9;3682:18;3674:26;;3710:71;3778:1;3767:9;3763:17;3754:6;3710:71;:::i;:::-;3566:222;;;;:::o;3794:143::-;3851:5;3882:6;3876:13;3867:22;;3898:33;3925:5;3898:33;:::i;:::-;3794:143;;;;:::o;3943:351::-;4013:6;4062:2;4050:9;4041:7;4037:23;4033:32;4030:119;;;4068:79;;:::i;:::-;4030:119;4188:1;4213:64;4269:7;4260:6;4249:9;4245:22;4213:64;:::i;:::-;4203:74;;4159:128;3943:351;;;;:::o;4300:180::-;4348:77;4345:1;4338:88;4445:4;4442:1;4435:15;4469:4;4466:1;4459:15;4486:118;4523:7;4563:34;4556:5;4552:46;4541:57;;4486:118;;;:::o;4610:122::-;4683:24;4701:5;4683:24;:::i;:::-;4676:5;4673:35;4663:63;;4722:1;4719;4712:12;4663:63;4610:122;:::o;4738:143::-;4795:5;4826:6;4820:13;4811:22;;4842:33;4869:5;4842:33;:::i;:::-;4738:143;;;;:::o;4887:101::-;4923:7;4963:18;4956:5;4952:30;4941:41;;4887:101;;;:::o;4994:120::-;5066:23;5083:5;5066:23;:::i;:::-;5059:5;5056:34;5046:62;;5104:1;5101;5094:12;5046:62;4994:120;:::o;5120:141::-;5176:5;5207:6;5201:13;5192:22;;5223:32;5249:5;5223:32;:::i;:::-;5120:141;;;;:::o;5267:505::-;5345:6;5353;5402:2;5390:9;5381:7;5377:23;5373:32;5370:119;;;5408:79;;:::i;:::-;5370:119;5528:1;5553:64;5609:7;5600:6;5589:9;5585:22;5553:64;:::i;:::-;5543:74;;5499:128;5666:2;5692:63;5747:7;5738:6;5727:9;5723:22;5692:63;:::i;:::-;5682:73;;5637:128;5267:505;;;;;:::o;5778:118::-;5865:24;5883:5;5865:24;:::i;:::-;5860:3;5853:37;5778:118;;:::o;5902:332::-;6023:4;6061:2;6050:9;6046:18;6038:26;;6074:71;6142:1;6131:9;6127:17;6118:6;6074:71;:::i;:::-;6155:72;6223:2;6212:9;6208:18;6199:6;6155:72;:::i;:::-;5902:332;;;;;:::o;6240:90::-;6274:7;6317:5;6310:13;6303:21;6292:32;;6240:90;;;:::o;6336:116::-;6406:21;6421:5;6406:21;:::i;:::-;6399:5;6396:32;6386:60;;6442:1;6439;6432:12;6386:60;6336:116;:::o;6458:137::-;6512:5;6543:6;6537:13;6528:22;;6559:30;6583:5;6559:30;:::i;:::-;6458:137;;;;:::o;6601:345::-;6668:6;6717:2;6705:9;6696:7;6692:23;6688:32;6685:119;;;6723:79;;:::i;:::-;6685:119;6843:1;6868:61;6921:7;6912:6;6901:9;6897:22;6868:61;:::i;:::-;6858:71;;6814:125;6601:345;;;;:::o;6952:60::-;6980:3;7001:5;6994:12;;6952:60;;;:::o;7018:140::-;7067:9;7100:52;7118:33;7127:23;7144:5;7127:23;:::i;:::-;7118:33;:::i;:::-;7100:52;:::i;:::-;7087:65;;7018:140;;;:::o;7164:129::-;7250:36;7280:5;7250:36;:::i;:::-;7245:3;7238:49;7164:129;;:::o;7299:330::-;7419:4;7457:2;7446:9;7442:18;7434:26;;7470:71;7538:1;7527:9;7523:17;7514:6;7470:71;:::i;:::-;7551;7618:2;7607:9;7603:18;7594:6;7551:71;:::i;:::-;7299:330;;;;;:::o;7635:::-;7755:4;7793:2;7782:9;7778:18;7770:26;;7806:71;7874:1;7863:9;7859:17;7850:6;7806:71;:::i;:::-;7887;7954:2;7943:9;7939:18;7930:6;7887:71;:::i;:::-;7635:330;;;;;:::o;7971:109::-;8052:21;8067:5;8052:21;:::i;:::-;8047:3;8040:34;7971:109;;:::o;8086:210::-;8173:4;8211:2;8200:9;8196:18;8188:26;;8224:65;8286:1;8275:9;8271:17;8262:6;8224:65;:::i;:::-;8086:210;;;;:::o;8302:140::-;8351:9;8384:52;8402:33;8411:23;8428:5;8411:23;:::i;:::-;8402:33;:::i;:::-;8384:52;:::i;:::-;8371:65;;8302:140;;;:::o;8448:129::-;8534:36;8564:5;8534:36;:::i;:::-;8529:3;8522:49;8448:129;;:::o;8583:438::-;8730:4;8768:2;8757:9;8753:18;8745:26;;8781:71;8849:1;8838:9;8834:17;8825:6;8781:71;:::i;:::-;8862;8929:2;8918:9;8914:18;8905:6;8862:71;:::i;:::-;8943;9010:2;8999:9;8995:18;8986:6;8943:71;:::i;:::-;8583:438;;;;;;:::o", "abi": "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"chainId\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"unlockTime\",\"type\":\"uint32\"}],\"name\":\"voteForNomineeWeights_assert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", "bin": "608060405260405180606001604052806201000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016202000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016203000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506004906003620000be92919062000304565b50604051620000cd9062000385565b604051809103905ff080158015620000e7573d5f803e3d5ffd5b505f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080604051620001599062000393565b620001659190620004bb565b604051809103905ff0801580156200017f573d5f803e3d5ffd5b5060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080604051620001f390620003a1565b620001ff919062000500565b604051809103905ff08015801562000219573d5f803e3d5ffd5b5060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930620f4240670de0b6b3a7640000620002ae919062000551565b6040518363ffffffff1660e01b8152600401620002cd929190620005ac565b5f604051808303815f87803b158015620002e5575f80fd5b505af1158015620002f8573d5f803e3d5ffd5b505050505050620005d7565b826003810192821562000372579160200282015b8281111562000371578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000318565b5b509050620003819190620003af565b5090565b61292d806200154783390190565b6155a98062003e7483390190565b612b96806200941d83390190565b5b80821115620003c8575f815f905550600101620003b0565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620003f782620003cc565b9050919050565b6200040981620003eb565b82525050565b5f82825260208201905092915050565b7f566f74696e6720457363726f77204f4c415300000000000000000000000000005f82015250565b5f620004556012836200040f565b915062000462826200041f565b602082019050919050565b7f76654f4c415300000000000000000000000000000000000000000000000000005f82015250565b5f620004a36006836200040f565b9150620004b0826200046d565b602082019050919050565b5f606082019050620004d05f830184620003fe565b8181036020830152620004e38162000447565b90508181036040830152620004f88162000495565b905092915050565b5f602082019050620005155f830184620003fe565b92915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200055d826200051b565b91506200056a836200051b565b92508282026200057a816200051b565b9150828204841483151762000594576200059362000524565b5b5092915050565b620005a6816200051b565b82525050565b5f604082019050620005c15f830185620003fe565b620005d060208301846200059b565b9392505050565b610f6280620005e55f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063b5dbd02f1461002d575b5f80fd5b61004760048036038101906100429190610b49565b610049565b005b5f4211610054575f80fd5b6003544211610061575f80fd5b630784ce008163ffffffff1610610076575f80fd5b6127108361ffff1610610087575f80fd5b670de0b6b3a7640000606461009c9190610bed565b82106100a6575f80fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016101009190610c3d565b602060405180830381865afa15801561011b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013f9190610c6a565b905082811161015157610150610c95565b5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b81526004016101ac9190610c3d565b6040805180830381865afa1580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610d44565b5090505f816fffffffffffffffffffffffffffffffff160361040f575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610281929190610d91565b6020604051808303815f875af115801561029d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c19190610ded565b5060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b52c05fe85856040518363ffffffff1660e01b815260040161031e929190610e51565b5f604051808303815f87803b158015610335575f80fd5b505af1158015610347573d5f803e3d5ffd5b505050505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b81526004016103a69190610c3d565b6040805180830381865afa1580156103c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e49190610d44565b5090505f816fffffffffffffffffffffffffffffffff161161040957610408610c95565b5b506104cf565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b815260040161046a9190610c3d565b6040805180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190610d44565b5090505f816fffffffffffffffffffffffffffffffff16116104cd576104cc610c95565b5b505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcfeeae688886040518363ffffffff1660e01b815260040161052b929190610e78565b5f604051808303815f87803b158015610542575f80fd5b505af1158015610554573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d80f36f89896040518363ffffffff1660e01b81526004016105b5929190610e78565b602060405180830381865afa1580156105d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f49190610c6a565b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a18f99ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190610c6a565b90505f821161069757610696610c95565b5b5f81116106a7576106a6610c95565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663289da14e5f6040518263ffffffff1660e01b81526004016107019190610eae565b5f604051808303815f87803b158015610718575f80fd5b505af115801561072a573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639faacf7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610799573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bd9190610ded565b90505f1515811515146107d3576107d2610c95565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663888739078b8b8b6040518463ffffffff1660e01b815260040161083193929190610ef7565b5f604051808303815f87803b158015610848575f80fd5b505af115801561085a573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639faacf7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ed9190610ded565b905060011515811515036109ab575f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631d0a06b68d8d6040518363ffffffff1660e01b8152600401610958929190610e78565b602060405180830381865afa158015610973573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109979190610c6a565b90505f81116109a9576109a8610c95565b5b505b4260038190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de28a19a8c8c6040518363ffffffff1660e01b8152600401610a0e929190610e78565b5f604051808303815f87803b158015610a25575f80fd5b505af1158015610a37573d5f803e3d5ffd5b505050505050505050505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a7582610a4c565b9050919050565b610a8581610a6b565b8114610a8f575f80fd5b50565b5f81359050610aa081610a7c565b92915050565b5f63ffffffff82169050919050565b610abe81610aa6565b8114610ac8575f80fd5b50565b5f81359050610ad981610ab5565b92915050565b5f61ffff82169050919050565b610af581610adf565b8114610aff575f80fd5b50565b5f81359050610b1081610aec565b92915050565b5f819050919050565b610b2881610b16565b8114610b32575f80fd5b50565b5f81359050610b4381610b1f565b92915050565b5f805f805f60a08688031215610b6257610b61610a48565b5b5f610b6f88828901610a92565b9550506020610b8088828901610acb565b9450506040610b9188828901610b02565b9350506060610ba288828901610b35565b9250506080610bb388828901610acb565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610bf782610b16565b9150610c0283610b16565b9250828202610c1081610b16565b91508282048414831517610c2757610c26610bc0565b5b5092915050565b610c3781610a6b565b82525050565b5f602082019050610c505f830184610c2e565b92915050565b5f81519050610c6481610b1f565b92915050565b5f60208284031215610c7f57610c7e610a48565b5b5f610c8c84828501610c56565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6fffffffffffffffffffffffffffffffff82169050919050565b610ce681610cc2565b8114610cf0575f80fd5b50565b5f81519050610d0181610cdd565b92915050565b5f67ffffffffffffffff82169050919050565b610d2381610d07565b8114610d2d575f80fd5b50565b5f81519050610d3e81610d1a565b92915050565b5f8060408385031215610d5a57610d59610a48565b5b5f610d6785828601610cf3565b9250506020610d7885828601610d30565b9150509250929050565b610d8b81610b16565b82525050565b5f604082019050610da45f830185610c2e565b610db16020830184610d82565b9392505050565b5f8115159050919050565b610dcc81610db8565b8114610dd6575f80fd5b50565b5f81519050610de781610dc3565b92915050565b5f60208284031215610e0257610e01610a48565b5b5f610e0f84828501610dd9565b91505092915050565b5f819050919050565b5f610e3b610e36610e3184610aa6565b610e18565b610b16565b9050919050565b610e4b81610e21565b82525050565b5f604082019050610e645f830185610d82565b610e716020830184610e42565b9392505050565b5f604082019050610e8b5f830185610c2e565b610e986020830184610e42565b9392505050565b610ea881610db8565b82525050565b5f602082019050610ec15f830184610e9f565b92915050565b5f610ee1610edc610ed784610adf565b610e18565b610b16565b9050919050565b610ef181610ec7565b82525050565b5f606082019050610f0a5f830186610c2e565b610f176020830185610e42565b610f246040830184610ee8565b94935050505056fea264697066735822122055fe1d0cd0522541e2920eb105369dc4ebf45d3fecbba69f4600e01fdad8d86f64736f6c6343000817003361010060405234801562000011575f80fd5b506040518060400160405280600981526020017f4175746f6e6f6c617300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f4c4153000000000000000000000000000000000000000000000000000000008152506012825f908162000090919062000453565b508160019081620000a2919062000453565b508060ff1660808160ff16815250504660a08181525050620000c96200016160201b60201c565b60c081815250505050503360065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260e08181525050620006c0565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051620001939190620005df565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001620001d495949392919062000665565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200026b57607f821691505b60208210810362000281576200028062000226565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620002e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002a8565b620002f18683620002a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200033b620003356200032f8462000309565b62000312565b62000309565b9050919050565b5f819050919050565b62000356836200031b565b6200036e620003658262000342565b848454620002b4565b825550505050565b5f90565b6200038462000376565b620003918184846200034b565b505050565b5b81811015620003b857620003ac5f826200037a565b60018101905062000397565b5050565b601f8211156200040757620003d18162000287565b620003dc8462000299565b81016020851015620003ec578190505b62000404620003fb8562000299565b83018262000396565b50505b505050565b5f82821c905092915050565b5f620004295f19846008026200040c565b1980831691505092915050565b5f62000443838362000418565b9150826002028217905092915050565b6200045e82620001ef565b67ffffffffffffffff8111156200047a5762000479620001f9565b5b62000486825462000253565b62000493828285620003bc565b5f60209050601f831160018114620004c9575f8415620004b4578287015190505b620004c0858262000436565b8655506200052f565b601f198416620004d98662000287565b5f5b828110156200050257848901518255600182019150602085019450602081019050620004db565b868310156200052257848901516200051e601f89168262000418565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620005618162000253565b6200056d818662000537565b9450600182165f81146200058a5760018114620005a057620005d6565b60ff1983168652811515820286019350620005d6565b620005ab8562000541565b5f5b83811015620005ce57815481890152600182019150602081019050620005ad565b838801955050505b50505092915050565b5f620005ec828462000553565b915081905092915050565b5f819050919050565b6200060b81620005f7565b82525050565b6200061c8162000309565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200064d8262000622565b9050919050565b6200065f8162000641565b82525050565b5f60a0820190506200067a5f83018862000600565b62000689602083018762000600565b62000698604083018662000600565b620006a7606083018562000611565b620006b6608083018462000654565b9695505050505050565b60805160a05160c05160e051612232620006fb5f395f8181610e05015261130e01525f610b1c01525f610ae801525f610ac301526122325ff3fe608060405234801561000f575f80fd5b506004361061018c575f3560e01c80636e79265c116100dc578063a457c2d711610095578063b091dab31161006f578063b091dab3146104ac578063d505accf146104ca578063dd62ed3e146104e6578063f27c3bf6146105165761018c565b8063a457c2d714610430578063a6f9dae114610460578063a9059cbb1461047c5761018c565b80636e79265c1461034657806370a08231146103765780637ecebe00146103a65780638da5cb5b146103d65780638e4a8379146103f457806395d89b41146104125761018c565b80632c4d4d1811610149578063395093511161012357806339509351146102c057806340c10f19146102f057806342966c681461030c5780635ff99e9d146103285761018c565b80632c4d4d1814610268578063313ce567146102845780633644e515146102a25761018c565b806306fdde031461019057806307546172146101ae578063095ea7b3146101cc5780630a8ded1d146101fc57806318160ddd1461021a57806323b872dd14610238575b5f80fd5b610198610534565b6040516101a5919061197c565b60405180910390f35b6101b66105bf565b6040516101c391906119db565b60405180910390f35b6101e660048036038101906101e19190611a55565b6105e4565b6040516101f39190611aad565b60405180910390f35b6102046106d1565b6040516102119190611ad5565b60405180910390f35b6102226106e1565b60405161022f9190611ad5565b60405180910390f35b610252600480360381019061024d9190611aee565b6106e7565b60405161025f9190611aad565b60405180910390f35b610282600480360381019061027d9190611b3e565b610922565b005b61028c610ac1565b6040516102999190611b84565b60405180910390f35b6102aa610ae5565b6040516102b79190611bb5565b60405180910390f35b6102da60048036038101906102d59190611a55565b610b41565b6040516102e79190611aad565b60405180910390f35b61030a60048036038101906103059190611a55565b610cb9565b005b61032660048036038101906103219190611bce565b610d8a565b005b610330610d97565b60405161033d9190611ad5565b60405180910390f35b610360600480360381019061035b9190611bce565b610d9c565b60405161036d9190611aad565b60405180910390f35b610390600480360381019061038b9190611b3e565b610db4565b60405161039d9190611ad5565b60405180910390f35b6103c060048036038101906103bb9190611b3e565b610dc9565b6040516103cd9190611ad5565b60405180910390f35b6103de610dde565b6040516103eb91906119db565b60405180910390f35b6103fc610e03565b6040516104099190611ad5565b60405180910390f35b61041a610e27565b604051610427919061197c565b60405180910390f35b61044a60048036038101906104459190611a55565b610eb3565b6040516104579190611aad565b60405180910390f35b61047a60048036038101906104759190611b3e565b611053565b005b61049660048036038101906104919190611a55565b6111f2565b6040516104a39190611aad565b60405180910390f35b6104b46112ff565b6040516104c19190611ad5565b60405180910390f35b6104e460048036038101906104df9190611c4d565b6113bd565b005b61050060048036038101906104fb9190611cea565b6116aa565b60405161050d9190611ad5565b60405180910390f35b61051e6116ca565b60405161052b9190611ad5565b60405180910390f35b5f805461054090611d55565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90611d55565b80156105b75780601f1061058e576101008083540402835291602001916105b7565b820191905f5260205f20905b81548152906001019060200180831161059a57829003601f168201915b505050505081565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106bf9190611ad5565b60405180910390a36001905092915050565b6b033b2e3c9fd0803ce800000081565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108145782816107979190611db2565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108609190611db2565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161090e9190611ad5565b60405180910390a360019150509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d6573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016109cd929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610b1a57610b156116d2565b610b3c565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281610bca9190611e0c565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ca69190611ad5565b60405180910390a3600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6d573360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe000000000000000000000000000000000000000000000000000000008152600401610d64929190611de5565b60405180910390fd5b610d7681610d9c565b15610d8657610d85828261175c565b5b5050565b610d943382611827565b50565b600281565b5f80610da66112ff565b905080831115915050919050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60018054610e3490611d55565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090611d55565b8015610eab5780601f10610e8257610100808354040283529160200191610eab565b820191905f5260205f20905b815481529060010190602001808311610e8e57829003601f168201915b505050505081565b5f8060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611048578281610f639190611db2565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161103f9190611ad5565b60405180910390a35b600191505092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611107573360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f625a43fe0000000000000000000000000000000000000000000000000000000081526004016110fe929190611de5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b60405160405180910390a250565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461123f9190611db2565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112ed9190611ad5565b60405180910390a36001905092915050565b5f8060025490505f6301e133807f0000000000000000000000000000000000000000000000000000000000000000426113389190611db2565b6113429190611e6c565b90505f6b033b2e3c9fd0803ce8000000905060098211156113a95760098261136a9190611db2565b91505f5b828110156113a75760646002836113859190611e9c565b61138f9190611e6c565b8261139a9190611e0c565b915080600101905061136e565b505b82816113b59190611db2565b935050505090565b42841015611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790611f27565b60405180910390fd5b5f600161140b610ae5565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b60405160200161149096959493929190611f45565b604051602081830303815290604052805190602001206040516020016114b7929190612018565b604051602081830303815290604052805190602001208585856040515f81526020016040526040516114ec949392919061204e565b6020604051602081039080840390855afa15801561150c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561157f57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b5906120db565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116999190611ad5565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b6301e1338081565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516117029190612195565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016117419594939291906121ab565b60405160208183030381529060405280519060200120905090565b8060025f82825461176d9190611e0c565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181b9190611ad5565b60405180910390a35050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546118739190611db2565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118e69190611ad5565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561192957808201518184015260208101905061190e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61194e826118f2565b61195881856118fc565b935061196881856020860161190c565b61197181611934565b840191505092915050565b5f6020820190508181035f8301526119948184611944565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119c58261199c565b9050919050565b6119d5816119bb565b82525050565b5f6020820190506119ee5f8301846119cc565b92915050565b5f80fd5b611a01816119bb565b8114611a0b575f80fd5b50565b5f81359050611a1c816119f8565b92915050565b5f819050919050565b611a3481611a22565b8114611a3e575f80fd5b50565b5f81359050611a4f81611a2b565b92915050565b5f8060408385031215611a6b57611a6a6119f4565b5b5f611a7885828601611a0e565b9250506020611a8985828601611a41565b9150509250929050565b5f8115159050919050565b611aa781611a93565b82525050565b5f602082019050611ac05f830184611a9e565b92915050565b611acf81611a22565b82525050565b5f602082019050611ae85f830184611ac6565b92915050565b5f805f60608486031215611b0557611b046119f4565b5b5f611b1286828701611a0e565b9350506020611b2386828701611a0e565b9250506040611b3486828701611a41565b9150509250925092565b5f60208284031215611b5357611b526119f4565b5b5f611b6084828501611a0e565b91505092915050565b5f60ff82169050919050565b611b7e81611b69565b82525050565b5f602082019050611b975f830184611b75565b92915050565b5f819050919050565b611baf81611b9d565b82525050565b5f602082019050611bc85f830184611ba6565b92915050565b5f60208284031215611be357611be26119f4565b5b5f611bf084828501611a41565b91505092915050565b611c0281611b69565b8114611c0c575f80fd5b50565b5f81359050611c1d81611bf9565b92915050565b611c2c81611b9d565b8114611c36575f80fd5b50565b5f81359050611c4781611c23565b92915050565b5f805f805f805f60e0888a031215611c6857611c676119f4565b5b5f611c758a828b01611a0e565b9750506020611c868a828b01611a0e565b9650506040611c978a828b01611a41565b9550506060611ca88a828b01611a41565b9450506080611cb98a828b01611c0f565b93505060a0611cca8a828b01611c39565b92505060c0611cdb8a828b01611c39565b91505092959891949750929550565b5f8060408385031215611d0057611cff6119f4565b5b5f611d0d85828601611a0e565b9250506020611d1e85828601611a0e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d6c57607f821691505b602082108103611d7f57611d7e611d28565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611dbc82611a22565b9150611dc783611a22565b9250828203905081811115611ddf57611dde611d85565b5b92915050565b5f604082019050611df85f8301856119cc565b611e0560208301846119cc565b9392505050565b5f611e1682611a22565b9150611e2183611a22565b9250828201905080821115611e3957611e38611d85565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611e7682611a22565b9150611e8183611a22565b925082611e9157611e90611e3f565b5b828204905092915050565b5f611ea682611a22565b9150611eb183611a22565b9250828202611ebf81611a22565b91508282048414831517611ed657611ed5611d85565b5b5092915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f611f116017836118fc565b9150611f1c82611edd565b602082019050919050565b5f6020820190508181035f830152611f3e81611f05565b9050919050565b5f60c082019050611f585f830189611ba6565b611f6560208301886119cc565b611f7260408301876119cc565b611f7f6060830186611ac6565b611f8c6080830185611ac6565b611f9960a0830184611ac6565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611fe2600283611fa4565b9150611fed82611fae565b600282019050919050565b5f819050919050565b61201261200d82611b9d565b611ff8565b82525050565b5f61202282611fd6565b915061202e8285612001565b60208201915061203e8284612001565b6020820191508190509392505050565b5f6080820190506120615f830187611ba6565b61206e6020830186611b75565b61207b6040830185611ba6565b6120886060830184611ba6565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f6120c5600e836118fc565b91506120d082612091565b602082019050919050565b5f6020820190508181035f8301526120f2816120b9565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461212181611d55565b61212b81866120f9565b9450600182165f8114612145576001811461215a5761218c565b60ff198316865281151582028601935061218c565b61216385612103565b5f5b8381101561218457815481890152600182019150602081019050612165565b838801955050505b50505092915050565b5f6121a08284612115565b915081905092915050565b5f60a0820190506121be5f830188611ba6565b6121cb6020830187611ba6565b6121d86040830186611ba6565b6121e56060830185611ac6565b6121f260808301846119cc565b969550505050505056fea264697066735822122006b9fd148fb1557c4bd1726128b4110b5b432c8b886f5764034a792d2fbbef9564736f6c6343000817003360a060405234801562000010575f80fd5b50604051620055a9380380620055a9833981810160405281019062000036919062000400565b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505081600690816200007b9190620006ce565b5080600790816200008d9190620006ce565b506040518060a001604052805f600f0b81526020015f600f0b81526020014267ffffffffffffffff1681526020014367ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525060035f8081526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050505050620007b2565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000256826200022b565b9050919050565b62000268816200024a565b811462000273575f80fd5b50565b5f8151905062000286816200025d565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620002dc8262000294565b810181811067ffffffffffffffff82111715620002fe57620002fd620002a4565b5b80604052505050565b5f620003126200021a565b9050620003208282620002d1565b919050565b5f67ffffffffffffffff821115620003425762000341620002a4565b5b6200034d8262000294565b9050602081019050919050565b5f5b83811015620003795780820151818401526020810190506200035c565b5f8484015250505050565b5f6200039a620003948462000325565b62000307565b905082815260208101848484011115620003b957620003b862000290565b5b620003c68482856200035a565b509392505050565b5f82601f830112620003e557620003e46200028c565b5b8151620003f784826020860162000384565b91505092915050565b5f805f606084860312156200041a576200041962000223565b5b5f620004298682870162000276565b935050602084015167ffffffffffffffff8111156200044d576200044c62000227565b5b6200045b86828701620003ce565b925050604084015167ffffffffffffffff8111156200047f576200047e62000227565b5b6200048d86828701620003ce565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004e657607f821691505b602082108103620004fc57620004fb620004a1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000523565b6200056c868362000523565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005b6620005b0620005aa8462000584565b6200058d565b62000584565b9050919050565b5f819050919050565b620005d18362000596565b620005e9620005e082620005bd565b8484546200052f565b825550505050565b5f90565b620005ff620005f1565b6200060c818484620005c6565b505050565b5b818110156200063357620006275f82620005f5565b60018101905062000612565b5050565b601f82111562000682576200064c8162000502565b620006578462000514565b8101602085101562000667578190505b6200067f620006768562000514565b83018262000611565b50505b505050565b5f82821c905092915050565b5f620006a45f198460080262000687565b1980831691505092915050565b5f620006be838362000693565b9150826002028217905092915050565b620006d98262000497565b67ffffffffffffffff811115620006f557620006f4620002a4565b5b620007018254620004ce565b6200070e82828562000637565b5f60209050601f83116001811462000744575f84156200072f578287015190505b6200073b8582620006b1565b865550620007aa565b601f198416620007548662000502565b5f5b828110156200077d5784890151825560018201915060208501945060208101905062000756565b868310156200079d578489015162000799601f89168262000693565b8355505b6001600288020188555050505b505050505050565b608051614dd0620007d95f395f818161136f01528181611fde015261218a0152614dd05ff3fe608060405234801561000f575f80fd5b5060043610610230575f3560e01c8063587cde1e1161012e5780639ab24eb0116100b6578063c2c4c5c11161007a578063c2c4c5c114610751578063c3cda5201461075b578063c4698ee514610777578063dd62ed3e146107a7578063fc0c546a146107d757610230565b80639ab24eb014610675578063a9059cbb146106a5578063b0a34fdd146106d5578063b18f270214610705578063b52c05fe1461073557610230565b806378888dbf116100fd57806378888dbf146105ab5780637c616fe6146105db5780638e539e8c146105f757806395d89b4114610627578063981b24d01461064557610230565b8063587cde1e146104fb5780635c19a95c1461052b57806370a082311461054757806370ab0a841461057757610230565b806329b55ca7116101bc578063474177ec11610180578063474177ec1461042f5780634deafcae1461044d5780634ee2cd7e1461047d57806353acfabd146104ad57806358341922146104dd57610230565b806329b55ca71461039f5780632f4f21e2146103bb578063313ce567146103d75780633a46b1a8146103f55780633ccfd60b1461042557610230565b8063095ea7b311610203578063095ea7b3146102d457806315456eba1461030457806318160ddd1461032057806318b213481461033e57806323b872dd1461036f57610230565b806301ffc9a714610234578063025fc7d814610264578063047fc9aa1461029857806306fdde03146102b6575b5f80fd5b61024e60048036038101906102499190613fd9565b6107f5565b60405161025b919061401e565b60405180910390f35b61027e6004803603810190610279919061406a565b61092e565b60405161028f9594939291906140fc565b60405180910390f35b6102a06109bb565b6040516102ad919061415c565b60405180910390f35b6102be6109c0565b6040516102cb91906141ff565b60405180910390f35b6102ee60048036038101906102e99190614279565b610a4c565b6040516102fb919061401e565b60405180910390f35b61031e6004803603810190610319919061406a565b610a8a565b005b610328610cba565b604051610335919061415c565b60405180910390f35b610358600480360381019061035391906142b7565b610cc2565b6040516103669291906142e2565b60405180910390f35b61038960048036038101906103849190614309565b610d10565b604051610396919061401e565b60405180910390f35b6103b960048036038101906103b49190614359565b610d4e565b005b6103d560048036038101906103d09190614279565b610dc3565b005b6103df610ff3565b6040516103ec91906143c4565b60405180910390f35b61040f600480360381019061040a9190614279565b610ff8565b60405161041c919061415c565b60405180910390f35b61042d611084565b005b61043761140f565b604051610444919061415c565b60405180910390f35b610467600480360381019061046291906142b7565b611415565b604051610474919061415c565b60405180910390f35b61049760048036038101906104929190614279565b61147b565b6040516104a4919061415c565b60405180910390f35b6104c760048036038101906104c291906142b7565b6114cd565b6040516104d4919061415c565b60405180910390f35b6104e5611516565b6040516104f2919061415c565b60405180910390f35b610515600480360381019061051091906142b7565b611525565b60405161052291906143ec565b60405180910390f35b610545600480360381019061054091906142b7565b611563565b005b610561600480360381019061055c91906142b7565b6115a0565b60405161056e919061415c565b60405180910390f35b610591600480360381019061058c9190614279565b611615565b6040516105a29594939291906140fc565b60405180910390f35b6105c560048036038101906105c0919061442f565b6116bc565b6040516105d2919061445a565b60405180910390f35b6105f560048036038101906105f0919061406a565b6116d9565b005b610611600480360381019061060c919061406a565b61196e565b60405161061e919061415c565b60405180910390f35b61062f611991565b60405161063c91906141ff565b60405180910390f35b61065f600480360381019061065a919061406a565b611a1d565b60405161066c919061415c565b60405180910390f35b61068f600480360381019061068a91906142b7565b611a6e565b60405161069c919061415c565b60405180910390f35b6106bf60048036038101906106ba9190614279565b611a80565b6040516106cc919061401e565b60405180910390f35b6106ef60048036038101906106ea9190614279565b611abe565b6040516106fc9190614506565b60405180910390f35b61071f600480360381019061071a919061406a565b611c18565b60405161072c919061415c565b60405180910390f35b61074f600480360381019061074a919061451f565b611d30565b005b610759611d3f565b005b610775600480360381019061077091906145ba565b611dae565b005b610791600480360381019061078c91906142b7565b611deb565b60405161079e9190614506565b60405180910390f35b6107c160048036038101906107bc9190614643565b611f9e565b6040516107ce919061415c565b60405180910390f35b6107df611fdc565b6040516107ec91906143ec565b60405180910390f35b5f7f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bf57507fe90fb3f6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092757507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6003602052805f5260405f205f91509050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b5f5481565b600680546109cd906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546109f9906146ae565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b505050505081565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610a8191906143ec565b60405180910390fd5b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610b87576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610be057336040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610bd791906143ec565b60405180910390fd5b600142610bed919061470b565b816020015167ffffffffffffffff161015610c4757338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610c3e93929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610ca857816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610c9f9291906147f3565b60405180910390fd5b610cb633835f846002612000565b5050565b5f8054905090565b6001602052805f5260405f205f91509050805f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690805f0160109054906101000a900467ffffffffffffffff16905082565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610d4591906143ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610db3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dbe8383836122c2565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610ec0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610f1957826040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610f1091906143ec565b60405180910390fd5b600142610f26919061470b565b816020015167ffffffffffffffff161015610f8057338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610f7793929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610fe157816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610fd89291906147f3565b60405180910390fd5b610fee83835f845f612000565b505050565b601281565b5f806110048385612592565b5090505f61101184612bd3565b9150508160400151816110249190614826565b60070b82602001516110369190614885565b825f0181815161104691906148c1565b915090600f0b9081600f0b815250505f825f0151600f0b131561107c57815f01516fffffffffffffffffffffffffffffffff1692505b505092915050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905042816020015167ffffffffffffffff1611156111a357338160200151426040517fab0246b300000000000000000000000000000000000000000000000000000000815260040161119a93929190614777565b60405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff16905060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505f805490505f8282039050805f819055506112e4338560405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525084612e2f565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568844260405161132c929190614928565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c8282604051611365929190614928565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016113c892919061494f565b6020604051808303815f875af11580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140891906149a0565b5050505050565b60025481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160109054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b5f806114878385612592565b509050600183611497919061470b565b816060015167ffffffffffffffff1610156114c65780608001516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b5f61152042611c18565b905090565b5f306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161155a91906143ec565b60405180910390fd5b306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161159791906143ec565b60405180910390fd5b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6004602052815f5260405f20818154811061162e575f80fd5b905f5260205f2090600202015f9150915050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b6005602052805f5260405f205f915054906101000a9004600f0b81565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905062093a8067ffffffffffffffff1662093a8067ffffffffffffffff16834201816117ca576117c96149cb565b5b040291505f815f01516fffffffffffffffffffffffffffffffff160361182757336040517f1ff847b600000000000000000000000000000000000000000000000000000000815260040161181e91906143ec565b60405180910390fd5b600142611834919061470b565b816020015167ffffffffffffffff16101561188e57338160200151426040517fd78507e100000000000000000000000000000000000000000000000000000000815260040161188593929190614777565b60405180910390fd5b6001816020015161189f91906149f8565b67ffffffffffffffff168210156118f557338160200151836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016118ec93929190614777565b60405180910390fd5b630784ce0042611905919061470b565b82111561195c5733630784ce004261191d919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161195393929190614a33565b60405180910390fd5b61196a335f84846003612000565b5050565b5f805f61197a84612bd3565b915091506119888282613b81565b92505050919050565b6007805461199e906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca906146ae565b8015611a155780601f106119ec57610100808354040283529160200191611a15565b820191905f5260205f20905b8154815290600101906020018083116119f857829003601f168201915b505050505081565b5f80611a29835f612592565b509050600183611a39919061470b565b816060015167ffffffffffffffff161015611a685780608001516fffffffffffffffffffffffffffffffff1691505b50919050565b5f611a798242613cee565b9050919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611ab591906143ec565b60405180910390fd5b611ac6613ef6565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110611b1557611b14614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905092915050565b5f8060035f60025481526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050611d288184613b81565b915050919050565b611d3b3383836122c2565b5050565b611dac5f60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff168152505f54612e2f565b565b306040517f535db4ec000000000000000000000000000000000000000000000000000000008152600401611de291906143ec565b60405180910390fd5b611df3613ef6565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115611f985760045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182611e899190614a95565b81548110611e9a57611e99614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505091505b50919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611fd391906143ec565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805490505f8582019050805f81905550612019613f4c565b845f01518560200151825f01836020018267ffffffffffffffff1667ffffffffffffffff16815250826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250505086855f01818151019150906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250505f8611156120c95785856020019067ffffffffffffffff16908167ffffffffffffffff16815250505b8460015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505061218088828785612e2f565b5f871115612227577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff1660e01b81526004016121e593929190614ac8565b6020604051808303815f875af1158015612201573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222591906149a0565b505b8773ffffffffffffffffffffffffffffffffffffffff167fbe9cf0e939c614fad640a623a53ba0a807c8cb503c4c4c8dacabe27b86ff2dd588876020015187426040516122779493929190614b70565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c83836040516122b0929190614928565b60405180910390a15050505050505050565b5f82036122fb576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff1662093a8067ffffffffffffffff1682420181612328576123276149cb565b5b040290505f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f815f01516fffffffffffffffffffffffffffffffff1611156124615783815f01516fffffffffffffffffffffffffffffffff166040517f89bf64dd00000000000000000000000000000000000000000000000000000000815260040161245892919061494f565b60405180910390fd5b60014261246e919061470b565b8210156124b6578342836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016124ad93929190614a33565b60405180910390fd5b630784ce00426124c6919061470b565b82111561251d5783630784ce00426124de919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161251493929190614a33565b60405180910390fd5b6bffffffffffffffffffffffff801683111561257e57826bffffffffffffffffffffffff6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016125759291906147f3565b60405180910390fd5b61258c848484846001612000565b50505050565b61259a613ef6565b5f805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125d9576002549050612630565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81036126295750612bcc565b6001810390505b5f5b60808110156129425781600184612649919061470b565b11612942575f60026001848661265f919061470b565b612669919061470b565b6126739190614bb3565b90505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036127af5760035f8281526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094506128fc565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081815481106127fe576127fd614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094505b600187612909919061470b565b856060015167ffffffffffffffff16101561292657809350612936565b6001816129339190614a95565b92505b50806001019050612632565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509250612bca565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110612acc57612acb614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505092505b505b9250929050565b612bdb613ef6565b5f43831115612c235782436040517f8633967e000000000000000000000000000000000000000000000000000000008152600401612c1a929190614928565b60405180910390fd5b5f612c2e845f612592565b80925081945050505f80600254831015612d97575f60035f600186612c53919061470b565b81526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905085606001518160600151612d659190614be3565b67ffffffffffffffff16925085604001518160400151612d859190614be3565b67ffffffffffffffff16915050612dd0565b846060015167ffffffffffffffff1643612db19190614a95565b9150846040015167ffffffffffffffff1642612dcd9190614a95565b90505b846040015167ffffffffffffffff1693505f821115612e275781856060015167ffffffffffffffff1687612e049190614a95565b82612e0f9190614c1e565b612e199190614bb3565b84612e24919061470b565b93505b505050915091565b612e37613ef6565b612e3f613ef6565b5f805f60025490505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146130565742886020015167ffffffffffffffff16118015612eab57505f885f01516fffffffffffffffffffffffffffffffff16115b15612f0e57630784ce00885f0151612ec39190614c5f565b8560200190600f0b9081600f0b81525050428860200151612ee49190614be3565b67ffffffffffffffff168560200151612efd9190614885565b855f0190600f0b9081600f0b815250505b42876020015167ffffffffffffffff16118015612f3f57505f875f01516fffffffffffffffffffffffffffffffff16115b15612fa257630784ce00875f0151612f579190614c5f565b8460200190600f0b9081600f0b81525050428760200151612f789190614be3565b67ffffffffffffffff168460200151612f919190614885565b845f0190600f0b9081600f0b815250505b60055f896020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b92505f876020015167ffffffffffffffff16111561305557876020015167ffffffffffffffff16876020015167ffffffffffffffff160361301b57829150613054565b60055f886020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b91505b5b5b61305e613ef6565b5f82111561316d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506131c3565b6040518060a001604052805f600f0b81526020015f600f0b81526020014267ffffffffffffffff1681526020014367ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090505b5f816040015190505f8290505f836040015167ffffffffffffffff1642111561323a57836040015167ffffffffffffffff16426132009190614a95565b846060015167ffffffffffffffff164361321a9190614a95565b670de0b6b3a764000061322d9190614c1e565b6132379190614bb3565b90505b5f62093a80808561324b9190614cc7565b6132559190614cf7565b90505f5b60ff8110156135c15762093a80820191505f428367ffffffffffffffff161115613285574292506132ba565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b85836132c69190614be3565b60070b87602001516132d89190614885565b875f018181516132e891906148c1565b915090600f0b9081600f0b8152505080876020018181516133099190614d33565b915090600f0b9081600f0b815250505f875f0151600f0b1215613338575f875f0190600f0b9081600f0b815250505b5f8760200151600f0b121561335a575f8760200190600f0b9081600f0b815250505b82955082876040019067ffffffffffffffff16908167ffffffffffffffff1681525050670de0b6b3a76400008560400151846133969190614be3565b67ffffffffffffffff16856133ab9190614c1e565b6133b59190614bb3565b85606001516133c491906149f8565b876060019067ffffffffffffffff16908167ffffffffffffffff1681525050846080015187608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050600188019750428367ffffffffffffffff16036134845743876060019067ffffffffffffffff16908167ffffffffffffffff16815250508c87608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050506135c1565b8660035f8a81526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505050806001019050613259565b5050846002819055505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146136a5578860200151886020015161361191906148c1565b846020018181516136229190614d33565b915090600f0b9081600f0b81525050885f0151885f015161364391906148c1565b845f018181516136539190614d33565b915090600f0b9081600f0b815250505f8460200151600f0b1215613684575f8460200190600f0b9081600f0b815250505b5f845f0151600f0b12156136a4575f845f0190600f0b9081600f0b815250505b5b8360035f8781526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff1614613b7257428c6020015167ffffffffffffffff1611156138ca5788602001518761382f9190614d33565b96508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16036138675787602001518761386491906148c1565b96505b8660055f8e6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b428b6020015167ffffffffffffffff1611801561390257508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16115b1561397c5787602001518661391791906148c1565b95508560055f8d6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b42886040019067ffffffffffffffff16908167ffffffffffffffff168152505043886060019067ffffffffffffffff16908167ffffffffffffffff16815250508a5f015188608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505060045f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2088908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b50505050505050505050505050565b5f8062093a80808560400151613b979190614cc7565b613ba19190614cf7565b90505f5b60ff811015613cbf5762093a80820191505f8467ffffffffffffffff168367ffffffffffffffff161115613bdb57849250613c10565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b856040015183613c209190614826565b60070b8660200151613c329190614885565b865f01818151613c4291906148c1565b915090600f0b9081600f0b815250508467ffffffffffffffff168367ffffffffffffffff1603613c725750613cbf565b8086602001818151613c849190614d33565b915090600f0b9081600f0b8152505082866040019067ffffffffffffffff16908167ffffffffffffffff168152505050806001019050613ba5565b505f845f0151600f0b1315613ce757835f01516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115613eef575f60045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183613d869190614a95565b81548110613d9757613d96614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050806040015184613ea49190614826565b60070b8160200151613eb69190614885565b815f01818151613ec691906148c1565b915090600f0b9081600f0b815250505f815f0151600f0b1315613eed57805f0151600f0b92505b505b5092915050565b6040518060a001604052805f600f0b81526020015f600f0b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090565b60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fb881613f84565b8114613fc2575f80fd5b50565b5f81359050613fd381613faf565b92915050565b5f60208284031215613fee57613fed613f80565b5b5f613ffb84828501613fc5565b91505092915050565b5f8115159050919050565b61401881614004565b82525050565b5f6020820190506140315f83018461400f565b92915050565b5f819050919050565b61404981614037565b8114614053575f80fd5b50565b5f8135905061406481614040565b92915050565b5f6020828403121561407f5761407e613f80565b5b5f61408c84828501614056565b91505092915050565b5f81600f0b9050919050565b6140aa81614095565b82525050565b5f67ffffffffffffffff82169050919050565b6140cc816140b0565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6140f6816140d2565b82525050565b5f60a08201905061410f5f8301886140a1565b61411c60208301876140a1565b61412960408301866140c3565b61413660608301856140c3565b61414360808301846140ed565b9695505050505050565b61415681614037565b82525050565b5f60208201905061416f5f83018461414d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156141ac578082015181840152602081019050614191565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6141d182614175565b6141db818561417f565b93506141eb81856020860161418f565b6141f4816141b7565b840191505092915050565b5f6020820190508181035f83015261421781846141c7565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6142488261421f565b9050919050565b6142588161423e565b8114614262575f80fd5b50565b5f813590506142738161424f565b92915050565b5f806040838503121561428f5761428e613f80565b5b5f61429c85828601614265565b92505060206142ad85828601614056565b9150509250929050565b5f602082840312156142cc576142cb613f80565b5b5f6142d984828501614265565b91505092915050565b5f6040820190506142f55f8301856140ed565b61430260208301846140c3565b9392505050565b5f805f606084860312156143205761431f613f80565b5b5f61432d86828701614265565b935050602061433e86828701614265565b925050604061434f86828701614056565b9150509250925092565b5f805f606084860312156143705761436f613f80565b5b5f61437d86828701614265565b935050602061438e86828701614056565b925050604061439f86828701614056565b9150509250925092565b5f60ff82169050919050565b6143be816143a9565b82525050565b5f6020820190506143d75f8301846143b5565b92915050565b6143e68161423e565b82525050565b5f6020820190506143ff5f8301846143dd565b92915050565b61440e816140b0565b8114614418575f80fd5b50565b5f8135905061442981614405565b92915050565b5f6020828403121561444457614443613f80565b5b5f6144518482850161441b565b91505092915050565b5f60208201905061446d5f8301846140a1565b92915050565b61447c81614095565b82525050565b61448b816140b0565b82525050565b61449a816140d2565b82525050565b60a082015f8201516144b45f850182614473565b5060208201516144c76020850182614473565b5060408201516144da6040850182614482565b5060608201516144ed6060850182614482565b5060808201516145006080850182614491565b50505050565b5f60a0820190506145195f8301846144a0565b92915050565b5f806040838503121561453557614534613f80565b5b5f61454285828601614056565b925050602061455385828601614056565b9150509250929050565b614566816143a9565b8114614570575f80fd5b50565b5f813590506145818161455d565b92915050565b5f819050919050565b61459981614587565b81146145a3575f80fd5b50565b5f813590506145b481614590565b92915050565b5f805f805f8060c087890312156145d4576145d3613f80565b5b5f6145e189828a01614265565b96505060206145f289828a01614056565b955050604061460389828a01614056565b945050606061461489828a01614573565b935050608061462589828a016145a6565b92505060a061463689828a016145a6565b9150509295509295509295565b5f806040838503121561465957614658613f80565b5b5f61466685828601614265565b925050602061467785828601614265565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146c557607f821691505b6020821081036146d8576146d7614681565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61471582614037565b915061472083614037565b9250828201905080821115614738576147376146de565b5b92915050565b5f819050919050565b5f61476161475c614757846140b0565b61473e565b614037565b9050919050565b61477181614747565b82525050565b5f60608201905061478a5f8301866143dd565b6147976020830185614768565b6147a4604083018461414d565b949350505050565b5f6bffffffffffffffffffffffff82169050919050565b5f6147dd6147d86147d3846147ac565b61473e565b614037565b9050919050565b6147ed816147c3565b82525050565b5f6040820190506148065f83018561414d565b61481360208301846147e4565b9392505050565b5f8160070b9050919050565b5f6148308261481a565b915061483b8361481a565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561487f5761487e6146de565b5b92915050565b5f61488f82614095565b915061489a83614095565b92508282026148a881614095565b91508082146148ba576148b96146de565b5b5092915050565b5f6148cb82614095565b91506148d683614095565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff8000000000000000000000000000000082121715614922576149216146de565b5b92915050565b5f60408201905061493b5f83018561414d565b614948602083018461414d565b9392505050565b5f6040820190506149625f8301856143dd565b61496f602083018461414d565b9392505050565b61497f81614004565b8114614989575f80fd5b50565b5f8151905061499a81614976565b92915050565b5f602082840312156149b5576149b4613f80565b5b5f6149c28482850161498c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a02826140b0565b9150614a0d836140b0565b9250828201905067ffffffffffffffff811115614a2d57614a2c6146de565b5b92915050565b5f606082019050614a465f8301866143dd565b614a53602083018561414d565b614a60604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614a9f82614037565b9150614aaa83614037565b9250828203905081811115614ac257614ac16146de565b5b92915050565b5f606082019050614adb5f8301866143dd565b614ae860208301856143dd565b614af5604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60048110614b3b57614b3a614afd565b5b50565b5f819050614b4b82614b2a565b919050565b5f614b5a82614b3e565b9050919050565b614b6a81614b50565b82525050565b5f608082019050614b835f83018761414d565b614b906020830186614768565b614b9d6040830185614b61565b614baa606083018461414d565b95945050505050565b5f614bbd82614037565b9150614bc883614037565b925082614bd857614bd76149cb565b5b828204905092915050565b5f614bed826140b0565b9150614bf8836140b0565b9250828203905067ffffffffffffffff811115614c1857614c176146de565b5b92915050565b5f614c2882614037565b9150614c3383614037565b9250828202614c4181614037565b91508282048414831517614c5857614c576146de565b5b5092915050565b5f614c6982614095565b9150614c7483614095565b925082614c8457614c836149cb565b5b60015f0383147fffffffffffffffffffffffffffffffff8000000000000000000000000000000083141615614cbc57614cbb6146de565b5b828205905092915050565b5f614cd1826140b0565b9150614cdc836140b0565b925082614cec57614ceb6149cb565b5b828204905092915050565b5f614d01826140b0565b9150614d0c836140b0565b9250828202614d1a816140b0565b9150808214614d2c57614d2b6146de565b5b5092915050565b5f614d3d82614095565b9150614d4883614095565b925082820190507fffffffffffffffffffffffffffffffff8000000000000000000000000000000081126f7fffffffffffffffffffffffffffffff82131715614d9457614d936146de565b5b9291505056fea26469706673582212203211cd5681899eb074173d306b7961409e2fd107813288dd10eedc8fc021491764736f6c6343000817003360a06040525f805f6101000a81548160ff02191690831515021790555034801562000028575f80fd5b5060405162002b9638038062002b9683398181016040528101906200004e91906200019e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505062093a808042620000fa919062000231565b62000106919062000268565b600b8190555060015f908060018154018082558091505060019003905f5260205f20015f909190919091505550620002b2565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000168826200013d565b9050919050565b6200017a816200015c565b811462000185575f80fd5b50565b5f8151905062000198816200016f565b92915050565b5f60208284031215620001b657620001b562000139565b5b5f620001c58482850162000188565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200023d82620001ce565b91506200024a83620001ce565b9250826200025d576200025c620001d7565b5b828204905092915050565b5f6200027482620001ce565b91506200028183620001ce565b92508282026200029181620001ce565b91508282048414831517620002ab57620002aa62000204565b5b5092915050565b6080516128bd620002d95f395f818161095c01528181610d110152610dc201526128bd5ff3fe608060405234801561000f575f80fd5b50600436106101ed575f3560e01c80637665a8ef1161010d578063c2c4c5c1116100a0578063de28a19a1161006f578063de28a19a14610645578063e4a28a5214610661578063ec73d9061461067f578063f4359ce5146106af576101ed565b8063c2c4c5c1146105bd578063d8cac5ae146105c7578063da669c6e146105f8578063dcfeeae614610629576101ed565b80639d175053116100dc5780639d175053146105205780639e5d842e146105515780639faacf7c14610581578063a18f99ff1461059f576101ed565b80637665a8ef146104865780637967d905146104b6578063861bd2a0146104d25780638887390714610504576101ed565b806341597036116101855780635bc105c0116101545780635bc105c0146103d75780636010185d146103f5578063635b85911461042657806366ab8ac614610456576101ed565b8063415970361461034d578063482649971461036b5780634efafacf146103895780634f6ffd07146103b9576101ed565b806327ebf531116101c157806327ebf531146102a0578063289da14e146102d15780633b766b3d146102ed5780633d80f36f1461031d576101ed565b806292a596146101f15780630c423201146102225780631d0a06b6146102525780631f85071614610282575b5f80fd5b61020b60048036038101906102069190611d7f565b6106cd565b604051610219929190611f5b565b60405180910390f35b61023c60048036038101906102379190611f90565b6108cb565b6040516102499190611fca565b60405180910390f35b61026c6004803603810190610267919061200d565b6108e0565b6040516102799190611fca565b60405180910390f35b61028a61095a565b604051610297919061205a565b60405180910390f35b6102ba60048036038101906102b59190611f90565b61097e565b6040516102c8929190612073565b60405180910390f35b6102eb60048036038101906102e691906120cf565b610a45565b005b61030760048036038101906103029190611f90565b610a60565b6040516103149190611fca565b60405180910390f35b6103376004803603810190610332919061200d565b610a80565b6040516103449190611fca565b60405180910390f35b610355610abf565b6040516103629190611fca565b60405180910390f35b610373610adb565b6040516103809190611fca565b60405180910390f35b6103a3600480360381019061039e9190611f90565b610ae1565b6040516103b09190611fca565b60405180910390f35b6103c1610af6565b6040516103ce9190611fca565b60405180910390f35b6103df610afd565b6040516103ec9190611fca565b60405180910390f35b61040f600480360381019061040a9190611d7f565b610b2b565b60405161041d9291906120fa565b60405180910390f35b610440600480360381019061043b9190611f90565b610b56565b60405161044d9190611fca565b60405180910390f35b610470600480360381019061046b919061200d565b610b6b565b60405161047d9190611fca565b60405180910390f35b6104a0600480360381019061049b919061200d565b610b8b565b6040516104ad9190611fca565b60405180910390f35b6104d060048036038101906104cb9190612331565b610bec565b005b6104ec60048036038101906104e7919061200d565b610cba565b6040516104fb939291906123d5565b60405180910390f35b61051e6004803603810190610519919061240a565b610ceb565b005b61053a60048036038101906105359190611f90565b6115cf565b6040516105489291906120fa565b60405180910390f35b61056b60048036038101906105669190611d7f565b6115ef565b6040516105789190611fca565b60405180910390f35b61058961160f565b6040516105969190612469565b60405180910390f35b6105a761161f565b6040516105b49190611fca565b60405180910390f35b6105c5611636565b005b6105e160048036038101906105dc919061240a565b611641565b6040516105ef9291906120fa565b60405180910390f35b610612600480360381019061060d919061240a565b61165e565b6040516106209291906120fa565b60405180910390f35b610643600480360381019061063e919061200d565b61168f565b005b61065f600480360381019061065a919061200d565b611904565b005b61066961191c565b6040516106769190611fca565b60405180910390f35b61069960048036038101906106949190612482565b611922565b6040516106a69190611fca565b60405180910390f35b6106b7611937565b6040516106c49190611fca565b60405180910390f35b6060805f8414806106dd57505f83145b15610714576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838561072191906124da565b90505f6001805490509050808211156107735781816040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161076a9291906120fa565b60405180910390fd5b8467ffffffffffffffff81111561078d5761078c612135565b5b6040519080825280602002602001820160405280156107bb5781602001602082028036833780820191505090505b5093508467ffffffffffffffff8111156107d8576107d7612135565b5b6040519080825280602002602001820160405280156108065781602001602082028036833780820191505090505b5092505f5b858110156108c1575f878261082091906124da565b90505f600182815481106108375761083661250d565b5b905f5260205f2001549050808784815181106108565761085561250d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a081901c8684815181106108a8576108a761250d565b5b602002602001018181525050505080600101905061080b565b5050509250929050565b600a602052805f5260405f205f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205491505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805f60018080549050610992919061253a565b90505f84036109cd576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80841115610a145783816040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610a0b9291906120fa565b60405180910390fd5b5f60018581548110610a2957610a2861250d565b5b905f5260205f200154905080935060a081901c92505050915091565b805f806101000a81548160ff02191690831515021790555050565b60018181548110610a6f575f80fd5b905f5260205f20015f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060025f8281526020019081526020015f205491505092915050565b5f60095f600b5481526020019081526020015f205f0154905090565b600b5481565b6008602052805f5260405f205f915090505481565b620d2f0081565b6024600267ffffffffffffffff610b1491906125ad565b610b1e91906125dd565b67ffffffffffffffff1681565b6006602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b6002602052805f5260405f205f915090505481565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060065f8281526020019081526020015f205f60085f8481526020019081526020015f205481526020019081526020015f205f015491505092915050565b81518351141580610bff57508051835114155b15610c4557825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600401610c3c9291906120fa565b60405180910390fd5b5f5b8351811015610cb457610ca9848281518110610c6657610c6561250d565b5b6020026020010151848381518110610c8157610c8061250d565b5b6020026020010151848481518110610c9c57610c9b61250d565b5b6020026020010151610ceb565b806001019050610c47565b50505050565b6003602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154905083565b5f8373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c4698ee5336040518263ffffffff1660e01b8152600401610d68919061205a565b60a060405180830381865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da7919061274a565b602001516fffffffffffffffffffffffffffffffff1690505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634deafcae336040518263ffffffff1660e01b8152600401610e19919061205a565b602060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190612789565b90505f62093a808062093a8042610e6f91906124da565b610e7991906127b4565b610e8391906127e4565b9050818110610ecd573382826040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610ec493929190612825565b60405180910390fd5b612710851115610f1857846127106040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610f0f9291906120fa565b60405180910390fd5b5f620d2f0060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2054610f7491906124da565b905042811115610fbf573342826040517f17601765000000000000000000000000000000000000000000000000000000008152600401610fb693929190612825565b60405180910390fd5b5f60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f206040518060600160405290815f82015481526020016001820154815260200160028201548152505090505f838260400151111561106457838260400151611053919061253a565b825f015161106191906127e4565b90505b5f60405180606001604052806127108b8a61107f91906127e4565b61108991906127b4565b81526020018a81526020018781525090505f85876110a7919061253a565b825f01516110b591906127e4565b90505f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050846020015183602001518261110d91906124da565b611117919061253a565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506127108111156111a657806127106040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161119d9291906120fa565b60405180910390fd5b6111c4826111b48f8f61193e565b6111be91906124da565b85611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f205f0181905550611206826111f6611b59565b61120091906124da565b85611b36565b60095f8981526020019081526020015f205f018190555086856040015111156112da57611267835f015160065f8d81526020019081526020015f205f8a81526020019081526020015f206001015461125e91906124da565b865f0151611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f20600101819055506112bd835f015160095f8a81526020019081526020015f20600101546112b491906124da565b865f0151611b36565b60095f8981526020019081526020015f2060010181905550611344565b825f015160065f8c81526020019081526020015f205f8981526020019081526020015f206001015f82825461130f91906124da565b92505081905550825f015160095f8981526020019081526020015f206001015f82825461133c91906124da565b925050819055505b42856040015111156113bc57845f015160075f8c81526020019081526020015f205f876040015181526020019081526020015f205f828254611386919061253a565b92505081905550845f0151600a5f876040015181526020019081526020015f205f8282546113b4919061253a565b925050819055505b825f015160075f8c81526020019081526020015f205f856040015181526020019081526020015f205f8282546113f291906124da565b92505081905550825f0151600a5f856040015181526020019081526020015f205f82825461142091906124da565b925050819055508260035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050504260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f20819055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f2054116115405761153f61285a565b5b60015f806101000a81548160ff0219169083151502179055508c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f491b1e1a0c99eaa02d3b9e779fea23f086f3b4f723b1633a89121774de05512f8e8e6040516115b89291906120fa565b60405180910390a350505050505050505050505050565b6009602052805f5260405f205f91509050805f0154908060010154905082565b6007602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900460ff1681565b5f60018080549050611631919061253a565b905090565b61163e611b59565b50565b5f8061164e858585611c88565b8092508193505050935093915050565b5f8061166a858561193e565b50611673611b59565b5061167f858585611c88565b8092508193505050935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361172d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024600267ffffffffffffffff61174491906125ad565b61174e91906125dd565b67ffffffffffffffff168111156117c857806024600267ffffffffffffffff61177791906125ad565b61178191906125dd565b67ffffffffffffffff166040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016117bf9291906120fa565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16905060a082901b811790505f60025f8381526020019081526020015f205411156118435782826040517f6421261300000000000000000000000000000000000000000000000000000000815260040161183a929190612073565b60405180910390fd5b60018054905060025f8381526020019081526020015f2081905550600181908060018154018082558091505060019003905f5260205f20015f90919091909150555f62093a808062093a804261189991906124da565b6118a391906127b4565b6118ad91906127e4565b90508060085f8481526020019081526020015f20819055507f1bc65a439335898028ac09fe90754a5ef59b65314198d75e6cdd5f9deaa5076784846040516118f6929190612073565b60405180910390a150505050565b61190e828261193e565b50611917611b59565b505050565b61271081565b6004602052805f5260405f205f915090505481565b62093a8081565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f60025f8381526020019081526020015f2054036119b95783836040517f5e6132570000000000000000000000000000000000000000000000000000000081526004016119b0929190612073565b60405180910390fd5b5f60085f8381526020019081526020015f205490505f60065f8481526020019081526020015f205f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611b2657428311611b265762093a8083611a3191906124da565b92505f62093a808360200151611a4791906127e4565b905080835f01511115611aaf5780835f01818151611a65919061253a565b915081815250505f60075f8781526020019081526020015f205f8681526020019081526020015f205490508084602001818151611aa2919061253a565b9150818152505050611ac3565b5f835f0181815250505f8360200181815250505b8260065f8781526020019081526020015f205f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611b18578360085f8781526020019081526020015f20819055505b508080600101915050611a11565b50805f0151935050505092915050565b5f818311611b44575f611b51565b8183611b50919061253a565b5b905092915050565b5f80600b5490505f60095f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611c7c57428311611c7c5762093a8083611bb491906124da565b92505f62093a808360200151611bca91906127e4565b905080835f01511115611c235780835f01818151611be8919061253a565b915081815250505f600a5f8681526020019081526020015f205490508084602001818151611c16919061253a565b9150818152505050611c37565b5f835f0181815250505f8360200181815250505b8260095f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611c6e5783600b819055505b508080600101915050611b94565b50805f01519250505090565b5f805f62093a808085611c9b91906127b4565b611ca591906127e4565b905060095f8281526020019081526020015f205f015491505f8673ffffffffffffffffffffffffffffffffffffffff16905060a086901b811790505f831115611d31575f60065f8381526020019081526020015f205f8481526020019081526020015f205f015490508381670de0b6b3a7640000611d2391906127e4565b611d2d91906127b4565b9450505b5050935093915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611d5e81611d4c565b8114611d68575f80fd5b50565b5f81359050611d7981611d55565b92915050565b5f8060408385031215611d9557611d94611d44565b5b5f611da285828601611d6b565b9250506020611db385828601611d6b565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611e0f82611de6565b9050919050565b611e1f81611e05565b82525050565b5f611e308383611e16565b60208301905092915050565b5f602082019050919050565b5f611e5282611dbd565b611e5c8185611dc7565b9350611e6783611dd7565b805f5b83811015611e97578151611e7e8882611e25565b9750611e8983611e3c565b925050600181019050611e6a565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ed681611d4c565b82525050565b5f611ee78383611ecd565b60208301905092915050565b5f602082019050919050565b5f611f0982611ea4565b611f138185611eae565b9350611f1e83611ebe565b805f5b83811015611f4e578151611f358882611edc565b9750611f4083611ef3565b925050600181019050611f21565b5085935050505092915050565b5f6040820190508181035f830152611f738185611e48565b90508181036020830152611f878184611eff565b90509392505050565b5f60208284031215611fa557611fa4611d44565b5b5f611fb284828501611d6b565b91505092915050565b611fc481611d4c565b82525050565b5f602082019050611fdd5f830184611fbb565b92915050565b611fec81611e05565b8114611ff6575f80fd5b50565b5f8135905061200781611fe3565b92915050565b5f806040838503121561202357612022611d44565b5b5f61203085828601611ff9565b925050602061204185828601611d6b565b9150509250929050565b61205481611e05565b82525050565b5f60208201905061206d5f83018461204b565b92915050565b5f6040820190506120865f83018561204b565b6120936020830184611fbb565b9392505050565b5f8115159050919050565b6120ae8161209a565b81146120b8575f80fd5b50565b5f813590506120c9816120a5565b92915050565b5f602082840312156120e4576120e3611d44565b5b5f6120f1848285016120bb565b91505092915050565b5f60408201905061210d5f830185611fbb565b61211a6020830184611fbb565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61216b82612125565b810181811067ffffffffffffffff8211171561218a57612189612135565b5b80604052505050565b5f61219c611d3b565b90506121a88282612162565b919050565b5f67ffffffffffffffff8211156121c7576121c6612135565b5b602082029050602081019050919050565b5f80fd5b5f6121ee6121e9846121ad565b612193565b90508083825260208201905060208402830185811115612211576122106121d8565b5b835b8181101561223a57806122268882611ff9565b845260208401935050602081019050612213565b5050509392505050565b5f82601f83011261225857612257612121565b5b81356122688482602086016121dc565b91505092915050565b5f67ffffffffffffffff82111561228b5761228a612135565b5b602082029050602081019050919050565b5f6122ae6122a984612271565b612193565b905080838252602082019050602084028301858111156122d1576122d06121d8565b5b835b818110156122fa57806122e68882611d6b565b8452602084019350506020810190506122d3565b5050509392505050565b5f82601f83011261231857612317612121565b5b813561232884826020860161229c565b91505092915050565b5f805f6060848603121561234857612347611d44565b5b5f84013567ffffffffffffffff81111561236557612364611d48565b5b61237186828701612244565b935050602084013567ffffffffffffffff81111561239257612391611d48565b5b61239e86828701612304565b925050604084013567ffffffffffffffff8111156123bf576123be611d48565b5b6123cb86828701612304565b9150509250925092565b5f6060820190506123e85f830186611fbb565b6123f56020830185611fbb565b6124026040830184611fbb565b949350505050565b5f805f6060848603121561242157612420611d44565b5b5f61242e86828701611ff9565b935050602061243f86828701611d6b565b925050604061245086828701611d6b565b9150509250925092565b6124638161209a565b82525050565b5f60208201905061247c5f83018461245a565b92915050565b5f6020828403121561249757612496611d44565b5b5f6124a484828501611ff9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124e482611d4c565b91506124ef83611d4c565b9250828201905080821115612507576125066124ad565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61254482611d4c565b915061254f83611d4c565b9250828203905081811115612567576125666124ad565b5b92915050565b5f67ffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6125b78261256d565b91506125c28361256d565b9250826125d2576125d1612580565b5b828204905092915050565b5f6125e78261256d565b91506125f28361256d565b9250828203905067ffffffffffffffff811115612612576126116124ad565b5b92915050565b5f80fd5b5f81600f0b9050919050565b6126318161261c565b811461263b575f80fd5b50565b5f8151905061264c81612628565b92915050565b61265b8161256d565b8114612665575f80fd5b50565b5f8151905061267681612652565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6126a08161267c565b81146126aa575f80fd5b50565b5f815190506126bb81612697565b92915050565b5f60a082840312156126d6576126d5612618565b5b6126e060a0612193565b90505f6126ef8482850161263e565b5f8301525060206127028482850161263e565b602083015250604061271684828501612668565b604083015250606061272a84828501612668565b606083015250608061273e848285016126ad565b60808301525092915050565b5f60a0828403121561275f5761275e611d44565b5b5f61276c848285016126c1565b91505092915050565b5f8151905061278381611d55565b92915050565b5f6020828403121561279e5761279d611d44565b5b5f6127ab84828501612775565b91505092915050565b5f6127be82611d4c565b91506127c983611d4c565b9250826127d9576127d8612580565b5b828204905092915050565b5f6127ee82611d4c565b91506127f983611d4c565b925082820261280781611d4c565b9150828204841483151761281e5761281d6124ad565b5b5092915050565b5f6060820190506128385f83018661204b565b6128456020830185611fbb565b6128526040830184611fbb565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220948cb71923f507b691853d26873dfaf65f1c095925be6cbedeb01e3ae8d2719264736f6c63430008170033", "bin-runtime": "608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063b5dbd02f1461002d575b5f80fd5b61004760048036038101906100429190610b49565b610049565b005b5f4211610054575f80fd5b6003544211610061575f80fd5b630784ce008163ffffffff1610610076575f80fd5b6127108361ffff1610610087575f80fd5b670de0b6b3a7640000606461009c9190610bed565b82106100a6575f80fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016101009190610c3d565b602060405180830381865afa15801561011b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013f9190610c6a565b905082811161015157610150610c95565b5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b81526004016101ac9190610c3d565b6040805180830381865afa1580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610d44565b5090505f816fffffffffffffffffffffffffffffffff160361040f575f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610281929190610d91565b6020604051808303815f875af115801561029d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c19190610ded565b5060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b52c05fe85856040518363ffffffff1660e01b815260040161031e929190610e51565b5f604051808303815f87803b158015610335575f80fd5b505af1158015610347573d5f803e3d5ffd5b505050505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b81526004016103a69190610c3d565b6040805180830381865afa1580156103c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e49190610d44565b5090505f816fffffffffffffffffffffffffffffffff161161040957610408610c95565b5b506104cf565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318b21348306040518263ffffffff1660e01b815260040161046a9190610c3d565b6040805180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190610d44565b5090505f816fffffffffffffffffffffffffffffffff16116104cd576104cc610c95565b5b505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcfeeae688886040518363ffffffff1660e01b815260040161052b929190610e78565b5f604051808303815f87803b158015610542575f80fd5b505af1158015610554573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d80f36f89896040518363ffffffff1660e01b81526004016105b5929190610e78565b602060405180830381865afa1580156105d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f49190610c6a565b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a18f99ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190610c6a565b90505f821161069757610696610c95565b5b5f81116106a7576106a6610c95565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663289da14e5f6040518263ffffffff1660e01b81526004016107019190610eae565b5f604051808303815f87803b158015610718575f80fd5b505af115801561072a573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639faacf7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610799573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bd9190610ded565b90505f1515811515146107d3576107d2610c95565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663888739078b8b8b6040518463ffffffff1660e01b815260040161083193929190610ef7565b5f604051808303815f87803b158015610848575f80fd5b505af115801561085a573d5f803e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639faacf7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ed9190610ded565b905060011515811515036109ab575f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631d0a06b68d8d6040518363ffffffff1660e01b8152600401610958929190610e78565b602060405180830381865afa158015610973573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109979190610c6a565b90505f81116109a9576109a8610c95565b5b505b4260038190555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663de28a19a8c8c6040518363ffffffff1660e01b8152600401610a0e929190610e78565b5f604051808303815f87803b158015610a25575f80fd5b505af1158015610a37573d5f803e3d5ffd5b505050505050505050505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a7582610a4c565b9050919050565b610a8581610a6b565b8114610a8f575f80fd5b50565b5f81359050610aa081610a7c565b92915050565b5f63ffffffff82169050919050565b610abe81610aa6565b8114610ac8575f80fd5b50565b5f81359050610ad981610ab5565b92915050565b5f61ffff82169050919050565b610af581610adf565b8114610aff575f80fd5b50565b5f81359050610b1081610aec565b92915050565b5f819050919050565b610b2881610b16565b8114610b32575f80fd5b50565b5f81359050610b4381610b1f565b92915050565b5f805f805f60a08688031215610b6257610b61610a48565b5b5f610b6f88828901610a92565b9550506020610b8088828901610acb565b9450506040610b9188828901610b02565b9350506060610ba288828901610b35565b9250506080610bb388828901610acb565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610bf782610b16565b9150610c0283610b16565b9250828202610c1081610b16565b91508282048414831517610c2757610c26610bc0565b5b5092915050565b610c3781610a6b565b82525050565b5f602082019050610c505f830184610c2e565b92915050565b5f81519050610c6481610b1f565b92915050565b5f60208284031215610c7f57610c7e610a48565b5b5f610c8c84828501610c56565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6fffffffffffffffffffffffffffffffff82169050919050565b610ce681610cc2565b8114610cf0575f80fd5b50565b5f81519050610d0181610cdd565b92915050565b5f67ffffffffffffffff82169050919050565b610d2381610d07565b8114610d2d575f80fd5b50565b5f81519050610d3e81610d1a565b92915050565b5f8060408385031215610d5a57610d59610a48565b5b5f610d6785828601610cf3565b9250506020610d7885828601610d30565b9150509250929050565b610d8b81610b16565b82525050565b5f604082019050610da45f830185610c2e565b610db16020830184610d82565b9392505050565b5f8115159050919050565b610dcc81610db8565b8114610dd6575f80fd5b50565b5f81519050610de781610dc3565b92915050565b5f60208284031215610e0257610e01610a48565b5b5f610e0f84828501610dd9565b91505092915050565b5f819050919050565b5f610e3b610e36610e3184610aa6565b610e18565b610b16565b9050919050565b610e4b81610e21565b82525050565b5f604082019050610e645f830185610d82565b610e716020830184610e42565b9392505050565b5f604082019050610e8b5f830185610c2e565b610e986020830184610e42565b9392505050565b610ea881610db8565b82525050565b5f602082019050610ec15f830184610e9f565b92915050565b5f610ee1610edc610ed784610adf565b610e18565b610b16565b9050919050565b610ef181610ec7565b82525050565b5f606082019050610f0a5f830186610c2e565b610f176020830185610e42565b610f246040830184610ee8565b94935050505056fea264697066735822122055fe1d0cd0522541e2920eb105369dc4ebf45d3fecbba69f4600e01fdad8d86f64736f6c63430008170033", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {}, "author": null, "details": null, "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol:IVEOLAS": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getLastUserPoint\",\"outputs\":[{\"components\":[{\"internalType\":\"int128\",\"name\":\"bias\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"slope\",\"type\":\"int128\"},{\"internalType\":\"uint64\",\"name\":\"ts\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"internalType\":\"structIVEOLAS.PointVoting\",\"name\":\"pv\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"lockedEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {"getLastUserPoint(address)": {"author": null, "details": "Gets the most recently recorded user point for `account`.", "params": {"account": "Account address."}, "return": null}, "lockedEnd(address)": {"author": null, "details": "Gets the `account`'s lock end time.", "params": {"account": "Account address."}, "return": null}}, "author": null, "details": null, "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/contracts/test/VoteWeightingFuzzing.sol:VoteWeightingFuzzing": {"srcmap": "1603:19267:3:-:0;;;2441:5;2401:45;;;;;;;;;;;;;;;;;;;;3925:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4017:1;4002:17;;:3;:17;;;3998:68;;4042:13;;;;;;;;;;;;;;3998:68;4115:3;4110:8;;;;;;;;;;2015:7;;4138:15;:22;;;;:::i;:::-;:29;;;;:::i;:::-;4128:7;:39;;;;4177:11;4194:1;4177:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:278;1603:19267;;88:117:9;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:351::-;915:6;964:2;952:9;943:7;939:23;935:32;932:119;;;970:79;;:::i;:::-;932:119;1090:1;1115:64;1171:7;1162:6;1151:9;1147:22;1115:64;:::i;:::-;1105:74;;1061:128;845:351;;;;:::o;1202:77::-;1239:7;1268:5;1257:16;;1202:77;;;:::o;1285:180::-;1333:77;1330:1;1323:88;1430:4;1427:1;1420:15;1454:4;1451:1;1444:15;1471:180;1519:77;1516:1;1509:88;1616:4;1613:1;1606:15;1640:4;1637:1;1630:15;1657:185;1697:1;1714:20;1732:1;1714:20;:::i;:::-;1709:25;;1748:20;1766:1;1748:20;:::i;:::-;1743:25;;1787:1;1777:35;;1792:18;;:::i;:::-;1777:35;1834:1;1831;1827:9;1822:14;;1657:185;;;;:::o;1848:410::-;1888:7;1911:20;1929:1;1911:20;:::i;:::-;1906:25;;1945:20;1963:1;1945:20;:::i;:::-;1940:25;;2000:1;1997;1993:9;2022:30;2040:11;2022:30;:::i;:::-;2011:41;;2201:1;2192:7;2188:15;2185:1;2182:22;2162:1;2155:9;2135:83;2112:139;;2231:18;;:::i;:::-;2112:139;1896:362;1848:410;;;;:::o;1603:19267:3:-;;;;;;;;;;;;;;;;;;;;;;;", "srcmap-runtime": "1603:19267:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19091:1182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3719:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20451:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2367:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18024:652;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;20309:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2528:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17315:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16723:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3809:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3577:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2094:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2266:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3326:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2614:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2950:67;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16192:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15398:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2718:72;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;11581:3513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3650:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3441:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2401:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16992:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8083:57;;;:::i;:::-;;10173:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10998:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6888:1127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8320:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2176:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2833:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1984:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19091:1182;19195:25;19222;19327:1;19316:7;:12;:32;;;;19347:1;19332:11;:16;19316:32;19312:81;;;19371:11;;;;;;;;;;;;;;19312:81;19448:13;19474:11;19464:7;:21;;;;:::i;:::-;19448:37;;19580:24;19607:11;:18;;;;19580:45;;19682:16;19674:5;:24;19670:95;;;19730:5;19737:16;19721:33;;;;;;;;;;;;:::i;:::-;;;;;;;;19670:95;19821:11;19807:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19796:37;;19868:11;19854:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19843:37;;19934:9;19929:338;19953:11;19949:1;:15;19929:338;;;19985:10;20002:7;19998:1;:11;;;;:::i;:::-;19985:24;;20023:22;20048:11;20060:2;20048:15;;;;;;;;:::i;:::-;;;;;;;;;;20023:40;;20158:14;20120:8;20129:1;20120:11;;;;;;;;:::i;:::-;;;;;;;:55;;;;;;;;;;;20253:3;20235:14;:21;;20221:8;20230:1;20221:11;;;;;;;;:::i;:::-;;;;;;;:35;;;;;19971:296;;19966:3;;;;;19929:338;;;;19253:1020;;19091:1182;;;;;:::o;3719:45::-;;;;;;;;;;;;;;;;;:::o;20451:417::-;20533:7;20657:22;20698:7;20682:25;;20657:50;;20801:3;20790:7;:14;;20772:32;;;;20821:12;:24;20834:10;20821:24;;;;;;;;;;;;;;;:40;20846:14;20821:40;;;;;;;;;;;;20814:47;;;20451:417;;;;:::o;2367:27::-;;;:::o;18024:652::-;18079:15;18096;18183:24;18231:1;18210:11;:18;;;;:22;;;;:::i;:::-;18183:49;;18301:1;18295:2;:7;18291:151;;18325:11;;;;;;;;;;;;;;18291:151;18362:16;18357:2;:21;18353:89;;;18410:2;18414:16;18401:30;;;;;;;;;;;;:::i;:::-;;;;;;;;18353:89;18460:22;18485:11;18497:2;18485:15;;;;;;;;:::i;:::-;;;;;;;;;;18460:40;;18583:14;18549:51;;18666:3;18648:14;:21;;18638:31;;18113:563;;18024:652;;;:::o;20309:107::-;20405:4;20377:25;;:32;;;;;;;;;;;;;;;;;;20309:107;:::o;2528:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17315:405::-;17394:10;17521:22;17562:7;17546:25;;17521:50;;17665:3;17654:7;:14;;17636:32;;;;17684:13;:29;17698:14;17684:29;;;;;;;;;;;;17679:34;;17406:314;17315:405;;;;:::o;16723:104::-;16771:7;16797:9;:18;16807:7;;16797:18;;;;;;;;;;;:23;;;16790:30;;16723:104;:::o;3809:22::-;;;;:::o;3577:45::-;;;;;;;;;;;;;;;;;:::o;2094:51::-;2138:7;2094:51;:::o;2266:64::-;2328:2;2324:1;2305:16;:20;;;;:::i;:::-;:25;;;;:::i;:::-;2266:64;;;:::o;3326:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2614:48::-;;;;;;;;;;;;;;;;;:::o;2950:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16192:440::-;16275:7;16399:22;16440:7;16424:25;;16399:50;;16543:3;16532:7;:14;;16514:32;;;;16564:12;:28;16577:14;16564:28;;;;;;;;;;;:56;16593:10;:26;16604:14;16593:26;;;;;;;;;;;;16564:56;;;;;;;;;;;:61;;;16557:68;;;16192:440;;;;:::o;15398:514::-;15586:8;:15;15567:8;:15;:34;;:71;;;;15624:7;:14;15605:8;:15;:33;;15567:71;15563:158;;;15678:8;:15;15695:7;:14;15661:49;;;;;;;;;;;;:::i;:::-;;;;;;;;15563:158;15781:9;15776:130;15800:8;:15;15796:1;:19;15776:130;;;15836:59;15858:8;15867:1;15858:11;;;;;;;;:::i;:::-;;;;;;;;15871:8;15880:1;15871:11;;;;;;;;:::i;:::-;;;;;;;;15884:7;15892:1;15884:10;;;;;;;;:::i;:::-;;;;;;;;15836:21;:59::i;:::-;15817:3;;;;;15776:130;;;;15398:514;;;:::o;2718:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11581:3513::-;11785:22;11826:7;11810:25;;11785:50;;11929:3;11918:7;:14;;11900:32;;;;11943:13;11983:2;11975:28;;;12004:10;11975:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;11959:64;;11943:80;;12033:15;12059:2;12051:21;;;12073:10;12051:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12033:51;;12094:16;2015:7;;;12114:15;:22;;;;:::i;:::-;12113:31;;;;:::i;:::-;:38;;;;:::i;:::-;12094:57;;12223:7;12211:8;:19;12207:99;;12265:10;12277:7;12286:8;12253:42;;;;;;;;;;;;;:::i;:::-;;;;;;;;12207:99;2213:6;12359;:19;12355:85;;;12410:6;2213;12401:28;;;;;;;;;;;;:::i;:::-;;;;;;;;12355:85;12492:29;2138:7;12524:12;:24;12537:10;12524:24;;;;;;;;;;;;;;;:40;12549:14;12524:40;;;;;;;;;;;;:60;;;;:::i;:::-;12492:92;;12622:15;12598:21;:39;12594:141;;;12673:10;12685:15;12702:21;12660:64;;;;;;;;;;;;;:::i;:::-;;;;;;;;12594:141;12794:26;12823:14;:26;12838:10;12823:26;;;;;;;;;;;;;;;:42;12850:14;12823:42;;;;;;;;;;;12794:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12875:15;12919:8;12904;:12;;;:23;12900:106;;;12986:8;12971;:12;;;:23;;;;:::i;:::-;12953:8;:14;;;:42;;;;:::i;:::-;12943:52;;12900:106;13016:26;13045:123;;;;;;;;2213:6;13085;13077:5;:14;;;;:::i;:::-;:27;;;;:::i;:::-;13045:123;;;;13151:6;13045:123;;;;13123:7;13045:123;;;13016:152;;13179:15;13225:8;13215:7;:18;;;;:::i;:::-;13197:8;:14;;;:37;;;;:::i;:::-;13179:55;;13245:17;13265:13;:25;13279:10;13265:25;;;;;;;;;;;;;;;;13245:45;;13341:8;:14;;;13324:8;:14;;;13312:9;:26;;;;:::i;:::-;:43;;;;:::i;:::-;13300:55;;13393:9;13365:13;:25;13379:10;13365:25;;;;;;;;;;;;;;;:37;;;;2213:6;13416:9;:22;13412:91;;;13470:9;2213:6;13461:31;;;;;;;;;;;;:::i;:::-;;;;;;;;13412:91;13719:59;13761:7;13730:28;13741:7;13750;13730:10;:28::i;:::-;:38;;;;:::i;:::-;13770:7;13719:10;:59::i;:::-;13673:12;:28;13686:14;13673:28;;;;;;;;;;;:38;13702:8;13673:38;;;;;;;;;;;:43;;:105;;;;13816:40;13839:7;13827:9;:7;:9::i;:::-;:19;;;;:::i;:::-;13848:7;13816:10;:40::i;:::-;13789:9;:19;13799:8;13789:19;;;;;;;;;;;:24;;:67;;;;13885:8;13870;:12;;;:23;13866:452;;;13956:89;14014:8;:14;;;13967:12;:28;13980:14;13967:28;;;;;;;;;;;:38;13996:8;13967:38;;;;;;;;;;;:44;;;:61;;;;:::i;:::-;14030:8;:14;;;13956:10;:89::i;:::-;13909:12;:28;13922:14;13909:28;;;;;;;;;;;:38;13938:8;13909:38;;;;;;;;;;;:44;;:136;;;;14087:70;14126:8;:14;;;14098:9;:19;14108:8;14098:19;;;;;;;;;;;:25;;;:42;;;;:::i;:::-;14142:8;:14;;;14087:10;:70::i;:::-;14059:9;:19;14069:8;14059:19;;;;;;;;;;;:25;;:98;;;;13866:452;;;14236:8;:14;;;14188:12;:28;14201:14;14188:28;;;;;;;;;;;:38;14217:8;14188:38;;;;;;;;;;;:44;;;:62;;;;;;;:::i;:::-;;;;;;;;14293:8;:14;;;14264:9;:19;14274:8;14264:19;;;;;;;;;;;:25;;;:43;;;;;;;:::i;:::-;;;;;;;;13866:452;14346:15;14331:8;:12;;;:30;14327:246;;;14492:8;:14;;;14445:13;:29;14459:14;14445:29;;;;;;;;;;;:43;14475:8;:12;;;14445:43;;;;;;;;;;;;:61;;;;;;;:::i;:::-;;;;;;;;14548:8;:14;;;14520:10;:24;14531:8;:12;;;14520:24;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;14327:246;14673:8;:14;;;14626:13;:29;14640:14;14626:29;;;;;;;;;;;:43;14656:8;:12;;;14626:43;;;;;;;;;;;;:61;;;;;;;:::i;:::-;;;;;;;;14725:8;:14;;;14697:10;:24;14708:8;:12;;;14697:24;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;14795:8;14750:14;:26;14765:10;14750:26;;;;;;;;;;;;;;;:42;14777:14;14750:42;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;14892:15;14849:12;:24;14862:10;14849:24;;;;;;;;;;;;;;;:40;14874:14;14849:40;;;;;;;;;;;:58;;;;14967:1;14924:12;:24;14937:10;14924:24;;;;;;;;;;;;;;;:40;14949:14;14924:40;;;;;;;;;;;;:44;14917:52;;;;:::i;:::-;;15016:4;14988:25;;:32;;;;;;;;;;;;;;;;;;15062:7;15035:52;;15050:10;15035:52;;;15071:7;15080:6;15035:52;;;;;;;:::i;:::-;;;;;;;;11669:3425;;;;;;;;;;11581:3513;;;:::o;3650:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3441:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2401:45::-;;;;;;;;;;;;:::o;16992:104::-;17041:7;17088:1;17067:11;:18;;;;:22;;;;:::i;:::-;17060:29;;16992:104;:::o;8083:57::-;8124:9;:7;:9::i;:::-;;8083:57::o;10173:251::-;10305:14;10321:16;10371:46;10394:7;10403;10412:4;10371:22;:46::i;:::-;10349:68;;;;;;;;10173:251;;;;;;:::o;10998:308::-;11130:14;11146:16;11174:28;11185:7;11194;11174:10;:28::i;:::-;;11212:9;:7;:9::i;:::-;;11253:46;11276:7;11285;11294:4;11253:22;:46::i;:::-;11231:68;;;;;;;;10998:308;;;;;;:::o;6888:1127::-;7022:1;7003:21;;:7;:21;;;6999:72;;7047:13;;;;;;;;;;;;;;6999:72;7130:1;7119:7;:12;7115:166;;7154:11;;;;;;;;;;;;;;7115:166;2328:2;2324:1;2305:16;:20;;;;:::i;:::-;:25;;;;:::i;:::-;7204:12;;7194:7;:22;7190:91;;;7248:7;2328:2;2324:1;2305:16;:20;;;;:::i;:::-;:25;;;;:::i;:::-;7257:12;;7239:31;;;;;;;;;;;;:::i;:::-;;;;;;;;7190:91;7396:22;7437:7;7421:25;;7396:50;;7540:3;7529:7;:14;;7511:32;;;;7633:1;7601:13;:29;7615:14;7601:29;;;;;;;;;;;;:33;7597:109;;;7678:7;7687;7657:38;;;;;;;;;;;;:::i;:::-;;;;;;;;7597:109;7747:11;:18;;;;7715:13;:29;7729:14;7715:29;;;;;;;;;;;:50;;;;7817:11;7834:14;7817:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7860:16;2015:7;;;7880:15;:22;;;;:::i;:::-;7879:31;;;;:::i;:::-;:38;;;;:::i;:::-;7860:57;;7956:8;7927:10;:26;7938:14;7927:26;;;;;;;;;;;:37;;;;7980:28;7991:7;8000;7980:28;;;;;;;:::i;:::-;;;;;;;;6951:1064;;6888:1127;;:::o;8320:134::-;8400:28;8411:7;8420;8400:10;:28::i;:::-;;8438:9;:7;:9::i;:::-;;8320:134;;:::o;2176:43::-;2213:6;2176:43;:::o;2833:48::-;;;;;;;;;;;;;;;;;:::o;1984:38::-;2015:7;1984:38;:::o;5377:1367::-;5449:7;5613:22;5654:7;5638:25;;5613:50;;5757:3;5746:7;:14;;5728:32;;;;5849:1;5816:13;:29;5830:14;5816:29;;;;;;;;;;;;:34;5812:109;;5893:7;5902;5873:37;;;;;;;;;;;;:::i;:::-;;;;;;;;5812:109;6000:9;6012:10;:26;6023:14;6012:26;;;;;;;;;;;;6000:38;;6048:15;6066:12;:28;6079:14;6066:28;;;;;;;;;;;:31;6095:1;6066:31;;;;;;;;;;;6048:49;;;;;;;;;;;;;;;;;;;;;;;;;;;6112:9;6107:607;6131:3;6127:1;:7;6107:607;;;6163:15;6159:1;:19;6198:5;6155:63;2015:7;6231:9;;;;;:::i;:::-;;;6254:13;2015:7;6270:2;:8;;;:15;;;;:::i;:::-;6254:31;;6313:5;6303:2;:7;;;:15;6299:253;;;6349:5;6338:2;:7;;:16;;;;;;;:::i;:::-;;;;;;;;6372:14;6389:13;:29;6403:14;6389:29;;;;;;;;;;;:32;6419:1;6389:32;;;;;;;;;;;;6372:49;;6451:6;6439:2;:8;;:18;;;;;;;:::i;:::-;;;;;;;;6320:152;6299:253;;;6506:1;6496:2;:7;;:11;;;;;6536:1;6525:2;:8;;:12;;;;;6299:253;6600:2;6566:12;:28;6579:14;6566:28;;;;;;;;;;;:31;6595:1;6566:31;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;6624:15;6620:1;:19;6616:88;;;6688:1;6659:10;:26;6670:14;6659:26;;;;;;;;;;;:30;;;;6616:88;6141:573;6136:3;;;;;;;6107:607;;;;6730:2;:7;;;6723:14;;;;;5377:1367;;;;:::o;15918:115::-;15983:7;16013:1;16009;:5;:17;;16025:1;16009:17;;;16021:1;16017;:5;;;;:::i;:::-;16009:17;16002:24;;15918:115;;;;:::o;4375:764::-;4412:7;4490:9;4502:7;;4490:19;;4519:15;4537:9;:12;4547:1;4537:12;;;;;;;;;;;4519:30;;;;;;;;;;;;;;;;;;;;;;;;;;;4564:9;4559:550;4583:3;4579:1;:7;4559:550;;;4615:15;4611:1;:19;4650:5;4607:63;2015:7;4683:9;;;;;:::i;:::-;;;4706:13;2015:7;4722:2;:8;;;:15;;;;:::i;:::-;4706:31;;4765:5;4755:2;:7;;;:15;4751:234;;;4801:5;4790:2;:7;;:16;;;;;;;:::i;:::-;;;;;;;;4824:14;4841:10;:13;4852:1;4841:13;;;;;;;;;;;;4824:30;;4884:6;4872:2;:8;;:18;;;;;;;:::i;:::-;;;;;;;;4772:133;4751:234;;;4939:1;4929:2;:7;;:11;;;;;4969:1;4958:2;:8;;:12;;;;;4751:234;5014:2;4999:9;:12;5009:1;4999:12;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;;5038:15;5034:1;:19;5030:69;;;5083:1;5073:7;:11;;;;5030:69;4593:516;4588:3;;;;;;;4559:550;;;;5125:2;:7;;;5118:14;;;;4375:764;:::o;8963:682::-;9096:14;9112:16;9140:9;2015:7;;9152:4;:11;;;;:::i;:::-;:18;;;;:::i;:::-;9140:30;;9191:9;:12;9201:1;9191:12;;;;;;;;;;;:17;;;9180:28;;9324:22;9365:7;9349:25;;9324:50;;9468:3;9457:7;:14;;9439:32;;;;9497:1;9486:8;:12;9482:157;;;9514:21;9538:12;:28;9551:14;9538:28;;;;;;;;;;;:31;9567:1;9538:31;;;;;;;;;;;:36;;;9514:60;;9620:8;9604:13;9597:4;:20;;;;:::i;:::-;:31;;;;:::i;:::-;9588:40;;9500:139;9482:157;9130:515;;8963:682;;;;;;:::o;7:75:9:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:114::-;1237:6;1271:5;1265:12;1255:22;;1170:114;;;:::o;1290:184::-;1389:11;1423:6;1418:3;1411:19;1463:4;1458:3;1454:14;1439:29;;1290:184;;;;:::o;1480:132::-;1547:4;1570:3;1562:11;;1600:4;1595:3;1591:14;1583:22;;1480:132;;;:::o;1618:126::-;1655:7;1695:42;1688:5;1684:54;1673:65;;1618:126;;;:::o;1750:96::-;1787:7;1816:24;1834:5;1816:24;:::i;:::-;1805:35;;1750:96;;;:::o;1852:108::-;1929:24;1947:5;1929:24;:::i;:::-;1924:3;1917:37;1852:108;;:::o;1966:179::-;2035:10;2056:46;2098:3;2090:6;2056:46;:::i;:::-;2134:4;2129:3;2125:14;2111:28;;1966:179;;;;:::o;2151:113::-;2221:4;2253;2248:3;2244:14;2236:22;;2151:113;;;:::o;2300:732::-;2419:3;2448:54;2496:5;2448:54;:::i;:::-;2518:86;2597:6;2592:3;2518:86;:::i;:::-;2511:93;;2628:56;2678:5;2628:56;:::i;:::-;2707:7;2738:1;2723:284;2748:6;2745:1;2742:13;2723:284;;;2824:6;2818:13;2851:63;2910:3;2895:13;2851:63;:::i;:::-;2844:70;;2937:60;2990:6;2937:60;:::i;:::-;2927:70;;2783:224;2770:1;2767;2763:9;2758:14;;2723:284;;;2727:14;3023:3;3016:10;;2424:608;;;2300:732;;;;:::o;3038:114::-;3105:6;3139:5;3133:12;3123:22;;3038:114;;;:::o;3158:184::-;3257:11;3291:6;3286:3;3279:19;3331:4;3326:3;3322:14;3307:29;;3158:184;;;;:::o;3348:132::-;3415:4;3438:3;3430:11;;3468:4;3463:3;3459:14;3451:22;;3348:132;;;:::o;3486:108::-;3563:24;3581:5;3563:24;:::i;:::-;3558:3;3551:37;3486:108;;:::o;3600:179::-;3669:10;3690:46;3732:3;3724:6;3690:46;:::i;:::-;3768:4;3763:3;3759:14;3745:28;;3600:179;;;;:::o;3785:113::-;3855:4;3887;3882:3;3878:14;3870:22;;3785:113;;;:::o;3934:732::-;4053:3;4082:54;4130:5;4082:54;:::i;:::-;4152:86;4231:6;4226:3;4152:86;:::i;:::-;4145:93;;4262:56;4312:5;4262:56;:::i;:::-;4341:7;4372:1;4357:284;4382:6;4379:1;4376:13;4357:284;;;4458:6;4452:13;4485:63;4544:3;4529:13;4485:63;:::i;:::-;4478:70;;4571:60;4624:6;4571:60;:::i;:::-;4561:70;;4417:224;4404:1;4401;4397:9;4392:14;;4357:284;;;4361:14;4657:3;4650:10;;4058:608;;;3934:732;;;;:::o;4672:634::-;4893:4;4931:2;4920:9;4916:18;4908:26;;4980:9;4974:4;4970:20;4966:1;4955:9;4951:17;4944:47;5008:108;5111:4;5102:6;5008:108;:::i;:::-;5000:116;;5163:9;5157:4;5153:20;5148:2;5137:9;5133:18;5126:48;5191:108;5294:4;5285:6;5191:108;:::i;:::-;5183:116;;4672:634;;;;;:::o;5312:329::-;5371:6;5420:2;5408:9;5399:7;5395:23;5391:32;5388:119;;;5426:79;;:::i;:::-;5388:119;5546:1;5571:53;5616:7;5607:6;5596:9;5592:22;5571:53;:::i;:::-;5561:63;;5517:117;5312:329;;;;:::o;5647:118::-;5734:24;5752:5;5734:24;:::i;:::-;5729:3;5722:37;5647:118;;:::o;5771:222::-;5864:4;5902:2;5891:9;5887:18;5879:26;;5915:71;5983:1;5972:9;5968:17;5959:6;5915:71;:::i;:::-;5771:222;;;;:::o;5999:122::-;6072:24;6090:5;6072:24;:::i;:::-;6065:5;6062:35;6052:63;;6111:1;6108;6101:12;6052:63;5999:122;:::o;6127:139::-;6173:5;6211:6;6198:20;6189:29;;6227:33;6254:5;6227:33;:::i;:::-;6127:139;;;;:::o;6272:474::-;6340:6;6348;6397:2;6385:9;6376:7;6372:23;6368:32;6365:119;;;6403:79;;:::i;:::-;6365:119;6523:1;6548:53;6593:7;6584:6;6573:9;6569:22;6548:53;:::i;:::-;6538:63;;6494:117;6650:2;6676:53;6721:7;6712:6;6701:9;6697:22;6676:53;:::i;:::-;6666:63;;6621:118;6272:474;;;;;:::o;6752:118::-;6839:24;6857:5;6839:24;:::i;:::-;6834:3;6827:37;6752:118;;:::o;6876:222::-;6969:4;7007:2;6996:9;6992:18;6984:26;;7020:71;7088:1;7077:9;7073:17;7064:6;7020:71;:::i;:::-;6876:222;;;;:::o;7104:332::-;7225:4;7263:2;7252:9;7248:18;7240:26;;7276:71;7344:1;7333:9;7329:17;7320:6;7276:71;:::i;:::-;7357:72;7425:2;7414:9;7410:18;7401:6;7357:72;:::i;:::-;7104:332;;;;;:::o;7442:90::-;7476:7;7519:5;7512:13;7505:21;7494:32;;7442:90;;;:::o;7538:116::-;7608:21;7623:5;7608:21;:::i;:::-;7601:5;7598:32;7588:60;;7644:1;7641;7634:12;7588:60;7538:116;:::o;7660:133::-;7703:5;7741:6;7728:20;7719:29;;7757:30;7781:5;7757:30;:::i;:::-;7660:133;;;;:::o;7799:323::-;7855:6;7904:2;7892:9;7883:7;7879:23;7875:32;7872:119;;;7910:79;;:::i;:::-;7872:119;8030:1;8055:50;8097:7;8088:6;8077:9;8073:22;8055:50;:::i;:::-;8045:60;;8001:114;7799:323;;;;:::o;8128:332::-;8249:4;8287:2;8276:9;8272:18;8264:26;;8300:71;8368:1;8357:9;8353:17;8344:6;8300:71;:::i;:::-;8381:72;8449:2;8438:9;8434:18;8425:6;8381:72;:::i;:::-;8128:332;;;;;:::o;8466:117::-;8575:1;8572;8565:12;8589:102;8630:6;8681:2;8677:7;8672:2;8665:5;8661:14;8657:28;8647:38;;8589:102;;;:::o;8697:180::-;8745:77;8742:1;8735:88;8842:4;8839:1;8832:15;8866:4;8863:1;8856:15;8883:281;8966:27;8988:4;8966:27;:::i;:::-;8958:6;8954:40;9096:6;9084:10;9081:22;9060:18;9048:10;9045:34;9042:62;9039:88;;;9107:18;;:::i;:::-;9039:88;9147:10;9143:2;9136:22;8926:238;8883:281;;:::o;9170:129::-;9204:6;9231:20;;:::i;:::-;9221:30;;9260:33;9288:4;9280:6;9260:33;:::i;:::-;9170:129;;;:::o;9305:311::-;9382:4;9472:18;9464:6;9461:30;9458:56;;;9494:18;;:::i;:::-;9458:56;9544:4;9536:6;9532:17;9524:25;;9604:4;9598;9594:15;9586:23;;9305:311;;;:::o;9622:117::-;9731:1;9728;9721:12;9762:710;9858:5;9883:81;9899:64;9956:6;9899:64;:::i;:::-;9883:81;:::i;:::-;9874:90;;9984:5;10013:6;10006:5;9999:21;10047:4;10040:5;10036:16;10029:23;;10100:4;10092:6;10088:17;10080:6;10076:30;10129:3;10121:6;10118:15;10115:122;;;10148:79;;:::i;:::-;10115:122;10263:6;10246:220;10280:6;10275:3;10272:15;10246:220;;;10355:3;10384:37;10417:3;10405:10;10384:37;:::i;:::-;10379:3;10372:50;10451:4;10446:3;10442:14;10435:21;;10322:144;10306:4;10301:3;10297:14;10290:21;;10246:220;;;10250:21;9864:608;;9762:710;;;;;:::o;10495:370::-;10566:5;10615:3;10608:4;10600:6;10596:17;10592:27;10582:122;;10623:79;;:::i;:::-;10582:122;10740:6;10727:20;10765:94;10855:3;10847:6;10840:4;10832:6;10828:17;10765:94;:::i;:::-;10756:103;;10572:293;10495:370;;;;:::o;10871:311::-;10948:4;11038:18;11030:6;11027:30;11024:56;;;11060:18;;:::i;:::-;11024:56;11110:4;11102:6;11098:17;11090:25;;11170:4;11164;11160:15;11152:23;;10871:311;;;:::o;11205:710::-;11301:5;11326:81;11342:64;11399:6;11342:64;:::i;:::-;11326:81;:::i;:::-;11317:90;;11427:5;11456:6;11449:5;11442:21;11490:4;11483:5;11479:16;11472:23;;11543:4;11535:6;11531:17;11523:6;11519:30;11572:3;11564:6;11561:15;11558:122;;;11591:79;;:::i;:::-;11558:122;11706:6;11689:220;11723:6;11718:3;11715:15;11689:220;;;11798:3;11827:37;11860:3;11848:10;11827:37;:::i;:::-;11822:3;11815:50;11894:4;11889:3;11885:14;11878:21;;11765:144;11749:4;11744:3;11740:14;11733:21;;11689:220;;;11693:21;11307:608;;11205:710;;;;;:::o;11938:370::-;12009:5;12058:3;12051:4;12043:6;12039:17;12035:27;12025:122;;12066:79;;:::i;:::-;12025:122;12183:6;12170:20;12208:94;12298:3;12290:6;12283:4;12275:6;12271:17;12208:94;:::i;:::-;12199:103;;12015:293;11938:370;;;;:::o;12314:1249::-;12466:6;12474;12482;12531:2;12519:9;12510:7;12506:23;12502:32;12499:119;;;12537:79;;:::i;:::-;12499:119;12685:1;12674:9;12670:17;12657:31;12715:18;12707:6;12704:30;12701:117;;;12737:79;;:::i;:::-;12701:117;12842:78;12912:7;12903:6;12892:9;12888:22;12842:78;:::i;:::-;12832:88;;12628:302;12997:2;12986:9;12982:18;12969:32;13028:18;13020:6;13017:30;13014:117;;;13050:79;;:::i;:::-;13014:117;13155:78;13225:7;13216:6;13205:9;13201:22;13155:78;:::i;:::-;13145:88;;12940:303;13310:2;13299:9;13295:18;13282:32;13341:18;13333:6;13330:30;13327:117;;;13363:79;;:::i;:::-;13327:117;13468:78;13538:7;13529:6;13518:9;13514:22;13468:78;:::i;:::-;13458:88;;13253:303;12314:1249;;;;;:::o;13569:442::-;13718:4;13756:2;13745:9;13741:18;13733:26;;13769:71;13837:1;13826:9;13822:17;13813:6;13769:71;:::i;:::-;13850:72;13918:2;13907:9;13903:18;13894:6;13850:72;:::i;:::-;13932;14000:2;13989:9;13985:18;13976:6;13932:72;:::i;:::-;13569:442;;;;;;:::o;14017:619::-;14094:6;14102;14110;14159:2;14147:9;14138:7;14134:23;14130:32;14127:119;;;14165:79;;:::i;:::-;14127:119;14285:1;14310:53;14355:7;14346:6;14335:9;14331:22;14310:53;:::i;:::-;14300:63;;14256:117;14412:2;14438:53;14483:7;14474:6;14463:9;14459:22;14438:53;:::i;:::-;14428:63;;14383:118;14540:2;14566:53;14611:7;14602:6;14591:9;14587:22;14566:53;:::i;:::-;14556:63;;14511:118;14017:619;;;;;:::o;14642:109::-;14723:21;14738:5;14723:21;:::i;:::-;14718:3;14711:34;14642:109;;:::o;14757:210::-;14844:4;14882:2;14871:9;14867:18;14859:26;;14895:65;14957:1;14946:9;14942:17;14933:6;14895:65;:::i;:::-;14757:210;;;;:::o;14973:329::-;15032:6;15081:2;15069:9;15060:7;15056:23;15052:32;15049:119;;;15087:79;;:::i;:::-;15049:119;15207:1;15232:53;15277:7;15268:6;15257:9;15253:22;15232:53;:::i;:::-;15222:63;;15178:117;14973:329;;;;:::o;15308:180::-;15356:77;15353:1;15346:88;15453:4;15450:1;15443:15;15477:4;15474:1;15467:15;15494:191;15534:3;15553:20;15571:1;15553:20;:::i;:::-;15548:25;;15587:20;15605:1;15587:20;:::i;:::-;15582:25;;15630:1;15627;15623:9;15616:16;;15651:3;15648:1;15645:10;15642:36;;;15658:18;;:::i;:::-;15642:36;15494:191;;;;:::o;15691:180::-;15739:77;15736:1;15729:88;15836:4;15833:1;15826:15;15860:4;15857:1;15850:15;15877:194;15917:4;15937:20;15955:1;15937:20;:::i;:::-;15932:25;;15971:20;15989:1;15971:20;:::i;:::-;15966:25;;16015:1;16012;16008:9;16000:17;;16039:1;16033:4;16030:11;16027:37;;;16044:18;;:::i;:::-;16027:37;15877:194;;;;:::o;16077:101::-;16113:7;16153:18;16146:5;16142:30;16131:41;;16077:101;;;:::o;16184:180::-;16232:77;16229:1;16222:88;16329:4;16326:1;16319:15;16353:4;16350:1;16343:15;16370:182;16409:1;16426:19;16443:1;16426:19;:::i;:::-;16421:24;;16459:19;16476:1;16459:19;:::i;:::-;16454:24;;16497:1;16487:35;;16502:18;;:::i;:::-;16487:35;16544:1;16541;16537:9;16532:14;;16370:182;;;;:::o;16558:208::-;16597:4;16617:19;16634:1;16617:19;:::i;:::-;16612:24;;16650:19;16667:1;16650:19;:::i;:::-;16645:24;;16693:1;16690;16686:9;16678:17;;16717:18;16711:4;16708:28;16705:54;;;16739:18;;:::i;:::-;16705:54;16558:208;;;;:::o;16772:117::-;16881:1;16878;16871:12;17018:92;17054:7;17098:5;17094:2;17083:21;17072:32;;17018:92;;;:::o;17116:120::-;17188:23;17205:5;17188:23;:::i;:::-;17181:5;17178:34;17168:62;;17226:1;17223;17216:12;17168:62;17116:120;:::o;17242:141::-;17298:5;17329:6;17323:13;17314:22;;17345:32;17371:5;17345:32;:::i;:::-;17242:141;;;;:::o;17389:120::-;17461:23;17478:5;17461:23;:::i;:::-;17454:5;17451:34;17441:62;;17499:1;17496;17489:12;17441:62;17389:120;:::o;17515:141::-;17571:5;17602:6;17596:13;17587:22;;17618:32;17644:5;17618:32;:::i;:::-;17515:141;;;;:::o;17662:118::-;17699:7;17739:34;17732:5;17728:46;17717:57;;17662:118;;;:::o;17786:122::-;17859:24;17877:5;17859:24;:::i;:::-;17852:5;17849:35;17839:63;;17898:1;17895;17888:12;17839:63;17786:122;:::o;17914:143::-;17971:5;18002:6;17996:13;17987:22;;18018:33;18045:5;18018:33;:::i;:::-;17914:143;;;;:::o;18097:1132::-;18185:5;18229:4;18217:9;18212:3;18208:19;18204:30;18201:117;;;18237:79;;:::i;:::-;18201:117;18336:21;18352:4;18336:21;:::i;:::-;18327:30;;18416:1;18456:59;18511:3;18502:6;18491:9;18487:22;18456:59;:::i;:::-;18449:4;18442:5;18438:16;18431:85;18367:160;18587:2;18628:59;18683:3;18674:6;18663:9;18659:22;18628:59;:::i;:::-;18621:4;18614:5;18610:16;18603:85;18537:162;18756:2;18797:59;18852:3;18843:6;18832:9;18828:22;18797:59;:::i;:::-;18790:4;18783:5;18779:16;18772:85;18709:159;18934:2;18975:59;19030:3;19021:6;19010:9;19006:22;18975:59;:::i;:::-;18968:4;18961:5;18957:16;18950:85;18878:168;19108:3;19150:60;19206:3;19197:6;19186:9;19182:22;19150:60;:::i;:::-;19143:4;19136:5;19132:16;19125:86;19056:166;18097:1132;;;;:::o;19235:408::-;19333:6;19382:3;19370:9;19361:7;19357:23;19353:33;19350:120;;;19389:79;;:::i;:::-;19350:120;19509:1;19534:92;19618:7;19609:6;19598:9;19594:22;19534:92;:::i;:::-;19524:102;;19480:156;19235:408;;;;:::o;19649:143::-;19706:5;19737:6;19731:13;19722:22;;19753:33;19780:5;19753:33;:::i;:::-;19649:143;;;;:::o;19798:351::-;19868:6;19917:2;19905:9;19896:7;19892:23;19888:32;19885:119;;;19923:79;;:::i;:::-;19885:119;20043:1;20068:64;20124:7;20115:6;20104:9;20100:22;20068:64;:::i;:::-;20058:74;;20014:128;19798:351;;;;:::o;20155:185::-;20195:1;20212:20;20230:1;20212:20;:::i;:::-;20207:25;;20246:20;20264:1;20246:20;:::i;:::-;20241:25;;20285:1;20275:35;;20290:18;;:::i;:::-;20275:35;20332:1;20329;20325:9;20320:14;;20155:185;;;;:::o;20346:410::-;20386:7;20409:20;20427:1;20409:20;:::i;:::-;20404:25;;20443:20;20461:1;20443:20;:::i;:::-;20438:25;;20498:1;20495;20491:9;20520:30;20538:11;20520:30;:::i;:::-;20509:41;;20699:1;20690:7;20686:15;20683:1;20680:22;20660:1;20653:9;20633:83;20610:139;;20729:18;;:::i;:::-;20610:139;20394:362;20346:410;;;;:::o;20762:442::-;20911:4;20949:2;20938:9;20934:18;20926:26;;20962:71;21030:1;21019:9;21015:17;21006:6;20962:71;:::i;:::-;21043:72;21111:2;21100:9;21096:18;21087:6;21043:72;:::i;:::-;21125;21193:2;21182:9;21178:18;21169:6;21125:72;:::i;:::-;20762:442;;;;;;:::o;21210:180::-;21258:77;21255:1;21248:88;21355:4;21352:1;21345:15;21379:4;21376:1;21369:15", "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ve\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"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\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"curTime\",\"type\":\"uint256\"}],\"name\":\"LockNotExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LockedValueNotZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"MaxUnlockTimeReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NoValueLocked\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"NomineeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"NomineeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonDelegatable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonTransferable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonZeroValue\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"UnlockTimeIncorrect\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"providedBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualBlockNumber\",\"type\":\"uint256\"}],\"name\":\"WrongBlockNumber\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValue\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"NewNominee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalWeight\",\"type\":\"uint256\"}],\"name\":\"NewNomineeWeight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"VoteForNominee\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_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\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"addNominee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"callVoteForNomineeWeights\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"changesSum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"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\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"checkpointNominee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getNominee\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"getNomineeId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"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\":[{\"internalType\":\"address[]\",\"name\":\"nominees\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"chainIds\",\"type\":\"uint256[]\"}],\"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\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"getlastUserVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lastUserVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mapNomineeIds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"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\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"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\":[{\"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\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"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\":\"bool\",\"name\":\"flag\",\"type\":\"bool\"}],\"name\":\"setCallVoteForNomineeWeights\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"setNominees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeSum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\":\"address\",\"name\":\"nominee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"voteForNomineeWeights\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"nominees\",\"type\":\"address[]\"},{\"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\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\"}]", "bin": "60a06040525f805f6101000a81548160ff02191690831515021790555034801562000028575f80fd5b5060405162002b9638038062002b9683398181016040528101906200004e91906200019e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505062093a808042620000fa919062000231565b62000106919062000268565b600b8190555060015f908060018154018082558091505060019003905f5260205f20015f909190919091505550620002b2565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000168826200013d565b9050919050565b6200017a816200015c565b811462000185575f80fd5b50565b5f8151905062000198816200016f565b92915050565b5f60208284031215620001b657620001b562000139565b5b5f620001c58482850162000188565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200023d82620001ce565b91506200024a83620001ce565b9250826200025d576200025c620001d7565b5b828204905092915050565b5f6200027482620001ce565b91506200028183620001ce565b92508282026200029181620001ce565b91508282048414831517620002ab57620002aa62000204565b5b5092915050565b6080516128bd620002d95f395f818161095c01528181610d110152610dc201526128bd5ff3fe608060405234801561000f575f80fd5b50600436106101ed575f3560e01c80637665a8ef1161010d578063c2c4c5c1116100a0578063de28a19a1161006f578063de28a19a14610645578063e4a28a5214610661578063ec73d9061461067f578063f4359ce5146106af576101ed565b8063c2c4c5c1146105bd578063d8cac5ae146105c7578063da669c6e146105f8578063dcfeeae614610629576101ed565b80639d175053116100dc5780639d175053146105205780639e5d842e146105515780639faacf7c14610581578063a18f99ff1461059f576101ed565b80637665a8ef146104865780637967d905146104b6578063861bd2a0146104d25780638887390714610504576101ed565b806341597036116101855780635bc105c0116101545780635bc105c0146103d75780636010185d146103f5578063635b85911461042657806366ab8ac614610456576101ed565b8063415970361461034d578063482649971461036b5780634efafacf146103895780634f6ffd07146103b9576101ed565b806327ebf531116101c157806327ebf531146102a0578063289da14e146102d15780633b766b3d146102ed5780633d80f36f1461031d576101ed565b806292a596146101f15780630c423201146102225780631d0a06b6146102525780631f85071614610282575b5f80fd5b61020b60048036038101906102069190611d7f565b6106cd565b604051610219929190611f5b565b60405180910390f35b61023c60048036038101906102379190611f90565b6108cb565b6040516102499190611fca565b60405180910390f35b61026c6004803603810190610267919061200d565b6108e0565b6040516102799190611fca565b60405180910390f35b61028a61095a565b604051610297919061205a565b60405180910390f35b6102ba60048036038101906102b59190611f90565b61097e565b6040516102c8929190612073565b60405180910390f35b6102eb60048036038101906102e691906120cf565b610a45565b005b61030760048036038101906103029190611f90565b610a60565b6040516103149190611fca565b60405180910390f35b6103376004803603810190610332919061200d565b610a80565b6040516103449190611fca565b60405180910390f35b610355610abf565b6040516103629190611fca565b60405180910390f35b610373610adb565b6040516103809190611fca565b60405180910390f35b6103a3600480360381019061039e9190611f90565b610ae1565b6040516103b09190611fca565b60405180910390f35b6103c1610af6565b6040516103ce9190611fca565b60405180910390f35b6103df610afd565b6040516103ec9190611fca565b60405180910390f35b61040f600480360381019061040a9190611d7f565b610b2b565b60405161041d9291906120fa565b60405180910390f35b610440600480360381019061043b9190611f90565b610b56565b60405161044d9190611fca565b60405180910390f35b610470600480360381019061046b919061200d565b610b6b565b60405161047d9190611fca565b60405180910390f35b6104a0600480360381019061049b919061200d565b610b8b565b6040516104ad9190611fca565b60405180910390f35b6104d060048036038101906104cb9190612331565b610bec565b005b6104ec60048036038101906104e7919061200d565b610cba565b6040516104fb939291906123d5565b60405180910390f35b61051e6004803603810190610519919061240a565b610ceb565b005b61053a60048036038101906105359190611f90565b6115cf565b6040516105489291906120fa565b60405180910390f35b61056b60048036038101906105669190611d7f565b6115ef565b6040516105789190611fca565b60405180910390f35b61058961160f565b6040516105969190612469565b60405180910390f35b6105a761161f565b6040516105b49190611fca565b60405180910390f35b6105c5611636565b005b6105e160048036038101906105dc919061240a565b611641565b6040516105ef9291906120fa565b60405180910390f35b610612600480360381019061060d919061240a565b61165e565b6040516106209291906120fa565b60405180910390f35b610643600480360381019061063e919061200d565b61168f565b005b61065f600480360381019061065a919061200d565b611904565b005b61066961191c565b6040516106769190611fca565b60405180910390f35b61069960048036038101906106949190612482565b611922565b6040516106a69190611fca565b60405180910390f35b6106b7611937565b6040516106c49190611fca565b60405180910390f35b6060805f8414806106dd57505f83145b15610714576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838561072191906124da565b90505f6001805490509050808211156107735781816040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161076a9291906120fa565b60405180910390fd5b8467ffffffffffffffff81111561078d5761078c612135565b5b6040519080825280602002602001820160405280156107bb5781602001602082028036833780820191505090505b5093508467ffffffffffffffff8111156107d8576107d7612135565b5b6040519080825280602002602001820160405280156108065781602001602082028036833780820191505090505b5092505f5b858110156108c1575f878261082091906124da565b90505f600182815481106108375761083661250d565b5b905f5260205f2001549050808784815181106108565761085561250d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a081901c8684815181106108a8576108a761250d565b5b602002602001018181525050505080600101905061080b565b5050509250929050565b600a602052805f5260405f205f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205491505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805f60018080549050610992919061253a565b90505f84036109cd576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80841115610a145783816040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610a0b9291906120fa565b60405180910390fd5b5f60018581548110610a2957610a2861250d565b5b905f5260205f200154905080935060a081901c92505050915091565b805f806101000a81548160ff02191690831515021790555050565b60018181548110610a6f575f80fd5b905f5260205f20015f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060025f8281526020019081526020015f205491505092915050565b5f60095f600b5481526020019081526020015f205f0154905090565b600b5481565b6008602052805f5260405f205f915090505481565b620d2f0081565b6024600267ffffffffffffffff610b1491906125ad565b610b1e91906125dd565b67ffffffffffffffff1681565b6006602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b6002602052805f5260405f205f915090505481565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060065f8281526020019081526020015f205f60085f8481526020019081526020015f205481526020019081526020015f205f015491505092915050565b81518351141580610bff57508051835114155b15610c4557825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600401610c3c9291906120fa565b60405180910390fd5b5f5b8351811015610cb457610ca9848281518110610c6657610c6561250d565b5b6020026020010151848381518110610c8157610c8061250d565b5b6020026020010151848481518110610c9c57610c9b61250d565b5b6020026020010151610ceb565b806001019050610c47565b50505050565b6003602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154905083565b5f8373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c4698ee5336040518263ffffffff1660e01b8152600401610d68919061205a565b60a060405180830381865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da7919061274a565b602001516fffffffffffffffffffffffffffffffff1690505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634deafcae336040518263ffffffff1660e01b8152600401610e19919061205a565b602060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190612789565b90505f62093a808062093a8042610e6f91906124da565b610e7991906127b4565b610e8391906127e4565b9050818110610ecd573382826040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610ec493929190612825565b60405180910390fd5b612710851115610f1857846127106040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610f0f9291906120fa565b60405180910390fd5b5f620d2f0060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2054610f7491906124da565b905042811115610fbf573342826040517f17601765000000000000000000000000000000000000000000000000000000008152600401610fb693929190612825565b60405180910390fd5b5f60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f206040518060600160405290815f82015481526020016001820154815260200160028201548152505090505f838260400151111561106457838260400151611053919061253a565b825f015161106191906127e4565b90505b5f60405180606001604052806127108b8a61107f91906127e4565b61108991906127b4565b81526020018a81526020018781525090505f85876110a7919061253a565b825f01516110b591906127e4565b90505f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050846020015183602001518261110d91906124da565b611117919061253a565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506127108111156111a657806127106040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161119d9291906120fa565b60405180910390fd5b6111c4826111b48f8f61193e565b6111be91906124da565b85611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f205f0181905550611206826111f6611b59565b61120091906124da565b85611b36565b60095f8981526020019081526020015f205f018190555086856040015111156112da57611267835f015160065f8d81526020019081526020015f205f8a81526020019081526020015f206001015461125e91906124da565b865f0151611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f20600101819055506112bd835f015160095f8a81526020019081526020015f20600101546112b491906124da565b865f0151611b36565b60095f8981526020019081526020015f2060010181905550611344565b825f015160065f8c81526020019081526020015f205f8981526020019081526020015f206001015f82825461130f91906124da565b92505081905550825f015160095f8981526020019081526020015f206001015f82825461133c91906124da565b925050819055505b42856040015111156113bc57845f015160075f8c81526020019081526020015f205f876040015181526020019081526020015f205f828254611386919061253a565b92505081905550845f0151600a5f876040015181526020019081526020015f205f8282546113b4919061253a565b925050819055505b825f015160075f8c81526020019081526020015f205f856040015181526020019081526020015f205f8282546113f291906124da565b92505081905550825f0151600a5f856040015181526020019081526020015f205f82825461142091906124da565b925050819055508260035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050504260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f20819055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f2054116115405761153f61285a565b5b60015f806101000a81548160ff0219169083151502179055508c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f491b1e1a0c99eaa02d3b9e779fea23f086f3b4f723b1633a89121774de05512f8e8e6040516115b89291906120fa565b60405180910390a350505050505050505050505050565b6009602052805f5260405f205f91509050805f0154908060010154905082565b6007602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900460ff1681565b5f60018080549050611631919061253a565b905090565b61163e611b59565b50565b5f8061164e858585611c88565b8092508193505050935093915050565b5f8061166a858561193e565b50611673611b59565b5061167f858585611c88565b8092508193505050935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361172d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024600267ffffffffffffffff61174491906125ad565b61174e91906125dd565b67ffffffffffffffff168111156117c857806024600267ffffffffffffffff61177791906125ad565b61178191906125dd565b67ffffffffffffffff166040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016117bf9291906120fa565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16905060a082901b811790505f60025f8381526020019081526020015f205411156118435782826040517f6421261300000000000000000000000000000000000000000000000000000000815260040161183a929190612073565b60405180910390fd5b60018054905060025f8381526020019081526020015f2081905550600181908060018154018082558091505060019003905f5260205f20015f90919091909150555f62093a808062093a804261189991906124da565b6118a391906127b4565b6118ad91906127e4565b90508060085f8481526020019081526020015f20819055507f1bc65a439335898028ac09fe90754a5ef59b65314198d75e6cdd5f9deaa5076784846040516118f6929190612073565b60405180910390a150505050565b61190e828261193e565b50611917611b59565b505050565b61271081565b6004602052805f5260405f205f915090505481565b62093a8081565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f60025f8381526020019081526020015f2054036119b95783836040517f5e6132570000000000000000000000000000000000000000000000000000000081526004016119b0929190612073565b60405180910390fd5b5f60085f8381526020019081526020015f205490505f60065f8481526020019081526020015f205f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611b2657428311611b265762093a8083611a3191906124da565b92505f62093a808360200151611a4791906127e4565b905080835f01511115611aaf5780835f01818151611a65919061253a565b915081815250505f60075f8781526020019081526020015f205f8681526020019081526020015f205490508084602001818151611aa2919061253a565b9150818152505050611ac3565b5f835f0181815250505f8360200181815250505b8260065f8781526020019081526020015f205f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611b18578360085f8781526020019081526020015f20819055505b508080600101915050611a11565b50805f0151935050505092915050565b5f818311611b44575f611b51565b8183611b50919061253a565b5b905092915050565b5f80600b5490505f60095f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611c7c57428311611c7c5762093a8083611bb491906124da565b92505f62093a808360200151611bca91906127e4565b905080835f01511115611c235780835f01818151611be8919061253a565b915081815250505f600a5f8681526020019081526020015f205490508084602001818151611c16919061253a565b9150818152505050611c37565b5f835f0181815250505f8360200181815250505b8260095f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611c6e5783600b819055505b508080600101915050611b94565b50805f01519250505090565b5f805f62093a808085611c9b91906127b4565b611ca591906127e4565b905060095f8281526020019081526020015f205f015491505f8673ffffffffffffffffffffffffffffffffffffffff16905060a086901b811790505f831115611d31575f60065f8381526020019081526020015f205f8481526020019081526020015f205f015490508381670de0b6b3a7640000611d2391906127e4565b611d2d91906127b4565b9450505b5050935093915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611d5e81611d4c565b8114611d68575f80fd5b50565b5f81359050611d7981611d55565b92915050565b5f8060408385031215611d9557611d94611d44565b5b5f611da285828601611d6b565b9250506020611db385828601611d6b565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611e0f82611de6565b9050919050565b611e1f81611e05565b82525050565b5f611e308383611e16565b60208301905092915050565b5f602082019050919050565b5f611e5282611dbd565b611e5c8185611dc7565b9350611e6783611dd7565b805f5b83811015611e97578151611e7e8882611e25565b9750611e8983611e3c565b925050600181019050611e6a565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ed681611d4c565b82525050565b5f611ee78383611ecd565b60208301905092915050565b5f602082019050919050565b5f611f0982611ea4565b611f138185611eae565b9350611f1e83611ebe565b805f5b83811015611f4e578151611f358882611edc565b9750611f4083611ef3565b925050600181019050611f21565b5085935050505092915050565b5f6040820190508181035f830152611f738185611e48565b90508181036020830152611f878184611eff565b90509392505050565b5f60208284031215611fa557611fa4611d44565b5b5f611fb284828501611d6b565b91505092915050565b611fc481611d4c565b82525050565b5f602082019050611fdd5f830184611fbb565b92915050565b611fec81611e05565b8114611ff6575f80fd5b50565b5f8135905061200781611fe3565b92915050565b5f806040838503121561202357612022611d44565b5b5f61203085828601611ff9565b925050602061204185828601611d6b565b9150509250929050565b61205481611e05565b82525050565b5f60208201905061206d5f83018461204b565b92915050565b5f6040820190506120865f83018561204b565b6120936020830184611fbb565b9392505050565b5f8115159050919050565b6120ae8161209a565b81146120b8575f80fd5b50565b5f813590506120c9816120a5565b92915050565b5f602082840312156120e4576120e3611d44565b5b5f6120f1848285016120bb565b91505092915050565b5f60408201905061210d5f830185611fbb565b61211a6020830184611fbb565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61216b82612125565b810181811067ffffffffffffffff8211171561218a57612189612135565b5b80604052505050565b5f61219c611d3b565b90506121a88282612162565b919050565b5f67ffffffffffffffff8211156121c7576121c6612135565b5b602082029050602081019050919050565b5f80fd5b5f6121ee6121e9846121ad565b612193565b90508083825260208201905060208402830185811115612211576122106121d8565b5b835b8181101561223a57806122268882611ff9565b845260208401935050602081019050612213565b5050509392505050565b5f82601f83011261225857612257612121565b5b81356122688482602086016121dc565b91505092915050565b5f67ffffffffffffffff82111561228b5761228a612135565b5b602082029050602081019050919050565b5f6122ae6122a984612271565b612193565b905080838252602082019050602084028301858111156122d1576122d06121d8565b5b835b818110156122fa57806122e68882611d6b565b8452602084019350506020810190506122d3565b5050509392505050565b5f82601f83011261231857612317612121565b5b813561232884826020860161229c565b91505092915050565b5f805f6060848603121561234857612347611d44565b5b5f84013567ffffffffffffffff81111561236557612364611d48565b5b61237186828701612244565b935050602084013567ffffffffffffffff81111561239257612391611d48565b5b61239e86828701612304565b925050604084013567ffffffffffffffff8111156123bf576123be611d48565b5b6123cb86828701612304565b9150509250925092565b5f6060820190506123e85f830186611fbb565b6123f56020830185611fbb565b6124026040830184611fbb565b949350505050565b5f805f6060848603121561242157612420611d44565b5b5f61242e86828701611ff9565b935050602061243f86828701611d6b565b925050604061245086828701611d6b565b9150509250925092565b6124638161209a565b82525050565b5f60208201905061247c5f83018461245a565b92915050565b5f6020828403121561249757612496611d44565b5b5f6124a484828501611ff9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124e482611d4c565b91506124ef83611d4c565b9250828201905080821115612507576125066124ad565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61254482611d4c565b915061254f83611d4c565b9250828203905081811115612567576125666124ad565b5b92915050565b5f67ffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6125b78261256d565b91506125c28361256d565b9250826125d2576125d1612580565b5b828204905092915050565b5f6125e78261256d565b91506125f28361256d565b9250828203905067ffffffffffffffff811115612612576126116124ad565b5b92915050565b5f80fd5b5f81600f0b9050919050565b6126318161261c565b811461263b575f80fd5b50565b5f8151905061264c81612628565b92915050565b61265b8161256d565b8114612665575f80fd5b50565b5f8151905061267681612652565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6126a08161267c565b81146126aa575f80fd5b50565b5f815190506126bb81612697565b92915050565b5f60a082840312156126d6576126d5612618565b5b6126e060a0612193565b90505f6126ef8482850161263e565b5f8301525060206127028482850161263e565b602083015250604061271684828501612668565b604083015250606061272a84828501612668565b606083015250608061273e848285016126ad565b60808301525092915050565b5f60a0828403121561275f5761275e611d44565b5b5f61276c848285016126c1565b91505092915050565b5f8151905061278381611d55565b92915050565b5f6020828403121561279e5761279d611d44565b5b5f6127ab84828501612775565b91505092915050565b5f6127be82611d4c565b91506127c983611d4c565b9250826127d9576127d8612580565b5b828204905092915050565b5f6127ee82611d4c565b91506127f983611d4c565b925082820261280781611d4c565b9150828204841483151761281e5761281d6124ad565b5b5092915050565b5f6060820190506128385f83018661204b565b6128456020830185611fbb565b6128526040830184611fbb565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220948cb71923f507b691853d26873dfaf65f1c095925be6cbedeb01e3ae8d2719264736f6c63430008170033", "bin-runtime": "608060405234801561000f575f80fd5b50600436106101ed575f3560e01c80637665a8ef1161010d578063c2c4c5c1116100a0578063de28a19a1161006f578063de28a19a14610645578063e4a28a5214610661578063ec73d9061461067f578063f4359ce5146106af576101ed565b8063c2c4c5c1146105bd578063d8cac5ae146105c7578063da669c6e146105f8578063dcfeeae614610629576101ed565b80639d175053116100dc5780639d175053146105205780639e5d842e146105515780639faacf7c14610581578063a18f99ff1461059f576101ed565b80637665a8ef146104865780637967d905146104b6578063861bd2a0146104d25780638887390714610504576101ed565b806341597036116101855780635bc105c0116101545780635bc105c0146103d75780636010185d146103f5578063635b85911461042657806366ab8ac614610456576101ed565b8063415970361461034d578063482649971461036b5780634efafacf146103895780634f6ffd07146103b9576101ed565b806327ebf531116101c157806327ebf531146102a0578063289da14e146102d15780633b766b3d146102ed5780633d80f36f1461031d576101ed565b806292a596146101f15780630c423201146102225780631d0a06b6146102525780631f85071614610282575b5f80fd5b61020b60048036038101906102069190611d7f565b6106cd565b604051610219929190611f5b565b60405180910390f35b61023c60048036038101906102379190611f90565b6108cb565b6040516102499190611fca565b60405180910390f35b61026c6004803603810190610267919061200d565b6108e0565b6040516102799190611fca565b60405180910390f35b61028a61095a565b604051610297919061205a565b60405180910390f35b6102ba60048036038101906102b59190611f90565b61097e565b6040516102c8929190612073565b60405180910390f35b6102eb60048036038101906102e691906120cf565b610a45565b005b61030760048036038101906103029190611f90565b610a60565b6040516103149190611fca565b60405180910390f35b6103376004803603810190610332919061200d565b610a80565b6040516103449190611fca565b60405180910390f35b610355610abf565b6040516103629190611fca565b60405180910390f35b610373610adb565b6040516103809190611fca565b60405180910390f35b6103a3600480360381019061039e9190611f90565b610ae1565b6040516103b09190611fca565b60405180910390f35b6103c1610af6565b6040516103ce9190611fca565b60405180910390f35b6103df610afd565b6040516103ec9190611fca565b60405180910390f35b61040f600480360381019061040a9190611d7f565b610b2b565b60405161041d9291906120fa565b60405180910390f35b610440600480360381019061043b9190611f90565b610b56565b60405161044d9190611fca565b60405180910390f35b610470600480360381019061046b919061200d565b610b6b565b60405161047d9190611fca565b60405180910390f35b6104a0600480360381019061049b919061200d565b610b8b565b6040516104ad9190611fca565b60405180910390f35b6104d060048036038101906104cb9190612331565b610bec565b005b6104ec60048036038101906104e7919061200d565b610cba565b6040516104fb939291906123d5565b60405180910390f35b61051e6004803603810190610519919061240a565b610ceb565b005b61053a60048036038101906105359190611f90565b6115cf565b6040516105489291906120fa565b60405180910390f35b61056b60048036038101906105669190611d7f565b6115ef565b6040516105789190611fca565b60405180910390f35b61058961160f565b6040516105969190612469565b60405180910390f35b6105a761161f565b6040516105b49190611fca565b60405180910390f35b6105c5611636565b005b6105e160048036038101906105dc919061240a565b611641565b6040516105ef9291906120fa565b60405180910390f35b610612600480360381019061060d919061240a565b61165e565b6040516106209291906120fa565b60405180910390f35b610643600480360381019061063e919061200d565b61168f565b005b61065f600480360381019061065a919061200d565b611904565b005b61066961191c565b6040516106769190611fca565b60405180910390f35b61069960048036038101906106949190612482565b611922565b6040516106a69190611fca565b60405180910390f35b6106b7611937565b6040516106c49190611fca565b60405180910390f35b6060805f8414806106dd57505f83145b15610714576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838561072191906124da565b90505f6001805490509050808211156107735781816040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161076a9291906120fa565b60405180910390fd5b8467ffffffffffffffff81111561078d5761078c612135565b5b6040519080825280602002602001820160405280156107bb5781602001602082028036833780820191505090505b5093508467ffffffffffffffff8111156107d8576107d7612135565b5b6040519080825280602002602001820160405280156108065781602001602082028036833780820191505090505b5092505f5b858110156108c1575f878261082091906124da565b90505f600182815481106108375761083661250d565b5b905f5260205f2001549050808784815181106108565761085561250d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a081901c8684815181106108a8576108a761250d565b5b602002602001018181525050505080600101905061080b565b5050509250929050565b600a602052805f5260405f205f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205491505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805f60018080549050610992919061253a565b90505f84036109cd576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80841115610a145783816040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610a0b9291906120fa565b60405180910390fd5b5f60018581548110610a2957610a2861250d565b5b905f5260205f200154905080935060a081901c92505050915091565b805f806101000a81548160ff02191690831515021790555050565b60018181548110610a6f575f80fd5b905f5260205f20015f915090505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060025f8281526020019081526020015f205491505092915050565b5f60095f600b5481526020019081526020015f205f0154905090565b600b5481565b6008602052805f5260405f205f915090505481565b620d2f0081565b6024600267ffffffffffffffff610b1491906125ad565b610b1e91906125dd565b67ffffffffffffffff1681565b6006602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b6002602052805f5260405f205f915090505481565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b8117905060065f8281526020019081526020015f205f60085f8481526020019081526020015f205481526020019081526020015f205f015491505092915050565b81518351141580610bff57508051835114155b15610c4557825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600401610c3c9291906120fa565b60405180910390fd5b5f5b8351811015610cb457610ca9848281518110610c6657610c6561250d565b5b6020026020010151848381518110610c8157610c8061250d565b5b6020026020010151848481518110610c9c57610c9b61250d565b5b6020026020010151610ceb565b806001019050610c47565b50505050565b6003602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154905083565b5f8373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c4698ee5336040518263ffffffff1660e01b8152600401610d68919061205a565b60a060405180830381865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da7919061274a565b602001516fffffffffffffffffffffffffffffffff1690505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634deafcae336040518263ffffffff1660e01b8152600401610e19919061205a565b602060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190612789565b90505f62093a808062093a8042610e6f91906124da565b610e7991906127b4565b610e8391906127e4565b9050818110610ecd573382826040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610ec493929190612825565b60405180910390fd5b612710851115610f1857846127106040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610f0f9291906120fa565b60405180910390fd5b5f620d2f0060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2054610f7491906124da565b905042811115610fbf573342826040517f17601765000000000000000000000000000000000000000000000000000000008152600401610fb693929190612825565b60405180910390fd5b5f60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f206040518060600160405290815f82015481526020016001820154815260200160028201548152505090505f838260400151111561106457838260400151611053919061253a565b825f015161106191906127e4565b90505b5f60405180606001604052806127108b8a61107f91906127e4565b61108991906127b4565b81526020018a81526020018781525090505f85876110a7919061253a565b825f01516110b591906127e4565b90505f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050846020015183602001518261110d91906124da565b611117919061253a565b90508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506127108111156111a657806127106040517f7ae5968500000000000000000000000000000000000000000000000000000000815260040161119d9291906120fa565b60405180910390fd5b6111c4826111b48f8f61193e565b6111be91906124da565b85611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f205f0181905550611206826111f6611b59565b61120091906124da565b85611b36565b60095f8981526020019081526020015f205f018190555086856040015111156112da57611267835f015160065f8d81526020019081526020015f205f8a81526020019081526020015f206001015461125e91906124da565b865f0151611b36565b60065f8c81526020019081526020015f205f8981526020019081526020015f20600101819055506112bd835f015160095f8a81526020019081526020015f20600101546112b491906124da565b865f0151611b36565b60095f8981526020019081526020015f2060010181905550611344565b825f015160065f8c81526020019081526020015f205f8981526020019081526020015f206001015f82825461130f91906124da565b92505081905550825f015160095f8981526020019081526020015f206001015f82825461133c91906124da565b925050819055505b42856040015111156113bc57845f015160075f8c81526020019081526020015f205f876040015181526020019081526020015f205f828254611386919061253a565b92505081905550845f0151600a5f876040015181526020019081526020015f205f8282546113b4919061253a565b925050819055505b825f015160075f8c81526020019081526020015f205f856040015181526020019081526020015f205f8282546113f291906124da565b92505081905550825f0151600a5f856040015181526020019081526020015f205f82825461142091906124da565b925050819055508260035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050504260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f20819055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c81526020019081526020015f2054116115405761153f61285a565b5b60015f806101000a81548160ff0219169083151502179055508c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f491b1e1a0c99eaa02d3b9e779fea23f086f3b4f723b1633a89121774de05512f8e8e6040516115b89291906120fa565b60405180910390a350505050505050505050505050565b6009602052805f5260405f205f91509050805f0154908060010154905082565b6007602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900460ff1681565b5f60018080549050611631919061253a565b905090565b61163e611b59565b50565b5f8061164e858585611c88565b8092508193505050935093915050565b5f8061166a858561193e565b50611673611b59565b5061167f858585611c88565b8092508193505050935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361172d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024600267ffffffffffffffff61174491906125ad565b61174e91906125dd565b67ffffffffffffffff168111156117c857806024600267ffffffffffffffff61177791906125ad565b61178191906125dd565b67ffffffffffffffff166040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016117bf9291906120fa565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16905060a082901b811790505f60025f8381526020019081526020015f205411156118435782826040517f6421261300000000000000000000000000000000000000000000000000000000815260040161183a929190612073565b60405180910390fd5b60018054905060025f8381526020019081526020015f2081905550600181908060018154018082558091505060019003905f5260205f20015f90919091909150555f62093a808062093a804261189991906124da565b6118a391906127b4565b6118ad91906127e4565b90508060085f8481526020019081526020015f20819055507f1bc65a439335898028ac09fe90754a5ef59b65314198d75e6cdd5f9deaa5076784846040516118f6929190612073565b60405180910390a150505050565b61190e828261193e565b50611917611b59565b505050565b61271081565b6004602052805f5260405f205f915090505481565b62093a8081565b5f808373ffffffffffffffffffffffffffffffffffffffff16905060a083901b811790505f60025f8381526020019081526020015f2054036119b95783836040517f5e6132570000000000000000000000000000000000000000000000000000000081526004016119b0929190612073565b60405180910390fd5b5f60085f8381526020019081526020015f205490505f60065f8481526020019081526020015f205f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611b2657428311611b265762093a8083611a3191906124da565b92505f62093a808360200151611a4791906127e4565b905080835f01511115611aaf5780835f01818151611a65919061253a565b915081815250505f60075f8781526020019081526020015f205f8681526020019081526020015f205490508084602001818151611aa2919061253a565b9150818152505050611ac3565b5f835f0181815250505f8360200181815250505b8260065f8781526020019081526020015f205f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611b18578360085f8781526020019081526020015f20819055505b508080600101915050611a11565b50805f0151935050505092915050565b5f818311611b44575f611b51565b8183611b50919061253a565b5b905092915050565b5f80600b5490505f60095f8381526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f5b6101f4811015611c7c57428311611c7c5762093a8083611bb491906124da565b92505f62093a808360200151611bca91906127e4565b905080835f01511115611c235780835f01818151611be8919061253a565b915081815250505f600a5f8681526020019081526020015f205490508084602001818151611c16919061253a565b9150818152505050611c37565b5f835f0181815250505f8360200181815250505b8260095f8681526020019081526020015f205f820151815f01556020820151816001015590505042841115611c6e5783600b819055505b508080600101915050611b94565b50805f01519250505090565b5f805f62093a808085611c9b91906127b4565b611ca591906127e4565b905060095f8281526020019081526020015f205f015491505f8673ffffffffffffffffffffffffffffffffffffffff16905060a086901b811790505f831115611d31575f60065f8381526020019081526020015f205f8481526020019081526020015f205f015490508381670de0b6b3a7640000611d2391906127e4565b611d2d91906127b4565b9450505b5050935093915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611d5e81611d4c565b8114611d68575f80fd5b50565b5f81359050611d7981611d55565b92915050565b5f8060408385031215611d9557611d94611d44565b5b5f611da285828601611d6b565b9250506020611db385828601611d6b565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611e0f82611de6565b9050919050565b611e1f81611e05565b82525050565b5f611e308383611e16565b60208301905092915050565b5f602082019050919050565b5f611e5282611dbd565b611e5c8185611dc7565b9350611e6783611dd7565b805f5b83811015611e97578151611e7e8882611e25565b9750611e8983611e3c565b925050600181019050611e6a565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ed681611d4c565b82525050565b5f611ee78383611ecd565b60208301905092915050565b5f602082019050919050565b5f611f0982611ea4565b611f138185611eae565b9350611f1e83611ebe565b805f5b83811015611f4e578151611f358882611edc565b9750611f4083611ef3565b925050600181019050611f21565b5085935050505092915050565b5f6040820190508181035f830152611f738185611e48565b90508181036020830152611f878184611eff565b90509392505050565b5f60208284031215611fa557611fa4611d44565b5b5f611fb284828501611d6b565b91505092915050565b611fc481611d4c565b82525050565b5f602082019050611fdd5f830184611fbb565b92915050565b611fec81611e05565b8114611ff6575f80fd5b50565b5f8135905061200781611fe3565b92915050565b5f806040838503121561202357612022611d44565b5b5f61203085828601611ff9565b925050602061204185828601611d6b565b9150509250929050565b61205481611e05565b82525050565b5f60208201905061206d5f83018461204b565b92915050565b5f6040820190506120865f83018561204b565b6120936020830184611fbb565b9392505050565b5f8115159050919050565b6120ae8161209a565b81146120b8575f80fd5b50565b5f813590506120c9816120a5565b92915050565b5f602082840312156120e4576120e3611d44565b5b5f6120f1848285016120bb565b91505092915050565b5f60408201905061210d5f830185611fbb565b61211a6020830184611fbb565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61216b82612125565b810181811067ffffffffffffffff8211171561218a57612189612135565b5b80604052505050565b5f61219c611d3b565b90506121a88282612162565b919050565b5f67ffffffffffffffff8211156121c7576121c6612135565b5b602082029050602081019050919050565b5f80fd5b5f6121ee6121e9846121ad565b612193565b90508083825260208201905060208402830185811115612211576122106121d8565b5b835b8181101561223a57806122268882611ff9565b845260208401935050602081019050612213565b5050509392505050565b5f82601f83011261225857612257612121565b5b81356122688482602086016121dc565b91505092915050565b5f67ffffffffffffffff82111561228b5761228a612135565b5b602082029050602081019050919050565b5f6122ae6122a984612271565b612193565b905080838252602082019050602084028301858111156122d1576122d06121d8565b5b835b818110156122fa57806122e68882611d6b565b8452602084019350506020810190506122d3565b5050509392505050565b5f82601f83011261231857612317612121565b5b813561232884826020860161229c565b91505092915050565b5f805f6060848603121561234857612347611d44565b5b5f84013567ffffffffffffffff81111561236557612364611d48565b5b61237186828701612244565b935050602084013567ffffffffffffffff81111561239257612391611d48565b5b61239e86828701612304565b925050604084013567ffffffffffffffff8111156123bf576123be611d48565b5b6123cb86828701612304565b9150509250925092565b5f6060820190506123e85f830186611fbb565b6123f56020830185611fbb565b6124026040830184611fbb565b949350505050565b5f805f6060848603121561242157612420611d44565b5b5f61242e86828701611ff9565b935050602061243f86828701611d6b565b925050604061245086828701611d6b565b9150509250925092565b6124638161209a565b82525050565b5f60208201905061247c5f83018461245a565b92915050565b5f6020828403121561249757612496611d44565b5b5f6124a484828501611ff9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124e482611d4c565b91506124ef83611d4c565b9250828201905080821115612507576125066124ad565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61254482611d4c565b915061254f83611d4c565b9250828203905081811115612567576125666124ad565b5b92915050565b5f67ffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6125b78261256d565b91506125c28361256d565b9250826125d2576125d1612580565b5b828204905092915050565b5f6125e78261256d565b91506125f28361256d565b9250828203905067ffffffffffffffff811115612612576126116124ad565b5b92915050565b5f80fd5b5f81600f0b9050919050565b6126318161261c565b811461263b575f80fd5b50565b5f8151905061264c81612628565b92915050565b61265b8161256d565b8114612665575f80fd5b50565b5f8151905061267681612652565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6126a08161267c565b81146126aa575f80fd5b50565b5f815190506126bb81612697565b92915050565b5f60a082840312156126d6576126d5612618565b5b6126e060a0612193565b90505f6126ef8482850161263e565b5f8301525060206127028482850161263e565b602083015250604061271684828501612668565b604083015250606061272a84828501612668565b606083015250608061273e848285016126ad565b60808301525092915050565b5f60a0828403121561275f5761275e611d44565b5b5f61276c848285016126c1565b91505092915050565b5f8151905061278381611d55565b92915050565b5f6020828403121561279e5761279d611d44565b5b5f6127ab84828501612775565b91505092915050565b5f6127be82611d4c565b91506127c983611d4c565b9250826127d9576127d8612580565b5b828204905092915050565b5f6127ee82611d4c565b91506127f983611d4c565b925082820261280781611d4c565b9150828204841483151761281e5761281d6124ad565b5b5092915050565b5f6060820190506128385f83018661204b565b6128456020830185611fbb565b6128526040830184611fbb565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220948cb71923f507b691853d26873dfaf65f1c095925be6cbedeb01e3ae8d2719264736f6c63430008170033", "userdoc": {"methods": {"getNominee(uint256)": {"notice": "The zero-th default nominee Id with id == 0 does not count."}, "getNominees(uint256,uint256)": {"notice": "The zero-th default nominee Id with id == 0 does not count."}, "getNumNominees()": {"notice": "The zero-th default nominee Id with id == 0 does not count."}, "nomineeRelativeWeightWrite(address,uint256,uint256)": {"notice": "Any address can call, however nothing is recorded if the values are filled already."}}, "notice": null}, "devdoc": {"methods": {"addNominee(address,uint256)": {"author": null, "details": "Add nominee address along with the chain Id.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee."}, "return": null}, "checkpoint()": {"author": null, "details": "Checkpoint to fill data common for all nominees.", "params": {}, "return": null}, "checkpointNominee(address,uint256)": {"author": null, "details": "Checkpoint to fill data for both a specific nominee and common for all nominees.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee."}, "return": null}, "constructor": {"author": null, "details": "Contract constructor.", "params": {"_ve": "`VotingEscrow` contract address."}, "return": null}, "getNominee(uint256)": {"author": null, "details": "Get the nominee address and its corresponding chain Id.", "params": {"id": "Nominee Id in the global set of (nominee | chainId) values."}, "return": null}, "getNomineeId(address,uint256)": {"author": null, "details": "Gets the nominee Id in the global nominees set.", "params": {"chainId": "Chain Id.", "nominee": "Nominee address."}, "return": null}, "getNomineeWeight(address,uint256)": {"author": null, "details": "Get current nominee weight.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee."}, "return": null}, "getNominees(uint256,uint256)": {"author": null, "details": "Get the set of nominee addresses and corresponding chain Ids.", "params": {"numNominees": "Number of nominees to get.", "startId": "Start Id of the nominee in the global set of (nominee | chainId) values."}, "return": null}, "getNumNominees()": {"author": null, "details": "Get the number of nominees.", "params": {}, "return": null}, "getWeightsSum()": {"author": null, "details": "Get sum of nominee weights.", "params": {}, "return": null}, "getlastUserVote(address,uint256)": {"author": null, "details": "For fuzzing only", "params": {}, "return": null}, "nomineeRelativeWeight(address,uint256,uint256)": {"author": null, "details": "Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights. (e.g. 1.0 == 1e18). Inflation which will be received by it is inflation_rate * relativeWeight / 1e18.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee.", "time": "Relative weight at the specified timestamp in the past or present."}, "return": null}, "nomineeRelativeWeightWrite(address,uint256,uint256)": {"author": null, "details": "Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. Also, get the total sum of all the nominee weights.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee.", "time": "Relative weight at the specified timestamp in the past or present."}, "return": null}, "setCallVoteForNomineeWeights(bool)": {"author": null, "details": "For fuzzing only", "params": {}, "return": null}, "voteForNomineeWeights(address,uint256,uint256)": {"author": null, "details": "Allocate voting power for changing pool weights.", "params": {"chainId": "Chain Id.", "nominee": "Address of the nominee the `msg.sender` votes for.", "weight": "Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0."}, "return": null}, "voteForNomineeWeightsBatch(address[],uint256[],uint256[])": {"author": null, "details": "Allocate voting power for changing pool weights in batch.", "params": {"chainIds": "Set of corresponding chain Ids.", "nominees": "Set of nominees the `msg.sender` votes for.", "weights": "Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0."}, "return": null}}, "author": null, "details": null, "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/contracts/veOLAS.sol:veOLAS": {"srcmap": "4557:31610:4:-:0;;;6224:406;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6318:6;6310:14;;;;;;;;;;6341:5;6334:4;:12;;;;;;:::i;:::-;;6365:7;6356:6;:16;;;;;;:::i;:::-;;6556:67;;;;;;;;6568:1;6556:67;;;;;;6571:1;6556:67;;;;;;6581:15;6556:67;;;;;;6606:12;6556:67;;;;;;6621:1;6556:67;;;;;6535:15;:18;6551:1;6535:18;;;;;;;;;;;:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6224:406;;;4557:31610;;7:75:9;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:117::-;954:1;951;944:12;968:117;1077:1;1074;1067:12;1091:102;1132:6;1183:2;1179:7;1174:2;1167:5;1163:14;1159:28;1149:38;;1091:102;;;:::o;1199:180::-;1247:77;1244:1;1237:88;1344:4;1341:1;1334:15;1368:4;1365:1;1358:15;1385:281;1468:27;1490:4;1468:27;:::i;:::-;1460:6;1456:40;1598:6;1586:10;1583:22;1562:18;1550:10;1547:34;1544:62;1541:88;;;1609:18;;:::i;:::-;1541:88;1649:10;1645:2;1638:22;1428:238;1385:281;;:::o;1672:129::-;1706:6;1733:20;;:::i;:::-;1723:30;;1762:33;1790:4;1782:6;1762:33;:::i;:::-;1672:129;;;:::o;1807:308::-;1869:4;1959:18;1951:6;1948:30;1945:56;;;1981:18;;:::i;:::-;1945:56;2019:29;2041:6;2019:29;:::i;:::-;2011:37;;2103:4;2097;2093:15;2085:23;;1807:308;;;:::o;2121:246::-;2202:1;2212:113;2226:6;2223:1;2220:13;2212:113;;;2311:1;2306:3;2302:11;2296:18;2292:1;2287:3;2283:11;2276:39;2248:2;2245:1;2241:10;2236:15;;2212:113;;;2359:1;2350:6;2345:3;2341:16;2334:27;2183:184;2121:246;;;:::o;2373:434::-;2462:5;2487:66;2503:49;2545:6;2503:49;:::i;:::-;2487:66;:::i;:::-;2478:75;;2576:6;2569:5;2562:21;2614:4;2607:5;2603:16;2652:3;2643:6;2638:3;2634:16;2631:25;2628:112;;;2659:79;;:::i;:::-;2628:112;2749:52;2794:6;2789:3;2784;2749:52;:::i;:::-;2468:339;2373:434;;;;;:::o;2827:355::-;2894:5;2943:3;2936:4;2928:6;2924:17;2920:27;2910:122;;2951:79;;:::i;:::-;2910:122;3061:6;3055:13;3086:90;3172:3;3164:6;3157:4;3149:6;3145:17;3086:90;:::i;:::-;3077:99;;2900:282;2827:355;;;;:::o;3188:1009::-;3296:6;3304;3312;3361:2;3349:9;3340:7;3336:23;3332:32;3329:119;;;3367:79;;:::i;:::-;3329:119;3487:1;3512:64;3568:7;3559:6;3548:9;3544:22;3512:64;:::i;:::-;3502:74;;3458:128;3646:2;3635:9;3631:18;3625:25;3677:18;3669:6;3666:30;3663:117;;;3699:79;;:::i;:::-;3663:117;3804:74;3870:7;3861:6;3850:9;3846:22;3804:74;:::i;:::-;3794:84;;3596:292;3948:2;3937:9;3933:18;3927:25;3979:18;3971:6;3968:30;3965:117;;;4001:79;;:::i;:::-;3965:117;4106:74;4172:7;4163:6;4152:9;4148:22;4106:74;:::i;:::-;4096:84;;3898:292;3188:1009;;;;;:::o;4203:99::-;4255:6;4289:5;4283:12;4273:22;;4203:99;;;:::o;4308:180::-;4356:77;4353:1;4346:88;4453:4;4450:1;4443:15;4477:4;4474:1;4467:15;4494:320;4538:6;4575:1;4569:4;4565:12;4555:22;;4622:1;4616:4;4612:12;4643:18;4633:81;;4699:4;4691:6;4687:17;4677:27;;4633:81;4761:2;4753:6;4750:14;4730:18;4727:38;4724:84;;4780:18;;:::i;:::-;4724:84;4545:269;4494:320;;;:::o;4820:141::-;4869:4;4892:3;4884:11;;4915:3;4912:1;4905:14;4949:4;4946:1;4936:18;4928:26;;4820:141;;;:::o;4967:93::-;5004:6;5051:2;5046;5039:5;5035:14;5031:23;5021:33;;4967:93;;;:::o;5066:107::-;5110:8;5160:5;5154:4;5150:16;5129:37;;5066:107;;;;:::o;5179:393::-;5248:6;5298:1;5286:10;5282:18;5321:97;5351:66;5340:9;5321:97;:::i;:::-;5439:39;5469:8;5458:9;5439:39;:::i;:::-;5427:51;;5511:4;5507:9;5500:5;5496:21;5487:30;;5560:4;5550:8;5546:19;5539:5;5536:30;5526:40;;5255:317;;5179:393;;;;;:::o;5578:77::-;5615:7;5644:5;5633:16;;5578:77;;;:::o;5661:60::-;5689:3;5710:5;5703:12;;5661:60;;;:::o;5727:142::-;5777:9;5810:53;5828:34;5837:24;5855:5;5837:24;:::i;:::-;5828:34;:::i;:::-;5810:53;:::i;:::-;5797:66;;5727:142;;;:::o;5875:75::-;5918:3;5939:5;5932:12;;5875:75;;;:::o;5956:269::-;6066:39;6097:7;6066:39;:::i;:::-;6127:91;6176:41;6200:16;6176:41;:::i;:::-;6168:6;6161:4;6155:11;6127:91;:::i;:::-;6121:4;6114:105;6032:193;5956:269;;;:::o;6231:73::-;6276:3;6231:73;:::o;6310:189::-;6387:32;;:::i;:::-;6428:65;6486:6;6478;6472:4;6428:65;:::i;:::-;6363:136;6310:189;;:::o;6505:186::-;6565:120;6582:3;6575:5;6572:14;6565:120;;;6636:39;6673:1;6666:5;6636:39;:::i;:::-;6609:1;6602:5;6598:13;6589:22;;6565:120;;;6505:186;;:::o;6697:543::-;6798:2;6793:3;6790:11;6787:446;;;6832:38;6864:5;6832:38;:::i;:::-;6916:29;6934:10;6916:29;:::i;:::-;6906:8;6902:44;7099:2;7087:10;7084:18;7081:49;;;7120:8;7105:23;;7081:49;7143:80;7199:22;7217:3;7199:22;:::i;:::-;7189:8;7185:37;7172:11;7143:80;:::i;:::-;6802:431;;6787:446;6697:543;;;:::o;7246:117::-;7300:8;7350:5;7344:4;7340:16;7319:37;;7246:117;;;;:::o;7369:169::-;7413:6;7446:51;7494:1;7490:6;7482:5;7479:1;7475:13;7446:51;:::i;:::-;7442:56;7527:4;7521;7517:15;7507:25;;7420:118;7369:169;;;;:::o;7543:295::-;7619:4;7765:29;7790:3;7784:4;7765:29;:::i;:::-;7757:37;;7827:3;7824:1;7820:11;7814:4;7811:21;7803:29;;7543:295;;;;:::o;7843:1395::-;7960:37;7993:3;7960:37;:::i;:::-;8062:18;8054:6;8051:30;8048:56;;;8084:18;;:::i;:::-;8048:56;8128:38;8160:4;8154:11;8128:38;:::i;:::-;8213:67;8273:6;8265;8259:4;8213:67;:::i;:::-;8307:1;8331:4;8318:17;;8363:2;8355:6;8352:14;8380:1;8375:618;;;;9037:1;9054:6;9051:77;;;9103:9;9098:3;9094:19;9088:26;9079:35;;9051:77;9154:67;9214:6;9207:5;9154:67;:::i;:::-;9148:4;9141:81;9010:222;8345:887;;8375:618;8427:4;8423:9;8415:6;8411:22;8461:37;8493:4;8461:37;:::i;:::-;8520:1;8534:208;8548:7;8545:1;8542:14;8534:208;;;8627:9;8622:3;8618:19;8612:26;8604:6;8597:42;8678:1;8670:6;8666:14;8656:24;;8725:2;8714:9;8710:18;8697:31;;8571:4;8568:1;8564:12;8559:17;;8534:208;;;8770:6;8761:7;8758:19;8755:179;;;8828:9;8823:3;8819:19;8813:26;8871:48;8913:4;8905:6;8901:17;8890:9;8871:48;:::i;:::-;8863:6;8856:64;8778:156;8755:179;8980:1;8976;8968:6;8964:14;8960:22;8954:4;8947:36;8382:611;;;8345:887;;7935:1303;;;7843:1395;;:::o;4557:31610:4:-;;;;;;;;;;;;;;;;;;;;;;;", "srcmap-runtime": "4557:31610:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34470:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5700:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;5419:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6005:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34974:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21460:981;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32455:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5497:58;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35178:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19257:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17597:1011;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5294:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30625:589;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23824:1131;;;:::i;:::-;;5629:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27893:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28239:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7198:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33648:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35603:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35797:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27604:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5819:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;5925:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22535:1192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33959:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6056:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32722:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28805:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34778:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7651:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33348:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18819:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15118:130;;;:::i;:::-;;35974:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6783:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35393:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5357:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34470:253;34555:4;34593:24;34578:39;;;:11;:39;;;;:82;;;;34636:24;34621:39;;;:11;:39;;;;34578:82;:138;;;;34691:25;34676:40;;;:11;:40;;;;34578:138;34571:145;;34470:253;;;:::o;5700:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5419:21::-;;;;:::o;6005:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34974:145::-;35059:4;35106;35082:30;;;;;;;;;;;:::i;:::-;;;;;;;;21460:981;21519:34;21556:17;:29;21574:10;21556:29;;;;;;;;;;;;;;;21519:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21648:1;21638:6;:11;21634:60;;21672:11;;;;;;;;;;;;;;21634:60;21780:1;21756:13;:20;;;:25;;;21752:88;;21818:10;21804:25;;;;;;;;;;;:::i;:::-;;;;;;;;21752:88;21929:1;21911:15;:19;;;;:::i;:::-;21886:13;:21;;;:45;;;21882:146;;;21966:10;21978:13;:21;;;22001:15;21954:63;;;;;;;;;;;;;:::i;:::-;;;;;;;;21882:146;22257:16;22248:25;;:6;:25;22244:97;;;22305:6;22313:16;22296:34;;;;;;;;;;;;:::i;:::-;;;;;;;;22244:97;22351:83;22363:10;22375:6;22383:1;22386:13;22401:32;22351:11;:83::i;:::-;21509:932;21460:981;:::o;32455:92::-;32508:7;32534:6;;32527:13;;32455:92;:::o;5497:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35178:159::-;35277:4;35324;35300:30;;;;;;;;;;;:::i;:::-;;;;;;;;19257:275;19423:1;19404:21;;:7;:21;;;19400:72;;19448:13;;;;;;;;;;;;;;19400:72;19482:43;19497:7;19506:6;19514:10;19482:14;:43::i;:::-;19257:275;;;:::o;17597:1011::-;17669:34;17706:17;:26;17724:7;17706:26;;;;;;;;;;;;;;;17669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17795:1;17785:6;:11;17781:60;;17819:11;;;;;;;;;;;;;;17781:60;17927:1;17903:13;:20;;;:25;;;17899:85;;17965:7;17951:22;;;;;;;;;;;:::i;:::-;;;;;;;;17899:85;18073:1;18055:15;:19;;;;:::i;:::-;18030:13;:21;;;:45;;;18026:146;;;18110:10;18122:13;:21;;;18145:15;18098:63;;;;;;;;;;;;;:::i;:::-;;;;;;;;18026:146;18431:16;18422:25;;:6;:25;18418:97;;;18479:6;18487:16;18470:34;;;;;;;;;;;;:::i;:::-;;;;;;;;18418:97;18525:76;18537:7;18546:6;18554:1;18557:13;18572:28;18525:11;:76::i;:::-;17659:949;17597:1011;;:::o;5294:35::-;5327:2;5294:35;:::o;30625:589::-;30715:15;30804:25;30835:39;30853:11;30866:7;30835:17;:39::i;:::-;30803:71;;;30926:17;30947:26;30961:11;30947:13;:26::i;:::-;30923:50;;;31102:6;:9;;;31082;31069:43;;;;:::i;:::-;31062:51;;31047:6;:12;;;:66;;;;:::i;:::-;31032:6;:11;;:81;;;;;;;:::i;:::-;;;;;;;;;;;;;;31141:1;31127:6;:11;;;:15;;;31123:85;;;31184:6;:11;;;31168:29;;31158:39;;31123:85;30732:482;;30625:589;;;;:::o;23824:1131::-;23863:34;23900:17;:29;23918:10;23900:29;;;;;;;;;;;;;;;23863:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23967:15;23943:13;:21;;;:39;;;23939:143;;;24020:10;24032:13;:21;;;24055:15;24005:66;;;;;;;;;;;;;:::i;:::-;;;;;;;;23939:143;24091:14;24116:13;:20;;;24108:29;;24091:46;;24180:19;;;;;;;;24194:1;24180:19;;;;;;24197:1;24180:19;;;;;24148:17;:29;24166:10;24148:29;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24209:20;24232:6;;24209:29;;24248:19;24389:6;24374:12;:21;24360:35;;24418:11;24409:6;:20;;;;24596:81;24608:10;24620:13;24635:19;;;;;;;;24649:1;24635:19;;;;;;24652:1;24635:19;;;;;24664:11;24596;:81::i;:::-;24702:10;24693:45;;;24714:6;24722:15;24693:45;;;;;;;:::i;:::-;;;;;;;;24753:33;24760:12;24774:11;24753:33;;;;;;;:::i;:::-;;;;;;;;24913:5;24906:22;;;24929:10;24941:6;24906:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23853:1102;;;;23824:1131::o;5629:29::-;;;;:::o;27893:152::-;27952:18;28003:17;:26;28021:7;28003:26;;;;;;;;;;;;;;;:34;;;;;;;;;;;;27995:43;;27982:56;;27893:152;;;:::o;28239:484::-;28321:15;28421:25;28452:39;28470:11;28483:7;28452:17;:39::i;:::-;28420:71;;;28655:1;28641:11;:15;;;;:::i;:::-;28619:6;:18;;;:38;;;28615:102;;;28691:6;:14;;;28683:23;;28673:33;;28615:102;28338:385;28239:484;;;;:::o;7198:157::-;7264:24;7319:13;:22;7333:7;7319:22;;;;;;;;;;;;;;;:29;;;;7300:48;;7198:157;;;:::o;33648:120::-;33698:7;33724:37;33745:15;33724:20;:37::i;:::-;33717:44;;33648:120;:::o;35603:142::-;35679:7;35732:4;35709:29;;;;;;;;;;;:::i;:::-;;;;;;;;35797:120;35904:4;35881:29;;;;;;;;;;;:::i;:::-;;;;;;;;27604:152;27670:15;27715:17;:26;27733:7;27715:26;;;;;;;;;;;;;;;:33;;;;;;;;;;;;27707:42;;27697:52;;27604:152;;;:::o;5819:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5925:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;22535:1192::-;22602:34;22639:17;:29;22657:10;22639:29;;;;;;;;;;;;;;;22602:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5061:7;22815:46;;5061:7;22816:37;;22835:10;22817:15;:28;22816:37;;;;;:::i;:::-;;;22815:46;22802:59;;22958:1;22934:13;:20;;;:25;;;22930:88;;22996:10;22982:25;;;;;;;;;;;:::i;:::-;;;;;;;;22930:88;23107:1;23089:15;:19;;;;:::i;:::-;23064:13;:21;;;:45;;;23060:146;;;23144:10;23156:13;:21;;;23179:15;23132:63;;;;;;;;;;;;;:::i;:::-;;;;;;;;23060:146;23304:1;23280:13;:21;;;:25;;;;:::i;:::-;23266:40;;:10;:40;23262:144;;;23349:10;23361:13;:21;;;23384:10;23329:66;;;;;;;;;;;;;:::i;:::-;;;;;;;;23262:144;5145:15;23493;:25;;;;:::i;:::-;23480:10;:38;23476:147;;;23562:10;5145:15;23574;:25;;;;:::i;:::-;23601:10;23541:71;;;;;;;;;;;;;:::i;:::-;;;;;;;;23476:147;23633:87;23645:10;23657:1;23660:10;23672:13;23687:32;23633:11;:87::i;:::-;22592:1135;22535:1192;:::o;33959:306::-;34038:7;34058:25;34085:17;34106:26;34120:11;34106:13;:26::i;:::-;34057:75;;;;34216:42;34232:6;34247:9;34216:15;:42::i;:::-;34209:49;;;;33959:306;;;:::o;6056:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32722:474::-;32789:16;32890:25;32921:42;32939:11;32960:1;32921:17;:42::i;:::-;32889:74;;;33127:1;33113:11;:15;;;;:::i;:::-;33091:6;:18;;;:38;;;33087:103;;;33164:6;:14;;;33156:23;;33145:34;;33087:103;32807:389;32722:474;;;:::o;28805:148::-;28870:7;28896:50;28913:7;28929:15;28896:16;:50::i;:::-;28889:57;;28805:148;;;:::o;34778:141::-;34859:4;34906;34882:30;;;;;;;;;;;:::i;:::-;;;;;;;;7651:146;7726:18;;:::i;:::-;7763:13;:22;7777:7;7763:22;;;;;;;;;;;;;;;7786:3;7763:27;;;;;;;;:::i;:::-;;;;;;;;;;;;7756:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7651:146;;;;:::o;33348:206::-;33411:7;33430:28;33461:15;:31;33477:14;;33461:31;;;;;;;;;;;33430:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33509:38;33525:9;33543:2;33509:15;:38::i;:::-;33502:45;;;33348:206;;;:::o;18819:128::-;18894:46;18909:10;18921:6;18929:10;18894:14;:46::i;:::-;18819:128;;:::o;15118:130::-;15159:82;15179:1;15183:19;;;;;;;;15197:1;15183:19;;;;;;15200:1;15183:19;;;;;15204;;;;;;;;15218:1;15204:19;;;;;;15221:1;15204:19;;;;;15233:6;;15159:11;:82::i;:::-;15118:130::o;35974:191::-;36152:4;36129:29;;;;;;;;;;;:::i;:::-;;;;;;;;6783:268;6849:21;;:::i;:::-;6882:23;6908:13;:22;6922:7;6908:22;;;;;;;;;;;;;;;:29;;;;6882:55;;6969:1;6951:15;:19;6947:98;;;6991:13;:22;7005:7;6991:22;;;;;;;;;;;;;;;7032:1;7014:15;:19;;;;:::i;:::-;6991:43;;;;;;;;:::i;:::-;;;;;;;;;;;;6986:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6947:98;6872:179;6783:268;;;:::o;35393:158::-;35484:7;35538:4;35514:30;;;;;;;;;;;:::i;:::-;;;;;;;;5357;;;:::o;15606:1680::-;15806:20;15829:6;;15806:29;;15845:19;15990:6;15975:12;:21;15961:35;;16019:11;16010:6;:20;;;;16085:30;;:::i;:::-;16166:13;:20;;;16188:13;:21;;;16126:9;:16;;16144:9;:17;;16125:85;;;;;;;;;;;;;;;;;;16416:6;16384:13;:20;;:39;;;;;;;;;;;;;;;;;16460:1;16447:10;:14;16443:87;;;16508:10;16477:13;:21;;:42;;;;;;;;;;;16443:87;16568:13;16539:17;:26;16557:7;16539:26;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16842:68;16854:7;16863:9;16874:13;16897:11;16842;:68::i;:::-;16933:1;16924:6;:10;16920:219;;;17074:5;17067:26;;;17094:10;17114:4;17121:6;17067:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16920:219;17162:7;17154:77;;;17171:6;17179:13;:21;;;17202:11;17215:15;17154:77;;;;;;;;;:::i;:::-;;;;;;;;17246:33;17253:12;17267:11;17246:33;;;;;;;:::i;:::-;;;;;;;;15796:1490;;;15606:1680;;;;;:::o;19842:1440::-;19990:1;19980:6;:11;19976:60;;20014:11;;;;;;;;;;;;;;19976:60;5061:7;20228:46;;5061:7;20229:37;;20248:10;20230:15;:28;20229:37;;;;;:::i;:::-;;;20228:46;20215:59;;20294:34;20331:17;:26;20349:7;20331:26;;;;;;;;;;;;;;;20294:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20464:1;20441:13;:20;;;:24;;;20437:120;;;20507:7;20524:13;:20;;;20516:29;;20488:58;;;;;;;;;;;;:::i;:::-;;;;;;;;20437:120;20649:1;20631:15;:19;;;;:::i;:::-;20617:10;:34;20613:129;;;20694:7;20703:15;20720:10;20674:57;;;;;;;;;;;;;:::i;:::-;;;;;;;;20613:129;5145:15;20829;:25;;;;:::i;:::-;20816:10;:38;20812:144;;;20898:7;5145:15;20907;:25;;;;:::i;:::-;20934:10;20877:68;;;;;;;;;;;;;:::i;:::-;;;;;;;;20812:144;21096:16;21087:25;;:6;:25;21083:97;;;21144:6;21152:16;21135:34;;;;;;;;;;;;:::i;:::-;;;;;;;;21083:97;21190:85;21202:7;21211:6;21219:10;21231:13;21246:28;21190:11;:85::i;:::-;19927:1355;19842:1440;;;:::o;25261:1524::-;25357:24;;:::i;:::-;25383:22;25468;25523:1;25504:21;;:7;:21;;;25500:388;;25558:14;;25541:31;;25500:388;;;25620:13;:22;25634:7;25620:22;;;;;;;;;;;;;;;:29;;;;25603:46;;25685:1;25667:14;:19;25663:88;;25706:30;;;25663:88;25862:1;25844:19;;;;25500:388;25975:9;25970:600;25994:3;25990:1;:7;25970:600;;;26045:14;26040:1;26023:14;:18;;;;:::i;:::-;26022:37;26079:5;26018:81;26112:11;26166:1;26161;26144:14;26127;:31;;;;:::i;:::-;:35;;;;:::i;:::-;26126:41;;;;:::i;:::-;26112:55;;26248:1;26229:21;;:7;:21;;;26225:162;;26278:15;:20;26294:3;26278:20;;;;;;;;;;;26270:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26225:162;;;26345:13;:22;26359:7;26345:22;;;;;;;;;;;;;;;26368:3;26345:27;;;;;;;;:::i;:::-;;;;;;;;;;;;26337:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26225:162;26440:1;26426:11;:15;;;;:::i;:::-;26405:5;:17;;;:37;;;26401:159;;;26479:3;26462:20;;26401:159;;;26544:1;26538:3;:7;;;;:::i;:::-;26521:24;;26401:159;26004:566;25999:3;;;;;25970:600;;;;26634:1;26615:21;;:7;:21;;;26611:168;;26660:15;:31;26676:14;26660:31;;;;;;;;;;;26652:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26611:168;;;26730:13;:22;26744:7;26730:22;;;;;;;;;;;;;;;26753:14;26730:38;;;;;;;;:::i;:::-;;;;;;;;;;;;26722:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26611:168;25411:1374;25261:1524;;;;;;:::o;29382:1049::-;29449:24;;:::i;:::-;29475:17;29604:12;29590:11;:26;29586:107;;;29656:11;29669:12;29639:43;;;;;;;;;;;;:::i;:::-;;;;;;;;29586:107;29777:22;29835:42;29853:11;29874:1;29835:17;:42::i;:::-;29809:68;;;;;;;;29888:14;29912:10;29953:14;;29936;:31;29932:351;;;29983:28;30014:15;:35;30047:1;30030:14;:18;;;;:::i;:::-;30014:35;;;;;;;;;;;29983:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30096:5;:17;;;30072:9;:21;;;:41;;;;:::i;:::-;30063:50;;;;30147:5;:8;;;30132:9;:12;;;:23;;;;:::i;:::-;30127:28;;;;29969:197;29932:351;;;30210:5;:17;;;30195:32;;:12;:32;;;;:::i;:::-;30186:41;;30264:5;:8;;;30246:26;;:15;:26;;;;:::i;:::-;30241:31;;29932:351;30304:5;:8;;;30292:20;;;;30335:1;30326:6;:10;30322:103;;;30408:6;30386:5;:17;;;30372:31;;:11;:31;;;;:::i;:::-;30366:2;:38;;;;:::i;:::-;30365:49;;;;:::i;:::-;30352:62;;;;;:::i;:::-;;;30322:103;29494:937;;;29382:1049;;;:::o;8200:6865::-;8378:23;;:::i;:::-;8411;;:::i;:::-;8444:16;8470;8496:19;8518:14;;8496:36;;8566:1;8547:21;;:7;:21;;;8543:1215;;8697:15;8677:9;:17;;;:35;;;:59;;;;;8735:1;8716:9;:16;;;:20;;;8677:59;8673:249;;;5247:15;8776:9;:16;;;8769:35;;;;:::i;:::-;8756:4;:10;;:48;;;;;;;;;;;8889:15;8862:9;:17;;;:43;;;;:::i;:::-;8854:52;;8834:4;:10;;;:73;;;;:::i;:::-;8822:4;:9;;:85;;;;;;;;;;;8673:249;8959:15;8939:9;:17;;;:35;;;:59;;;;;8997:1;8978:9;:16;;;:20;;;8939:59;8935:249;;;5247:15;9038:9;:16;;;9031:35;;;;:::i;:::-;9018:4;:10;;:48;;;;;;;;;;;9151:15;9124:9;:17;;;:43;;;;:::i;:::-;9116:52;;9096:4;:10;;;:73;;;;:::i;:::-;9084:4;:9;;:85;;;;;;;;;;;8935:249;9442:15;:34;9458:9;:17;;;9442:34;;;;;;;;;;;;;;;;;;;;;;;;;9430:46;;9514:1;9494:9;:17;;;:21;;;9490:258;;;9560:9;:17;;;9539:38;;:9;:17;;;:38;;;9535:199;;9613:9;9601:21;;9535:199;;;9681:15;:34;9697:9;:17;;;9681:34;;;;;;;;;;;;;;;;;;;;;;;;;9669:46;;9535:199;9490:258;8543:1215;9768:28;;:::i;:::-;9824:1;9810:11;:15;9806:284;;;9853:15;:28;9869:11;9853:28;;;;;;;;;;;9841:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9806:284;;;10012:67;;;;;;;;10024:1;10012:67;;;;;;10027:1;10012:67;;;;;;10037:15;10012:67;;;;;;10062:12;10012:67;;;;;;10077:1;10012:67;;;;;10000:79;;9806:284;10099:21;10123:9;:12;;;10099:36;;10323:31;10357:9;10323:43;;10376:19;10440:9;:12;;;10422:30;;:15;:30;10418:364;;;10758:9;:12;;;10740:30;;:15;:30;;;;:::i;:::-;10706:9;:21;;;10691:36;;:12;:36;;;;:::i;:::-;10676:4;:52;;;;:::i;:::-;10675:96;;;;:::i;:::-;10661:110;;10418:364;11076:12;5061:7;;11092:14;:21;;;;:::i;:::-;11091:30;;;;:::i;:::-;11076:45;;11140:9;11135:2059;11159:3;11155:1;:7;11135:2059;;;5061:7;11449:13;;;;11498;11541:15;11533:5;:23;;;11529:179;;;11595:15;11580:31;;11529:179;;;11667:15;:22;11683:5;11667:22;;;;;;;;;;;;;;;;;;;;;;;;;11658:31;;11529:179;11782:14;11774:5;:22;;;;:::i;:::-;11761:37;;11743:9;:15;;;:55;;;;:::i;:::-;11725:9;:14;;:73;;;;;;;:::i;:::-;;;;;;;;;;;;;;11835:6;11816:9;:15;;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;11880:1;11863:9;:14;;;:18;;;11859:190;;;12029:1;12012:9;:14;;:18;;;;;;;;;;;11859:190;12088:1;12070:9;:15;;;:19;;;12066:175;;;12221:1;12203:9;:15;;:19;;;;;;;;;;;12066:175;12275:5;12258:22;;12313:5;12298:9;:12;;:20;;;;;;;;;;;12520:4;12500:12;:15;;;12492:5;:23;;;;:::i;:::-;12484:32;;12470:11;:46;;;;:::i;:::-;12469:55;;;;:::i;:::-;12435:12;:24;;;:90;;;;:::i;:::-;12411:9;:21;;:114;;;;;;;;;;;12563:12;:20;;;12543:9;:17;;:40;;;;;;;;;;;12859:1;12844:16;;;;12913:15;12904:5;:24;;;12900:280;;12983:12;12952:9;:21;;:44;;;;;;;;;;;13038:9;13018;:17;;:29;;;;;;;;;;;13069:5;;;12900:280;13152:9;13121:15;:28;13137:11;13121:28;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11169:2025;11164:3;;;;;11135:2059;;;;10999:2205;13231:11;13214:14;:28;;;;13336:1;13317:21;;:7;:21;;;13313:452;;13510:4;:10;;;13497:4;:10;;;:23;;;;:::i;:::-;13477:9;:15;;:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;13566:4;:9;;;13554:4;:9;;;:21;;;;:::i;:::-;13535:9;:14;;:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;13612:1;13594:9;:15;;;:19;;;13590:77;;;13651:1;13633:9;:15;;:19;;;;;;;;;;;13590:77;13701:1;13684:9;:14;;;:18;;;13680:75;;;13739:1;13722:9;:14;;:18;;;;;;;;;;;13680:75;13313:452;13847:9;13816:15;:28;13832:11;13816:28;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13890:1;13871:21;;:7;:21;;;13867:1192;;14124:15;14104:9;:17;;;:35;;;14100:402;;;14249:4;:10;;;14236:23;;;;;:::i;:::-;;;14302:9;:17;;;14281:38;;:9;:17;;;:38;;;14277:147;;14356:4;:10;;;14343:23;;;;;:::i;:::-;;;14277:147;14478:9;14441:15;:34;14457:9;:17;;;14441:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;14100:402;14540:15;14520:9;:17;;;:35;;;:76;;;;;14579:9;:17;;;14559:37;;:9;:17;;;:37;;;14520:76;14516:302;;;14629:4;:10;;;14616:23;;;;;:::i;:::-;;;14733:9;14696:15;:34;14712:9;:17;;;14696:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;14516:302;14887:15;14870:4;:7;;:33;;;;;;;;;;;14943:12;14917:4;:16;;:39;;;;;;;;;;;14985:9;:16;;;14970:4;:12;;:31;;;;;;;;;;;15015:13;:22;15029:7;15015:22;;;;;;;;;;;;;;;15043:4;15015:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13867:1192;8368:6697;;;;;;;;;8200:6865;;;;:::o;31483:892::-;31572:15;31648:12;5061:7;;31664:9;:12;;;:19;;;;:::i;:::-;31663:28;;;;:::i;:::-;31648:43;;31706:9;31701:567;31725:3;31721:1;:7;31701:567;;;5061:7;31828:13;;;;31869;31908:2;31900:10;;:5;:10;;;31896:129;;;31938:2;31930:10;;31896:129;;;31988:15;:22;32004:5;31988:22;;;;;;;;;;;;;;;;;;;;;;;;;31979:31;;31896:129;32102:9;:12;;;32087:5;32081:34;;;;:::i;:::-;32074:42;;32056:9;:15;;;:60;;;;:::i;:::-;32038:9;:14;;:78;;;;;;;:::i;:::-;;;;;;;;;;;;;;32143:2;32134:11;;:5;:11;;;32130:55;;32165:5;;;32130:55;32217:6;32198:9;:15;;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;32252:5;32237:9;:12;;:20;;;;;;;;;;;31735:533;31730:3;;;;;31701:567;;;;32299:1;32282:9;:14;;;:18;;;32278:91;;;32342:9;:14;;;32326:32;;32316:42;;32278:91;31589:786;31483:892;;;;:::o;26991:471::-;27068:16;27096:19;27118:13;:22;27132:7;27118:22;;;;;;;;;;;;;;;:29;;;;27096:51;;27175:1;27161:11;:15;27157:299;;;27192:25;27220:13;:22;27234:7;27220:22;;;;;;;;;;;;;;;27257:1;27243:11;:15;;;;:::i;:::-;27220:39;;;;;;;;:::i;:::-;;;;;;;;;;;;27192:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27328:6;:9;;;27316:2;27310:28;;;;:::i;:::-;27303:36;;27288:6;:12;;;:51;;;;:::i;:::-;27273:6;:11;;:66;;;;;;;:::i;:::-;;;;;;;;;;;;;;27371:1;27357:6;:11;;;:15;;;27353:93;;;27418:6;:11;;;27411:19;;27392:39;;27353:93;27178:278;27157:299;27086:376;26991:471;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:9:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:92::-;2245:7;2289:5;2285:2;2274:21;2263:32;;2209:92;;;:::o;2307:115::-;2392:23;2409:5;2392:23;:::i;:::-;2387:3;2380:36;2307:115;;:::o;2428:101::-;2464:7;2504:18;2497:5;2493:30;2482:41;;2428:101;;;:::o;2535:115::-;2620:23;2637:5;2620:23;:::i;:::-;2615:3;2608:36;2535:115;;:::o;2656:118::-;2693:7;2733:34;2726:5;2722:46;2711:57;;2656:118;;;:::o;2780:::-;2867:24;2885:5;2867:24;:::i;:::-;2862:3;2855:37;2780:118;;:::o;2904:648::-;3101:4;3139:3;3128:9;3124:19;3116:27;;3153:69;3219:1;3208:9;3204:17;3195:6;3153:69;:::i;:::-;3232:70;3298:2;3287:9;3283:18;3274:6;3232:70;:::i;:::-;3312;3378:2;3367:9;3363:18;3354:6;3312:70;:::i;:::-;3392;3458:2;3447:9;3443:18;3434:6;3392:70;:::i;:::-;3472:73;3540:3;3529:9;3525:19;3516:6;3472:73;:::i;:::-;2904:648;;;;;;;;:::o;3558:118::-;3645:24;3663:5;3645:24;:::i;:::-;3640:3;3633:37;3558:118;;:::o;3682:222::-;3775:4;3813:2;3802:9;3798:18;3790:26;;3826:71;3894:1;3883:9;3879:17;3870:6;3826:71;:::i;:::-;3682:222;;;;:::o;3910:99::-;3962:6;3996:5;3990:12;3980:22;;3910:99;;;:::o;4015:169::-;4099:11;4133:6;4128:3;4121:19;4173:4;4168:3;4164:14;4149:29;;4015:169;;;;:::o;4190:246::-;4271:1;4281:113;4295:6;4292:1;4289:13;4281:113;;;4380:1;4375:3;4371:11;4365:18;4361:1;4356:3;4352:11;4345:39;4317:2;4314:1;4310:10;4305:15;;4281:113;;;4428:1;4419:6;4414:3;4410:16;4403:27;4252:184;4190:246;;;:::o;4442:102::-;4483:6;4534:2;4530:7;4525:2;4518:5;4514:14;4510:28;4500:38;;4442:102;;;:::o;4550:377::-;4638:3;4666:39;4699:5;4666:39;:::i;:::-;4721:71;4785:6;4780:3;4721:71;:::i;:::-;4714:78;;4801:65;4859:6;4854:3;4847:4;4840:5;4836:16;4801:65;:::i;:::-;4891:29;4913:6;4891:29;:::i;:::-;4886:3;4882:39;4875:46;;4642:285;4550:377;;;;:::o;4933:313::-;5046:4;5084:2;5073:9;5069:18;5061:26;;5133:9;5127:4;5123:20;5119:1;5108:9;5104:17;5097:47;5161:78;5234:4;5225:6;5161:78;:::i;:::-;5153:86;;4933:313;;;;:::o;5252:126::-;5289:7;5329:42;5322:5;5318:54;5307:65;;5252:126;;;:::o;5384:96::-;5421:7;5450:24;5468:5;5450:24;:::i;:::-;5439:35;;5384:96;;;:::o;5486:122::-;5559:24;5577:5;5559:24;:::i;:::-;5552:5;5549:35;5539:63;;5598:1;5595;5588:12;5539:63;5486:122;:::o;5614:139::-;5660:5;5698:6;5685:20;5676:29;;5714:33;5741:5;5714:33;:::i;:::-;5614:139;;;;:::o;5759:474::-;5827:6;5835;5884:2;5872:9;5863:7;5859:23;5855:32;5852:119;;;5890:79;;:::i;:::-;5852:119;6010:1;6035:53;6080:7;6071:6;6060:9;6056:22;6035:53;:::i;:::-;6025:63;;5981:117;6137:2;6163:53;6208:7;6199:6;6188:9;6184:22;6163:53;:::i;:::-;6153:63;;6108:118;5759:474;;;;;:::o;6239:329::-;6298:6;6347:2;6335:9;6326:7;6322:23;6318:32;6315:119;;;6353:79;;:::i;:::-;6315:119;6473:1;6498:53;6543:7;6534:6;6523:9;6519:22;6498:53;:::i;:::-;6488:63;;6444:117;6239:329;;;;:::o;6574:328::-;6693:4;6731:2;6720:9;6716:18;6708:26;;6744:71;6812:1;6801:9;6797:17;6788:6;6744:71;:::i;:::-;6825:70;6891:2;6880:9;6876:18;6867:6;6825:70;:::i;:::-;6574:328;;;;;:::o;6908:619::-;6985:6;6993;7001;7050:2;7038:9;7029:7;7025:23;7021:32;7018:119;;;7056:79;;:::i;:::-;7018:119;7176:1;7201:53;7246:7;7237:6;7226:9;7222:22;7201:53;:::i;:::-;7191:63;;7147:117;7303:2;7329:53;7374:7;7365:6;7354:9;7350:22;7329:53;:::i;:::-;7319:63;;7274:118;7431:2;7457:53;7502:7;7493:6;7482:9;7478:22;7457:53;:::i;:::-;7447:63;;7402:118;6908:619;;;;;:::o;7533:::-;7610:6;7618;7626;7675:2;7663:9;7654:7;7650:23;7646:32;7643:119;;;7681:79;;:::i;:::-;7643:119;7801:1;7826:53;7871:7;7862:6;7851:9;7847:22;7826:53;:::i;:::-;7816:63;;7772:117;7928:2;7954:53;7999:7;7990:6;7979:9;7975:22;7954:53;:::i;:::-;7944:63;;7899:118;8056:2;8082:53;8127:7;8118:6;8107:9;8103:22;8082:53;:::i;:::-;8072:63;;8027:118;7533:619;;;;;:::o;8158:86::-;8193:7;8233:4;8226:5;8222:16;8211:27;;8158:86;;;:::o;8250:112::-;8333:22;8349:5;8333:22;:::i;:::-;8328:3;8321:35;8250:112;;:::o;8368:214::-;8457:4;8495:2;8484:9;8480:18;8472:26;;8508:67;8572:1;8561:9;8557:17;8548:6;8508:67;:::i;:::-;8368:214;;;;:::o;8588:118::-;8675:24;8693:5;8675:24;:::i;:::-;8670:3;8663:37;8588:118;;:::o;8712:222::-;8805:4;8843:2;8832:9;8828:18;8820:26;;8856:71;8924:1;8913:9;8909:17;8900:6;8856:71;:::i;:::-;8712:222;;;;:::o;8940:120::-;9012:23;9029:5;9012:23;:::i;:::-;9005:5;9002:34;8992:62;;9050:1;9047;9040:12;8992:62;8940:120;:::o;9066:137::-;9111:5;9149:6;9136:20;9127:29;;9165:32;9191:5;9165:32;:::i;:::-;9066:137;;;;:::o;9209:327::-;9267:6;9316:2;9304:9;9295:7;9291:23;9287:32;9284:119;;;9322:79;;:::i;:::-;9284:119;9442:1;9467:52;9511:7;9502:6;9491:9;9487:22;9467:52;:::i;:::-;9457:62;;9413:116;9209:327;;;;:::o;9542:218::-;9633:4;9671:2;9660:9;9656:18;9648:26;;9684:69;9750:1;9739:9;9735:17;9726:6;9684:69;:::i;:::-;9542:218;;;;:::o;9766:105::-;9841:23;9858:5;9841:23;:::i;:::-;9836:3;9829:36;9766:105;;:::o;9877:::-;9952:23;9969:5;9952:23;:::i;:::-;9947:3;9940:36;9877:105;;:::o;9988:108::-;10065:24;10083:5;10065:24;:::i;:::-;10060:3;10053:37;9988:108;;:::o;10150:1038::-;10305:4;10300:3;10296:14;10392:4;10385:5;10381:16;10375:23;10411:61;10466:4;10461:3;10457:14;10443:12;10411:61;:::i;:::-;10320:162;10565:4;10558:5;10554:16;10548:23;10584:61;10639:4;10634:3;10630:14;10616:12;10584:61;:::i;:::-;10492:163;10735:4;10728:5;10724:16;10718:23;10754:61;10809:4;10804:3;10800:14;10786:12;10754:61;:::i;:::-;10665:160;10914:4;10907:5;10903:16;10897:23;10933:61;10988:4;10983:3;10979:14;10965:12;10933:61;:::i;:::-;10835:169;11089:4;11082:5;11078:16;11072:23;11108:63;11165:4;11160:3;11156:14;11142:12;11108:63;:::i;:::-;11014:167;10274:914;10150:1038;;:::o;11194:339::-;11345:4;11383:3;11372:9;11368:19;11360:27;;11397:129;11523:1;11512:9;11508:17;11499:6;11397:129;:::i;:::-;11194:339;;;;:::o;11539:474::-;11607:6;11615;11664:2;11652:9;11643:7;11639:23;11635:32;11632:119;;;11670:79;;:::i;:::-;11632:119;11790:1;11815:53;11860:7;11851:6;11840:9;11836:22;11815:53;:::i;:::-;11805:63;;11761:117;11917:2;11943:53;11988:7;11979:6;11968:9;11964:22;11943:53;:::i;:::-;11933:63;;11888:118;11539:474;;;;;:::o;12019:118::-;12090:22;12106:5;12090:22;:::i;:::-;12083:5;12080:33;12070:61;;12127:1;12124;12117:12;12070:61;12019:118;:::o;12143:135::-;12187:5;12225:6;12212:20;12203:29;;12241:31;12266:5;12241:31;:::i;:::-;12143:135;;;;:::o;12284:77::-;12321:7;12350:5;12339:16;;12284:77;;;:::o;12367:122::-;12440:24;12458:5;12440:24;:::i;:::-;12433:5;12430:35;12420:63;;12479:1;12476;12469:12;12420:63;12367:122;:::o;12495:139::-;12541:5;12579:6;12566:20;12557:29;;12595:33;12622:5;12595:33;:::i;:::-;12495:139;;;;:::o;12640:1053::-;12742:6;12750;12758;12766;12774;12782;12831:3;12819:9;12810:7;12806:23;12802:33;12799:120;;;12838:79;;:::i;:::-;12799:120;12958:1;12983:53;13028:7;13019:6;13008:9;13004:22;12983:53;:::i;:::-;12973:63;;12929:117;13085:2;13111:53;13156:7;13147:6;13136:9;13132:22;13111:53;:::i;:::-;13101:63;;13056:118;13213:2;13239:53;13284:7;13275:6;13264:9;13260:22;13239:53;:::i;:::-;13229:63;;13184:118;13341:2;13367:51;13410:7;13401:6;13390:9;13386:22;13367:51;:::i;:::-;13357:61;;13312:116;13467:3;13494:53;13539:7;13530:6;13519:9;13515:22;13494:53;:::i;:::-;13484:63;;13438:119;13596:3;13623:53;13668:7;13659:6;13648:9;13644:22;13623:53;:::i;:::-;13613:63;;13567:119;12640:1053;;;;;;;;:::o;13699:474::-;13767:6;13775;13824:2;13812:9;13803:7;13799:23;13795:32;13792:119;;;13830:79;;:::i;:::-;13792:119;13950:1;13975:53;14020:7;14011:6;14000:9;13996:22;13975:53;:::i;:::-;13965:63;;13921:117;14077:2;14103:53;14148:7;14139:6;14128:9;14124:22;14103:53;:::i;:::-;14093:63;;14048:118;13699:474;;;;;:::o;14179:180::-;14227:77;14224:1;14217:88;14324:4;14321:1;14314:15;14348:4;14345:1;14338:15;14365:320;14409:6;14446:1;14440:4;14436:12;14426:22;;14493:1;14487:4;14483:12;14514:18;14504:81;;14570:4;14562:6;14558:17;14548:27;;14504:81;14632:2;14624:6;14621:14;14601:18;14598:38;14595:84;;14651:18;;:::i;:::-;14595:84;14416:269;14365:320;;;:::o;14691:180::-;14739:77;14736:1;14729:88;14836:4;14833:1;14826:15;14860:4;14857:1;14850:15;14877:191;14917:3;14936:20;14954:1;14936:20;:::i;:::-;14931:25;;14970:20;14988:1;14970:20;:::i;:::-;14965:25;;15013:1;15010;15006:9;14999:16;;15034:3;15031:1;15028:10;15025:36;;;15041:18;;:::i;:::-;15025:36;14877:191;;;;:::o;15074:60::-;15102:3;15123:5;15116:12;;15074:60;;;:::o;15140:140::-;15189:9;15222:52;15240:33;15249:23;15266:5;15249:23;:::i;:::-;15240:33;:::i;:::-;15222:52;:::i;:::-;15209:65;;15140:140;;;:::o;15286:129::-;15372:36;15402:5;15372:36;:::i;:::-;15367:3;15360:49;15286:129;;:::o;15421:440::-;15569:4;15607:2;15596:9;15592:18;15584:26;;15620:71;15688:1;15677:9;15673:17;15664:6;15620:71;:::i;:::-;15701;15768:2;15757:9;15753:18;15744:6;15701:71;:::i;:::-;15782:72;15850:2;15839:9;15835:18;15826:6;15782:72;:::i;:::-;15421:440;;;;;;:::o;15867:109::-;15903:7;15943:26;15936:5;15932:38;15921:49;;15867:109;;;:::o;15982:140::-;16031:9;16064:52;16082:33;16091:23;16108:5;16091:23;:::i;:::-;16082:33;:::i;:::-;16064:52;:::i;:::-;16051:65;;15982:140;;;:::o;16128:129::-;16214:36;16244:5;16214:36;:::i;:::-;16209:3;16202:49;16128:129;;:::o;16263:330::-;16383:4;16421:2;16410:9;16406:18;16398:26;;16434:71;16502:1;16491:9;16487:17;16478:6;16434:71;:::i;:::-;16515;16582:2;16571:9;16567:18;16558:6;16515:71;:::i;:::-;16263:330;;;;;:::o;16599:90::-;16634:7;16677:5;16674:1;16663:20;16652:31;;16599:90;;;:::o;16695:323::-;16733:4;16753:18;16769:1;16753:18;:::i;:::-;16748:23;;16785:18;16801:1;16785:18;:::i;:::-;16780:23;;16827:1;16824;16820:9;16812:17;;16959:18;16953:4;16949:29;16868:66;16862:4;16858:77;16842:146;16839:172;;;16991:18;;:::i;:::-;16839:172;16695:323;;;;:::o;17024:275::-;17063:7;17086:19;17103:1;17086:19;:::i;:::-;17081:24;;17119:19;17136:1;17119:19;:::i;:::-;17114:24;;17173:1;17170;17166:9;17195:29;17212:11;17195:29;:::i;:::-;17184:40;;17256:11;17247:7;17244:24;17234:58;;17272:18;;:::i;:::-;17234:58;17071:228;17024:275;;;;:::o;17305:342::-;17344:4;17364:19;17381:1;17364:19;:::i;:::-;17359:24;;17397:19;17414:1;17397:19;:::i;:::-;17392:24;;17440:1;17437;17433:9;17425:17;;17572:34;17566:4;17562:45;17481:66;17475:4;17471:77;17455:162;17452:188;;;17620:18;;:::i;:::-;17452:188;17305:342;;;;:::o;17653:332::-;17774:4;17812:2;17801:9;17797:18;17789:26;;17825:71;17893:1;17882:9;17878:17;17869:6;17825:71;:::i;:::-;17906:72;17974:2;17963:9;17959:18;17950:6;17906:72;:::i;:::-;17653:332;;;;;:::o;17991:::-;18112:4;18150:2;18139:9;18135:18;18127:26;;18163:71;18231:1;18220:9;18216:17;18207:6;18163:71;:::i;:::-;18244:72;18312:2;18301:9;18297:18;18288:6;18244:72;:::i;:::-;17991:332;;;;;:::o;18329:116::-;18399:21;18414:5;18399:21;:::i;:::-;18392:5;18389:32;18379:60;;18435:1;18432;18425:12;18379:60;18329:116;:::o;18451:137::-;18505:5;18536:6;18530:13;18521:22;;18552:30;18576:5;18552:30;:::i;:::-;18451:137;;;;:::o;18594:345::-;18661:6;18710:2;18698:9;18689:7;18685:23;18681:32;18678:119;;;18716:79;;:::i;:::-;18678:119;18836:1;18861:61;18914:7;18905:6;18894:9;18890:22;18861:61;:::i;:::-;18851:71;;18807:125;18594:345;;;;:::o;18945:180::-;18993:77;18990:1;18983:88;19090:4;19087:1;19080:15;19114:4;19111:1;19104:15;19131:205;19170:3;19189:19;19206:1;19189:19;:::i;:::-;19184:24;;19222:19;19239:1;19222:19;:::i;:::-;19217:24;;19264:1;19261;19257:9;19250:16;;19287:18;19282:3;19279:27;19276:53;;;19309:18;;:::i;:::-;19276:53;19131:205;;;;:::o;19342:442::-;19491:4;19529:2;19518:9;19514:18;19506:26;;19542:71;19610:1;19599:9;19595:17;19586:6;19542:71;:::i;:::-;19623:72;19691:2;19680:9;19676:18;19667:6;19623:72;:::i;:::-;19705;19773:2;19762:9;19758:18;19749:6;19705:72;:::i;:::-;19342:442;;;;;;:::o;19790:180::-;19838:77;19835:1;19828:88;19935:4;19932:1;19925:15;19959:4;19956:1;19949:15;19976:194;20016:4;20036:20;20054:1;20036:20;:::i;:::-;20031:25;;20070:20;20088:1;20070:20;:::i;:::-;20065:25;;20114:1;20111;20107:9;20099:17;;20138:1;20132:4;20129:11;20126:37;;;20143:18;;:::i;:::-;20126:37;19976:194;;;;:::o;20176:442::-;20325:4;20363:2;20352:9;20348:18;20340:26;;20376:71;20444:1;20433:9;20429:17;20420:6;20376:71;:::i;:::-;20457:72;20525:2;20514:9;20510:18;20501:6;20457:72;:::i;:::-;20539;20607:2;20596:9;20592:18;20583:6;20539:72;:::i;:::-;20176:442;;;;;;:::o;20624:180::-;20672:77;20669:1;20662:88;20769:4;20766:1;20759:15;20793:4;20790:1;20783:15;20810:121;20899:1;20892:5;20889:12;20879:46;;20905:18;;:::i;:::-;20879:46;20810:121;:::o;20937:143::-;20990:7;21019:5;21008:16;;21025:49;21068:5;21025:49;:::i;:::-;20937:143;;;:::o;21086:::-;21150:9;21183:40;21217:5;21183:40;:::i;:::-;21170:53;;21086:143;;;:::o;21235:159::-;21336:51;21381:5;21336:51;:::i;:::-;21331:3;21324:64;21235:159;;:::o;21400:579::-;21590:4;21628:3;21617:9;21613:19;21605:27;;21642:71;21710:1;21699:9;21695:17;21686:6;21642:71;:::i;:::-;21723;21790:2;21779:9;21775:18;21766:6;21723:71;:::i;:::-;21804:86;21886:2;21875:9;21871:18;21862:6;21804:86;:::i;:::-;21900:72;21968:2;21957:9;21953:18;21944:6;21900:72;:::i;:::-;21400:579;;;;;;;:::o;21985:185::-;22025:1;22042:20;22060:1;22042:20;:::i;:::-;22037:25;;22076:20;22094:1;22076:20;:::i;:::-;22071:25;;22115:1;22105:35;;22120:18;;:::i;:::-;22105:35;22162:1;22159;22155:9;22150:14;;21985:185;;;;:::o;22176:208::-;22215:4;22235:19;22252:1;22235:19;:::i;:::-;22230:24;;22268:19;22285:1;22268:19;:::i;:::-;22263:24;;22311:1;22308;22304:9;22296:17;;22335:18;22329:4;22326:28;22323:54;;;22357:18;;:::i;:::-;22323:54;22176:208;;;;:::o;22390:410::-;22430:7;22453:20;22471:1;22453:20;:::i;:::-;22448:25;;22487:20;22505:1;22487:20;:::i;:::-;22482:25;;22542:1;22539;22535:9;22564:30;22582:11;22564:30;:::i;:::-;22553:41;;22743:1;22734:7;22730:15;22727:1;22724:22;22704:1;22697:9;22677:83;22654:139;;22773:18;;:::i;:::-;22654:139;22438:362;22390:410;;;;:::o;22806:385::-;22845:1;22862:19;22879:1;22862:19;:::i;:::-;22857:24;;22895:19;22912:1;22895:19;:::i;:::-;22890:24;;22933:1;22923:35;;22938:18;;:::i;:::-;22923:35;23124:1;23121;23117:9;23114:1;23111:16;23030:66;23027:1;23024:73;23007:130;23004:156;;;23140:18;;:::i;:::-;23004:156;23183:1;23180;23175:10;23170:15;;22806:385;;;;:::o;23197:182::-;23236:1;23253:19;23270:1;23253:19;:::i;:::-;23248:24;;23286:19;23303:1;23286:19;:::i;:::-;23281:24;;23324:1;23314:35;;23329:18;;:::i;:::-;23314:35;23371:1;23368;23364:9;23359:14;;23197:182;;;;:::o;23385:275::-;23424:7;23447:19;23464:1;23447:19;:::i;:::-;23442:24;;23480:19;23497:1;23480:19;:::i;:::-;23475:24;;23534:1;23531;23527:9;23556:29;23573:11;23556:29;:::i;:::-;23545:40;;23617:11;23608:7;23605:24;23595:58;;23633:18;;:::i;:::-;23595:58;23432:228;23385:275;;;;:::o;23666:338::-;23705:3;23724:19;23741:1;23724:19;:::i;:::-;23719:24;;23757:19;23774:1;23757:19;:::i;:::-;23752:24;;23799:1;23796;23792:9;23785:16;;23897:66;23892:3;23888:76;23839:34;23834:3;23830:44;23814:160;23811:186;;;23977:18;;:::i;:::-;23811:186;23666:338;;;;:::o", "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"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\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"curTime\",\"type\":\"uint256\"}],\"name\":\"LockNotExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LockedValueNotZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"MaxUnlockTimeReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NoValueLocked\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonDelegatable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NonTransferable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonZeroValue\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minUnlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedUnlockTime\",\"type\":\"uint256\"}],\"name\":\"UnlockTimeIncorrect\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numValues1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numValues2\",\"type\":\"uint256\"}],\"name\":\"WrongArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providedBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualBlockNumber\",\"type\":\"uint256\"}],\"name\":\"WrongBlockNumber\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValue\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"locktime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enumveOLAS.DepositType\",\"name\":\"depositType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ts\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousSupply\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currentSupply\",\"type\":\"uint256\"}],\"name\":\"Supply\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ts\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"balanceOfAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockTime\",\"type\":\"uint256\"}],\"name\":\"createLock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockTime\",\"type\":\"uint256\"}],\"name\":\"createLockFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getLastUserPoint\",\"outputs\":[{\"components\":[{\"internalType\":\"int128\",\"name\":\"bias\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"slope\",\"type\":\"int128\"},{\"internalType\":\"uint64\",\"name\":\"ts\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"internalType\":\"structPointVoting\",\"name\":\"pv\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getNumUserPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"accountNumPoints\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getUserPoint\",\"outputs\":[{\"components\":[{\"internalType\":\"int128\",\"name\":\"bias\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"slope\",\"type\":\"int128\"},{\"internalType\":\"uint64\",\"name\":\"ts\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"internalType\":\"structPointVoting\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"increaseAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"unlockTime\",\"type\":\"uint256\"}],\"name\":\"increaseUnlockTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"lockedEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"mapLockedBalances\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"mapSlopeChanges\",\"outputs\":[{\"internalType\":\"int128\",\"name\":\"\",\"type\":\"int128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mapSupplyPoints\",\"outputs\":[{\"internalType\":\"int128\",\"name\":\"bias\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"slope\",\"type\":\"int128\"},{\"internalType\":\"uint64\",\"name\":\"ts\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mapUserPoints\",\"outputs\":[{\"internalType\":\"int128\",\"name\":\"bias\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"slope\",\"type\":\"int128\"},{\"internalType\":\"uint64\",\"name\":\"ts\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalNumPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"totalSupplyAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupplyLocked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ts\",\"type\":\"uint256\"}],\"name\":\"totalSupplyLockedAtT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", "bin": "60a060405234801562000010575f80fd5b50604051620055a9380380620055a9833981810160405281019062000036919062000400565b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505081600690816200007b9190620006ce565b5080600790816200008d9190620006ce565b506040518060a001604052805f600f0b81526020015f600f0b81526020014267ffffffffffffffff1681526020014367ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525060035f8081526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050505050620007b2565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000256826200022b565b9050919050565b62000268816200024a565b811462000273575f80fd5b50565b5f8151905062000286816200025d565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620002dc8262000294565b810181811067ffffffffffffffff82111715620002fe57620002fd620002a4565b5b80604052505050565b5f620003126200021a565b9050620003208282620002d1565b919050565b5f67ffffffffffffffff821115620003425762000341620002a4565b5b6200034d8262000294565b9050602081019050919050565b5f5b83811015620003795780820151818401526020810190506200035c565b5f8484015250505050565b5f6200039a620003948462000325565b62000307565b905082815260208101848484011115620003b957620003b862000290565b5b620003c68482856200035a565b509392505050565b5f82601f830112620003e557620003e46200028c565b5b8151620003f784826020860162000384565b91505092915050565b5f805f606084860312156200041a576200041962000223565b5b5f620004298682870162000276565b935050602084015167ffffffffffffffff8111156200044d576200044c62000227565b5b6200045b86828701620003ce565b925050604084015167ffffffffffffffff8111156200047f576200047e62000227565b5b6200048d86828701620003ce565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004e657607f821691505b602082108103620004fc57620004fb620004a1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000523565b6200056c868362000523565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005b6620005b0620005aa8462000584565b6200058d565b62000584565b9050919050565b5f819050919050565b620005d18362000596565b620005e9620005e082620005bd565b8484546200052f565b825550505050565b5f90565b620005ff620005f1565b6200060c818484620005c6565b505050565b5b818110156200063357620006275f82620005f5565b60018101905062000612565b5050565b601f82111562000682576200064c8162000502565b620006578462000514565b8101602085101562000667578190505b6200067f620006768562000514565b83018262000611565b50505b505050565b5f82821c905092915050565b5f620006a45f198460080262000687565b1980831691505092915050565b5f620006be838362000693565b9150826002028217905092915050565b620006d98262000497565b67ffffffffffffffff811115620006f557620006f4620002a4565b5b620007018254620004ce565b6200070e82828562000637565b5f60209050601f83116001811462000744575f84156200072f578287015190505b6200073b8582620006b1565b865550620007aa565b601f198416620007548662000502565b5f5b828110156200077d5784890151825560018201915060208501945060208101905062000756565b868310156200079d578489015162000799601f89168262000693565b8355505b6001600288020188555050505b505050505050565b608051614dd0620007d95f395f818161136f01528181611fde015261218a0152614dd05ff3fe608060405234801561000f575f80fd5b5060043610610230575f3560e01c8063587cde1e1161012e5780639ab24eb0116100b6578063c2c4c5c11161007a578063c2c4c5c114610751578063c3cda5201461075b578063c4698ee514610777578063dd62ed3e146107a7578063fc0c546a146107d757610230565b80639ab24eb014610675578063a9059cbb146106a5578063b0a34fdd146106d5578063b18f270214610705578063b52c05fe1461073557610230565b806378888dbf116100fd57806378888dbf146105ab5780637c616fe6146105db5780638e539e8c146105f757806395d89b4114610627578063981b24d01461064557610230565b8063587cde1e146104fb5780635c19a95c1461052b57806370a082311461054757806370ab0a841461057757610230565b806329b55ca7116101bc578063474177ec11610180578063474177ec1461042f5780634deafcae1461044d5780634ee2cd7e1461047d57806353acfabd146104ad57806358341922146104dd57610230565b806329b55ca71461039f5780632f4f21e2146103bb578063313ce567146103d75780633a46b1a8146103f55780633ccfd60b1461042557610230565b8063095ea7b311610203578063095ea7b3146102d457806315456eba1461030457806318160ddd1461032057806318b213481461033e57806323b872dd1461036f57610230565b806301ffc9a714610234578063025fc7d814610264578063047fc9aa1461029857806306fdde03146102b6575b5f80fd5b61024e60048036038101906102499190613fd9565b6107f5565b60405161025b919061401e565b60405180910390f35b61027e6004803603810190610279919061406a565b61092e565b60405161028f9594939291906140fc565b60405180910390f35b6102a06109bb565b6040516102ad919061415c565b60405180910390f35b6102be6109c0565b6040516102cb91906141ff565b60405180910390f35b6102ee60048036038101906102e99190614279565b610a4c565b6040516102fb919061401e565b60405180910390f35b61031e6004803603810190610319919061406a565b610a8a565b005b610328610cba565b604051610335919061415c565b60405180910390f35b610358600480360381019061035391906142b7565b610cc2565b6040516103669291906142e2565b60405180910390f35b61038960048036038101906103849190614309565b610d10565b604051610396919061401e565b60405180910390f35b6103b960048036038101906103b49190614359565b610d4e565b005b6103d560048036038101906103d09190614279565b610dc3565b005b6103df610ff3565b6040516103ec91906143c4565b60405180910390f35b61040f600480360381019061040a9190614279565b610ff8565b60405161041c919061415c565b60405180910390f35b61042d611084565b005b61043761140f565b604051610444919061415c565b60405180910390f35b610467600480360381019061046291906142b7565b611415565b604051610474919061415c565b60405180910390f35b61049760048036038101906104929190614279565b61147b565b6040516104a4919061415c565b60405180910390f35b6104c760048036038101906104c291906142b7565b6114cd565b6040516104d4919061415c565b60405180910390f35b6104e5611516565b6040516104f2919061415c565b60405180910390f35b610515600480360381019061051091906142b7565b611525565b60405161052291906143ec565b60405180910390f35b610545600480360381019061054091906142b7565b611563565b005b610561600480360381019061055c91906142b7565b6115a0565b60405161056e919061415c565b60405180910390f35b610591600480360381019061058c9190614279565b611615565b6040516105a29594939291906140fc565b60405180910390f35b6105c560048036038101906105c0919061442f565b6116bc565b6040516105d2919061445a565b60405180910390f35b6105f560048036038101906105f0919061406a565b6116d9565b005b610611600480360381019061060c919061406a565b61196e565b60405161061e919061415c565b60405180910390f35b61062f611991565b60405161063c91906141ff565b60405180910390f35b61065f600480360381019061065a919061406a565b611a1d565b60405161066c919061415c565b60405180910390f35b61068f600480360381019061068a91906142b7565b611a6e565b60405161069c919061415c565b60405180910390f35b6106bf60048036038101906106ba9190614279565b611a80565b6040516106cc919061401e565b60405180910390f35b6106ef60048036038101906106ea9190614279565b611abe565b6040516106fc9190614506565b60405180910390f35b61071f600480360381019061071a919061406a565b611c18565b60405161072c919061415c565b60405180910390f35b61074f600480360381019061074a919061451f565b611d30565b005b610759611d3f565b005b610775600480360381019061077091906145ba565b611dae565b005b610791600480360381019061078c91906142b7565b611deb565b60405161079e9190614506565b60405180910390f35b6107c160048036038101906107bc9190614643565b611f9e565b6040516107ce919061415c565b60405180910390f35b6107df611fdc565b6040516107ec91906143ec565b60405180910390f35b5f7f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bf57507fe90fb3f6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092757507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6003602052805f5260405f205f91509050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b5f5481565b600680546109cd906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546109f9906146ae565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b505050505081565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610a8191906143ec565b60405180910390fd5b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610b87576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610be057336040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610bd791906143ec565b60405180910390fd5b600142610bed919061470b565b816020015167ffffffffffffffff161015610c4757338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610c3e93929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610ca857816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610c9f9291906147f3565b60405180910390fd5b610cb633835f846002612000565b5050565b5f8054905090565b6001602052805f5260405f205f91509050805f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690805f0160109054906101000a900467ffffffffffffffff16905082565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610d4591906143ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610db3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dbe8383836122c2565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610ec0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610f1957826040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610f1091906143ec565b60405180910390fd5b600142610f26919061470b565b816020015167ffffffffffffffff161015610f8057338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610f7793929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610fe157816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610fd89291906147f3565b60405180910390fd5b610fee83835f845f612000565b505050565b601281565b5f806110048385612592565b5090505f61101184612bd3565b9150508160400151816110249190614826565b60070b82602001516110369190614885565b825f0181815161104691906148c1565b915090600f0b9081600f0b815250505f825f0151600f0b131561107c57815f01516fffffffffffffffffffffffffffffffff1692505b505092915050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905042816020015167ffffffffffffffff1611156111a357338160200151426040517fab0246b300000000000000000000000000000000000000000000000000000000815260040161119a93929190614777565b60405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff16905060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505f805490505f8282039050805f819055506112e4338560405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525084612e2f565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568844260405161132c929190614928565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c8282604051611365929190614928565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016113c892919061494f565b6020604051808303815f875af11580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140891906149a0565b5050505050565b60025481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160109054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b5f806114878385612592565b509050600183611497919061470b565b816060015167ffffffffffffffff1610156114c65780608001516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b5f61152042611c18565b905090565b5f306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161155a91906143ec565b60405180910390fd5b306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161159791906143ec565b60405180910390fd5b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6004602052815f5260405f20818154811061162e575f80fd5b905f5260205f2090600202015f9150915050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b6005602052805f5260405f205f915054906101000a9004600f0b81565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905062093a8067ffffffffffffffff1662093a8067ffffffffffffffff16834201816117ca576117c96149cb565b5b040291505f815f01516fffffffffffffffffffffffffffffffff160361182757336040517f1ff847b600000000000000000000000000000000000000000000000000000000815260040161181e91906143ec565b60405180910390fd5b600142611834919061470b565b816020015167ffffffffffffffff16101561188e57338160200151426040517fd78507e100000000000000000000000000000000000000000000000000000000815260040161188593929190614777565b60405180910390fd5b6001816020015161189f91906149f8565b67ffffffffffffffff168210156118f557338160200151836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016118ec93929190614777565b60405180910390fd5b630784ce0042611905919061470b565b82111561195c5733630784ce004261191d919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161195393929190614a33565b60405180910390fd5b61196a335f84846003612000565b5050565b5f805f61197a84612bd3565b915091506119888282613b81565b92505050919050565b6007805461199e906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca906146ae565b8015611a155780601f106119ec57610100808354040283529160200191611a15565b820191905f5260205f20905b8154815290600101906020018083116119f857829003601f168201915b505050505081565b5f80611a29835f612592565b509050600183611a39919061470b565b816060015167ffffffffffffffff161015611a685780608001516fffffffffffffffffffffffffffffffff1691505b50919050565b5f611a798242613cee565b9050919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611ab591906143ec565b60405180910390fd5b611ac6613ef6565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110611b1557611b14614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905092915050565b5f8060035f60025481526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050611d288184613b81565b915050919050565b611d3b3383836122c2565b5050565b611dac5f60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff168152505f54612e2f565b565b306040517f535db4ec000000000000000000000000000000000000000000000000000000008152600401611de291906143ec565b60405180910390fd5b611df3613ef6565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115611f985760045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182611e899190614a95565b81548110611e9a57611e99614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505091505b50919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611fd391906143ec565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805490505f8582019050805f81905550612019613f4c565b845f01518560200151825f01836020018267ffffffffffffffff1667ffffffffffffffff16815250826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250505086855f01818151019150906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250505f8611156120c95785856020019067ffffffffffffffff16908167ffffffffffffffff16815250505b8460015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505061218088828785612e2f565b5f871115612227577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff1660e01b81526004016121e593929190614ac8565b6020604051808303815f875af1158015612201573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222591906149a0565b505b8773ffffffffffffffffffffffffffffffffffffffff167fbe9cf0e939c614fad640a623a53ba0a807c8cb503c4c4c8dacabe27b86ff2dd588876020015187426040516122779493929190614b70565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c83836040516122b0929190614928565b60405180910390a15050505050505050565b5f82036122fb576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff1662093a8067ffffffffffffffff1682420181612328576123276149cb565b5b040290505f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f815f01516fffffffffffffffffffffffffffffffff1611156124615783815f01516fffffffffffffffffffffffffffffffff166040517f89bf64dd00000000000000000000000000000000000000000000000000000000815260040161245892919061494f565b60405180910390fd5b60014261246e919061470b565b8210156124b6578342836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016124ad93929190614a33565b60405180910390fd5b630784ce00426124c6919061470b565b82111561251d5783630784ce00426124de919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161251493929190614a33565b60405180910390fd5b6bffffffffffffffffffffffff801683111561257e57826bffffffffffffffffffffffff6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016125759291906147f3565b60405180910390fd5b61258c848484846001612000565b50505050565b61259a613ef6565b5f805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125d9576002549050612630565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81036126295750612bcc565b6001810390505b5f5b60808110156129425781600184612649919061470b565b11612942575f60026001848661265f919061470b565b612669919061470b565b6126739190614bb3565b90505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036127af5760035f8281526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094506128fc565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081815481106127fe576127fd614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094505b600187612909919061470b565b856060015167ffffffffffffffff16101561292657809350612936565b6001816129339190614a95565b92505b50806001019050612632565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509250612bca565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110612acc57612acb614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505092505b505b9250929050565b612bdb613ef6565b5f43831115612c235782436040517f8633967e000000000000000000000000000000000000000000000000000000008152600401612c1a929190614928565b60405180910390fd5b5f612c2e845f612592565b80925081945050505f80600254831015612d97575f60035f600186612c53919061470b565b81526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905085606001518160600151612d659190614be3565b67ffffffffffffffff16925085604001518160400151612d859190614be3565b67ffffffffffffffff16915050612dd0565b846060015167ffffffffffffffff1643612db19190614a95565b9150846040015167ffffffffffffffff1642612dcd9190614a95565b90505b846040015167ffffffffffffffff1693505f821115612e275781856060015167ffffffffffffffff1687612e049190614a95565b82612e0f9190614c1e565b612e199190614bb3565b84612e24919061470b565b93505b505050915091565b612e37613ef6565b612e3f613ef6565b5f805f60025490505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146130565742886020015167ffffffffffffffff16118015612eab57505f885f01516fffffffffffffffffffffffffffffffff16115b15612f0e57630784ce00885f0151612ec39190614c5f565b8560200190600f0b9081600f0b81525050428860200151612ee49190614be3565b67ffffffffffffffff168560200151612efd9190614885565b855f0190600f0b9081600f0b815250505b42876020015167ffffffffffffffff16118015612f3f57505f875f01516fffffffffffffffffffffffffffffffff16115b15612fa257630784ce00875f0151612f579190614c5f565b8460200190600f0b9081600f0b81525050428760200151612f789190614be3565b67ffffffffffffffff168460200151612f919190614885565b845f0190600f0b9081600f0b815250505b60055f896020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b92505f876020015167ffffffffffffffff16111561305557876020015167ffffffffffffffff16876020015167ffffffffffffffff160361301b57829150613054565b60055f886020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b91505b5b5b61305e613ef6565b5f82111561316d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506131c3565b6040518060a001604052805f600f0b81526020015f600f0b81526020014267ffffffffffffffff1681526020014367ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090505b5f816040015190505f8290505f836040015167ffffffffffffffff1642111561323a57836040015167ffffffffffffffff16426132009190614a95565b846060015167ffffffffffffffff164361321a9190614a95565b670de0b6b3a764000061322d9190614c1e565b6132379190614bb3565b90505b5f62093a80808561324b9190614cc7565b6132559190614cf7565b90505f5b60ff8110156135c15762093a80820191505f428367ffffffffffffffff161115613285574292506132ba565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b85836132c69190614be3565b60070b87602001516132d89190614885565b875f018181516132e891906148c1565b915090600f0b9081600f0b8152505080876020018181516133099190614d33565b915090600f0b9081600f0b815250505f875f0151600f0b1215613338575f875f0190600f0b9081600f0b815250505b5f8760200151600f0b121561335a575f8760200190600f0b9081600f0b815250505b82955082876040019067ffffffffffffffff16908167ffffffffffffffff1681525050670de0b6b3a76400008560400151846133969190614be3565b67ffffffffffffffff16856133ab9190614c1e565b6133b59190614bb3565b85606001516133c491906149f8565b876060019067ffffffffffffffff16908167ffffffffffffffff1681525050846080015187608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050600188019750428367ffffffffffffffff16036134845743876060019067ffffffffffffffff16908167ffffffffffffffff16815250508c87608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050506135c1565b8660035f8a81526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505050806001019050613259565b5050846002819055505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146136a5578860200151886020015161361191906148c1565b846020018181516136229190614d33565b915090600f0b9081600f0b81525050885f0151885f015161364391906148c1565b845f018181516136539190614d33565b915090600f0b9081600f0b815250505f8460200151600f0b1215613684575f8460200190600f0b9081600f0b815250505b5f845f0151600f0b12156136a4575f845f0190600f0b9081600f0b815250505b5b8360035f8781526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff1614613b7257428c6020015167ffffffffffffffff1611156138ca5788602001518761382f9190614d33565b96508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16036138675787602001518761386491906148c1565b96505b8660055f8e6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b428b6020015167ffffffffffffffff1611801561390257508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16115b1561397c5787602001518661391791906148c1565b95508560055f8d6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b42886040019067ffffffffffffffff16908167ffffffffffffffff168152505043886060019067ffffffffffffffff16908167ffffffffffffffff16815250508a5f015188608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505060045f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2088908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b50505050505050505050505050565b5f8062093a80808560400151613b979190614cc7565b613ba19190614cf7565b90505f5b60ff811015613cbf5762093a80820191505f8467ffffffffffffffff168367ffffffffffffffff161115613bdb57849250613c10565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b856040015183613c209190614826565b60070b8660200151613c329190614885565b865f01818151613c4291906148c1565b915090600f0b9081600f0b815250508467ffffffffffffffff168367ffffffffffffffff1603613c725750613cbf565b8086602001818151613c849190614d33565b915090600f0b9081600f0b8152505082866040019067ffffffffffffffff16908167ffffffffffffffff168152505050806001019050613ba5565b505f845f0151600f0b1315613ce757835f01516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115613eef575f60045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183613d869190614a95565b81548110613d9757613d96614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050806040015184613ea49190614826565b60070b8160200151613eb69190614885565b815f01818151613ec691906148c1565b915090600f0b9081600f0b815250505f815f0151600f0b1315613eed57805f0151600f0b92505b505b5092915050565b6040518060a001604052805f600f0b81526020015f600f0b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090565b60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fb881613f84565b8114613fc2575f80fd5b50565b5f81359050613fd381613faf565b92915050565b5f60208284031215613fee57613fed613f80565b5b5f613ffb84828501613fc5565b91505092915050565b5f8115159050919050565b61401881614004565b82525050565b5f6020820190506140315f83018461400f565b92915050565b5f819050919050565b61404981614037565b8114614053575f80fd5b50565b5f8135905061406481614040565b92915050565b5f6020828403121561407f5761407e613f80565b5b5f61408c84828501614056565b91505092915050565b5f81600f0b9050919050565b6140aa81614095565b82525050565b5f67ffffffffffffffff82169050919050565b6140cc816140b0565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6140f6816140d2565b82525050565b5f60a08201905061410f5f8301886140a1565b61411c60208301876140a1565b61412960408301866140c3565b61413660608301856140c3565b61414360808301846140ed565b9695505050505050565b61415681614037565b82525050565b5f60208201905061416f5f83018461414d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156141ac578082015181840152602081019050614191565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6141d182614175565b6141db818561417f565b93506141eb81856020860161418f565b6141f4816141b7565b840191505092915050565b5f6020820190508181035f83015261421781846141c7565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6142488261421f565b9050919050565b6142588161423e565b8114614262575f80fd5b50565b5f813590506142738161424f565b92915050565b5f806040838503121561428f5761428e613f80565b5b5f61429c85828601614265565b92505060206142ad85828601614056565b9150509250929050565b5f602082840312156142cc576142cb613f80565b5b5f6142d984828501614265565b91505092915050565b5f6040820190506142f55f8301856140ed565b61430260208301846140c3565b9392505050565b5f805f606084860312156143205761431f613f80565b5b5f61432d86828701614265565b935050602061433e86828701614265565b925050604061434f86828701614056565b9150509250925092565b5f805f606084860312156143705761436f613f80565b5b5f61437d86828701614265565b935050602061438e86828701614056565b925050604061439f86828701614056565b9150509250925092565b5f60ff82169050919050565b6143be816143a9565b82525050565b5f6020820190506143d75f8301846143b5565b92915050565b6143e68161423e565b82525050565b5f6020820190506143ff5f8301846143dd565b92915050565b61440e816140b0565b8114614418575f80fd5b50565b5f8135905061442981614405565b92915050565b5f6020828403121561444457614443613f80565b5b5f6144518482850161441b565b91505092915050565b5f60208201905061446d5f8301846140a1565b92915050565b61447c81614095565b82525050565b61448b816140b0565b82525050565b61449a816140d2565b82525050565b60a082015f8201516144b45f850182614473565b5060208201516144c76020850182614473565b5060408201516144da6040850182614482565b5060608201516144ed6060850182614482565b5060808201516145006080850182614491565b50505050565b5f60a0820190506145195f8301846144a0565b92915050565b5f806040838503121561453557614534613f80565b5b5f61454285828601614056565b925050602061455385828601614056565b9150509250929050565b614566816143a9565b8114614570575f80fd5b50565b5f813590506145818161455d565b92915050565b5f819050919050565b61459981614587565b81146145a3575f80fd5b50565b5f813590506145b481614590565b92915050565b5f805f805f8060c087890312156145d4576145d3613f80565b5b5f6145e189828a01614265565b96505060206145f289828a01614056565b955050604061460389828a01614056565b945050606061461489828a01614573565b935050608061462589828a016145a6565b92505060a061463689828a016145a6565b9150509295509295509295565b5f806040838503121561465957614658613f80565b5b5f61466685828601614265565b925050602061467785828601614265565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146c557607f821691505b6020821081036146d8576146d7614681565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61471582614037565b915061472083614037565b9250828201905080821115614738576147376146de565b5b92915050565b5f819050919050565b5f61476161475c614757846140b0565b61473e565b614037565b9050919050565b61477181614747565b82525050565b5f60608201905061478a5f8301866143dd565b6147976020830185614768565b6147a4604083018461414d565b949350505050565b5f6bffffffffffffffffffffffff82169050919050565b5f6147dd6147d86147d3846147ac565b61473e565b614037565b9050919050565b6147ed816147c3565b82525050565b5f6040820190506148065f83018561414d565b61481360208301846147e4565b9392505050565b5f8160070b9050919050565b5f6148308261481a565b915061483b8361481a565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561487f5761487e6146de565b5b92915050565b5f61488f82614095565b915061489a83614095565b92508282026148a881614095565b91508082146148ba576148b96146de565b5b5092915050565b5f6148cb82614095565b91506148d683614095565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff8000000000000000000000000000000082121715614922576149216146de565b5b92915050565b5f60408201905061493b5f83018561414d565b614948602083018461414d565b9392505050565b5f6040820190506149625f8301856143dd565b61496f602083018461414d565b9392505050565b61497f81614004565b8114614989575f80fd5b50565b5f8151905061499a81614976565b92915050565b5f602082840312156149b5576149b4613f80565b5b5f6149c28482850161498c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a02826140b0565b9150614a0d836140b0565b9250828201905067ffffffffffffffff811115614a2d57614a2c6146de565b5b92915050565b5f606082019050614a465f8301866143dd565b614a53602083018561414d565b614a60604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614a9f82614037565b9150614aaa83614037565b9250828203905081811115614ac257614ac16146de565b5b92915050565b5f606082019050614adb5f8301866143dd565b614ae860208301856143dd565b614af5604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60048110614b3b57614b3a614afd565b5b50565b5f819050614b4b82614b2a565b919050565b5f614b5a82614b3e565b9050919050565b614b6a81614b50565b82525050565b5f608082019050614b835f83018761414d565b614b906020830186614768565b614b9d6040830185614b61565b614baa606083018461414d565b95945050505050565b5f614bbd82614037565b9150614bc883614037565b925082614bd857614bd76149cb565b5b828204905092915050565b5f614bed826140b0565b9150614bf8836140b0565b9250828203905067ffffffffffffffff811115614c1857614c176146de565b5b92915050565b5f614c2882614037565b9150614c3383614037565b9250828202614c4181614037565b91508282048414831517614c5857614c576146de565b5b5092915050565b5f614c6982614095565b9150614c7483614095565b925082614c8457614c836149cb565b5b60015f0383147fffffffffffffffffffffffffffffffff8000000000000000000000000000000083141615614cbc57614cbb6146de565b5b828205905092915050565b5f614cd1826140b0565b9150614cdc836140b0565b925082614cec57614ceb6149cb565b5b828204905092915050565b5f614d01826140b0565b9150614d0c836140b0565b9250828202614d1a816140b0565b9150808214614d2c57614d2b6146de565b5b5092915050565b5f614d3d82614095565b9150614d4883614095565b925082820190507fffffffffffffffffffffffffffffffff8000000000000000000000000000000081126f7fffffffffffffffffffffffffffffff82131715614d9457614d936146de565b5b9291505056fea26469706673582212203211cd5681899eb074173d306b7961409e2fd107813288dd10eedc8fc021491764736f6c63430008170033", "bin-runtime": "608060405234801561000f575f80fd5b5060043610610230575f3560e01c8063587cde1e1161012e5780639ab24eb0116100b6578063c2c4c5c11161007a578063c2c4c5c114610751578063c3cda5201461075b578063c4698ee514610777578063dd62ed3e146107a7578063fc0c546a146107d757610230565b80639ab24eb014610675578063a9059cbb146106a5578063b0a34fdd146106d5578063b18f270214610705578063b52c05fe1461073557610230565b806378888dbf116100fd57806378888dbf146105ab5780637c616fe6146105db5780638e539e8c146105f757806395d89b4114610627578063981b24d01461064557610230565b8063587cde1e146104fb5780635c19a95c1461052b57806370a082311461054757806370ab0a841461057757610230565b806329b55ca7116101bc578063474177ec11610180578063474177ec1461042f5780634deafcae1461044d5780634ee2cd7e1461047d57806353acfabd146104ad57806358341922146104dd57610230565b806329b55ca71461039f5780632f4f21e2146103bb578063313ce567146103d75780633a46b1a8146103f55780633ccfd60b1461042557610230565b8063095ea7b311610203578063095ea7b3146102d457806315456eba1461030457806318160ddd1461032057806318b213481461033e57806323b872dd1461036f57610230565b806301ffc9a714610234578063025fc7d814610264578063047fc9aa1461029857806306fdde03146102b6575b5f80fd5b61024e60048036038101906102499190613fd9565b6107f5565b60405161025b919061401e565b60405180910390f35b61027e6004803603810190610279919061406a565b61092e565b60405161028f9594939291906140fc565b60405180910390f35b6102a06109bb565b6040516102ad919061415c565b60405180910390f35b6102be6109c0565b6040516102cb91906141ff565b60405180910390f35b6102ee60048036038101906102e99190614279565b610a4c565b6040516102fb919061401e565b60405180910390f35b61031e6004803603810190610319919061406a565b610a8a565b005b610328610cba565b604051610335919061415c565b60405180910390f35b610358600480360381019061035391906142b7565b610cc2565b6040516103669291906142e2565b60405180910390f35b61038960048036038101906103849190614309565b610d10565b604051610396919061401e565b60405180910390f35b6103b960048036038101906103b49190614359565b610d4e565b005b6103d560048036038101906103d09190614279565b610dc3565b005b6103df610ff3565b6040516103ec91906143c4565b60405180910390f35b61040f600480360381019061040a9190614279565b610ff8565b60405161041c919061415c565b60405180910390f35b61042d611084565b005b61043761140f565b604051610444919061415c565b60405180910390f35b610467600480360381019061046291906142b7565b611415565b604051610474919061415c565b60405180910390f35b61049760048036038101906104929190614279565b61147b565b6040516104a4919061415c565b60405180910390f35b6104c760048036038101906104c291906142b7565b6114cd565b6040516104d4919061415c565b60405180910390f35b6104e5611516565b6040516104f2919061415c565b60405180910390f35b610515600480360381019061051091906142b7565b611525565b60405161052291906143ec565b60405180910390f35b610545600480360381019061054091906142b7565b611563565b005b610561600480360381019061055c91906142b7565b6115a0565b60405161056e919061415c565b60405180910390f35b610591600480360381019061058c9190614279565b611615565b6040516105a29594939291906140fc565b60405180910390f35b6105c560048036038101906105c0919061442f565b6116bc565b6040516105d2919061445a565b60405180910390f35b6105f560048036038101906105f0919061406a565b6116d9565b005b610611600480360381019061060c919061406a565b61196e565b60405161061e919061415c565b60405180910390f35b61062f611991565b60405161063c91906141ff565b60405180910390f35b61065f600480360381019061065a919061406a565b611a1d565b60405161066c919061415c565b60405180910390f35b61068f600480360381019061068a91906142b7565b611a6e565b60405161069c919061415c565b60405180910390f35b6106bf60048036038101906106ba9190614279565b611a80565b6040516106cc919061401e565b60405180910390f35b6106ef60048036038101906106ea9190614279565b611abe565b6040516106fc9190614506565b60405180910390f35b61071f600480360381019061071a919061406a565b611c18565b60405161072c919061415c565b60405180910390f35b61074f600480360381019061074a919061451f565b611d30565b005b610759611d3f565b005b610775600480360381019061077091906145ba565b611dae565b005b610791600480360381019061078c91906142b7565b611deb565b60405161079e9190614506565b60405180910390f35b6107c160048036038101906107bc9190614643565b611f9e565b6040516107ce919061415c565b60405180910390f35b6107df611fdc565b6040516107ec91906143ec565b60405180910390f35b5f7f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bf57507fe90fb3f6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092757507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6003602052805f5260405f205f91509050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b5f5481565b600680546109cd906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546109f9906146ae565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b505050505081565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610a8191906143ec565b60405180910390fd5b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610b87576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610be057336040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610bd791906143ec565b60405180910390fd5b600142610bed919061470b565b816020015167ffffffffffffffff161015610c4757338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610c3e93929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610ca857816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610c9f9291906147f3565b60405180910390fd5b610cb633835f846002612000565b5050565b5f8054905090565b6001602052805f5260405f205f91509050805f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690805f0160109054906101000a900467ffffffffffffffff16905082565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401610d4591906143ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610db3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dbe8383836122c2565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f8203610ec0576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff1603610f1957826040517f1ff847b6000000000000000000000000000000000000000000000000000000008152600401610f1091906143ec565b60405180910390fd5b600142610f26919061470b565b816020015167ffffffffffffffff161015610f8057338160200151426040517fd78507e1000000000000000000000000000000000000000000000000000000008152600401610f7793929190614777565b60405180910390fd5b6bffffffffffffffffffffffff8016821115610fe157816bffffffffffffffffffffffff6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600401610fd89291906147f3565b60405180910390fd5b610fee83835f845f612000565b505050565b601281565b5f806110048385612592565b5090505f61101184612bd3565b9150508160400151816110249190614826565b60070b82602001516110369190614885565b825f0181815161104691906148c1565b915090600f0b9081600f0b815250505f825f0151600f0b131561107c57815f01516fffffffffffffffffffffffffffffffff1692505b505092915050565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905042816020015167ffffffffffffffff1611156111a357338160200151426040517fab0246b300000000000000000000000000000000000000000000000000000000815260040161119a93929190614777565b60405180910390fd5b5f815f01516fffffffffffffffffffffffffffffffff16905060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505f805490505f8282039050805f819055506112e4338560405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525084612e2f565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568844260405161132c929190614928565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c8282604051611365929190614928565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016113c892919061494f565b6020604051808303815f875af11580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140891906149a0565b5050505050565b60025481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160109054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b5f806114878385612592565b509050600183611497919061470b565b816060015167ffffffffffffffff1610156114c65780608001516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b5f61152042611c18565b905090565b5f306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161155a91906143ec565b60405180910390fd5b306040517f535db4ec00000000000000000000000000000000000000000000000000000000815260040161159791906143ec565b60405180910390fd5b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6004602052815f5260405f20818154811061162e575f80fd5b905f5260205f2090600202015f9150915050805f015f9054906101000a9004600f0b90805f0160109054906101000a9004600f0b90806001015f9054906101000a900467ffffffffffffffff16908060010160089054906101000a900467ffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16905085565b6005602052805f5260405f205f915054906101000a9004600f0b81565b5f60015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905062093a8067ffffffffffffffff1662093a8067ffffffffffffffff16834201816117ca576117c96149cb565b5b040291505f815f01516fffffffffffffffffffffffffffffffff160361182757336040517f1ff847b600000000000000000000000000000000000000000000000000000000815260040161181e91906143ec565b60405180910390fd5b600142611834919061470b565b816020015167ffffffffffffffff16101561188e57338160200151426040517fd78507e100000000000000000000000000000000000000000000000000000000815260040161188593929190614777565b60405180910390fd5b6001816020015161189f91906149f8565b67ffffffffffffffff168210156118f557338160200151836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016118ec93929190614777565b60405180910390fd5b630784ce0042611905919061470b565b82111561195c5733630784ce004261191d919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161195393929190614a33565b60405180910390fd5b61196a335f84846003612000565b5050565b5f805f61197a84612bd3565b915091506119888282613b81565b92505050919050565b6007805461199e906146ae565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca906146ae565b8015611a155780601f106119ec57610100808354040283529160200191611a15565b820191905f5260205f20905b8154815290600101906020018083116119f857829003601f168201915b505050505081565b5f80611a29835f612592565b509050600183611a39919061470b565b816060015167ffffffffffffffff161015611a685780608001516fffffffffffffffffffffffffffffffff1691505b50919050565b5f611a798242613cee565b9050919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611ab591906143ec565b60405180910390fd5b611ac6613ef6565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110611b1557611b14614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905092915050565b5f8060035f60025481526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050611d288184613b81565b915050919050565b611d3b3383836122c2565b5050565b611dac5f60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525060405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff168152505f54612e2f565b565b306040517f535db4ec000000000000000000000000000000000000000000000000000000008152600401611de291906143ec565b60405180910390fd5b611df3613ef6565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115611f985760045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182611e899190614a95565b81548110611e9a57611e99614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505091505b50919050565b5f306040517f9c21e7b2000000000000000000000000000000000000000000000000000000008152600401611fd391906143ec565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805490505f8582019050805f81905550612019613f4c565b845f01518560200151825f01836020018267ffffffffffffffff1667ffffffffffffffff16815250826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250505086855f01818151019150906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250505f8611156120c95785856020019067ffffffffffffffff16908167ffffffffffffffff16815250505b8460015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505061218088828785612e2f565b5f871115612227577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff1660e01b81526004016121e593929190614ac8565b6020604051808303815f875af1158015612201573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222591906149a0565b505b8773ffffffffffffffffffffffffffffffffffffffff167fbe9cf0e939c614fad640a623a53ba0a807c8cb503c4c4c8dacabe27b86ff2dd588876020015187426040516122779493929190614b70565b60405180910390a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c83836040516122b0929190614928565b60405180910390a15050505050505050565b5f82036122fb576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff1662093a8067ffffffffffffffff1682420181612328576123276149cb565b5b040290505f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020015f820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505090505f815f01516fffffffffffffffffffffffffffffffff1611156124615783815f01516fffffffffffffffffffffffffffffffff166040517f89bf64dd00000000000000000000000000000000000000000000000000000000815260040161245892919061494f565b60405180910390fd5b60014261246e919061470b565b8210156124b6578342836040517f311d1bf90000000000000000000000000000000000000000000000000000000081526004016124ad93929190614a33565b60405180910390fd5b630784ce00426124c6919061470b565b82111561251d5783630784ce00426124de919061470b565b836040517fc172987b00000000000000000000000000000000000000000000000000000000815260040161251493929190614a33565b60405180910390fd5b6bffffffffffffffffffffffff801683111561257e57826bffffffffffffffffffffffff6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004016125759291906147f3565b60405180910390fd5b61258c848484846001612000565b50505050565b61259a613ef6565b5f805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125d9576002549050612630565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f81036126295750612bcc565b6001810390505b5f5b60808110156129425781600184612649919061470b565b11612942575f60026001848661265f919061470b565b612669919061470b565b6126739190614bb3565b90505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036127af5760035f8281526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094506128fc565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081815481106127fe576127fd614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505094505b600187612909919061470b565b856060015167ffffffffffffffff16101561292657809350612936565b6001816129339190614a95565b92505b50806001019050612632565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509250612bca565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110612acc57612acb614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505092505b505b9250929050565b612bdb613ef6565b5f43831115612c235782436040517f8633967e000000000000000000000000000000000000000000000000000000008152600401612c1a929190614928565b60405180910390fd5b5f612c2e845f612592565b80925081945050505f80600254831015612d97575f60035f600186612c53919061470b565b81526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905085606001518160600151612d659190614be3565b67ffffffffffffffff16925085604001518160400151612d859190614be3565b67ffffffffffffffff16915050612dd0565b846060015167ffffffffffffffff1643612db19190614a95565b9150846040015167ffffffffffffffff1642612dcd9190614a95565b90505b846040015167ffffffffffffffff1693505f821115612e275781856060015167ffffffffffffffff1687612e049190614a95565b82612e0f9190614c1e565b612e199190614bb3565b84612e24919061470b565b93505b505050915091565b612e37613ef6565b612e3f613ef6565b5f805f60025490505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146130565742886020015167ffffffffffffffff16118015612eab57505f885f01516fffffffffffffffffffffffffffffffff16115b15612f0e57630784ce00885f0151612ec39190614c5f565b8560200190600f0b9081600f0b81525050428860200151612ee49190614be3565b67ffffffffffffffff168560200151612efd9190614885565b855f0190600f0b9081600f0b815250505b42876020015167ffffffffffffffff16118015612f3f57505f875f01516fffffffffffffffffffffffffffffffff16115b15612fa257630784ce00875f0151612f579190614c5f565b8460200190600f0b9081600f0b81525050428760200151612f789190614be3565b67ffffffffffffffff168460200151612f919190614885565b845f0190600f0b9081600f0b815250505b60055f896020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b92505f876020015167ffffffffffffffff16111561305557876020015167ffffffffffffffff16876020015167ffffffffffffffff160361301b57829150613054565b60055f886020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b91505b5b5b61305e613ef6565b5f82111561316d5760035f8381526020019081526020015f206040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506131c3565b6040518060a001604052805f600f0b81526020015f600f0b81526020014267ffffffffffffffff1681526020014367ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090505b5f816040015190505f8290505f836040015167ffffffffffffffff1642111561323a57836040015167ffffffffffffffff16426132009190614a95565b846060015167ffffffffffffffff164361321a9190614a95565b670de0b6b3a764000061322d9190614c1e565b6132379190614bb3565b90505b5f62093a80808561324b9190614cc7565b6132559190614cf7565b90505f5b60ff8110156135c15762093a80820191505f428367ffffffffffffffff161115613285574292506132ba565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b85836132c69190614be3565b60070b87602001516132d89190614885565b875f018181516132e891906148c1565b915090600f0b9081600f0b8152505080876020018181516133099190614d33565b915090600f0b9081600f0b815250505f875f0151600f0b1215613338575f875f0190600f0b9081600f0b815250505b5f8760200151600f0b121561335a575f8760200190600f0b9081600f0b815250505b82955082876040019067ffffffffffffffff16908167ffffffffffffffff1681525050670de0b6b3a76400008560400151846133969190614be3565b67ffffffffffffffff16856133ab9190614c1e565b6133b59190614bb3565b85606001516133c491906149f8565b876060019067ffffffffffffffff16908167ffffffffffffffff1681525050846080015187608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050600188019750428367ffffffffffffffff16036134845743876060019067ffffffffffffffff16908167ffffffffffffffff16815250508c87608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff1681525050506135c1565b8660035f8a81526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505050806001019050613259565b5050846002819055505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146136a5578860200151886020015161361191906148c1565b846020018181516136229190614d33565b915090600f0b9081600f0b81525050885f0151885f015161364391906148c1565b845f018181516136539190614d33565b915090600f0b9081600f0b815250505f8460200151600f0b1215613684575f8460200190600f0b9081600f0b815250505b5f845f0151600f0b12156136a4575f845f0190600f0b9081600f0b815250505b5b8360035f8781526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050505f73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff1614613b7257428c6020015167ffffffffffffffff1611156138ca5788602001518761382f9190614d33565b96508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16036138675787602001518761386491906148c1565b96505b8660055f8e6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b428b6020015167ffffffffffffffff1611801561390257508b6020015167ffffffffffffffff168b6020015167ffffffffffffffff16115b1561397c5787602001518661391791906148c1565b95508560055f8d6020015167ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505b42886040019067ffffffffffffffff16908167ffffffffffffffff168152505043886060019067ffffffffffffffff16908167ffffffffffffffff16815250508a5f015188608001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505060045f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2088908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b50505050505050505050505050565b5f8062093a80808560400151613b979190614cc7565b613ba19190614cf7565b90505f5b60ff811015613cbf5762093a80820191505f8467ffffffffffffffff168367ffffffffffffffff161115613bdb57849250613c10565b60055f8467ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9054906101000a9004600f0b90505b856040015183613c209190614826565b60070b8660200151613c329190614885565b865f01818151613c4291906148c1565b915090600f0b9081600f0b815250508467ffffffffffffffff168367ffffffffffffffff1603613c725750613cbf565b8086602001818151613c849190614d33565b915090600f0b9081600f0b8152505082866040019067ffffffffffffffff16908167ffffffffffffffff168152505050806001019050613ba5565b505f845f0151600f0b1315613ce757835f01516fffffffffffffffffffffffffffffffff1691505b5092915050565b5f8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905090505f811115613eef575f60045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183613d869190614a95565b81548110613d9757613d96614a68565b5b905f5260205f2090600202016040518060a00160405290815f82015f9054906101000a9004600f0b600f0b600f0b81526020015f820160109054906101000a9004600f0b600f0b600f0b8152602001600182015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050806040015184613ea49190614826565b60070b8160200151613eb69190614885565b815f01818151613ec691906148c1565b915090600f0b9081600f0b815250505f815f0151600f0b1315613eed57805f0151600f0b92505b505b5092915050565b6040518060a001604052805f600f0b81526020015f600f0b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681525090565b60405180604001604052805f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fb881613f84565b8114613fc2575f80fd5b50565b5f81359050613fd381613faf565b92915050565b5f60208284031215613fee57613fed613f80565b5b5f613ffb84828501613fc5565b91505092915050565b5f8115159050919050565b61401881614004565b82525050565b5f6020820190506140315f83018461400f565b92915050565b5f819050919050565b61404981614037565b8114614053575f80fd5b50565b5f8135905061406481614040565b92915050565b5f6020828403121561407f5761407e613f80565b5b5f61408c84828501614056565b91505092915050565b5f81600f0b9050919050565b6140aa81614095565b82525050565b5f67ffffffffffffffff82169050919050565b6140cc816140b0565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6140f6816140d2565b82525050565b5f60a08201905061410f5f8301886140a1565b61411c60208301876140a1565b61412960408301866140c3565b61413660608301856140c3565b61414360808301846140ed565b9695505050505050565b61415681614037565b82525050565b5f60208201905061416f5f83018461414d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156141ac578082015181840152602081019050614191565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6141d182614175565b6141db818561417f565b93506141eb81856020860161418f565b6141f4816141b7565b840191505092915050565b5f6020820190508181035f83015261421781846141c7565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6142488261421f565b9050919050565b6142588161423e565b8114614262575f80fd5b50565b5f813590506142738161424f565b92915050565b5f806040838503121561428f5761428e613f80565b5b5f61429c85828601614265565b92505060206142ad85828601614056565b9150509250929050565b5f602082840312156142cc576142cb613f80565b5b5f6142d984828501614265565b91505092915050565b5f6040820190506142f55f8301856140ed565b61430260208301846140c3565b9392505050565b5f805f606084860312156143205761431f613f80565b5b5f61432d86828701614265565b935050602061433e86828701614265565b925050604061434f86828701614056565b9150509250925092565b5f805f606084860312156143705761436f613f80565b5b5f61437d86828701614265565b935050602061438e86828701614056565b925050604061439f86828701614056565b9150509250925092565b5f60ff82169050919050565b6143be816143a9565b82525050565b5f6020820190506143d75f8301846143b5565b92915050565b6143e68161423e565b82525050565b5f6020820190506143ff5f8301846143dd565b92915050565b61440e816140b0565b8114614418575f80fd5b50565b5f8135905061442981614405565b92915050565b5f6020828403121561444457614443613f80565b5b5f6144518482850161441b565b91505092915050565b5f60208201905061446d5f8301846140a1565b92915050565b61447c81614095565b82525050565b61448b816140b0565b82525050565b61449a816140d2565b82525050565b60a082015f8201516144b45f850182614473565b5060208201516144c76020850182614473565b5060408201516144da6040850182614482565b5060608201516144ed6060850182614482565b5060808201516145006080850182614491565b50505050565b5f60a0820190506145195f8301846144a0565b92915050565b5f806040838503121561453557614534613f80565b5b5f61454285828601614056565b925050602061455385828601614056565b9150509250929050565b614566816143a9565b8114614570575f80fd5b50565b5f813590506145818161455d565b92915050565b5f819050919050565b61459981614587565b81146145a3575f80fd5b50565b5f813590506145b481614590565b92915050565b5f805f805f8060c087890312156145d4576145d3613f80565b5b5f6145e189828a01614265565b96505060206145f289828a01614056565b955050604061460389828a01614056565b945050606061461489828a01614573565b935050608061462589828a016145a6565b92505060a061463689828a016145a6565b9150509295509295509295565b5f806040838503121561465957614658613f80565b5b5f61466685828601614265565b925050602061467785828601614265565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146c557607f821691505b6020821081036146d8576146d7614681565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61471582614037565b915061472083614037565b9250828201905080821115614738576147376146de565b5b92915050565b5f819050919050565b5f61476161475c614757846140b0565b61473e565b614037565b9050919050565b61477181614747565b82525050565b5f60608201905061478a5f8301866143dd565b6147976020830185614768565b6147a4604083018461414d565b949350505050565b5f6bffffffffffffffffffffffff82169050919050565b5f6147dd6147d86147d3846147ac565b61473e565b614037565b9050919050565b6147ed816147c3565b82525050565b5f6040820190506148065f83018561414d565b61481360208301846147e4565b9392505050565b5f8160070b9050919050565b5f6148308261481a565b915061483b8361481a565b92508282039050677fffffffffffffff81137fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008212171561487f5761487e6146de565b5b92915050565b5f61488f82614095565b915061489a83614095565b92508282026148a881614095565b91508082146148ba576148b96146de565b5b5092915050565b5f6148cb82614095565b91506148d683614095565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff8000000000000000000000000000000082121715614922576149216146de565b5b92915050565b5f60408201905061493b5f83018561414d565b614948602083018461414d565b9392505050565b5f6040820190506149625f8301856143dd565b61496f602083018461414d565b9392505050565b61497f81614004565b8114614989575f80fd5b50565b5f8151905061499a81614976565b92915050565b5f602082840312156149b5576149b4613f80565b5b5f6149c28482850161498c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a02826140b0565b9150614a0d836140b0565b9250828201905067ffffffffffffffff811115614a2d57614a2c6146de565b5b92915050565b5f606082019050614a465f8301866143dd565b614a53602083018561414d565b614a60604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614a9f82614037565b9150614aaa83614037565b9250828203905081811115614ac257614ac16146de565b5b92915050565b5f606082019050614adb5f8301866143dd565b614ae860208301856143dd565b614af5604083018461414d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60048110614b3b57614b3a614afd565b5b50565b5f819050614b4b82614b2a565b919050565b5f614b5a82614b3e565b9050919050565b614b6a81614b50565b82525050565b5f608082019050614b835f83018761414d565b614b906020830186614768565b614b9d6040830185614b61565b614baa606083018461414d565b95945050505050565b5f614bbd82614037565b9150614bc883614037565b925082614bd857614bd76149cb565b5b828204905092915050565b5f614bed826140b0565b9150614bf8836140b0565b9250828203905067ffffffffffffffff811115614c1857614c176146de565b5b92915050565b5f614c2882614037565b9150614c3383614037565b9250828202614c4181614037565b91508282048414831517614c5857614c576146de565b5b5092915050565b5f614c6982614095565b9150614c7483614095565b925082614c8457614c836149cb565b5b60015f0383147fffffffffffffffffffffffffffffffff8000000000000000000000000000000083141615614cbc57614cbb6146de565b5b828205905092915050565b5f614cd1826140b0565b9150614cdc836140b0565b925082614cec57614ceb6149cb565b5b828204905092915050565b5f614d01826140b0565b9150614d0c836140b0565b9250828202614d1a816140b0565b9150808214614d2c57614d2b6146de565b5b5092915050565b5f614d3d82614095565b9150614d4883614095565b925082820190507fffffffffffffffffffffffffffffffff8000000000000000000000000000000081126f7fffffffffffffffffffffffffffffff82131715614d9457614d936146de565b5b9291505056fea26469706673582212203211cd5681899eb074173d306b7961409e2fd107813288dd10eedc8fc021491764736f6c63430008170033", "userdoc": {"methods": {"createLockFor(address,uint256,uint256)": {"notice": "Tokens are taken from `msg.sender`'s balance."}, "getUserPoint(address,uint256)": {"notice": "The out of bound condition is treated by the default code generation check."}}, "notice": "This token supports the ERC20 interface specifications except for transfers and approvals."}, "devdoc": {"methods": {"allowance(address,address)": {"author": null, "details": "Reverts the allowance of this token.", "params": {}, "return": null}, "approve(address,uint256)": {"author": null, "details": "Reverts the approval of this token.", "params": {}, "return": null}, "balanceOf(address)": {"author": null, "details": "Gets the account balance in native token.", "params": {"account": "Account address."}, "return": null}, "balanceOfAt(address,uint256)": {"author": null, "details": "Gets the account balance at a specific block number.", "params": {"account": "Account address.", "blockNumber": "Block number."}, "return": null}, "checkpoint()": {"author": null, "details": "Record global data to checkpoint.", "params": {}, "return": null}, "constructor": {"author": null, "details": "Contract constructor", "params": {"_name": "Token name.", "_symbol": "Token symbol.", "_token": "Token address."}, "return": null}, "createLock(uint256,uint256)": {"author": null, "details": "Deposits `amount` tokens for `msg.sender` and locks for `unlockTime`.", "params": {"amount": "Amount to deposit.", "unlockTime": "Time when tokens unlock, rounded down to a whole week."}, "return": null}, "createLockFor(address,uint256,uint256)": {"author": null, "details": "Deposits `amount` tokens for `account` and locks for `unlockTime`.", "params": {"account": "Account address.", "amount": "Amount to deposit.", "unlockTime": "Time when tokens unlock, rounded down to a whole week."}, "return": null}, "delegate(address)": {"author": null, "details": "Reverts delegate for this token.", "params": {}, "return": null}, "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": {"author": null, "details": "Reverts delegateBySig for this token.", "params": {}, "return": null}, "delegates(address)": {"author": null, "details": "Reverts delegates of this token.", "params": {}, "return": null}, "depositFor(address,uint256)": {"author": null, "details": "Deposits `amount` tokens for `account` and adds to the lock.Anyone (even a smart contract) can deposit for someone else, but cannot extend their locktime and deposit for a brand new user.", "params": {"account": "Account address.", "amount": "Amount to add."}, "return": null}, "getLastUserPoint(address)": {"author": null, "details": "Gets the most recently recorded user point for `account`.", "params": {"account": "Account address."}, "return": null}, "getNumUserPoints(address)": {"author": null, "details": "Gets the number of user points.", "params": {"account": "Account address."}, "return": null}, "getPastTotalSupply(uint256)": {"author": null, "details": "Calculate total voting power at some point in the past.", "params": {"blockNumber": "Block number to calculate the total voting power at."}, "return": null}, "getPastVotes(address,uint256)": {"author": null, "details": "Gets voting power at a specific block number.", "params": {"account": "Account address.", "blockNumber": "Block number."}, "return": null}, "getUserPoint(address,uint256)": {"author": null, "details": "Gets the checkpoint structure at number `idx` for `account`.", "params": {"account": "User wallet address.", "idx": "User point number."}, "return": null}, "getVotes(address)": {"author": null, "details": "Gets the voting power.", "params": {"account": "Account address."}, "return": null}, "increaseAmount(uint256)": {"author": null, "details": "Deposits `amount` additional tokens for `msg.sender` without modifying the unlock time.", "params": {"amount": "Amount of tokens to deposit and add to the lock."}, "return": null}, "increaseUnlockTime(uint256)": {"author": null, "details": "Extends the unlock time.", "params": {"unlockTime": "New tokens unlock time."}, "return": null}, "lockedEnd(address)": {"author": null, "details": "Gets the `account`'s lock end time.", "params": {"account": "Account address."}, "return": null}, "supportsInterface(bytes4)": {"author": null, "details": "Gets information about the interface support.", "params": {"interfaceId": "A specified interface Id."}, "return": null}, "totalSupply()": {"author": null, "details": "Gets total token supply.", "params": {}, "return": null}, "totalSupplyAt(uint256)": {"author": null, "details": "Gets total token supply at a specific block number.", "params": {"blockNumber": "Block number."}, "return": null}, "totalSupplyLocked()": {"author": null, "details": "Calculates current total voting power.", "params": {}, "return": null}, "totalSupplyLockedAtT(uint256)": {"author": null, "details": "Calculates total voting power at time `ts`.", "params": {"ts": "Time to get total voting power at."}, "return": null}, "transfer(address,uint256)": {"author": null, "details": "Reverts the transfer of this token.", "params": {}, "return": null}, "transferFrom(address,address,uint256)": {"author": null, "details": "Reverts the transferFrom of this token.", "params": {}, "return": null}, "withdraw()": {"author": null, "details": "Withdraws all tokens for `msg.sender`. Only possible if the lock has expired.", "params": {}, "return": null}}, "author": null, "details": null, "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/lib/solmate/src/tokens/ERC20.sol:ERC20": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": "Modern and gas efficient ERC20 + EIP-2612 implementation."}, "devdoc": {"methods": {}, "author": "Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)", "details": "Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.", "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol:IVotes": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {"delegate(address)": {"author": null, "details": "Delegates votes from the sender to `delegatee`.", "params": {}, "return": null}, "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": {"author": null, "details": "Delegates votes from signer to `delegatee`.", "params": {}, "return": null}, "delegates(address)": {"author": null, "details": "Returns the delegate that `account` has chosen.", "params": {}, "return": null}, "getPastTotalSupply(uint256)": {"author": null, "details": "Returns the total supply of votes available at the end of a past block (`blockNumber`). NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote.", "params": {}, "return": null}, "getPastVotes(address,uint256)": {"author": null, "details": "Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).", "params": {}, "return": null}, "getVotes(address)": {"author": null, "details": "Returns the current amount of votes that `account` has.", "params": {}, "return": null}}, "author": null, "details": "Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. _Available since v4.5._", "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {"allowance(address,address)": {"author": null, "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.", "params": {}, "return": null}, "approve(address,uint256)": {"author": null, "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.", "params": {}, "return": null}, "balanceOf(address)": {"author": null, "details": "Returns the amount of tokens owned by `account`.", "params": {}, "return": null}, "totalSupply()": {"author": null, "details": "Returns the amount of tokens in existence.", "params": {}, "return": null}, "transfer(address,uint256)": {"author": null, "details": "Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.", "params": {}, "return": null}, "transferFrom(address,address,uint256)": {"author": null, "details": "Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.", "params": {}, "return": null}}, "author": null, "details": "Interface of the ERC20 standard as defined in the EIP.", "title": null}, "libraries": {}}, "/home/andrey/valory/autonolas-governance/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol:IERC165": {"srcmap": "", "srcmap-runtime": "", "abi": "[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", "bin": "", "bin-runtime": "", "userdoc": {"methods": {}, "notice": null}, "devdoc": {"methods": {"supportsInterface(bytes4)": {"author": null, "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.", "params": {}, "return": null}}, "author": null, "details": "Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.", "title": null}, "libraries": {}}}} \ No newline at end of file diff --git a/audits/internal11/fuzzing/echidna_assert.yaml b/audits/internal11/fuzzing/echidna_assert.yaml new file mode 100644 index 0000000..30d1d73 --- /dev/null +++ b/audits/internal11/fuzzing/echidna_assert.yaml @@ -0,0 +1,10 @@ +#testMode: overflow +testMode: assertion +coverage: true +corpusDir: corpusEchidna +coverageFormats: ["html"] +# maxBlockDelay: 12 +# provide solc remappings to crytic-compile +# https://www.justinsilver.com/technology/programming/slither-echidna-remappings/ +cryticArgs: ['--solc-remaps', '@=node_modules/@'] + diff --git a/audits/internal11/fuzzing/echidna_overflow.yaml b/audits/internal11/fuzzing/echidna_overflow.yaml new file mode 100644 index 0000000..a8ae0b6 --- /dev/null +++ b/audits/internal11/fuzzing/echidna_overflow.yaml @@ -0,0 +1,10 @@ +testMode: overflow +#testMode: assertion +coverage: true +corpusDir: corpusEchidna +coverageFormats: ["html"] +# maxBlockDelay: 12 +# provide solc remappings to crytic-compile +# https://www.justinsilver.com/technology/programming/slither-echidna-remappings/ +cryticArgs: ['--solc-remaps', '@=node_modules/@'] + diff --git a/audits/internal11/fuzzing/fuzzing-assert.PNG b/audits/internal11/fuzzing/fuzzing-assert.PNG new file mode 100755 index 0000000..7ad5782 Binary files /dev/null and b/audits/internal11/fuzzing/fuzzing-assert.PNG differ diff --git a/audits/internal11/fuzzing/fuzzing-overflow.PNG b/audits/internal11/fuzzing/fuzzing-overflow.PNG new file mode 100755 index 0000000..79df250 Binary files /dev/null and b/audits/internal11/fuzzing/fuzzing-overflow.PNG differ diff --git a/audits/internal11/fuzzing/start_echidna.sh b/audits/internal11/fuzzing/start_echidna.sh new file mode 100644 index 0000000..c737e2b --- /dev/null +++ b/audits/internal11/fuzzing/start_echidna.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +rm -rf corpusEchidna/ +echidna contracts/test/EchidnaVoteWeightingAssert.sol --contract EchidnaVoteWeightingAssert --config echidna_assert.yaml diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol new file mode 100644 index 0000000..b5ea92d --- /dev/null +++ b/contracts/VoteWeighting.sol @@ -0,0 +1,764 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +// Dispenser interface +interface IDispenser { + /// @dev Records nominee addition in dispenser. + /// @param nomineeHash Nominee hash. + function addNominee(bytes32 nomineeHash) external; + + /// @dev Records nominee removal. + /// @param nomineeHash Nominee hash. + function removeNominee(bytes32 nomineeHash) external; +} + +// veOLAS interface +interface IVEOLAS { + // Structure for voting escrow points + // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + struct PointVoting { + // w(i) = at + b (bias) + int128 bias; + // dw / dt = a (slope) + int128 slope; + // Timestamp. It will never practically be bigger than 2^64 - 1 + uint64 ts; + // Block number. It will not be bigger than the timestamp + uint64 blockNumber; + // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + uint128 balance; + } + + /// @dev Gets the `account`'s lock end time. + /// @param account Account address. + /// @return unlockTime Lock end time. + function lockedEnd(address account) external view returns (uint256 unlockTime); + + /// @dev Gets the most recently recorded user point for `account`. + /// @param account Account address. + /// @return pv Last checkpoint. + function getLastUserPoint(address account) external view returns (PointVoting memory pv); +} + +/// @dev Only `owner` has a privilege, but the `sender` was provided. +/// @param sender Sender address. +/// @param owner Required sender address as an owner. +error OwnerOnly(address sender, address owner); + +/// @dev Provided zero address. +error ZeroAddress(); + +/// @dev Zero value when it has to be different from zero. +error ZeroValue(); + +/// @dev Wrong length of two arrays. +/// @param numValues1 Number of values in a first array. +/// @param numValues2 Number of values in a second array. +error WrongArrayLength(uint256 numValues1, uint256 numValues2); + +/// @dev Value overflow. +/// @param provided Overflow value. +/// @param max Maximum possible value. +error Overflow(uint256 provided, uint256 max); + +/// @dev Underflow value. +/// @param provided Provided value. +/// @param expected Minimum expected value. +error Underflow(uint256 provided, uint256 expected); + +/// @dev Nominee does not exist. +/// @param account Nominee account address. +/// @param chainId Nominee chain Id. +error NomineeDoesNotExist(bytes32 account, uint256 chainId); + +/// @dev Nominee already exists. +/// @param account Nominee account address. +/// @param chainId Nominee chain Id. +error NomineeAlreadyExists(bytes32 account, uint256 chainId); + +/// @dev Value lock is expired. +/// @param account Address that is checked for the locked value. +/// @param deadline The lock expiration deadline. +/// @param curTime Current timestamp. +error LockExpired(address account, uint256 deadline, uint256 curTime); + +/// @dev The vote has been performed already. +/// @param voter Voter address. +/// @param curTime Current time. +/// @param nextAllowedVotingTime Next allowed voting time. +error VoteTooOften(address voter, uint256 curTime, uint256 nextAllowedVotingTime); + +/// @dev Nominee is not in the removed nominee map. +/// @param account Nominee account address. +/// @param chainId Nominee chain Id. +error NomineeNotRemoved(bytes32 account, uint256 chainId); + +/// @dev Nominee is in the removed nominee map. +/// @param account Nominee account address. +/// @param chainId Nominee chain Id. +error NomineeRemoved(bytes32 account, uint256 chainId); + +// Point struct +struct Point { + uint256 bias; + uint256 slope; +} + +// Voted slope struct +struct VotedSlope { + uint256 slope; + uint256 power; + uint256 end; +} + +// Nominee struct +struct Nominee { + bytes32 account; + uint256 chainId; +} + + +/// @title VoteWeighting - Smart contract for Vote Weighting with specific nominees composed of address and chain Id +/// @author Aleksandr Kuperman - +/// @author Andrey Lebedev - +/// @author Mariapia Moscatiello - +contract VoteWeighting { + event OwnerUpdated(address indexed owner); + 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); + + // 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 + uint256 public constant WEIGHT_VOTE_DELAY = 864_000; + // Max weight amount + uint256 public constant MAX_WEIGHT = 10_000; + // Maximum chain Id as per EVM specs + uint256 public constant MAX_EVM_CHAIN_ID = type(uint64).max / 2 - 36; + // veOLAS contract address + address public immutable ve; + // Contract owner address + address public owner; + // Dispenser contract + address public dispenser; + + // Set of Nominee structs + Nominee[] public setNominees; + // Mapping of hash(Nominee struct) => nominee Id + mapping(bytes32 => uint256) public mapNomineeIds; + // Mapping of hash(Nominee struct) => previously removed nominee flag + mapping(bytes32 => bool) public mapRemovedNominees; + + // user -> hash(Nominee struct) -> VotedSlope + mapping(address => mapping(bytes32 => VotedSlope)) public voteUserSlopes; + // Total vote power used by user + mapping(address => uint256) public voteUserPower; + // Last user vote's timestamp for each hash(Nominee struct) + mapping(address => mapping(bytes32 => uint256)) public lastUserVote; + + // Past and scheduled points for nominee weight, sum of weights per type, total weight + // Point is for bias+slope + // changes_* are for changes in slope + // time_* are for the last change timestamp + // timestamps are rounded to whole weeks + + // hash(Nominee struct) -> time -> Point + mapping(bytes32 => mapping(uint256 => Point)) public pointsWeight; + // hash(Nominee struct) -> time -> slope + mapping(bytes32 => mapping(uint256 => uint256)) public changesWeight; + // hash(Nominee struct) -> last scheduled time (next week) + mapping(bytes32 => uint256) public timeWeight; + + // time -> Point + mapping(uint256 => Point) public pointsSum; + // time -> slope + mapping(uint256 => uint256) public changesSum; + // last scheduled time (next week) + uint256 public timeSum; + + /// @dev Contract constructor. + /// @param _ve Voting Escrow contract address. + constructor(address _ve) { + // Check for the zero address + if (_ve == address(0)) { + revert ZeroAddress(); + } + + // Set initial parameters + owner = msg.sender; + ve = _ve; + timeSum = block.timestamp / WEEK * WEEK; + setNominees.push(Nominee(bytes32(0), 0)); + } + + /// @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. + function _getSum() internal returns (uint256) { + // t is always > 0 as it is set in the constructor + uint256 t = timeSum; + Point memory pt = pointsSum[t]; + for (uint256 i = 0; i < 500; i++) { + if (t > block.timestamp) { + break; + } + t += WEEK; + uint256 dBias = pt.slope * WEEK; + if (pt.bias > dBias) { + pt.bias -= dBias; + uint256 dSlope = changesSum[t]; + pt.slope -= dSlope; + } else { + pt.bias = 0; + pt.slope = 0; + } + + pointsSum[t] = pt; + if (t > block.timestamp) { + timeSum = t; + } + } + return pt.bias; + } + + /// @dev Fill historic nominee weights week-over-week for missed checkins and return the total for the future week. + /// @param account Nominee account address in bytes32 form. + /// @param chainId Nominee chain Id. + /// @return Nominee weight. + function _getWeight(bytes32 account, uint256 chainId) internal returns (uint256) { + // Construct the nominee struct + Nominee memory nominee = Nominee(account, chainId); + + // Check that the nominee exists or has been removed + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + if (!mapRemovedNominees[nomineeHash] && mapNomineeIds[nomineeHash] == 0) { + revert NomineeDoesNotExist(account, chainId); + } + + // t is always > 0 as it is set during the addNominee() call + uint256 t = timeWeight[nomineeHash]; + Point memory pt = pointsWeight[nomineeHash][t]; + for (uint256 i = 0; i < 500; i++) { + if (t > block.timestamp) { + break; + } + t += WEEK; + uint256 dBias = pt.slope * WEEK; + if (pt.bias > dBias) { + pt.bias -= dBias; + uint256 dSlope = changesWeight[nomineeHash][t]; + pt.slope -= dSlope; + } else { + pt.bias = 0; + pt.slope = 0; + } + + pointsWeight[nomineeHash][t] = pt; + if (t > block.timestamp) { + timeWeight[nomineeHash] = t; + } + } + return pt.bias; + } + + /// @dev Add nominee address along with the chain Id. + /// @param nominee Nominee account address and chainId. + function _addNominee(Nominee memory nominee) internal { + // Check for the nominee existence + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + if (mapNomineeIds[nomineeHash] > 0) { + revert NomineeAlreadyExists(nominee.account, nominee.chainId); + } + + // Check for the previously removed nominee + if (mapRemovedNominees[nomineeHash]) { + revert NomineeRemoved(nominee.account, nominee.chainId); + } + + uint256 id = setNominees.length; + mapNomineeIds[nomineeHash] = id; + // Push the nominee into the list + setNominees.push(nominee); + + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + timeWeight[nomineeHash] = nextTime; + + // Enable nominee in dispenser, if applicable + address localDispenser = dispenser; + if (localDispenser != address(0)) { + IDispenser(localDispenser).addNominee(nomineeHash); + } + + emit AddNominee(nominee.account, nominee.chainId, id); + } + + /// @dev Add EVM nominee address along with the chain Id. + /// @param account Address of the nominee. + /// @param chainId Chain Id. + function addNomineeEVM(address account, uint256 chainId) external { + // Check for the zero address + if (account == address(0)) { + revert ZeroAddress(); + } + + // Check for zero chain Id + if (chainId == 0) { + revert ZeroValue(); + } + + // Check for the chain Id overflow + if (chainId > MAX_EVM_CHAIN_ID) { + revert Overflow(chainId, MAX_EVM_CHAIN_ID); + } + + Nominee memory nominee = Nominee(bytes32(uint256(uint160(account))), chainId); + + // Record nominee instance + _addNominee(nominee); + } + + /// @dev Add Non-EVM nominee address along with the chain Id. + /// @param account Address of the nominee in byte32 standard. + /// @param chainId Chain Id. + function addNomineeNonEVM(bytes32 account, uint256 chainId) external { + // Check for the zero address + if (account == bytes32(0)) { + revert ZeroAddress(); + } + + // Check for the chain Id underflow + if (MAX_EVM_CHAIN_ID >= chainId) { + revert Underflow(chainId, MAX_EVM_CHAIN_ID + 1); + } + + Nominee memory nominee = Nominee(account, chainId); + + // Record nominee instance + _addNominee(nominee); + } + + /// @dev Changes the owner address. + /// @param newOwner Address of a new owner. + function changeOwner(address newOwner) external { + // Check for the contract ownership + if (msg.sender != owner) { + revert OwnerOnly(msg.sender, owner); + } + + // Check for the zero address + if (newOwner == address(0)) { + revert ZeroAddress(); + } + + owner = newOwner; + emit OwnerUpdated(newOwner); + } + + /// @dev Changes the dispenser contract address. + /// @notice Dispenser can 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 + if (msg.sender != owner) { + revert OwnerOnly(msg.sender, owner); + } + + dispenser = newDispenser; + } + + /// @dev Checkpoint to fill data common for all nominees. + function checkpoint() external { + _getSum(); + } + + /// @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(); + } + + /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights. + /// Inflation which will be received by it is inflation_rate * relativeWeight / 1e18. + /// @param account Address of the nominee in byte32 standard. + /// @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 totalSum Sum of nominee weights. + function _nomineeRelativeWeight( + bytes32 account, + uint256 chainId, + uint256 time + ) internal view returns (uint256 weight, uint256 totalSum) { + uint256 t = time / WEEK * WEEK; + totalSum = pointsSum[t].bias; + + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + if (totalSum > 0) { + uint256 nomineeWeight = pointsWeight[nomineeHash][t].bias; + weight = 1e18 * nomineeWeight / totalSum; + } + } + + /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights. + /// (e.g. 1.0 == 1e18). Inflation which will be received by it is + /// inflation_rate * relativeWeight / 1e18. + /// @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 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); + } + + /// @dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. + /// Also, get the total sum of all the nominee weights. + /// @notice Any address can call, however nothing is recorded if the values are filled already. + /// @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 totalSum Sum of nominee weights. + function nomineeRelativeWeightWrite( + bytes32 account, + uint256 chainId, + uint256 time + ) external returns (uint256 weight, uint256 totalSum) { + _getWeight(account, chainId); + _getSum(); + (weight, totalSum) = _nomineeRelativeWeight(account, chainId, time); + } + + /// @dev Allocate voting power for changing pool weights. + /// @param account Address of the nominee the `msg.sender` votes for in bytes32 form. + /// @param chainId Chain Id. + /// @param weight Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + function voteForNomineeWeights(bytes32 account, uint256 chainId, uint256 weight) public { + // Get the nominee hash + bytes32 nomineeHash = keccak256(abi.encode(Nominee(account, chainId))); + + // Check for the previously removed nominee + if (mapRemovedNominees[nomineeHash]) { + revert NomineeRemoved(account, chainId); + } + + uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); + uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + + // Check for the lock end expiration + if (nextTime >= lockEnd) { + revert LockExpired(msg.sender, lockEnd, nextTime); + } + + // Check for the weight number + if (weight > MAX_WEIGHT) { + revert Overflow(weight, MAX_WEIGHT); + } + + // Check for the last voting time + uint256 nextAllowedVotingTime = lastUserVote[msg.sender][nomineeHash] + WEIGHT_VOTE_DELAY; + if (nextAllowedVotingTime > block.timestamp) { + revert VoteTooOften(msg.sender, block.timestamp, nextAllowedVotingTime); + } + + // Prepare old and new slopes and biases + VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeHash]; + uint256 oldBias; + if (oldSlope.end > nextTime) { + oldBias = oldSlope.slope * (oldSlope.end - nextTime); + } + + VotedSlope memory newSlope = VotedSlope({ + slope: slope * weight / MAX_WEIGHT, + end: lockEnd, + power: weight + }); + + uint256 newBias = newSlope.slope * (lockEnd - nextTime); + + uint256 powerUsed = voteUserPower[msg.sender]; + powerUsed = powerUsed + newSlope.power - oldSlope.power; + voteUserPower[msg.sender] = powerUsed; + if (powerUsed > MAX_WEIGHT) { + revert Overflow(powerUsed, MAX_WEIGHT); + } + + // Remove old and schedule new slope changes + // Remove slope changes for old slopes + // Schedule recording of initial slope for nextTime + pointsWeight[nomineeHash][nextTime].bias = _maxAndSub(_getWeight(account, chainId) + newBias, oldBias); + pointsSum[nextTime].bias = _maxAndSub(_getSum() + newBias, oldBias); + if (oldSlope.end > nextTime) { + pointsWeight[nomineeHash][nextTime].slope = + _maxAndSub(pointsWeight[nomineeHash][nextTime].slope + newSlope.slope, oldSlope.slope); + pointsSum[nextTime].slope = _maxAndSub(pointsSum[nextTime].slope + newSlope.slope, oldSlope.slope); + } else { + pointsWeight[nomineeHash][nextTime].slope += newSlope.slope; + pointsSum[nextTime].slope += newSlope.slope; + } + if (oldSlope.end > block.timestamp) { + // Cancel old slope changes if they still didn't happen + changesWeight[nomineeHash][oldSlope.end] -= oldSlope.slope; + changesSum[oldSlope.end] -= oldSlope.slope; + } + // Add slope changes for new slopes + changesWeight[nomineeHash][newSlope.end] += newSlope.slope; + changesSum[newSlope.end] += newSlope.slope; + + voteUserSlopes[msg.sender][nomineeHash] = newSlope; + + // Record last action time + lastUserVote[msg.sender][nomineeHash] = block.timestamp; + + emit VoteForNominee(msg.sender, account, chainId, weight); + } + + /// @dev Allocate voting power for changing pool weights in batch. + /// @param accounts Set of nominee addresses in bytes32 form the `msg.sender` votes for. + /// @param chainIds Set of corresponding chain Ids. + /// @param weights Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + function voteForNomineeWeightsBatch( + bytes32[] memory accounts, + uint256[] memory chainIds, + uint256[] memory weights + ) external { + if (accounts.length != chainIds.length || accounts.length != weights.length) { + revert WrongArrayLength(accounts.length, weights.length); + } + + // Traverse all accounts and weights + for (uint256 i = 0; i < accounts.length; ++i) { + voteForNomineeWeights(accounts[i], chainIds[i], weights[i]); + } + } + + function _maxAndSub(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : 0; + } + + /// @dev Removes nominee from the contract and zeros its weight. + /// @param account Address of the nominee in bytes32 form. + /// @param chainId Chain Id. + function removeNominee(bytes32 account, uint256 chainId) external { + // Check for the contract ownership + if (msg.sender != owner) { + revert OwnerOnly(owner, msg.sender); + } + + // Get the nominee struct and hash + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + // Get the nominee id in the nominee set + uint256 id = mapNomineeIds[nomineeHash]; + if (id == 0) { + revert NomineeDoesNotExist(account, chainId); + } + + // Set nominee weight to zero + uint256 oldWeight = _getWeight(account, chainId); + uint256 oldSum = _getSum(); + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + pointsWeight[nomineeHash][nextTime].bias = 0; + timeWeight[nomineeHash] = nextTime; + + // Account for the the sum weight change + uint256 newSum = oldSum - oldWeight; + pointsSum[nextTime].bias = newSum; + timeSum = nextTime; + + // 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; + setNominees[id] = nominee; + // Pop the last element from the set + setNominees.pop(); + + emit RemoveNominee(account, chainId, newSum); + } + + /// @dev Retrieves user voting power from a removed nominee. + /// @param account Address of the nominee in bytes32 form. + /// @param chainId Chain Id. + function retrieveRemovedNomineeVotingPower(bytes32 account, uint256 chainId) external { + // Get the nominee struct and hash + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + // Check that the nominee is removed + if (!mapRemovedNominees[nomineeHash]) { + revert NomineeNotRemoved(account, chainId); + } + + // Get the user old slope + VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeHash]; + if (oldSlope.power == 0) { + revert ZeroValue(); + } + + // Cancel old slope changes if they still didn't happen + if (oldSlope.end > block.timestamp) { + changesWeight[nomineeHash][oldSlope.end] -= oldSlope.slope; + changesSum[oldSlope.end] -= oldSlope.slope; + } + + // Update the voting power + uint256 powerUsed = voteUserPower[msg.sender]; + powerUsed = powerUsed - oldSlope.power; + voteUserPower[msg.sender] = powerUsed; + delete voteUserSlopes[msg.sender][nomineeHash]; + } + + /// @dev Get current nominee weight. + /// @param account Address of the nominee in bytes32 form. + /// @param chainId Chain Id. + /// @return Nominee weight. + function getNomineeWeight(bytes32 account, uint256 chainId) external view returns (uint256) { + // Get the nominee struct and hash + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + return pointsWeight[nomineeHash][timeWeight[nomineeHash]].bias; + } + + /// @dev Get sum of nominee weights. + /// @return Sum of nominee weights. + function getWeightsSum() external view returns (uint256) { + return pointsSum[timeSum].bias; + } + + /// @dev Get the total number of nominees. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @return Total number of nominees. + function getNumNominees() external view returns (uint256) { + return setNominees.length - 1; + } + + /// @dev Gets a full set of nominees. + /// @notice The returned set includes the zero-th empty nominee instance. + /// @return nominees Set of all the nominees in the contract. + function getAllNominees() external view returns (Nominee[] memory nominees) { + nominees = setNominees; + } + + /// @dev Gets the nominee Id in the global nominees set. + /// @param account Nominee address in bytes32 form. + /// @param chainId Chain Id. + /// @return id Nominee Id in the global set of Nominee struct values. + function getNomineeId(bytes32 account, uint256 chainId) external view returns (uint256 id) { + // Get the nominee struct and hash + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + id = mapNomineeIds[nomineeHash]; + } + + /// @dev Get the nominee address and its corresponding chain Id. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @param id Nominee Id in the global set of Nominee struct values. + /// @return nominee Nominee address in bytes32 form and chain Id. + function getNominee(uint256 id) external view returns (Nominee memory nominee) { + // Get the total number of nominees in the contract + uint256 totalNumNominees = setNominees.length - 1; + // Check for the zero id or the overflow + if (id == 0) { + revert ZeroValue(); + } else if (id > totalNumNominees) { + revert Overflow(id, totalNumNominees); + } + + nominee = setNominees[id]; + } + + /// @dev Get the set of nominee addresses and corresponding chain Ids. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @param startId Start Id of the nominee in the global set of Nominee struct values. + /// @param numNominees Number of nominees to get. + /// @return nominees Set of nominee accounts in bytes32 form and chain Ids. + function getNominees( + uint256 startId, + uint256 numNominees + ) external view returns (Nominee[] memory nominees) + { + // Check for the zero id or the overflow + if (startId == 0 || numNominees == 0) { + revert ZeroValue(); + } + + // Get the last nominee Id requested + uint256 endId = startId + numNominees; + // Get the total number of nominees in the contract with the zero-th nominee + uint256 totalNumNominees = setNominees.length; + + // Check for the overflow + if (endId > totalNumNominees) { + revert Overflow(endId, totalNumNominees); + } + + // Allocate the nominee array + nominees = new Nominee[](numNominees); + + // Traverse selected nominees + for (uint256 i = 0; i < numNominees; ++i) { + uint256 id = i + startId; + // Get the nominee struct + nominees[i] = setNominees[id]; + } + } + + /// @dev Gets next allowed voting time for selected nominees and voters. + /// @notice The function does not check for repeated nominees and voters. + /// @param accounts Set of nominee account addresses. + /// @param chainIds Corresponding set of chain Ids. + /// @param voters Corresponding set of voters for specified nominees. + function getNextAllowedVotingTimes( + bytes32[] memory accounts, + uint256[] memory chainIds, + address[] memory voters + ) external view returns (uint256[] memory nextAllowedVotingTimes) { + // Check array lengths + if (accounts.length != chainIds.length || accounts.length != voters.length) { + revert WrongArrayLength(accounts.length, chainIds.length); + } + + // Allocate the times array + nextAllowedVotingTimes = new uint256[](accounts.length); + + // Traverse nominees and get next available voting times + for (uint256 i = 0; i < accounts.length; ++i) { + // Get the nominee struct and hash + Nominee memory nominee = Nominee(accounts[i], chainIds[i]); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + + // Check for nominee existence + if (mapNomineeIds[nomineeHash] == 0) { + revert NomineeDoesNotExist(accounts[i], chainIds[i]); + } + + // Calculate next allowed voting times + nextAllowedVotingTimes[i] = lastUserVote[voters[i]][nomineeHash] + WEIGHT_VOTE_DELAY; + } + } +} \ No newline at end of file diff --git a/contracts/bridges/test/WormholeL1Receiver.sol b/contracts/bridges/test/WormholeL1Receiver.sol new file mode 100644 index 0000000..dee8a10 --- /dev/null +++ b/contracts/bridges/test/WormholeL1Receiver.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +/// @title WormholeL1Receiver - Smart contract for the L1 message receiving via wormhole +/// @author Aleksandr Kuperman - +/// @author Andrey Lebedev - +/// @author Mariapia Moscatiello - +contract WormholeL1Receiver { + event MessageReceived(bytes32 indexed sourceMessageSender, bytes data, bytes32 deliveryHash, uint256 sourceChain); + + /// @dev Processes a message received from L1 Wormhole Relayer contract. + /// @notice The sender must be the source contract address. + /// @param data Bytes message sent from L1 Wormhole Relayer contract. + /// @param sourceAddress The (wormhole format) address on the sending chain which requested this delivery. + /// @param sourceChain The wormhole chain Id where this delivery was requested. + /// @param deliveryHash The VAA hash of the deliveryVAA. + function receiveWormholeMessages( + bytes memory data, + bytes[] memory, + bytes32 sourceAddress, + uint16 sourceChain, + bytes32 deliveryHash + ) external payable { + // Emit received message + emit MessageReceived(sourceAddress, data, deliveryHash, sourceChain); + } +} \ No newline at end of file diff --git a/contracts/bridges/test/WormholeL1Sender.sol b/contracts/bridges/test/WormholeL1Sender.sol new file mode 100644 index 0000000..4fba88e --- /dev/null +++ b/contracts/bridges/test/WormholeL1Sender.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import {IBridgeErrors} from "../../interfaces/IBridgeErrors.sol"; + +interface IWormhole { + function sendPayloadToEvm( + // Chain ID in Wormhole format + uint16 targetChain, + // Contract Address on target chain we're sending a message to + address targetAddress, + // The payload, encoded as bytes + bytes memory payload, + // How much value to attach to the delivery transaction + uint256 receiverValue, + // The gas limit to set on the delivery transaction + uint256 gasLimit + ) external payable returns ( + // Unique, incrementing ID, used to identify a message + uint64 sequence + ); +} + +/// @title WormholeL1Sender - Smart contract for sending a message from L2 to L1 via wormhole +/// @author Aleksandr Kuperman - +/// @author Andrey Lebedev - +/// @author Mariapia Moscatiello - +contract WormholeL1Sender is IBridgeErrors { + event MessageReceived(bytes32 indexed sourceMessageSender, bytes data, bytes32 deliveryHash, uint256 sourceChain); + + uint256 public constant GAS_LIMIT = 50_000; + // L2 Wormhole Relayer address that receives the message across the bridge from the source L1 network + address public immutable wormholeRelayer; + // Source chain Id + uint16 public immutable sourceChainId; + // Source contract to communicate with on L1 + address public sourceSender; + + /// @dev WormholeMessenger constructor. + /// @param _wormholeRelayer L2 Wormhole Relayer address. + /// @param _sourceChainId Source wormhole format chain Id. + constructor(address _wormholeRelayer, uint16 _sourceChainId, address _sourceSender) { + // Check for zero addresses + if (_wormholeRelayer == address(0) || _sourceSender == address(0)) { + revert ZeroAddress(); + } + + // Check source chain Id + if (_sourceChainId == 0) { + revert ZeroValue(); + } + + wormholeRelayer = _wormholeRelayer; + sourceChainId = _sourceChainId; + sourceSender = _sourceSender; + } + + function sendMessage() external payable { + bytes32 message = keccak256(abi.encode("Hello")); + + // Send the message + IWormhole(wormholeRelayer).sendPayloadToEvm{value: msg.value}( + sourceChainId, + sourceSender, + abi.encode(message), + 0, + GAS_LIMIT + ); + } + + receive() external payable {} +} \ No newline at end of file diff --git a/contracts/bridges/test/WormholeL2ReceiverL1Sender.sol b/contracts/bridges/test/WormholeL2ReceiverL1Sender.sol new file mode 100644 index 0000000..ccc9241 --- /dev/null +++ b/contracts/bridges/test/WormholeL2ReceiverL1Sender.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import {IBridgeErrors} from "../../interfaces/IBridgeErrors.sol"; + +interface IWormhole { + function quoteEVMDeliveryPrice( + uint16 targetChain, + uint256 receiverValue, + uint256 gasLimit + ) external returns (uint256 nativePriceQuote, uint256 targetChainRefundPerGasUnused); + + function sendPayloadToEvm( + // Chain ID in Wormhole format + uint16 targetChain, + // Contract Address on target chain we're sending a message to + address targetAddress, + // The payload, encoded as bytes + bytes memory payload, + // How much value to attach to the delivery transaction + uint256 receiverValue, + // The gas limit to set on the delivery transaction + uint256 gasLimit + ) external payable returns ( + // Unique, incrementing ID, used to identify a message + uint64 sequence + ); +} + +/// @title WormholeL2ReceiverL1Sender - Smart contract for the L1-L2-L1 message relaying via wormhole +/// @author Aleksandr Kuperman - +/// @author Andrey Lebedev - +/// @author Mariapia Moscatiello - +contract WormholeL2ReceiverL1Sender is IBridgeErrors { + event MessageReceived(bytes32 indexed sourceMessageSender, bytes data, bytes32 deliveryHash, uint256 sourceChain); + + uint256 public constant GAS_LIMIT = 50_000; + // L2 Wormhole Relayer address that receives the message across the bridge from the source L1 network + address public immutable wormholeRelayer; + // Source chain Id + uint16 public immutable sourceChainId; + // Source contract to communicate with on L1 + address public sourceSender; + // Delivery hashes + mapping(bytes32 => bool) public mapDeliveryHashes; + + /// @dev WormholeMessenger constructor. + /// @param _wormholeRelayer L2 Wormhole Relayer address. + /// @param _sourceChainId Source wormhole format chain Id. + constructor(address _wormholeRelayer, uint16 _sourceChainId) { + // Check for zero addresses + if (_wormholeRelayer == address(0)) { + revert ZeroAddress(); + } + + // Check source chain Id + if (_sourceChainId == 0) { + revert ZeroValue(); + } + + wormholeRelayer = _wormholeRelayer; + sourceChainId = _sourceChainId; + } + + + /// @dev Processes a message received from L2 Wormhole Relayer contract. + /// @notice The sender must be the source contract address. + /// @param data Bytes message sent from L2 Wormhole Relayer contract. + /// @param sourceAddress The (wormhole format) address on the sending chain which requested this delivery. + /// @param sourceChain The wormhole chain Id where this delivery was requested. + /// @param deliveryHash The VAA hash of the deliveryVAA. + function receiveWormholeMessages( + bytes memory data, + bytes[] memory, + bytes32 sourceAddress, + uint16 sourceChain, + bytes32 deliveryHash + ) external payable { + // Check L2 Wormhole Relayer address + if (msg.sender != wormholeRelayer) { + revert TargetRelayerOnly(msg.sender, wormholeRelayer); + } + + // Check the source chain Id + if (sourceChain != sourceChainId) { + revert WrongSourceChainId(sourceChain, sourceChainId); + } + + // Check the delivery hash uniqueness + if (mapDeliveryHashes[deliveryHash]) { + revert AlreadyDelivered(deliveryHash); + } + mapDeliveryHashes[deliveryHash] = true; + + sourceSender = abi.decode(data, (address)); + + // Get a quote for the cost of gas for delivery + uint256 cost; + (cost, ) = IWormhole(wormholeRelayer).quoteEVMDeliveryPrice(sourceChain, 0, GAS_LIMIT); + + // Send the message + IWormhole(wormholeRelayer).sendPayloadToEvm{value: cost}( + sourceChain, + sourceSender, + abi.encode(keccak256("Hello")), + 0, + GAS_LIMIT + ); + + // Emit received message + emit MessageReceived(sourceAddress, data, deliveryHash, sourceChain); + } + + receive() external payable {} +} \ No newline at end of file diff --git a/contracts/test/EchidnaVoteWeightingAssert.sol b/contracts/test/EchidnaVoteWeightingAssert.sol new file mode 100644 index 0000000..8550487 --- /dev/null +++ b/contracts/test/EchidnaVoteWeightingAssert.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import "../OLAS.sol"; +import "../veOLAS.sol"; +import "./VoteWeightingFuzzing.sol"; + + +contract EchidnaVoteWeightingAssert { + OLAS olas; + veOLAS ve; + VoteWeightingFuzzing vw; + uint160 constant FAKE_OLAS = 7; + + uint256 constant oneOLASBalance = 1 ether; + uint256 constant fourYear = 4 * 365 * 86400; + uint256 constant oneYear = 1 * 365 * 86400; + uint256 constant maxVoteWeight = 10000; + uint64 constant WEEK = 1 weeks; + uint256 constant oneOLAS = 1 ether; + uint256 constant oneMLN = 1_000_000; + uint256 ts; + + // msg.sender in Echidna + address[3] private senders = [ address(0x10000), address(0x20000), address(0x30000) ]; + + constructor() payable { + olas = new OLAS(); + address aolas = address(olas); + ve = new veOLAS(aolas, "Voting Escrow OLAS", "veOLAS"); + address ave = address(ve); + vw = new VoteWeightingFuzzing(ave); + olas.mint(address(this),oneOLAS*oneMLN); + } + + // voteForNomineeWeights_assert(0xdeadbeef,1,0,4495678220902361,1124857) + function voteForNomineeWeights_assert(address nominee, uint32 chainId, uint16 weight, uint256 amount, uint32 unlockTime) external { + require(block.timestamp > 0); + require(block.timestamp > ts); + require(unlockTime < fourYear); + require(weight < maxVoteWeight); + require(amount < 100 * oneOLAS); + uint256 balanceOf = olas.balanceOf(address(this)); + assert(balanceOf > amount); + (uint128 initialAmount,) = ve.mapLockedBalances(address(this)); + if (initialAmount == 0) { + olas.approve(address(ve), amount); + ve.createLock(amount, unlockTime); + (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + assert(lockedAmount > 0); + } else { + (uint128 lockedAmount,) = ve.mapLockedBalances(address(this)); + assert(lockedAmount > 0); + } + vw.addNominee(nominee, chainId); + uint256 id = vw.getNomineeId(nominee, chainId); + uint256 num = vw.getNumNominees(); + assert(id > 0); + assert(num > 0); + vw.setCallVoteForNomineeWeights(false); + bool beforeAfterCall = vw.callVoteForNomineeWeights(); + assert(beforeAfterCall == false); + vw.voteForNomineeWeights(nominee, chainId, weight); + bool stateAfterCall = vw.callVoteForNomineeWeights(); + if(stateAfterCall == true) { + uint256 lts = vw.getlastUserVote(nominee,chainId); + assert(lts > 0); + } + ts = block.timestamp; // next timestamp > timestamp + vw.checkpointNominee(nominee, chainId); + } + +} + diff --git a/contracts/test/VoteWeightingFuzzing.sol b/contracts/test/VoteWeightingFuzzing.sol new file mode 100644 index 0000000..5ea83cb --- /dev/null +++ b/contracts/test/VoteWeightingFuzzing.sol @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import "../interfaces/IErrors.sol"; + +interface IVEOLAS { + // Structure for voting escrow points + // The struct size is two storage slots of 2 * uint256 (128 + 128 + 64 + 64 + 128) + struct PointVoting { + // w(i) = at + b (bias) + int128 bias; + // dw / dt = a (slope) + int128 slope; + // Timestamp. It will never practically be bigger than 2^64 - 1 + uint64 ts; + // Block number. It will not be bigger than the timestamp + uint64 blockNumber; + // Token amount. It will never practically be bigger. Initial OLAS cap is 1 bn tokens, or 1e27. + // After 10 years, the inflation rate is 2% per year. It would take 1340+ years to reach 2^128 - 1 + uint128 balance; + } + + /// @dev Gets the `account`'s lock end time. + /// @param account Account address. + /// @return unlockTime Lock end time. + function lockedEnd(address account) external view returns (uint256 unlockTime); + + /// @dev Gets the most recently recorded user point for `account`. + /// @param account Account address. + /// @return pv Last checkpoint. + function getLastUserPoint(address account) external view returns (PointVoting memory pv); +} + +error NomineeDoesNotExist(address nominee, uint256 chainId); +error NomineeAlreadyExists(address nominee, uint256 chainId); +error VoteTooOften(address voter, uint256 curTime, uint256 nextAllowedVotingTime); + +struct Point { + uint256 bias; + uint256 slope; +} + +struct VotedSlope { + uint256 slope; + uint256 power; + uint256 end; +} + +contract VoteWeightingFuzzing is IErrors { + event NewNomineeWeight(address indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); + event VoteForNominee(address indexed user, address indexed nominee, uint256 chainId, uint256 weight); + event NewNominee(address nominee, uint256 chainId); + + // 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 + uint256 public constant WEIGHT_VOTE_DELAY = 864_000; + // Max weight amount + uint256 public constant MAX_WEIGHT = 10_000; + // Maximum chain Id as per EVM specs + uint256 public constant MAX_CHAIN_ID = type(uint64).max / 2 - 36; + // veOLAS contract address + address public immutable ve; + + bool public callVoteForNomineeWeights = false; + + // TODO: Convert both to cyclic map? + // Set of (chainId | nominee) + uint256[] public setNominees; + // Mapping of (chainId | nominee) => nominee Id + mapping(uint256 => uint256) public mapNomineeIds; + + // user -> (chainId | nominee) -> VotedSlope + mapping(address => mapping(uint256 => VotedSlope)) public voteUserSlopes; + // Total vote power used by user + mapping(address => uint256) public voteUserPower; + // Last user vote's timestamp for each (chainId | nominee) + mapping(address => mapping(uint256 => uint256)) public lastUserVote; + + // Past and scheduled points for nominee weight, sum of weights per type, total weight + // Point is for bias+slope + // changes_* are for changes in slope + // time_* are for the last change timestamp + // timestamps are rounded to whole weeks + + // (chainId | nominee) -> time -> Point + mapping(uint256 => mapping(uint256 => Point)) public pointsWeight; + // (chainId | nominee) -> time -> slope + mapping(uint256 => mapping(uint256 => uint256)) public changesWeight; + // (chainId | nominee) -> last scheduled time (next week) + mapping(uint256 => uint256) public timeWeight; + + // time -> Point + mapping(uint256 => Point) public pointsSum; + // time -> slope + mapping(uint256 => uint256) public changesSum; + // last scheduled time (next week) + uint256 public timeSum; + + /// @dev Contract constructor. + /// @param _ve `VotingEscrow` contract address. + constructor(address _ve) { + // Check for the zero address + if (_ve == address(0)) { + revert ZeroAddress(); + } + + // Set initial parameters + ve = _ve; + timeSum = block.timestamp / WEEK * WEEK; + setNominees.push(0); + } + + /// @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. + function _getSum() internal returns (uint256) { + // t is always > 0 as it is set in the constructor + uint256 t = timeSum; + Point memory pt = pointsSum[t]; + for (uint256 i = 0; i < 500; i++) { + if (t > block.timestamp) { + break; + } + t += WEEK; + uint256 dBias = pt.slope * WEEK; + if (pt.bias > dBias) { + pt.bias -= dBias; + uint256 dSlope = changesSum[t]; + pt.slope -= dSlope; + } else { + pt.bias = 0; + pt.slope = 0; + } + + pointsSum[t] = pt; + if (t > block.timestamp) { + timeSum = t; + } + } + return pt.bias; + } + + /// @dev Fill historic nominee weights week-over-week for missed checkins and return the total for the future week. + /// @param nominee Address of the nominee. + /// @param chainId Chain Id. + /// @return Nominee weight. + function _getWeight(address nominee, uint256 chainId) internal returns (uint256) { + // Push a pair of key defining variables into one key + // Nominee address and chain Id + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + // Check that the nominee exists + if (mapNomineeIds[nomineeChainId] == 0) { + revert NomineeDoesNotExist(nominee, chainId); + } + + // t is always > 0 as it is set during the addNominee() call + uint256 t = timeWeight[nomineeChainId]; + Point memory pt = pointsWeight[nomineeChainId][t]; + for (uint256 i = 0; i < 500; i++) { + if (t > block.timestamp) { + break; + } + t += WEEK; + uint256 dBias = pt.slope * WEEK; + if (pt.bias > dBias) { + pt.bias -= dBias; + uint256 dSlope = changesWeight[nomineeChainId][t]; + pt.slope -= dSlope; + } else { + pt.bias = 0; + pt.slope = 0; + } + + pointsWeight[nomineeChainId][t] = pt; + if (t > block.timestamp) { + timeWeight[nomineeChainId] = t; + } + } + return pt.bias; + } + + /// @dev Add nominee address along with the chain Id. + /// @param nominee Address of the nominee. + /// @param chainId Chain Id. + function addNominee(address nominee, uint256 chainId) external { + // Check for the zero address + if (nominee == address(0)) { + revert ZeroAddress(); + } + + // Check for the chain Id + if (chainId == 0) { + revert ZeroValue(); + } + else if (chainId > MAX_CHAIN_ID) { + revert Overflow(chainId, MAX_CHAIN_ID); + } + + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + // Check for the nominee existence + if (mapNomineeIds[nomineeChainId] > 0) { + revert NomineeAlreadyExists(nominee, chainId); + } + mapNomineeIds[nomineeChainId] = setNominees.length; + // Push the nominee into the list + setNominees.push(nomineeChainId); + + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + timeWeight[nomineeChainId] = nextTime; + + emit NewNominee(nominee, chainId); + } + + /// @dev Checkpoint to fill data common for all nominees. + function checkpoint() external { + _getSum(); + } + + /// @dev Checkpoint to fill data for both a specific nominee and common for all nominees. + /// @param nominee Address of the nominee. + /// @param chainId Chain Id. + function checkpointNominee(address nominee, uint256 chainId) external { + _getWeight(nominee, chainId); + _getSum(); + } + + /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 (e.g. 1.0 == 1e18) and a sum of weights. + /// Inflation which will be received by it is inflation_rate * relativeWeight / 1e18. + /// @param nominee Address of the nominee. + /// @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 totalSum Sum of nominee weights. + function _nomineeRelativeWeight( + address nominee, + uint256 chainId, + uint256 time + ) internal view returns (uint256 weight, uint256 totalSum) { + uint256 t = time / WEEK * WEEK; + totalSum = pointsSum[t].bias; + + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + if (totalSum > 0) { + uint256 nomineeWeight = pointsWeight[nomineeChainId][t].bias; + weight = 1e18 * nomineeWeight / totalSum; + } + } + + /// @dev Get Nominee relative weight (not more than 1.0) normalized to 1e18 and the sum of weights. + /// (e.g. 1.0 == 1e18). Inflation which will be received by it is + /// inflation_rate * relativeWeight / 1e18. + /// @param nominee Address of the nominee. + /// @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 totalSum Sum of nominee weights. + function nomineeRelativeWeight( + address nominee, + uint256 chainId, + uint256 time + ) external view returns (uint256 weight, uint256 totalSum) { + (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + } + + /// @dev Get nominee weight normalized to 1e18 and also fill all the unfilled values for type and nominee records. + /// Also, get the total sum of all the nominee weights. + /// @notice Any address can call, however nothing is recorded if the values are filled already. + /// @param nominee Address of the nominee. + /// @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 totalSum Sum of nominee weights. + function nomineeRelativeWeightWrite( + address nominee, + uint256 chainId, + uint256 time + ) external returns (uint256 weight, uint256 totalSum) { + _getWeight(nominee, chainId); + _getSum(); + (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + } + + /// @dev Allocate voting power for changing pool weights. + /// @param nominee Address of the nominee the `msg.sender` votes for. + /// @param chainId Chain Id. + /// @param weight Weight for a nominee in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + function voteForNomineeWeights(address nominee, uint256 chainId, uint256 weight) public { + + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); + uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + + // Check for the lock end expiration + if (nextTime >= lockEnd) { + revert LockExpired(msg.sender, lockEnd, nextTime); + } + + // Check for the weight number + if (weight > MAX_WEIGHT) { + revert Overflow(weight, MAX_WEIGHT); + } + + // Check for the last voting time + uint256 nextAllowedVotingTime = lastUserVote[msg.sender][nomineeChainId] + WEIGHT_VOTE_DELAY; + if (nextAllowedVotingTime > block.timestamp) { + revert VoteTooOften(msg.sender, block.timestamp, nextAllowedVotingTime); + } + + // Prepare old and new slopes and biases + VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeChainId]; + uint256 oldBias; + if (oldSlope.end > nextTime) { + oldBias = oldSlope.slope * (oldSlope.end - nextTime); + } + + VotedSlope memory newSlope = VotedSlope({ + slope: slope * weight / MAX_WEIGHT, + end: lockEnd, + power: weight + }); + + uint256 newBias = newSlope.slope * (lockEnd - nextTime); + + uint256 powerUsed = voteUserPower[msg.sender]; + powerUsed = powerUsed + newSlope.power - oldSlope.power; + voteUserPower[msg.sender] = powerUsed; + if (powerUsed > MAX_WEIGHT) { + revert Overflow(powerUsed, MAX_WEIGHT); + } + + // Remove old and schedule new slope changes + // Remove slope changes for old slopes + // Schedule recording of initial slope for nextTime + pointsWeight[nomineeChainId][nextTime].bias = _maxAndSub(_getWeight(nominee, chainId) + newBias, oldBias); + + pointsSum[nextTime].bias = _maxAndSub(_getSum() + newBias, oldBias); + if (oldSlope.end > nextTime) { + pointsWeight[nomineeChainId][nextTime].slope = _maxAndSub(pointsWeight[nomineeChainId][nextTime].slope + newSlope.slope, oldSlope.slope); + pointsSum[nextTime].slope = _maxAndSub(pointsSum[nextTime].slope + newSlope.slope, oldSlope.slope); + } else { + pointsWeight[nomineeChainId][nextTime].slope += newSlope.slope; + pointsSum[nextTime].slope += newSlope.slope; + } + if (oldSlope.end > block.timestamp) { + // Cancel old slope changes if they still didn't happen + changesWeight[nomineeChainId][oldSlope.end] -= oldSlope.slope; + changesSum[oldSlope.end] -= oldSlope.slope; + } + // Add slope changes for new slopes + changesWeight[nomineeChainId][newSlope.end] += newSlope.slope; + changesSum[newSlope.end] += newSlope.slope; + + voteUserSlopes[msg.sender][nomineeChainId] = newSlope; + + // Record last action time + lastUserVote[msg.sender][nomineeChainId] = block.timestamp; + assert(lastUserVote[msg.sender][nomineeChainId] > 0); + + callVoteForNomineeWeights = true; + emit VoteForNominee(msg.sender, nominee, chainId, weight); + } + + /// @dev Allocate voting power for changing pool weights in batch. + /// @param nominees Set of nominees the `msg.sender` votes for. + /// @param chainIds Set of corresponding chain Ids. + /// @param weights Weights for a nominees in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0. + function voteForNomineeWeightsBatch( + address[] memory nominees, + uint256[] memory chainIds, + uint256[] memory weights + ) external { + if (nominees.length != chainIds.length || nominees.length != weights.length) { + revert WrongArrayLength(nominees.length, weights.length); + } + + // Traverse all accounts and weights + for (uint256 i = 0; i < nominees.length; ++i) { + voteForNomineeWeights(nominees[i], chainIds[i], weights[i]); + } + } + + function _maxAndSub(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : 0; + } + + /// @dev Get current nominee weight. + /// @param nominee Address of the nominee. + /// @param chainId Chain Id. + /// @return Nominee weight. + function getNomineeWeight(address nominee, uint256 chainId) external view returns (uint256) { + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + return pointsWeight[nomineeChainId][timeWeight[nomineeChainId]].bias; + } + + /// @dev Get sum of nominee weights. + /// @return Sum of nominee weights. + function getWeightsSum() external view returns (uint256) { + return pointsSum[timeSum].bias; + } + + /// @dev Get the number of nominees. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @return Total number of nominees. + function getNumNominees() external view returns (uint256) { + return setNominees.length - 1; + } + + /// @dev Gets the nominee Id in the global nominees set. + /// @param nominee Nominee address. + /// @param chainId Chain Id. + /// @return id Nominee Id in the global set of (nominee | chainId) values. + function getNomineeId(address nominee, uint256 chainId) external view returns (uint256 id) { + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + + id = mapNomineeIds[nomineeChainId]; + } + + /// @dev Get the nominee address and its corresponding chain Id. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @param id Nominee Id in the global set of (nominee | chainId) values. + /// @return nominee Nominee address. + /// @return chainId Chain Id. + function getNominee(uint256 id) external view returns (address nominee, uint256 chainId) { + // Get the total number of nominees in the contract + uint256 totalNumNominees = setNominees.length - 1; + // Check for the zero id or the overflow + if (id == 0) { + revert ZeroValue(); + } else if (id > totalNumNominees) { + revert Overflow(id, totalNumNominees); + } + + uint256 nomineeChainId = setNominees[id]; + // Extract the nominee address + nominee = address(uint160(uint256(nomineeChainId))); + // Extract chain Id + chainId = nomineeChainId >> 160; + } + + /// @dev Get the set of nominee addresses and corresponding chain Ids. + /// @notice The zero-th default nominee Id with id == 0 does not count. + /// @param startId Start Id of the nominee in the global set of (nominee | chainId) values. + /// @param numNominees Number of nominees to get. + /// @return nominees Set of nominee addresses. + /// @return chainIds Set of corresponding chain Ids. + function getNominees( + uint256 startId, + uint256 numNominees + ) external view returns (address[] memory nominees, uint256[] memory chainIds) + { + // Check for the zero id or the overflow + if (startId == 0 || numNominees == 0) { + revert ZeroValue(); + } + + // Get the last nominee Id requested + uint256 endId = startId + numNominees; + // Get the total number of nominees in the contract with the zero-th nominee + uint256 totalNumNominees = setNominees.length; + + // Check for the overflow + if (endId > totalNumNominees) { + revert Overflow(endId, totalNumNominees); + } + + // Allocate + nominees = new address[](numNominees); + chainIds = new uint256[](numNominees); + + // Traverse selected nominees + for (uint256 i = 0; i < numNominees; ++i) { + uint256 id = i + startId; + uint256 nomineeChainId = setNominees[id]; + // Extract the nominee address + nominees[i] = address(uint160(uint256(nomineeChainId))); + // Extract chain Id + chainIds[i] = nomineeChainId >> 160; + } + } + + /// @dev For fuzzing only + function setCallVoteForNomineeWeights(bool flag) external { + callVoteForNomineeWeights = flag; + } + /// @dev For fuzzing only + function getlastUserVote(address nominee, uint256 chainId) external view returns (uint256) { + // Push a pair of key defining variables into one key + // nominee occupies first 160 bits + uint256 nomineeChainId = uint256(uint160(nominee)); + // chain Id occupies no more than next 64 bits + nomineeChainId |= chainId << 160; + return lastUserVote[msg.sender][nomineeChainId]; + } +} \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index 9f334db..454ff71 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -14,7 +14,7 @@ const ALCHEMY_API_KEY_MAINNET = process.env.ALCHEMY_API_KEY_MAINNET; const ALCHEMY_API_KEY_MATIC = process.env.ALCHEMY_API_KEY_MATIC; const ALCHEMY_API_KEY_GOERLI = process.env.ALCHEMY_API_KEY_GOERLI; const ALCHEMY_API_KEY_SEPOLIA = process.env.ALCHEMY_API_KEY_SEPOLIA; -const ALCHEMY_API_KEY_MUMBAI = process.env.ALCHEMY_API_KEY_MUMBAI; +const ALCHEMY_API_KEY_AMOY = process.env.ALCHEMY_API_KEY_AMOY; let TESTNET_MNEMONIC = process.env.TESTNET_MNEMONIC; const accounts = { @@ -88,8 +88,8 @@ module.exports = { accounts: accounts, chainId: 11155111, }, - polygonMumbai: { - url: "https://polygon-mumbai.g.alchemy.com/v2/" + ALCHEMY_API_KEY_MUMBAI, + polygonAmoy: { + url: "https://polygon-amoy.g.alchemy.com/v2/" + ALCHEMY_API_KEY_AMOY, accounts: accounts, }, chiado: { @@ -122,6 +122,14 @@ module.exports = { }, etherscan: { customChains: [ + { + network: "polygonAmoy", + chainId: 80002, + urls: { + apiURL: "https://api-amoy.polygonscan.com/api", + browserURL: "https://amoy.polygonscan.com/" + } + }, { network: "chiado", chainId: 10200, @@ -205,7 +213,7 @@ module.exports = { celo: CELOSCAN_API_KEY, goerli: ETHERSCAN_API_KEY, sepolia: ETHERSCAN_API_KEY, - polygonMumbai: POLYGONSCAN_API_KEY, + polygonAmoy: POLYGONSCAN_API_KEY, chiado: GNOSISSCAN_API_KEY, arbitrumSepolia: ARBISCAN_API_KEY, optimisticSepolia: OPSCAN_API_KEY, diff --git a/package.json b/package.json index c71582b..22d9ab3 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.21.0", + "hardhat": "^2.22.3", "@typechain/hardhat": "^9.1.0", "ethers": "^5.7.2", "@typechain/ethers-v5": "^11.1.2", diff --git a/scripts/deployment/bridges/gnosis/test/mediator_goerli_chiado_change_governor.js b/scripts/deployment/bridges/gnosis/test/mediator_goerli_chiado_change_governor.js new file mode 100644 index 0000000..12daecc --- /dev/null +++ b/scripts/deployment/bridges/gnosis/test/mediator_goerli_chiado_change_governor.js @@ -0,0 +1,80 @@ +/*global process*/ + +const { ethers } = require("ethers"); + +async function main() { + const ALCHEMY_API_KEY_GOERLI = process.env.ALCHEMY_API_KEY_GOERLI; + const goerliURL = "https://eth-goerli.g.alchemy.com/v2/" + ALCHEMY_API_KEY_GOERLI; + const goerliProvider = new ethers.providers.JsonRpcProvider(goerliURL); + await goerliProvider.getBlockNumber().then((result) => { + console.log("Current block number goerli: " + result); + }); + + const chiadoURL = "https://rpc.chiadochain.net"; + const chiadoProvider = new ethers.providers.JsonRpcProvider(chiadoURL); + await chiadoProvider.getBlockNumber().then((result) => { + console.log("Current block number chiado: " + result); + }); + + const fs = require("fs"); + // AMBProxy address on goerli + const AMBProxyAddress = "0x87A19d769D875964E9Cd41dDBfc397B2543764E6"; + const AMBProxyJSON = "abis/test/EternalStorageProxy.json"; + let contractFromJSON = fs.readFileSync(AMBProxyJSON, "utf8"); + const AMBProxyABI = JSON.parse(contractFromJSON); + const AMBProxy = new ethers.Contract(AMBProxyAddress, AMBProxyABI, goerliProvider); + + // Test deployed HomeMediator address on chiado + const homeMediatorAddress = "0x0a50009D55Ed5700ac8FF713709d5Ad5fa843896"; + const homeMediatorJSON = "artifacts/contracts/bridges/HomeMediator.sol/HomeMediator.json"; + contractFromJSON = fs.readFileSync(homeMediatorJSON, "utf8"); + let parsedFile = JSON.parse(contractFromJSON); + const homeMediatorABI = parsedFile["abi"]; + const homeMediator = new ethers.Contract(homeMediatorAddress, homeMediatorABI, chiadoProvider); + + // Mock Timelock contract address on goerli (has AMBProxy address in it already) + const mockTimelockAddress = "0x5b03476a21e9c7cEB8dB1Bd9F24664e480FDcc43"; + const mockTimelockJSON = "artifacts/contracts/bridges/test/MockTimelock.sol/MockTimelock.json"; + contractFromJSON = fs.readFileSync(mockTimelockJSON, "utf8"); + parsedFile = JSON.parse(contractFromJSON); + const mockTimelockABI = parsedFile["abi"]; + const mockTimelock = new ethers.Contract(mockTimelockAddress, mockTimelockABI, goerliProvider); + + // Get the EOA + const account = ethers.utils.HDNode.fromMnemonic(process.env.TESTNET_MNEMONIC).derivePath("m/44'/60'/0'/0/0"); + const EOAgoerli = new ethers.Wallet(account, goerliProvider); + const EOAchiado = new ethers.Wallet(account, chiadoProvider); + console.log("EOA address",EOAgoerli.address); + if (EOAchiado.address == EOAgoerli.address) { + console.log("Correct wallet setup"); + } + + // Home Mediator to change the foreign governor address + const rawPayload = homeMediator.interface.encodeFunctionData("changeForeignGovernor", [EOAchiado.address]); + // Pack the second part of data + const target = homeMediatorAddress; + const value = 0; + const payload = ethers.utils.arrayify(rawPayload); + const data = ethers.utils.solidityPack( + ["address", "uint96", "uint32", "bytes"], + [target, value, payload.length, payload] + ); + + // Build the final payload to be passed from the imaginary Timelock + const mediatorPayload = await homeMediator.interface.encodeFunctionData("processMessageFromForeign", [data]); + const requestGasLimit = "2000000"; + const timelockPayload = await AMBProxy.interface.encodeFunctionData("requireToPassMessage", [homeMediatorAddress, + mediatorPayload, requestGasLimit]); + + // Send the message to chiado receiver + const tx = await mockTimelock.connect(EOAgoerli).execute(timelockPayload); + console.log("Timelock data execution hash", tx.hash); + await tx.wait(); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/optimistic/test/deploy_00_mock_timelock.js b/scripts/deployment/bridges/optimistic/test/deploy_00_mock_timelock.js index 73515f0..9d15c68 100644 --- a/scripts/deployment/bridges/optimistic/test/deploy_00_mock_timelock.js +++ b/scripts/deployment/bridges/optimistic/test/deploy_00_mock_timelock.js @@ -11,7 +11,6 @@ async function main() { const useLedger = parsedData.useLedger; const derivationPath = parsedData.derivationPath; const providerName = "sepolia"; - const gasPriceInGwei = parsedData.gasPriceInGwei; let EOA; const provider = await ethers.providers.getDefaultProvider(providerName); diff --git a/scripts/deployment/bridges/polygon/test/fx_goerli_mumbai_hello_world.js b/scripts/deployment/bridges/polygon/test/fx_goerli_mumbai_hello_world.js index 1443d33..d193d90 100644 --- a/scripts/deployment/bridges/polygon/test/fx_goerli_mumbai_hello_world.js +++ b/scripts/deployment/bridges/polygon/test/fx_goerli_mumbai_hello_world.js @@ -26,14 +26,6 @@ async function main() { const fxRootABI = parsedFile["abi"]; const fxRoot = new ethers.Contract(fxRootAddress, fxRootABI, goerliProvider); - // FxChild address on mumbai - const fxChildAddress = "0xCf73231F28B7331BBe3124B907840A94851f9f11"; - const fxChildJSON = "artifacts/fx-portal/contracts/FxChild.sol/FxChild.json"; - contractFromJSON = fs.readFileSync(fxChildJSON, "utf8"); - parsedFile = JSON.parse(contractFromJSON); - const fxChildABI = parsedFile["abi"]; - const fxChild = new ethers.Contract(fxChildAddress, fxChildABI, mumbaiProvider); - // Test deployed FxChildTunnel address on mumbai const fxChildTunnelAddress = "0x31D3202d8744B16A120117A053459DDFAE93c855"; const fxChildTunnelJSON = "artifacts/contracts/bridges/test/FxChildTunnel.sol/FxChildTunnel.json"; @@ -42,6 +34,8 @@ async function main() { const fxChildTunnelABI = parsedFile["abi"]; const fxChildTunnel = new ethers.Contract(fxChildTunnelAddress, fxChildTunnelABI, mumbaiProvider); const verifyFxChildAddress = await fxChildTunnel.fxChild(); + + const fxChildAddress = "0xCf73231F28B7331BBe3124B907840A94851f9f11"; if (fxChildAddress == verifyFxChildAddress) { console.log("Successfully connected to the test fxChildTunnel contract"); } diff --git a/scripts/deployment/bridges/polygon/test/fx_mumbai_goerli_token_transfer.js b/scripts/deployment/bridges/polygon/test/fx_mumbai_goerli_token_transfer.js index a63cf42..03af9af 100644 --- a/scripts/deployment/bridges/polygon/test/fx_mumbai_goerli_token_transfer.js +++ b/scripts/deployment/bridges/polygon/test/fx_mumbai_goerli_token_transfer.js @@ -18,38 +18,15 @@ async function main() { }); const fs = require("fs"); - // FxRoot address on goerli - const fxRootAddress = "0x3d1d3E34f7fB6D26245E6640E1c50710eFFf15bA"; - const fxRootJSON = "artifacts/lib/fx-portal/contracts/FxRoot.sol/FxRoot.json"; - let contractFromJSON = fs.readFileSync(fxRootJSON, "utf8"); - let parsedFile = JSON.parse(contractFromJSON); - const fxRootABI = parsedFile["abi"]; - const fxRoot = new ethers.Contract(fxRootAddress, fxRootABI, goerliProvider); - - // FxChild address on mumbai - const fxChildAddress = "0xCf73231F28B7331BBe3124B907840A94851f9f11"; - const fxChildJSON = "artifacts/lib/fx-portal/contracts/FxChild.sol/FxChild.json"; - contractFromJSON = fs.readFileSync(fxChildJSON, "utf8"); - parsedFile = JSON.parse(contractFromJSON); - const fxChildABI = parsedFile["abi"]; - const fxChild = new ethers.Contract(fxChildAddress, fxChildABI, mumbaiProvider); // ChildMockERC20 address on mumbai const mockChildERC20Address = "0xeB49bE5DF00F74bd240DE4535DDe6Bc89CEfb994"; const mockChildERC20JSON = "artifacts/contracts/bridges/test/ChildMockERC20.sol/ChildMockERC20.json"; - contractFromJSON = fs.readFileSync(mockChildERC20JSON, "utf8"); - parsedFile = JSON.parse(contractFromJSON); + let contractFromJSON = fs.readFileSync(mockChildERC20JSON, "utf8"); + let parsedFile = JSON.parse(contractFromJSON); const mockChildERC20ABI = parsedFile["abi"]; const mockChildERC20 = new ethers.Contract(mockChildERC20Address, mockChildERC20ABI, mumbaiProvider); - // BridgedERC20 address on goerli - const bridgedERC20Address = "0x88e4ad16Bd4953Bbe74589942b368969037a7d81"; - const bridgedERC20JSON = "artifacts/contracts/bridges/BridgedERC20.sol/BridgedERC20.json"; - contractFromJSON = fs.readFileSync(bridgedERC20JSON, "utf8"); - parsedFile = JSON.parse(contractFromJSON); - const bridgedERC20ABI = parsedFile["abi"]; - const bridgedERC20 = new ethers.Contract(bridgedERC20Address, bridgedERC20ABI, goerliProvider); - // Test deployed FxERC20ChildTunnel address on mumbai const fxERC20ChildTunnelAddress = "0x1d333b46dB6e8FFd271b6C2D2B254868BD9A2dbd"; const fxERC20ChildTunnelJSON = "artifacts/contracts/bridges/FxERC20ChildTunnel.sol/FxERC20ChildTunnel.json"; @@ -58,6 +35,9 @@ async function main() { const fxERC20ChildTunnelABI = parsedFile["abi"]; const fxERC20ChildTunnel = new ethers.Contract(fxERC20ChildTunnelAddress, fxERC20ChildTunnelABI, mumbaiProvider); const verifyFxChildAddress = await fxERC20ChildTunnel.fxChild(); + + // FxChild address on mumbai + const fxChildAddress = "0xCf73231F28B7331BBe3124B907840A94851f9f11"; if (fxChildAddress == verifyFxChildAddress) { console.log("Successfully connected to the test fxERC20ChildTunnel contract"); } @@ -70,6 +50,9 @@ async function main() { const fxERC20RootTunnelABI = parsedFile["abi"]; const fxERC20RootTunnel = new ethers.Contract(fxERC20RootTunnelAddress, fxERC20RootTunnelABI, goerliProvider); const verifyFxRootAddress = await fxERC20RootTunnel.fxRoot(); + + // FxRoot address on goerli + const fxRootAddress = "0x3d1d3E34f7fB6D26245E6640E1c50710eFFf15bA"; if (fxRootAddress == verifyFxRootAddress) { console.log("Successfully connected to the test fxERC20RootTunnel contract"); } diff --git a/scripts/deployment/bridges/wormhole/test/deploy_00_mock_timelock.js b/scripts/deployment/bridges/wormhole/test/deploy_00_mock_timelock.js index 2594c6f..c7fb757 100644 --- a/scripts/deployment/bridges/wormhole/test/deploy_00_mock_timelock.js +++ b/scripts/deployment/bridges/wormhole/test/deploy_00_mock_timelock.js @@ -11,7 +11,6 @@ async function main() { const useLedger = parsedData.useLedger; const derivationPath = parsedData.derivationPath; const providerName = "sepolia"; - const gasPriceInGwei = parsedData.gasPriceInGwei; let EOA; const provider = await ethers.providers.getDefaultProvider(providerName); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_03_womholel2receiverl1sender.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_03_womholel2receiverl1sender.js new file mode 100644 index 0000000..c595da1 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_03_womholel2receiverl1sender.js @@ -0,0 +1,57 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + let EOA; + + const provider = new ethers.providers.JsonRpcProvider(parsedData.networkURL); + const signers = await ethers.getSigners(); + + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("1. EOA to deploy WormholeL2ReceiverL1Sender contract"); + const WormholeL2ReceiverL1Sender = await ethers.getContractFactory("WormholeL2ReceiverL1Sender"); + console.log("You are signing the following transaction: WormholeL2ReceiverL1Sender.connect(EOA).deploy()"); + const wormholeL2ReceiverL1Sender = await WormholeL2ReceiverL1Sender.connect(EOA).deploy(parsedData.L2WormholeRelayerAddress, + parsedData.sourceChainId, parsedData.wormholeL1ReceiverAddress); + const result = await wormholeL2ReceiverL1Sender.deployed(); + + // Transaction details + console.log("Contract deployment: WormholeL2ReceiverL1Sender"); + console.log("Contract address:", wormholeL2ReceiverL1Sender.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.wormholeL2ReceiverL1SenderAddress = wormholeL2ReceiverL1Sender.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_03_womholel2receiverl1sender.js --network " + providerName + " " + wormholeL2ReceiverL1Sender.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_04_womholel1receiver.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_04_womholel1receiver.js new file mode 100644 index 0000000..bc73235 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_04_womholel1receiver.js @@ -0,0 +1,56 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = "sepolia"; + let EOA; + + const provider = await ethers.providers.getDefaultProvider(providerName); + const signers = await ethers.getSigners(); + + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("1. EOA to deploy WormholeL1Receiver contract"); + const WormholeL1Receiver = await ethers.getContractFactory("WormholeL1Receiver"); + console.log("You are signing the following transaction: WormholeL1Receiver.connect(EOA).deploy()"); + const wormholeL1Receiver = await WormholeL1Receiver.connect(EOA).deploy(); + const result = await wormholeL1Receiver.deployed(); + + // Transaction details + console.log("Contract deployment: WormholeL1Receiver"); + console.log("Contract address:", wormholeL1Receiver.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.wormholeL1ReceiverAddress = wormholeL1Receiver.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --network " + providerName + " " + wormholeL1Receiver.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_05_womholel1sender.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_05_womholel1sender.js new file mode 100644 index 0000000..7653cc5 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/deploy_05_womholel1sender.js @@ -0,0 +1,57 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + let EOA; + + const provider = new ethers.providers.JsonRpcProvider(parsedData.networkURL); + const signers = await ethers.getSigners(); + + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("1. EOA to deploy WormholeL1Sender contract"); + const WormholeL1Sender = await ethers.getContractFactory("WormholeL1Sender"); + console.log("You are signing the following transaction: WormholeL1Sender.connect(EOA).deploy()"); + const wormholeL1Sender = await WormholeL1Sender.connect(EOA).deploy(parsedData.L2WormholeRelayerAddress, + parsedData.sourceChainId, parsedData.wormholeL1ReceiverAddress); + const result = await wormholeL1Sender.deployed(); + + // Transaction details + console.log("Contract deployment: WormholeL1Sender"); + console.log("Contract address:", wormholeL1Sender.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.wormholeL1SenderAddress = wormholeL1Sender.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_05_womholel1sender.js --network " + providerName + " " + wormholeL1Sender.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/globals_optimistic_sepolia.json b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/globals_optimistic_sepolia.json new file mode 100644 index 0000000..0c8551c --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/globals_optimistic_sepolia.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"optimisticSepolia","gasPriceInGwei":"2","networkURL":"https://sepolia.optimism.io","sourceChainId":"10002","L1WormholeRelayerAddress":"0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470","L2WormholeRelayerAddress":"0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE","wormholeL2ReceiverL1SenderAddress":"0x1d333b46dB6e8FFd271b6C2D2B254868BD9A2dbd","wormholeL1ReceiverAddress":"0xF66E23209074FA7946E41f45f43d765281af2207","wormholeL1SenderAddress":"0x04A0afD079F14D539B17253Ea93563934A024165"} \ No newline at end of file diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_l2_only_sepolia_optimism_sepolia.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_l2_only_sepolia_optimism_sepolia.js new file mode 100644 index 0000000..8763090 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_l2_only_sepolia_optimism_sepolia.js @@ -0,0 +1,60 @@ +/*global process*/ + +const { ethers } = require("ethers"); + +async function main() { + const sepoliaURL = "https://eth-sepolia.g.alchemy.com/v2/" + process.env.ALCHEMY_API_KEY_SEPOLIA; + const sepoliaProvider = new ethers.providers.JsonRpcProvider(sepoliaURL); + await sepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number sepolia: " + result); + }); + + const optimisticSepoliaURL = "https://sepolia.optimism.io"; + const optimisticSepoliaProvider = new ethers.providers.JsonRpcProvider(optimisticSepoliaURL); + await optimisticSepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number optimisticSepolia: " + result); + }); + + const fs = require("fs"); + // WormholeRelayer address on optimistic sepolia + const wormholeRelayerAddress = "0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE"; + const wormholeRelayerJSON = "abis/test/WormholeRelayer.json"; + let contractFromJSON = fs.readFileSync(wormholeRelayerJSON, "utf8"); + const wormholeRelayerABI = JSON.parse(contractFromJSON); + const wormholeRelayer = new ethers.Contract(wormholeRelayerAddress, wormholeRelayerABI, optimisticSepoliaProvider); + + // Test deployed WormholeMessenger address on optimisticSepolia + const wormholeMessengerAddress = "0x04A0afD079F14D539B17253Ea93563934A024165"; // payable process on L2 + const wormholeMessengerJSON = "artifacts/contracts/bridges/test/WormholeL2ReceiverL1Sender.sol/WormholeL2ReceiverL1Sender.json"; + contractFromJSON = fs.readFileSync(wormholeMessengerJSON, "utf8"); + let parsedFile = JSON.parse(contractFromJSON); + const wormholeMessengerABI = parsedFile["abi"]; + const wormholeMessenger = new ethers.Contract(wormholeMessengerAddress, wormholeMessengerABI, optimisticSepoliaProvider); + + // Get the EOA + const account = ethers.utils.HDNode.fromMnemonic(process.env.TESTNET_MNEMONIC).derivePath("m/44'/60'/0'/0/0"); + const EOAsepolia = new ethers.Wallet(account, sepoliaProvider); + const EOAoptimisticSepolia = new ethers.Wallet(account, optimisticSepoliaProvider); + console.log("EOA address",EOAsepolia.address); + if (EOAoptimisticSepolia.address == EOAsepolia.address) { + console.log("Correct wallet setup"); + } + + const targetChain = 10002; // sepolia + const minGasLimit = "50000"; + const transferCost = await wormholeRelayer["quoteEVMDeliveryPrice(uint16,uint256,uint256)"](targetChain, 0, minGasLimit); + + // Send the message to optimisticSepolia receiver + const tx = await wormholeMessenger.connect(EOAoptimisticSepolia).sendMessage({ value: transferCost.nativePriceQuote }); + console.log("Execution hash", tx.hash); + await tx.wait(); + // https://wormholescan.io/#/tx/0xef934da740738881b3069373602a64148944e15ae3b5da2c2630f85886ae6453?network=TESTNET + // https://sepolia.etherscan.io/tx/0x3c85e931ee7f974f771d2b589a11f24e6982f4d68444e47ff57f6a24203788b0 +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_sepolia_optimism_sepolia.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_sepolia_optimism_sepolia.js new file mode 100644 index 0000000..f13da7d --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/messenger_sepolia_optimism_sepolia.js @@ -0,0 +1,81 @@ +/*global process*/ + +const { ethers } = require("ethers"); + +async function main() { + const sepoliaURL = "https://eth-sepolia.g.alchemy.com/v2/" + process.env.ALCHEMY_API_KEY_SEPOLIA; + const sepoliaProvider = new ethers.providers.JsonRpcProvider(sepoliaURL); + await sepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number sepolia: " + result); + }); + + const optimisticSepoliaURL = "https://sepolia.optimism.io"; + const optimisticSepoliaProvider = new ethers.providers.JsonRpcProvider(optimisticSepoliaURL); + await optimisticSepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number optimisticSepolia: " + result); + }); + + const fs = require("fs"); + // WormholeRelayer address on sepolia + const wormholeRelayerAddress = "0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470"; + const wormholeRelayerJSON = "abis/test/WormholeRelayer.json"; + let contractFromJSON = fs.readFileSync(wormholeRelayerJSON, "utf8"); + const wormholeRelayerABI = JSON.parse(contractFromJSON); + const wormholeRelayer = new ethers.Contract(wormholeRelayerAddress, wormholeRelayerABI, sepoliaProvider); + + // Test deployed WormholeMessenger address on optimisticSepolia + const wormholeMessengerAddress = "0x1d333b46dB6e8FFd271b6C2D2B254868BD9A2dbd"; // payable process on L2 + const wormholeMessengerJSON = "artifacts/contracts/bridges/test/WormholeL2ReceiverL1Sender.sol/WormholeL2ReceiverL1Sender.json"; + contractFromJSON = fs.readFileSync(wormholeMessengerJSON, "utf8"); + let parsedFile = JSON.parse(contractFromJSON); + const wormholeMessengerABI = parsedFile["abi"]; + const wormholeMessenger = new ethers.Contract(wormholeMessengerAddress, wormholeMessengerABI, optimisticSepoliaProvider); + + // Mock Timelock contract address on sepolia (has WormholeRelayer address in it already) + const mockTimelockAddress = "0x14CF2e543AB75B321bcf84C3AcC88d570Ccf9106"; // payable + const mockTimelockJSON = "artifacts/contracts/bridges/test/MockTimelock.sol/MockTimelock.json"; + contractFromJSON = fs.readFileSync(mockTimelockJSON, "utf8"); + parsedFile = JSON.parse(contractFromJSON); + const mockTimelockABI = parsedFile["abi"]; + const mockTimelock = new ethers.Contract(mockTimelockAddress, mockTimelockABI, sepoliaProvider); + + // Get the EOA + const account = ethers.utils.HDNode.fromMnemonic(process.env.TESTNET_MNEMONIC).derivePath("m/44'/60'/0'/0/0"); + const EOAsepolia = new ethers.Wallet(account, sepoliaProvider); + const EOAoptimisticSepolia = new ethers.Wallet(account, optimisticSepoliaProvider); + console.log("EOA address",EOAsepolia.address); + if (EOAoptimisticSepolia.address == EOAsepolia.address) { + console.log("Correct wallet setup"); + } + + const amountToSend = ethers.utils.parseEther("0.02"); + let tx = await EOAoptimisticSepolia.sendTransaction({to: wormholeMessenger.address, value: amountToSend}); + console.log("Send Optimistic hash", tx.hash); + await tx.wait(); + + const targetChain = 10005; // optimistic sepolia + const minGasLimit = "2000000"; + const transferCost = await wormholeRelayer["quoteEVMDeliveryPrice(uint16,uint256,uint256)"](targetChain, 0, minGasLimit); + + // Data = WormholeL1Receiver address in the bytes32 format + const data = "0x000000000000000000000000f66e23209074fa7946e41f45f43d765281af2207"; + + // Build the final payload to be passed from the imaginary Timelock + const sendPayloadSelector = "0x4b5ca6f4"; + const timelockPayload = await wormholeRelayer.interface.encodeFunctionData(sendPayloadSelector, [targetChain, + wormholeMessengerAddress, data, 0, minGasLimit, targetChain, wormholeMessengerAddress]); + + // Send the message to optimisticSepolia receiver + tx = await mockTimelock.connect(EOAsepolia).execute(timelockPayload, { value: transferCost.nativePriceQuote }); + console.log("Timelock data execution hash", tx.hash); + await tx.wait(); + // https://wormholescan.io/#/tx/0x2a7daee399681fd37e066c2672e06f1c43ff3dbdad4c8cbbc941a00529e7ae10?network=TESTNET + // https://sepolia-optimism.etherscan.io/tx/0x31395dfd37e4095177e0d5a8ebbff0ebdcf30e8ee7e617078cf8677cec8ed24c +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_03_womholel2receiverl1sender.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_03_womholel2receiverl1sender.js new file mode 100644 index 0000000..0121e59 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_03_womholel2receiverl1sender.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); + +module.exports = [ + parsedData.L2WormholeRelayerAddress, + parsedData.sourceChainId +]; \ No newline at end of file diff --git a/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_05_womholel1sender.js b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_05_womholel1sender.js new file mode 100644 index 0000000..7901c95 --- /dev/null +++ b/scripts/deployment/bridges/wormhole/test/l1_l2_l1/verify_05_womholel1sender.js @@ -0,0 +1,10 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); + +module.exports = [ + parsedData.L2WormholeRelayerAddress, + parsedData.sourceChainId, + parsedData.wormholeL1ReceiverAddress +]; \ No newline at end of file diff --git a/scripts/proposals/proposal_01_goerli_sync_mainnet.js b/scripts/proposals/proposal_01_goerli_sync_mainnet.js index 942c344..d1c0db3 100644 --- a/scripts/proposals/proposal_01_goerli_sync_mainnet.js +++ b/scripts/proposals/proposal_01_goerli_sync_mainnet.js @@ -7,9 +7,7 @@ async function main() { const globalsFile = "globals.json"; const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); let parsedData = JSON.parse(dataFromJSON); - const providerName = parsedData.providerName; - const provider = await ethers.providers.getDefaultProvider(providerName); const signers = await ethers.getSigners(); // EOA address diff --git a/scripts/proposals/proposal_04_CM_guard.js b/scripts/proposals/proposal_04_CM_guard.js index b96bae2..1dc3897 100644 --- a/scripts/proposals/proposal_04_CM_guard.js +++ b/scripts/proposals/proposal_04_CM_guard.js @@ -8,7 +8,6 @@ async function main() { const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); let parsedData = JSON.parse(dataFromJSON); - const timelockAddress = parsedData.timelockAddress; const treasuryAddress = parsedData.treasuryAddress; const depositoryAddress = parsedData.depositoryAddress; const serviceRegistryTokenUtilityAddress = "0x3Fb926116D454b95c669B6Bf2E7c3bad8d19affA"; @@ -20,7 +19,6 @@ async function main() { const homeMediatorAddress = "0x15bd56669F57192a97dF41A2aa8f4403e9491776"; const fxRootAddress = parsedData.fxRootAddress; const fxGovernorTunnelAddress = "0x9338b5153AE39BB89f50468E608eD9d764B755fD"; - const CMAddress = parsedData.CM; diff --git a/scripts/proposals/proposal_04_CM_guard_goerli.js b/scripts/proposals/proposal_04_CM_guard_goerli.js index 1a8d096..8af273e 100644 --- a/scripts/proposals/proposal_04_CM_guard_goerli.js +++ b/scripts/proposals/proposal_04_CM_guard_goerli.js @@ -8,7 +8,6 @@ async function main() { const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); let parsedData = JSON.parse(dataFromJSON); - const timelockAddress = parsedData.timelockAddress; const treasuryAddress = parsedData.treasuryAddress; const depositoryAddress = "0x5FDc466f4A7547c876eF40CD30fFA2A89F1EcDE7"; const serviceRegistryTokenUtilityAddress = "0x6d9b08701Af43D68D991c074A27E4d90Af7f2276"; @@ -21,7 +20,6 @@ async function main() { const homeMediatorAddress = "0x670Ac235EE13C0B2a5065282bBB0c61cfB354592"; const fxRootAddress = "0x3d1d3E34f7fB6D26245E6640E1c50710eFFf15bA"; const fxGovernorTunnelAddress = "0x17806E2a12d5E0F48C9803cd397DB3F044DA3b77"; - const CMAddress = parsedData.CM; diff --git a/scripts/proposals/proposal_05_CM_guard.js b/scripts/proposals/proposal_05_CM_guard.js index a816bee..5e65435 100644 --- a/scripts/proposals/proposal_05_CM_guard.js +++ b/scripts/proposals/proposal_05_CM_guard.js @@ -13,7 +13,6 @@ async function main() { const multisig = await ethers.getContractAt("GnosisSafe", parsedData.CM); const nonce = await multisig.nonce(); - const timelockAddress = parsedData.timelockAddress; const guardCMAddress = parsedData.guardCMAddress; // Construct the payload for the multisig to swap the guard by the Timelock diff --git a/test/Deployment.js b/test/Deployment.js index 9543f4b..eab220b 100644 --- a/test/Deployment.js +++ b/test/Deployment.js @@ -23,10 +23,10 @@ describe("Deployment", function () { const fs = require("fs"); let gnosisSafeL2; let gnosisSafeProxyFactory; - const _1kOLABalance = "1000" + "0".repeat(18); - const _2kOLABalance = "2000" + "0".repeat(18); - const _3kOLABalance = "3000" + "0".repeat(18); - const _4kOLABalance = "4000" + "0".repeat(18); + const _1kOLASBalance = "1000" + "0".repeat(18); + const _2kOLASBalance = "2000" + "0".repeat(18); + const _3kOLASBalance = "3000" + "0".repeat(18); + const _4kOLASBalance = "4000" + "0".repeat(18); const oneYear = 365 * 86400; let veOLASSigners; let buOLASSigners; @@ -78,12 +78,12 @@ describe("Deployment", function () { let claimableBalancesJSON = { "veOLAS": { "addresses": [veOLASSigners[0].address, veOLASSigners[1].address, veOLASSigners[2].address], - "amounts": [_1kOLABalance, _2kOLABalance, _3kOLABalance], + "amounts": [_1kOLASBalance, _2kOLASBalance, _3kOLASBalance], "lockTimes": [oneYear, 2 * oneYear, 3 * oneYear] }, "buOLAS": { "addresses": [buOLASSigners[0].address, buOLASSigners[1].address, buOLASSigners[2].address, buOLASSigners[3].address], - "amounts": [_1kOLABalance, _2kOLABalance, _3kOLABalance, _4kOLABalance], + "amounts": [_1kOLASBalance, _2kOLASBalance, _3kOLASBalance, _4kOLASBalance], "numSteps": [1, 2, 3, 4] } }; diff --git a/test/GovernanceOLAS.js b/test/GovernanceOLAS.js index 59a09ba..0e73953 100644 --- a/test/GovernanceOLAS.js +++ b/test/GovernanceOLAS.js @@ -10,10 +10,10 @@ describe("Governance OLAS", function () { let ve; let signers; const oneWeek = 7 * 86400; - const oneOLABalance = ethers.utils.parseEther("1"); - const twoOLABalance = ethers.utils.parseEther("2"); - const fiveOLABalance = ethers.utils.parseEther("5"); - const tenOLABalance = ethers.utils.parseEther("10"); + const oneOLASBalance = ethers.utils.parseEther("1"); + const twoOLASBalance = ethers.utils.parseEther("2"); + const fiveOLASBalance = ethers.utils.parseEther("5"); + const tenOLASBalance = ethers.utils.parseEther("10"); const AddressZero = "0x" + "0".repeat(40); const bytes32Zero = "0x" + "0".repeat(64); const safeThreshold = 7; @@ -21,7 +21,7 @@ describe("Governance OLAS", function () { const minDelay = 1; // blocks const initialVotingDelay = 0; // blocks const initialVotingPeriod = 1; // blocks - const initialProposalThreshold = fiveOLABalance; // required voting power + const initialProposalThreshold = fiveOLASBalance; // required voting power const quorum = 1; // quorum factor const proposalDescription = "Proposal 0"; beforeEach(async function () { @@ -44,7 +44,7 @@ describe("Governance OLAS", function () { signers = await ethers.getSigners(); // Mint 10 OLAS worth of OLAS tokens by default - await token.mint(signers[0].address, tenOLABalance); + await token.mint(signers[0].address, tenOLASBalance); const balance = await token.balanceOf(signers[0].address); expect(ethers.utils.formatEther(balance) == 10).to.be.true; }); @@ -106,14 +106,14 @@ describe("Governance OLAS", function () { it("Changes the ownership of a governance contract and a timelock", async function () { const deployer = signers[0]; // Approve signers[0] for 10 OLAS by voting ve - await token.approve(ve.address, tenOLABalance); + await token.approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration in Voting Escrow. // This will result in voting power being almost exactly as OLAS amount locked: // voting power = amount * t_left_before_unlock / t_max const lockDuration = 4 * 365 * 86400; // Lock 10 OLAS, which is enough to cover the 5 OLAS of initial proposal threshold voting power - await ve.createLock(tenOLABalance, lockDuration); + await ve.createLock(tenOLASBalance, lockDuration); // Deploy first timelock const executors = [deployer.address]; @@ -198,7 +198,7 @@ describe("Governance OLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLA by voting ve - await token.connect(deployer).approve(ve.address, tenOLABalance); + await token.connect(deployer).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLA amount locked: @@ -207,9 +207,9 @@ describe("Governance OLAS", function () { const lockDuration = fourYears; // Lock 5 OLA, which is lower than the initial proposal threshold by a bit - await ve.connect(deployer).createLock(fiveOLABalance, lockDuration); + await ve.connect(deployer).createLock(fiveOLASBalance, lockDuration); // Add a bit more - await ve.connect(deployer).increaseAmount(oneOLABalance); + await ve.connect(deployer).increaseAmount(oneOLASBalance); // Deploy Timelock const executors = []; @@ -267,23 +267,23 @@ describe("Governance OLAS", function () { // Transfer initial balances to all the gelegators: 1 OLAS to each for (let i = 1; i <= numDelegators; i++) { - await token.transfer(signers[i].address, oneOLABalance); + await token.transfer(signers[i].address, oneOLASBalance); const balance = await token.balanceOf(signers[i].address); expect(ethers.utils.formatEther(balance) == 1).to.be.true; } // Approve signers[1]-signers[10] for 1 OLAS by voting ve for (let i = 1; i <= numDelegators; i++) { - await token.connect(signers[i]).approve(ve.address, oneOLABalance); + await token.connect(signers[i]).approve(ve.address, oneOLASBalance); } // Define 1 week for the lock duration const lockDuration = oneWeek; // Deposit tokens as a voting power to a chosen delegatee - await ve.connect(signers[1]).createLock(oneOLABalance, lockDuration); + await ve.connect(signers[1]).createLock(oneOLASBalance, lockDuration); for (let i = 2; i <= numDelegators; i++) { - await ve.connect(signers[i]).depositFor(delegatee, oneOLABalance); + await ve.connect(signers[i]).depositFor(delegatee, oneOLASBalance); } // Given 1 OLAS worth of voting power from every address, the cumulative voting power must be 10 @@ -301,7 +301,7 @@ describe("Governance OLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLAS by voting ve - await token.connect(signers[0]).approve(ve.address, tenOLABalance); + await token.connect(signers[0]).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLAS amount locked: @@ -310,7 +310,7 @@ describe("Governance OLAS", function () { const lockDuration = fourYears; // Lock 5 OLAS, which is lower than the initial proposal threshold by a bit - await ve.connect(signers[0]).createLock(fiveOLABalance, lockDuration); + await ve.connect(signers[0]).createLock(fiveOLASBalance, lockDuration); // Deploy simple version of a timelock const executors = []; @@ -333,7 +333,7 @@ describe("Governance OLAS", function () { ).to.be.revertedWith("Governor: proposer votes below proposal threshold"); // Adding voting power, and the proposal must go through, 4 + 2 of OLAS in voting power is almost 6 > 5 required - await ve.connect(signers[0]).increaseAmount(twoOLABalance); + await ve.connect(signers[0]).increaseAmount(twoOLASBalance); await governor.connect(signers[0])["propose(address[],uint256[],bytes[],string)"]([AddressZero], [0], ["0x"], proposalDescription); }); @@ -344,7 +344,7 @@ describe("Governance OLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLA by voting ve - await token.connect(deployer).approve(ve.address, tenOLABalance); + await token.connect(deployer).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLA amount locked: @@ -353,9 +353,9 @@ describe("Governance OLAS", function () { const lockDuration = fourYears; // Lock 5 OLA, which is lower than the initial proposal threshold by a bit - await ve.connect(deployer).createLock(fiveOLABalance, lockDuration); + await ve.connect(deployer).createLock(fiveOLASBalance, lockDuration); // Add a bit more - await ve.connect(deployer).increaseAmount(oneOLABalance); + await ve.connect(deployer).increaseAmount(oneOLASBalance); // Deploy Timelock const proposers = [deployer.address]; diff --git a/test/GovernanceTwoOLAS.js b/test/GovernanceTwoOLAS.js index b801182..9013c89 100644 --- a/test/GovernanceTwoOLAS.js +++ b/test/GovernanceTwoOLAS.js @@ -11,10 +11,10 @@ describe("Governance OLAS on wveOLAS", function () { let wve; let signers; const oneWeek = 7 * 86400; - const oneOLABalance = ethers.utils.parseEther("1"); - const twoOLABalance = ethers.utils.parseEther("2"); - const fiveOLABalance = ethers.utils.parseEther("5"); - const tenOLABalance = ethers.utils.parseEther("10"); + const oneOLASBalance = ethers.utils.parseEther("1"); + const twoOLASBalance = ethers.utils.parseEther("2"); + const fiveOLASBalance = ethers.utils.parseEther("5"); + const tenOLASBalance = ethers.utils.parseEther("10"); const AddressZero = "0x" + "0".repeat(40); const bytes32Zero = "0x" + "0".repeat(64); const safeThreshold = 7; @@ -22,7 +22,7 @@ describe("Governance OLAS on wveOLAS", function () { const minDelay = 1; // blocks const initialVotingDelay = 0; // blocks const initialVotingPeriod = 1; // blocks - const initialProposalThreshold = fiveOLABalance; // required voting power + const initialProposalThreshold = fiveOLASBalance; // required voting power const quorum = 1; // quorum factor const proposalDescription = "Proposal 0"; beforeEach(async function () { @@ -49,7 +49,7 @@ describe("Governance OLAS on wveOLAS", function () { signers = await ethers.getSigners(); // Mint 10 OLAS worth of OLAS tokens by default - await token.mint(signers[0].address, tenOLABalance); + await token.mint(signers[0].address, tenOLASBalance); const balance = await token.balanceOf(signers[0].address); expect(ethers.utils.formatEther(balance) == 10).to.be.true; }); @@ -111,14 +111,14 @@ describe("Governance OLAS on wveOLAS", function () { it("Changes the ownership of a governance contract and a timelock", async function () { const deployer = signers[0]; // Approve signers[0] for 10 OLAS by voting ve - await token.approve(ve.address, tenOLABalance); + await token.approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration in Voting Escrow. // This will result in voting power being almost exactly as OLAS amount locked: // voting power = amount * t_left_before_unlock / t_max const lockDuration = 4 * 365 * 86400; // Lock 10 OLAS, which is enough to cover the 5 OLAS of initial proposal threshold voting power - await ve.createLock(tenOLABalance, lockDuration); + await ve.createLock(tenOLASBalance, lockDuration); // Deploy first timelock const executors = [deployer.address]; @@ -203,7 +203,7 @@ describe("Governance OLAS on wveOLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLA by voting ve - await token.connect(deployer).approve(ve.address, tenOLABalance); + await token.connect(deployer).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLA amount locked: @@ -212,9 +212,9 @@ describe("Governance OLAS on wveOLAS", function () { const lockDuration = fourYears; // Lock 5 OLA, which is lower than the initial proposal threshold by a bit - await ve.connect(deployer).createLock(fiveOLABalance, lockDuration); + await ve.connect(deployer).createLock(fiveOLASBalance, lockDuration); // Add a bit more - await ve.connect(deployer).increaseAmount(oneOLABalance); + await ve.connect(deployer).increaseAmount(oneOLASBalance); // Deploy Timelock const executors = []; @@ -272,23 +272,23 @@ describe("Governance OLAS on wveOLAS", function () { // Transfer initial balances to all the gelegators: 1 OLAS to each for (let i = 1; i <= numDelegators; i++) { - await token.transfer(signers[i].address, oneOLABalance); + await token.transfer(signers[i].address, oneOLASBalance); const balance = await token.balanceOf(signers[i].address); expect(ethers.utils.formatEther(balance) == 1).to.be.true; } // Approve signers[1]-signers[10] for 1 OLAS by voting ve for (let i = 1; i <= numDelegators; i++) { - await token.connect(signers[i]).approve(ve.address, oneOLABalance); + await token.connect(signers[i]).approve(ve.address, oneOLASBalance); } // Define 1 week for the lock duration const lockDuration = oneWeek; // Deposit tokens as a voting power to a chosen delegatee - await ve.connect(signers[1]).createLock(oneOLABalance, lockDuration); + await ve.connect(signers[1]).createLock(oneOLASBalance, lockDuration); for (let i = 2; i <= numDelegators; i++) { - await ve.connect(signers[i]).depositFor(delegatee, oneOLABalance); + await ve.connect(signers[i]).depositFor(delegatee, oneOLASBalance); } // Given 1 OLAS worth of voting power from every address, the cumulative voting power must be 10 @@ -306,7 +306,7 @@ describe("Governance OLAS on wveOLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLAS by voting ve - await token.connect(signers[0]).approve(ve.address, tenOLABalance); + await token.connect(signers[0]).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLAS amount locked: @@ -315,7 +315,7 @@ describe("Governance OLAS on wveOLAS", function () { const lockDuration = fourYears; // Lock 5 OLAS, which is lower than the initial proposal threshold by a bit - await ve.connect(signers[0]).createLock(fiveOLABalance, lockDuration); + await ve.connect(signers[0]).createLock(fiveOLASBalance, lockDuration); // Deploy simple version of a timelock const executors = []; @@ -338,7 +338,7 @@ describe("Governance OLAS on wveOLAS", function () { ).to.be.revertedWith("Governor: proposer votes below proposal threshold"); // Adding voting power, and the proposal must go through, 4 + 2 of OLAS in voting power is almost 6 > 5 required - await ve.connect(signers[0]).increaseAmount(twoOLABalance); + await ve.connect(signers[0]).increaseAmount(twoOLASBalance); await governor.connect(signers[0])["propose(address[],uint256[],bytes[],string)"]([AddressZero], [0], ["0x"], proposalDescription); }); @@ -349,7 +349,7 @@ describe("Governance OLAS on wveOLAS", function () { expect(ethers.utils.formatEther(balance) == 10).to.be.true; // Approve signers[0] for 10 OLA by voting ve - await token.connect(deployer).approve(ve.address, tenOLABalance); + await token.connect(deployer).approve(ve.address, tenOLASBalance); // Define 4 years for the lock duration. // This will result in voting power being almost exactly as OLA amount locked: @@ -358,9 +358,9 @@ describe("Governance OLAS on wveOLAS", function () { const lockDuration = fourYears; // Lock 5 OLA, which is lower than the initial proposal threshold by a bit - await ve.connect(deployer).createLock(fiveOLABalance, lockDuration); + await ve.connect(deployer).createLock(fiveOLASBalance, lockDuration); // Add a bit more - await ve.connect(deployer).increaseAmount(oneOLABalance); + await ve.connect(deployer).increaseAmount(oneOLASBalance); // Deploy Timelock const proposers = [deployer.address]; diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js new file mode 100644 index 0000000..0657487 --- /dev/null +++ b/test/VoteWeighting.js @@ -0,0 +1,723 @@ +/*global describe, context, beforeEach, it*/ + +const { expect } = require("chai"); +const { ethers } = require("hardhat"); +const helpers = require("@nomicfoundation/hardhat-network-helpers"); + +describe("Voting Escrow OLAS", function () { + let olas; + let ve; + let vw; + let signers; + let deployer; + const initialMint = "1000000000000000000000000"; // 1_000_000 + const oneWeek = 7 * 86400; + const oneYear = 365 * 86400; + const chainId = 1; + const maxVoteWeight = 10000; + const E18 = 10**18; + const oneOLASBalance = ethers.utils.parseEther("1"); + const AddressZero = ethers.constants.AddressZero; + const HashZero = ethers.constants.HashZero; + + function getNextTime(ts) { + return Math.floor((ts + oneWeek) / oneWeek) * oneWeek; + } + + function convertAddressToBytes32(account) { + return ("0x" + "0".repeat(24) + account.slice(2)).toLowerCase(); + } + + function convertBytes32ToAddress(account) { + return "0x" + account.slice(26); + } + + beforeEach(async function () { + const OLAS = await ethers.getContractFactory("OLAS"); + olas = await OLAS.deploy(); + await olas.deployed(); + + signers = await ethers.getSigners(); + deployer = signers[0]; + await olas.mint(deployer.address, initialMint); + + const VE = await ethers.getContractFactory("veOLAS"); + ve = await VE.deploy(olas.address, "Voting Escrow OLAS", "veOLAS"); + await ve.deployed(); + + const VoteWeighting = await ethers.getContractFactory("VoteWeighting"); + vw = await VoteWeighting.deploy(ve.address); + await vw.deployed(); + }); + + context("Initialization", async function () { + it("Should fail when deploying with the zero address", async function () { + const VoteWeighting = await ethers.getContractFactory("VoteWeighting"); + await expect( + VoteWeighting.deploy(AddressZero) + ).to.be.revertedWithCustomError(vw, "ZeroAddress"); + }); + + it("veOLAS", async function () { + // Checks for the veOLAS account + const veAddress = await vw.ve(); + expect(ve.address).to.equal(veAddress); + }); + + it("Changing owner", async function () { + const account = signers[1]; + + // Trying to change owner from a non-owner account address + await expect( + vw.connect(account).changeOwner(account.address) + ).to.be.revertedWithCustomError(vw, "OwnerOnly"); + + // Trying to change owner for the zero address + await expect( + vw.connect(deployer).changeOwner(AddressZero) + ).to.be.revertedWithCustomError(vw, "ZeroAddress"); + + // Changing the owner + await vw.connect(deployer).changeOwner(account.address); + + // Trying to change owner from the previous owner address + await expect( + vw.connect(deployer).changeOwner(deployer.address) + ).to.be.revertedWithCustomError(vw, "OwnerOnly"); + }); + + it("Setting dispenser", async function () { + // Try to set not by the owner + await expect( + vw.connect(signers[1]).changeDispenser(deployer.address) + ).to.be.revertedWithCustomError(vw, "OwnerOnly"); + + // Set dispenser to any address + await vw.changeDispenser(deployer.address); + + // Zero address + await vw.changeDispenser(AddressZero); + }); + }); + + context("Adding nominees", async function () { + it("Should fail with wrong nominee params", async function () { + let nominee = signers[1].address; + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Try to add a zero address nominee + await expect( + vw.addNomineeEVM(AddressZero, chainId) + ).to.be.revertedWithCustomError(vw, "ZeroAddress"); + + // Try to add a zero chain Id + await expect( + vw.addNomineeEVM(nominee, 0) + ).to.be.revertedWithCustomError(vw, "ZeroValue"); + + // Try to add an overflow chain Id + const maxEVMChainId = await vw.MAX_EVM_CHAIN_ID(); + const overflowChainId = maxEVMChainId.add(1); + await expect( + vw.addNomineeEVM(nominee, overflowChainId) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // Try to add an underflow chain Id for the non-EVM chain + nominee = convertAddressToBytes32(nominee); + await expect( + vw.addNomineeNonEVM(nominee, maxEVMChainId) + ).to.be.revertedWithCustomError(vw, "Underflow"); + + // Try to add a non-EVM nominee with a zero address + await expect( + vw.addNomineeNonEVM(HashZero, chainId) + ).to.be.revertedWithCustomError(vw, "ZeroAddress"); + }); + + it("Add nominee", async function () { + let nominee = signers[1].address; + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add a nominee + await vw.addNomineeEVM(nominee, chainId); + + // Try to add the same nominee + await expect( + vw.addNomineeEVM(nominee, chainId) + ).to.be.revertedWithCustomError(vw, "NomineeAlreadyExists"); + + // Check the nominee setup + const numNominees = await vw.getNumNominees(); + expect(numNominees).to.equal(1); + const allNominees = await vw.getAllNominees(); + expect(allNominees.length).to.equal(numNominees.add(1)); + + const nomineeChainId = await vw.getNominee(1); + expect(nomineeChainId.account).to.equal(convertAddressToBytes32(nominee)); + expect(nomineeChainId.chainId).to.equal(chainId); + + const nomineeChainIds = await vw.getNominees(1, 1); + expect(nomineeChainIds[0].account).to.equal(convertAddressToBytes32(nominee)); + expect(nomineeChainIds[0].chainId).to.equal(chainId); + + let nomineeId = await vw.getNomineeId(convertAddressToBytes32(nominee), chainId); + expect(nomineeId).to.equal(1); + + // Check the nominee Id of a nonexistent nominee + nomineeId = await vw.getNomineeId(convertAddressToBytes32(nominee), chainId + 1); + expect(nomineeId).to.equal(0); + + // Adding a non-EVM nominee + nominee = convertAddressToBytes32(nominee); + const maxEVMChainId = await vw.MAX_EVM_CHAIN_ID(); + await vw.addNomineeNonEVM(nominee, maxEVMChainId.add(1)); + }); + + it("Get nominees", async function () { + const nominee = signers[1].address; + // Add a nominee + await vw.addNomineeEVM(nominee, chainId); + + // Try to get the zero-th nominees + await expect( + vw.getNominee(0) + ).to.be.revertedWithCustomError(vw, "ZeroValue"); + await expect( + vw.getNominees(1, 0) + ).to.be.revertedWithCustomError(vw, "ZeroValue"); + await expect( + vw.getNominees(0, 1) + ).to.be.revertedWithCustomError(vw, "ZeroValue"); + + // Try to get the nonexistent nominee + await expect( + vw.getNominee(2) + ).to.be.revertedWithCustomError(vw, "Overflow"); + await expect( + vw.getNominees(2, 1) + ).to.be.revertedWithCustomError(vw, "Overflow"); + await expect( + vw.getNominees(1, 2) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // Add one more nominee + await vw.addNomineeEVM(nominee, chainId + 1); + // Try to get the nonexistent nominee + await expect( + vw.getNominee(3) + ).to.be.revertedWithCustomError(vw, "Overflow"); + await expect( + vw.getNominees(2, 2) + ).to.be.revertedWithCustomError(vw, "Overflow"); + await expect( + vw.getNominees(1, 3) + ).to.be.revertedWithCustomError(vw, "Overflow"); + }); + }); + + context("Voting", async function () { + it("Should fail with wrong input arguments", async function () { + // Add a nominee + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + // Approve OLAS for veOLAS + await olas.approve(ve.address, oneOLASBalance); + + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Lock one OLAS into veOLAS for one week + await ve.createLock(oneOLASBalance, oneWeek); + + // Try to vote for the nominee when the lock is about to expire + await expect( + vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight) + ).to.be.revertedWithCustomError(vw, "LockExpired"); + + // Restore to the state of the snapshot + await snapshot.restore(); + + // Lock one OLAS into veOLAS for one year + await ve.createLock(oneOLASBalance, oneYear); + + // Try to vote for the nominee with the bigger weight + await expect( + vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight + 1) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // Vote for the nominee + await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight); + + // Try to vote for the same nominee again within a defined period + await expect( + vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight) + ).to.be.revertedWithCustomError(vw, "VoteTooOften"); + + // Try to vote for another nominee with all the voting power used + nominee = signers[2].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + await expect( + vw.voteForNomineeWeights(nominee, chainId, 1) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // Voting with the zero power is possible + await vw.voteForNomineeWeights(nominee, chainId, 0); + + // Try to checkpoint nominee that does not exist + await expect( + vw.checkpointNominee(nominee, chainId + 1) + ).to.be.revertedWithCustomError(vw, "NomineeDoesNotExist"); + + // Try to vote batch with incorrect array lengths + await expect( + vw.voteForNomineeWeightsBatch([nominee], [], []) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.voteForNomineeWeightsBatch([nominee], [chainId], []) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.voteForNomineeWeightsBatch([nominee], [], [maxVoteWeight]) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.voteForNomineeWeightsBatch([], [chainId], [maxVoteWeight]) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + + // Try to get next allowed voting times with wrong params + await expect( + vw.getNextAllowedVotingTimes([nominee], [], []) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.getNextAllowedVotingTimes([nominee], [chainId], []) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.getNextAllowedVotingTimes([], [chainId], []) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + await expect( + vw.getNextAllowedVotingTimes([], [chainId], [signers[1].address]) + ).to.be.revertedWithCustomError(vw, "WrongArrayLength"); + // Nominee that does not exist + await expect( + vw.getNextAllowedVotingTimes([nominee], [chainId + 1], [signers[1].address]) + ).to.be.revertedWithCustomError(vw, "NomineeDoesNotExist"); + }); + + it("Vote for the nominees separately", async function () { + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add a nominee + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + // Get the next point timestamp where votes are written after voting + let block = await ethers.provider.getBlock("latest"); + let nextTime = getNextTime(block.timestamp); + + // Make sure the initial weight is zero + let weight = await vw.nomineeRelativeWeight(nominee, chainId, block.timestamp); + expect(weight.weight).to.equal(0); + weight = await vw.nomineeRelativeWeight(nominee, chainId, nextTime); + expect(weight.weight).to.equal(0); + + // Vote for the nominee + await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight / 2); + + + // Add one more nominee + let nominee2 = signers[2].address; + await vw.addNomineeEVM(nominee2, chainId); + nominee2 = convertAddressToBytes32(nominee2); + + // Make sure the initial weight is zero + weight = await vw.nomineeRelativeWeight(nominee2, chainId, nextTime); + expect(weight.weight).to.equal(0); + + // Vote for another nominee + await vw.voteForNomineeWeights(nominee2, chainId, maxVoteWeight / 2); + + + // Check the current nominee weight + weight = await vw.getNomineeWeight(nominee, chainId); + expect(weight).to.be.greaterThan(0); + // Check the sum of nominee weights + const sumWeights = await vw.getWeightsSum(); + expect(sumWeights).to.be.greaterThan(0); + + // 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); + weight = await vw.nomineeRelativeWeight(nominee2, chainId, nextTime); + expect(Number(weight.weight) / 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); + + // Checkpoint and checkpoint nominee + await vw.checkpoint(); + await vw.checkpointNominee(nominee, chainId); + + // Get next allowed voting times + block = await ethers.provider.getBlock("latest"); + nextTime = (await vw.WEIGHT_VOTE_DELAY()).add(block.timestamp); + const nextTimes = await vw.getNextAllowedVotingTimes([nominee, nominee2], [chainId, chainId], + [deployer.address, deployer.address]); + for (let i = 0; i < nextTimes.length; i++) { + expect(nextTimes[i]).to.lessThanOrEqual(nextTime); + } + }); + + it("Vote for the nominee after some time", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add a nominee + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + // Wait for several weeks + await helpers.time.increase(oneWeek * 3); + + // Vote for the nominee + await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight); + + // Get the next point timestamp where votes are written after voting + const block = await ethers.provider.getBlock("latest"); + const nextTime = getNextTime(block.timestamp); + + // 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); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + + it("Batch vote for the nominees", async function () { + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add nominees + const numNominees = 2; + let nominees = [signers[1].address, signers[2].address]; + const chainIds = new Array(numNominees).fill(chainId); + for (let i = 0; i < numNominees; i++) { + await vw.addNomineeEVM(nominees[i], chainIds[i]); + } + + nominees = [convertAddressToBytes32(nominees[0]), convertAddressToBytes32(nominees[1])]; + + // Get the next point timestamp where votes are written after voting + const block = await ethers.provider.getBlock("latest"); + const nextTime = getNextTime(block.timestamp); + + // Vote for the nominees in batch + const voteWeights = new Array(2).fill(maxVoteWeight / 2); + await vw.voteForNomineeWeightsBatch(nominees, chainIds, voteWeights); + + // 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); + } + }); + + it("Voting several times week after week", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add a nominee + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + // Vote for the nominee + await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight); + + // Wait for next two weeks (must pass 10 days where one cannot vote) + await helpers.time.increase(oneWeek * 2); + + // Vote for the nominee again + await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight); + + // Get the next point timestamp where votes are written after voting + const block = await ethers.provider.getBlock("latest"); + const nextTime = getNextTime(block.timestamp); + + // 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); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + + it("Voting with veOLAS lock changing", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Add nominees + const numNominees = 2; + let nominees = [signers[2].address, signers[3].address]; + for (let i = 0; i < numNominees; i++) { + await vw.addNomineeEVM(nominees[i], chainId); + } + nominees = [convertAddressToBytes32(nominees[0]), convertAddressToBytes32(nominees[1])]; + + // Lock one OLAS into veOLAS by deployer and another account + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + const user = signers[1]; + await olas.transfer(user.address, oneOLASBalance); + await olas.connect(user).approve(ve.address, oneOLASBalance); + await ve.connect(user).createLock(oneOLASBalance, oneYear); + + // Vote for the nominee by the deployer + await vw.voteForNomineeWeights(nominees[0], chainId, maxVoteWeight); + // Vote for the nominee by the user + await vw.connect(user).voteForNomineeWeights(nominees[1], chainId, maxVoteWeight); + + // Deployer increases the OLAS amount in veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.increaseAmount(oneOLASBalance); + + // Wait for several weeks + await helpers.time.increase(oneWeek * 3); + + // Vote for the nominee by the deployer + await vw.voteForNomineeWeights(nominees[0], chainId, maxVoteWeight); + // Vote for the nominee by the user + await vw.connect(user).voteForNomineeWeights(nominees[1], chainId, maxVoteWeight); + + // Get the next point timestamp where votes are written after voting + let block = await ethers.provider.getBlock("latest"); + let nextTime = getNextTime(block.timestamp); + + // Check relative weights that must represent a half for each + const weights = [ + await vw.nomineeRelativeWeight(nominees[0], chainId, nextTime), + 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); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + + it("Changing votes after two weeks", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Add nominees + const numNominees = 3; + let nominees = [signers[2].address, signers[3].address, signers[4].address]; + for (let i = 0; i < numNominees; i++) { + await vw.addNomineeEVM(nominees[i], chainId); + } + nominees = [convertAddressToBytes32(nominees[0]), convertAddressToBytes32(nominees[1]), + convertAddressToBytes32(nominees[2])]; + + let weights = [2000, 7000, 1000]; + const chainIds = new Array(numNominees).fill(chainId); + + // Lock one OLAS into veOLAS by deployer and another account + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Vote for the nominees + await vw.voteForNomineeWeightsBatch(nominees, chainIds, weights); + + // Wait for two weeks + await helpers.time.increase(oneWeek * 2); + + // Vote for the nominees again with different weights + weights = [9000, 500, 500]; + // Having weights too high after spending all the voting power results in the overflow + await expect( + vw.voteForNomineeWeightsBatch(nominees, chainIds, weights) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // The first weight must be no bigger than the first one used before, so no more than 2000 + // The second weight must be no bigger than the addition of a difference between first weights: + // 2000 - 1000 = 1000, so the maximum second weight must be 7000 + 1000 = 8000, or below + weights = [1000, 8000, 1000]; + await vw.voteForNomineeWeightsBatch(nominees, chainIds, weights); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + + it("Remove nominee and retrieve voting power", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + const numNominees = 2; + // Add nominees and get their bytes32 addresses + let nominees = [signers[1].address, signers[2].address]; + for (let i = 0; i < numNominees; i++) { + await vw.addNomineeEVM(nominees[i], chainId); + nominees[i] = convertAddressToBytes32(nominees[i]); + } + + // Vote for the first nominee + await vw.voteForNomineeWeights(nominees[0], chainId, maxVoteWeight); + + // Get the set of nominees + let setNominees = await vw.getAllNominees(); + // Check that the length is 3 (including the zero one) + expect(setNominees.length).to.equal(3); + + // Get the first nominee id + let id = await vw.getNomineeId(nominees[0], chainId); + // The id must be equal to 1 + expect(id).to.equal(1); + // Get the second nominee id + id = await vw.getNomineeId(nominees[1], chainId); + // The id must be equal to 2 + expect(id).to.equal(2); + + // Try to remove the nominee not by the owner + await expect( + vw.connect(signers[1]).removeNominee(nominees[0], chainId) + ).to.be.revertedWithCustomError(vw, "OwnerOnly"); + + // Remove the nominee + await vw.removeNominee(nominees[0], chainId); + + // Get the removed nominee Id + id = await vw.getNomineeId(nominees[0], chainId); + expect(id).to.equal(0); + + // Try to remove the nominee again + await expect( + vw.removeNominee(nominees[0], chainId) + ).to.be.revertedWithCustomError(vw, "NomineeDoesNotExist"); + + // Get the id for the second nominee that was shifted from 2 to 1 + id = await vw.getNomineeId(nominees[1], chainId); + expect(id).to.equal(1); + + // Try to add a removed nominee + await expect( + vw.addNomineeEVM(convertBytes32ToAddress(nominees[0]), chainId) + ).to.be.revertedWithCustomError(vw, "NomineeRemoved"); + + // Try to vote for a removed nominee + await expect( + vw.voteForNomineeWeights(nominees[0], chainId, maxVoteWeight) + ).to.be.revertedWithCustomError(vw, "NomineeRemoved"); + + // Checkpoint the nominee weight, which is still possible + await vw.checkpointNominee(nominees[0], chainId); + + // Wait for two weeks + await helpers.time.increase(oneWeek * 2); + + // Try to vote for the second nominee - fails because the voting power is not retrieved + await expect( + vw.voteForNomineeWeights(nominees[1], chainId, maxVoteWeight) + ).to.be.revertedWithCustomError(vw, "Overflow"); + + // Retrieve the nominee voting power + await vw.retrieveRemovedNomineeVotingPower(nominees[0], chainId); + + // Try to retrieve voting power from the same nominee that was already retrieved from + await expect( + vw.retrieveRemovedNomineeVotingPower(nominees[0], chainId) + ).to.be.revertedWithCustomError(vw, "ZeroValue"); + + // Try to retrieve voting power from the nominee that was not removed + await expect( + vw.retrieveRemovedNomineeVotingPower(nominees[1], chainId) + ).to.be.revertedWithCustomError(vw, "NomineeNotRemoved"); + + // Now it's possible to case a vote for another nominee + await vw.voteForNomineeWeights(nominees[1], chainId, maxVoteWeight); + + // Checkpoint the nominee + await vw.checkpointNominee(nominees[1], chainId); + // The removed nominee has still some weighting power + let weight = await vw.getNomineeWeight(nominees[1], chainId); + expect(weight).to.gt(0); + + // Remove the second nominee + await vw.removeNominee(nominees[1], chainId); + + // After removing, the weight must be zero + weight = await vw.getNomineeWeight(nominees[1], chainId); + expect(weight).to.equal(0); + + // Wait for two weeks + await helpers.time.increase(oneWeek * 2); + + // Checkpoint the removed nominee and check its weight again that must be zero + await vw.checkpointNominee(nominees[1], chainId); + weight = await vw.getNomineeWeight(nominees[1], chainId); + expect(weight).to.equal(0); + + // Wait until the lock expires + await helpers.time.increase(oneYear); + + // Retrieve the second nominee voting power + await vw.retrieveRemovedNomineeVotingPower(nominees[1], chainId); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + + it("Should fail when the dispenser is not correctly called", async function () { + // Take a snapshot of the current state of the blockchain + const snapshot = await helpers.takeSnapshot(); + + // Lock one OLAS into veOLAS + await olas.approve(ve.address, oneOLASBalance); + await ve.createLock(oneOLASBalance, oneYear); + + // Add nominee and get their bytes32 addresses + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + + // Set the dispenser + await vw.changeDispenser(deployer.address); + + // Try to add nominee + await expect( + vw.addNomineeEVM(convertBytes32ToAddress(nominee), chainId + 1) + ).to.be.reverted; + + // Try to remove nominee + await expect( + vw.removeNominee(nominee, chainId) + ).to.be.reverted; + + // Restore to the state of the snapshot + await snapshot.restore(); + }); + }); +}); diff --git a/test/buOLAS.js b/test/buOLAS.js index 13cd271..91478b3 100644 --- a/test/buOLAS.js +++ b/test/buOLAS.js @@ -10,7 +10,7 @@ describe("buOLAS", function () { let signers; const initialMint = "1000000000000000000000000"; // 1000000 const oneYear = 365 * 86400; - const quarterOLABalance = ethers.utils.parseEther("0.25"); + const quarterOLASBalance = ethers.utils.parseEther("0.25"); const oneOLASBalance = ethers.utils.parseEther("1"); const twoOLASBalance = ethers.utils.parseEther("2"); const AddressZero = "0x" + "0".repeat(40); @@ -128,7 +128,7 @@ describe("buOLAS", function () { ethers.provider.send("evm_mine"); // Now the releasable amount must be equal to 1/4 of the total amount amount = await bu.releasableAmount(account.address); - expect(amount).to.equal(quarterOLABalance); + expect(amount).to.equal(quarterOLASBalance); // Move five years in time ethers.provider.send("evm_increaseTime", [5 * oneYear + 100]); @@ -167,7 +167,7 @@ describe("buOLAS", function () { // Withdraw must be equal to 1/4 of the total amount expect(await olas.balanceOf(account.address)).to.equal(0); await bu.connect(account).withdraw(); - expect(await olas.balanceOf(account.address)).to.equal(quarterOLABalance); + expect(await olas.balanceOf(account.address)).to.equal(quarterOLASBalance); // Try to withdraw more now await expect( @@ -198,10 +198,10 @@ describe("buOLAS", function () { ethers.provider.send("evm_increaseTime", [oneYear + 100]); ethers.provider.send("evm_mine"); // Withdraw must be equal to rounded 1/3 of the total amount - const thirdOLABalance = new ethers.BigNumber.from(oneOLASBalance).div(numSteps); + const thirdOLASBalance = new ethers.BigNumber.from(oneOLASBalance).div(numSteps); await bu.connect(account).withdraw(); - const recoveredFullBalance = thirdOLABalance.mul(numSteps); - expect(await olas.balanceOf(account.address)).to.equal(thirdOLABalance); + const recoveredFullBalance = thirdOLASBalance.mul(numSteps); + expect(await olas.balanceOf(account.address)).to.equal(thirdOLASBalance); // This proves that we can potentially lose only 1e(-18) tokens if we call revoke on non divisible remainder expect(recoveredFullBalance.add(1)).to.equal(oneOLASBalance); @@ -240,7 +240,7 @@ describe("buOLAS", function () { await bu.connect(owner).revoke([account.address]); // The buOLAS balanceOf must be equal to the releasable amount after the revoke balance = await bu.balanceOf(account.address); - expect(balance).to.equal(quarterOLABalance); + expect(balance).to.equal(quarterOLASBalance); // Move time after the full lock duration ethers.provider.send("evm_increaseTime", [3 * oneYear + 100]); @@ -248,7 +248,7 @@ describe("buOLAS", function () { // The releasable amount must still be the 1/4 amount, since the rest was revoked let amount = await bu.releasableAmount(account.address); - expect(amount).to.equal(quarterOLABalance); + expect(amount).to.equal(quarterOLASBalance); // Withdraw must be equal to 1/4 of the total amount since another 3/4 has been revoked expect(await olas.balanceOf(account.address)).to.equal(0); @@ -257,7 +257,7 @@ describe("buOLAS", function () { expect(supply).to.equal(oneOLASBalance); // Withdraw what we can for the account await bu.connect(account).withdraw(); - expect(await olas.balanceOf(account.address)).to.equal(quarterOLABalance); + expect(await olas.balanceOf(account.address)).to.equal(quarterOLASBalance); // Now the balance is zero, since the rest of 3/4 tokens were burned supply = await bu.totalSupply(); expect(supply).to.equal(0); @@ -290,21 +290,21 @@ describe("buOLAS", function () { // Revoke at this point of time await bu.connect(owner).revoke([account.address]); // The buOLAS balanceOf must be equal to the releasable amount after the revoke, which is 1/3 - const thirdOLABalance = new ethers.BigNumber.from(oneOLASBalance).div(numSteps); + const thirdOLASBalance = new ethers.BigNumber.from(oneOLASBalance).div(numSteps); const balance = await bu.balanceOf(account.address); - expect(balance).to.equal(thirdOLABalance); + expect(balance).to.equal(thirdOLASBalance); // The releasable amount must be the 1/3 amount, since the rest 1/3 was revoked let amount = await bu.releasableAmount(account.address); - expect(amount).to.equal(thirdOLABalance); + expect(amount).to.equal(thirdOLASBalance); - const twoThirdsOLABalance = thirdOLABalance.mul(2); + const twoThirdsOLASBalance = thirdOLASBalance.mul(2); // Before the withdraw the total supply is equal to 2/3 of the full balance, since 1/3 was already withdrawn let supply = await bu.totalSupply(); - expect(supply).to.equal(twoThirdsOLABalance.add(1)); + expect(supply).to.equal(twoThirdsOLASBalance.add(1)); // Withdraw what we can for the account, after which the balance is 2/3 of the initial balance await bu.connect(account).withdraw(); - expect(await olas.balanceOf(account.address)).to.equal(twoThirdsOLABalance); + expect(await olas.balanceOf(account.address)).to.equal(twoThirdsOLASBalance); // Now the balance is zero, since the rest of 1/3 tokens were burned supply = await bu.totalSupply(); expect(supply).to.equal(0); diff --git a/test/veOLAS.js b/test/veOLAS.js index 8f0483a..444ee7d 100644 --- a/test/veOLAS.js +++ b/test/veOLAS.js @@ -9,9 +9,9 @@ describe("Voting Escrow OLAS", function () { let signers; const initialMint = "1000000000000000000000000"; // 1000000 const oneWeek = 7 * 86400; - const oneOLABalance = ethers.utils.parseEther("1"); - const twoOLABalance = ethers.utils.parseEther("2"); - const tenOLABalance = ethers.utils.parseEther("10"); + const oneOLASBalance = ethers.utils.parseEther("1"); + const twoOLASBalance = ethers.utils.parseEther("2"); + const tenOLASBalance = ethers.utils.parseEther("10"); const AddressZero = "0x" + "0".repeat(40); const overflowNum96 = "8" + "0".repeat(28); @@ -57,14 +57,14 @@ describe("Voting Escrow OLAS", function () { }); it("Should fail when creating a lock with zero value or wrong duration", async function () { - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); await expect( ve.createLock(0, 0) ).to.be.revertedWithCustomError(ve, "ZeroValue"); await expect( - ve.createLock(oneOLABalance, 0) + ve.createLock(oneOLASBalance, 0) ).to.be.revertedWithCustomError(ve, "UnlockTimeIncorrect"); await expect( @@ -75,19 +75,19 @@ describe("Voting Escrow OLAS", function () { it("Create lock", async function () { // Transfer 10 OLAS to signers[1] const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve signers[0] and signers[1] for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now // Balance should be zero before the lock expect(await ve.getVotes(owner.address)).to.equal(0); - await ve.createLock(oneOLABalance, lockDuration); - await ve.connect(owner).createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); + await ve.connect(owner).createLock(oneOLASBalance, lockDuration); // Lock end is rounded by 1 week, as implemented by design const lockEnd = await ve.lockedEnd(owner.address); @@ -97,7 +97,7 @@ describe("Voting Escrow OLAS", function () { // Get the account of the last user point const pv = await ve.getLastUserPoint(owner.address); - expect(pv.balance).to.equal(oneOLABalance); + expect(pv.balance).to.equal(oneOLASBalance); // Get the number of user points for owner and compare the balance of the last point const numAccountPoints = await ve.getNumUserPoints(owner.address); @@ -118,7 +118,7 @@ describe("Voting Escrow OLAS", function () { const account = signers[1]; // Approve owner for 1 OLAS by veOLAS - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now @@ -127,11 +127,11 @@ describe("Voting Escrow OLAS", function () { expect(await ve.getVotes(account.address)).to.equal(0); // Try to create lock for the zero address await expect( - ve.connect(owner).createLockFor(AddressZero, oneOLABalance, lockDuration) + ve.connect(owner).createLockFor(AddressZero, oneOLASBalance, lockDuration) ).to.be.revertedWithCustomError(ve, "ZeroAddress"); // Lock for the account from the funds of the owner (approved for veOLAS) - await ve.connect(owner).createLockFor(account.address, oneOLABalance, lockDuration); + await ve.connect(owner).createLockFor(account.address, oneOLASBalance, lockDuration); // Lock end is rounded by 1 week, as implemented by design const lockEnd = await ve.lockedEnd(account.address); @@ -141,7 +141,7 @@ describe("Voting Escrow OLAS", function () { // Get the account of the last user point const pv = await ve.getLastUserPoint(account.address); - expect(pv.balance).to.equal(oneOLABalance); + expect(pv.balance).to.equal(oneOLASBalance); // Get the number of user points for owner and compare the balance of the last point const numAccountPoints = await ve.getNumUserPoints(account.address); @@ -154,27 +154,27 @@ describe("Voting Escrow OLAS", function () { const deployer = signers[0]; // Transfer 10 OLAS to signers[1] const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve deployer for 2 OLAS by voting escrow - await olas.approve(ve.address, twoOLABalance); + await olas.approve(ve.address, twoOLASBalance); // Approve owner for 1 OLAS by voting escrow - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now // Try to deposit 1 OLAS for deployer without initially locked balance await expect( - ve.depositFor(deployer.address, oneOLABalance) + ve.depositFor(deployer.address, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NoValueLocked"); // Create lock for the deployer - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Try to lock the remainder of 1 OLAS for deployer from the account that did not approve for veOLAS await expect( - ve.connect(signers[2]).depositFor(deployer.address, oneOLABalance) + ve.connect(signers[2]).depositFor(deployer.address, oneOLASBalance) ).to.be.reverted; // Try to deposit zero value for deployer @@ -188,53 +188,53 @@ describe("Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(ve, "Overflow"); // Deposit for the deployer from the - await ve.connect(owner).depositFor(deployer.address, oneOLABalance); + await ve.connect(owner).depositFor(deployer.address, oneOLASBalance); // Check the balance of deployer (must be twice of his initial one) const balanceDeployer = await ve.balanceOf(deployer.address); - expect(balanceDeployer).to.equal(twoOLABalance); + expect(balanceDeployer).to.equal(twoOLASBalance); // Try to deposit 1 OLAS for deployer after its lock time hase expired ethers.provider.send("evm_increaseTime", [oneWeek + 1000]); ethers.provider.send("evm_mine"); await expect( - ve.depositFor(deployer.address, oneOLABalance) + ve.depositFor(deployer.address, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "LockExpired"); }); it("Should fail when creating a lock for more than 4 years", async function () { const fourYears = 4 * 365 * oneWeek / 7; - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); const lockDuration = fourYears + oneWeek; // 4 years and 1 week await expect( - ve.createLock(oneOLABalance, lockDuration) + ve.createLock(oneOLASBalance, lockDuration) ).to.be.revertedWithCustomError(ve, "MaxUnlockTimeReached"); }); it("Should fail when creating a lock with already locked value", async function () { - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); const lockDuration = oneWeek; - ve.createLock(oneOLABalance, lockDuration); + ve.createLock(oneOLASBalance, lockDuration); await expect( - ve.createLock(oneOLABalance, lockDuration) + ve.createLock(oneOLASBalance, lockDuration) ).to.be.revertedWithCustomError(ve, "LockedValueNotZero"); }); it("Increase amount of lock", async function () { - await olas.approve(ve.address, tenOLABalance); + await olas.approve(ve.address, tenOLASBalance); const lockDuration = oneWeek; // Should fail if requires are not satisfied // No previous lock await expect( - ve.increaseAmount(oneOLABalance) + ve.increaseAmount(oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NoValueLocked"); // Now lock 1 OLAS - ve.createLock(oneOLABalance, lockDuration); + ve.createLock(oneOLASBalance, lockDuration); // Increase by more than a zero await expect( ve.increaseAmount(0) @@ -246,7 +246,7 @@ describe("Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(ve, "Overflow"); // Add 1 OLAS more - await ve.increaseAmount(oneOLABalance); + await ve.increaseAmount(oneOLASBalance); // Time forward to the lock expiration ethers.provider.send("evm_increaseTime", [oneWeek]); @@ -254,12 +254,12 @@ describe("Voting Escrow OLAS", function () { // Not possible to add to the expired lock await expect( - ve.increaseAmount(oneOLABalance) + ve.increaseAmount(oneOLASBalance) ).to.be.revertedWithCustomError(ve, "LockExpired"); }); it("Increase amount of unlock time", async function () { - await olas.approve(ve.address, tenOLABalance); + await olas.approve(ve.address, tenOLASBalance); const lockDuration = oneWeek; // Should fail if requires are not satisfied @@ -269,7 +269,7 @@ describe("Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(ve, "NoValueLocked"); // Lock 1 OLAS - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Try to decrease the unlock time await expect( ve.increaseUnlockTime(lockDuration - 1) @@ -297,12 +297,12 @@ describe("Voting Escrow OLAS", function () { it("Withdraw", async function () { // Transfer 2 OLAS to signers[1] and approve the voting escrow for 1 OLAS const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.transfer(owner.address, tenOLASBalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Lock 1 OLAS const lockDuration = 2 * oneWeek; - await ve.connect(owner).createLock(oneOLABalance, lockDuration); + await ve.connect(owner).createLock(oneOLASBalance, lockDuration); // Try withdraw early await expect(ve.connect(owner).withdraw()).to.be.revertedWithCustomError(ve, "LockNotExpired"); @@ -323,7 +323,7 @@ describe("Voting Escrow OLAS", function () { // Now withdraw must work await ve.connect(owner).withdraw(); - expect(await olas.balanceOf(owner.address)).to.equal(tenOLABalance); + expect(await olas.balanceOf(owner.address)).to.equal(tenOLASBalance); }); }); @@ -332,11 +332,11 @@ describe("Voting Escrow OLAS", function () { // Transfer 10 OLAS worth of OLAS to signers[1] const deployer = signers[0]; const account = signers[1]; - await olas.transfer(account.address, tenOLABalance); + await olas.transfer(account.address, tenOLASBalance); // Approve deployer and account for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); - await olas.connect(account).approve(ve.address, tenOLABalance); + await olas.approve(ve.address, oneOLASBalance); + await olas.connect(account).approve(ve.address, tenOLASBalance); // Initial total supply must be 0 expect(await ve.totalSupply()).to.equal(0); @@ -345,8 +345,8 @@ describe("Voting Escrow OLAS", function () { const lockDuration = oneWeek; // 1 week from now // Create locks for both addresses deployer and account - await ve.createLock(oneOLABalance, lockDuration); - await ve.connect(account).createLock(twoOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); + await ve.connect(account).createLock(twoOLASBalance, lockDuration); // Balance is time-based, it changes slightly every fraction of a time // Use both balances to check for the supply @@ -390,13 +390,13 @@ describe("Voting Escrow OLAS", function () { it("Checkpoint with points of inactivity", async function () { // Approve deployer and account for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); // Lock for four years const lockDuration = 4 * 365 * oneWeek / 7; // Create locks for both addresses deployer and account - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Move 10 weeks in time for (let i = 0; i < 10; ++i) { @@ -422,22 +422,22 @@ describe("Voting Escrow OLAS", function () { // Transfer 10 OLAS worth of OLAS to signers[1] const deployer = signers[0]; const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve signers[0] and signers[1] for 1 OLAS by voting escrow - await olas.approve(ve.address, tenOLABalance); - await olas.connect(owner).approve(ve.address, tenOLABalance); + await olas.approve(ve.address, tenOLASBalance); + await olas.connect(owner).approve(ve.address, tenOLASBalance); // Define 1 week for the lock duration let lockDuration = oneWeek; // Create and increase locks for both addresses signers[0] and signers[1] - await ve.createLock(twoOLABalance, lockDuration); - await ve.increaseAmount(oneOLABalance); + await ve.createLock(twoOLASBalance, lockDuration); + await ve.increaseAmount(oneOLASBalance); let blockNumber = await ethers.provider.getBlockNumber(); - await ve.connect(owner).createLock(twoOLABalance, lockDuration); - await ve.connect(owner).increaseAmount(oneOLABalance); - await ve.connect(owner).increaseAmount(oneOLABalance); + await ve.connect(owner).createLock(twoOLASBalance, lockDuration); + await ve.connect(owner).increaseAmount(oneOLASBalance); + await ve.connect(owner).increaseAmount(oneOLASBalance); // Get past votes of the owner (bug resolved in wveOLAS) const votesOwner = await ve.getPastVotes(owner.address, blockNumber); @@ -462,7 +462,7 @@ describe("Voting Escrow OLAS", function () { const deployer = signers[0].address; const user = signers[1].address; // Approve signers[0] for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); // Initial total supply must be 0 expect(await ve.totalSupply()).to.equal(0); @@ -471,20 +471,20 @@ describe("Voting Escrow OLAS", function () { const lockDuration = oneWeek; // 1 week from now // Create locks for both addresses signers[0] and signers[1] - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Try to call transfer-related functions for veOLAS await expect( - ve.approve(user, oneOLABalance) + ve.approve(user, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NonTransferable"); await expect( ve.allowance(deployer, user) ).to.be.revertedWithCustomError(ve, "NonTransferable"); await expect( - ve.transfer(user, oneOLABalance) + ve.transfer(user, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NonTransferable"); await expect( - ve.transferFrom(deployer, user, oneOLABalance) + ve.transferFrom(deployer, user, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NonTransferable"); // Try to call delegate-related functions for veOLAS diff --git a/test/wveOLAS.js b/test/wveOLAS.js index 342b3a3..f2bed7c 100644 --- a/test/wveOLAS.js +++ b/test/wveOLAS.js @@ -10,9 +10,9 @@ describe("Wrapped Voting Escrow OLAS", function () { let signers; const initialMint = "1000000000000000000000000"; // 1000000 const oneWeek = 7 * 86400; - const oneOLABalance = ethers.utils.parseEther("1"); - const twoOLABalance = ethers.utils.parseEther("2"); - const tenOLABalance = ethers.utils.parseEther("10"); + const oneOLASBalance = ethers.utils.parseEther("1"); + const twoOLASBalance = ethers.utils.parseEther("2"); + const tenOLASBalance = ethers.utils.parseEther("10"); const AddressZero = "0x" + "0".repeat(40); const overflowNum96 = "8" + "0".repeat(28); @@ -77,19 +77,19 @@ describe("Wrapped Voting Escrow OLAS", function () { it("Create lock", async function () { // Transfer 10 OLAS to signers[1] const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve signers[0] and signers[1] for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now // Balance should be zero before the lock expect(await wve.getVotes(owner.address)).to.equal(0); - await ve.createLock(oneOLABalance, lockDuration); - await ve.connect(owner).createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); + await ve.connect(owner).createLock(oneOLASBalance, lockDuration); // Lock end is rounded by 1 week, as implemented by design const lockEnd = await wve.lockedEnd(owner.address); @@ -99,7 +99,7 @@ describe("Wrapped Voting Escrow OLAS", function () { // Get the account of the last user point const pv = await wve.getLastUserPoint(owner.address); - expect(pv.balance).to.equal(oneOLABalance); + expect(pv.balance).to.equal(oneOLASBalance); // Get the number of user points for owner and compare the balance of the last point const numAccountPoints = await wve.getNumUserPoints(owner.address); @@ -120,7 +120,7 @@ describe("Wrapped Voting Escrow OLAS", function () { const account = signers[1]; // Approve owner for 1 OLAS by veOLAS - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now @@ -129,11 +129,11 @@ describe("Wrapped Voting Escrow OLAS", function () { expect(await wve.getVotes(account.address)).to.equal(0); // Try to create lock for the zero address await expect( - ve.connect(owner).createLockFor(AddressZero, oneOLABalance, lockDuration) + ve.connect(owner).createLockFor(AddressZero, oneOLASBalance, lockDuration) ).to.be.revertedWithCustomError(ve, "ZeroAddress"); // Lock for the account from the funds of the owner (approved for veOLAS) - await ve.connect(owner).createLockFor(account.address, oneOLABalance, lockDuration); + await ve.connect(owner).createLockFor(account.address, oneOLASBalance, lockDuration); // Lock end is rounded by 1 week, as implemented by design const lockEnd = await wve.lockedEnd(account.address); @@ -143,7 +143,7 @@ describe("Wrapped Voting Escrow OLAS", function () { // Get the account of the last user point const pv = await wve.getLastUserPoint(account.address); - expect(pv.balance).to.equal(oneOLABalance); + expect(pv.balance).to.equal(oneOLASBalance); // Get the number of user points for owner and compare the balance of the last point const numAccountPoints = await wve.getNumUserPoints(account.address); @@ -156,27 +156,27 @@ describe("Wrapped Voting Escrow OLAS", function () { const deployer = signers[0]; // Transfer 10 OLAS to signers[1] const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve deployer for 2 OLAS by voting escrow - await olas.approve(ve.address, twoOLABalance); + await olas.approve(ve.address, twoOLASBalance); // Approve owner for 1 OLAS by voting escrow - await olas.connect(owner).approve(ve.address, oneOLABalance); + await olas.connect(owner).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now // Try to deposit 1 OLAS for deployer without initially locked balance await expect( - ve.depositFor(deployer.address, oneOLABalance) + ve.depositFor(deployer.address, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "NoValueLocked"); // Create lock for the deployer - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Try to lock the remainder of 1 OLAS for deployer from the account that did not approve for veOLAS await expect( - ve.connect(signers[2]).depositFor(deployer.address, oneOLABalance) + ve.connect(signers[2]).depositFor(deployer.address, oneOLASBalance) ).to.be.reverted; // Try to deposit zero value for deployer @@ -190,17 +190,17 @@ describe("Wrapped Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(ve, "Overflow"); // Deposit for the deployer from the - await ve.connect(owner).depositFor(deployer.address, oneOLABalance); + await ve.connect(owner).depositFor(deployer.address, oneOLASBalance); // Check the balance of deployer (must be twice of his initial one) const balanceDeployer = await wve.balanceOf(deployer.address); - expect(balanceDeployer).to.equal(twoOLABalance); + expect(balanceDeployer).to.equal(twoOLASBalance); // Try to deposit 1 OLAS for deployer after its lock time hase expired ethers.provider.send("evm_increaseTime", [oneWeek + 1000]); ethers.provider.send("evm_mine"); await expect( - ve.depositFor(deployer.address, oneOLABalance) + ve.depositFor(deployer.address, oneOLASBalance) ).to.be.revertedWithCustomError(ve, "LockExpired"); }); }); @@ -210,11 +210,11 @@ describe("Wrapped Voting Escrow OLAS", function () { // Transfer 10 OLAS worth of OLAS to signers[1] const deployer = signers[0]; const account = signers[1]; - await olas.transfer(account.address, tenOLABalance); + await olas.transfer(account.address, tenOLASBalance); // Approve deployer and account for 1 and 10 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); - await olas.connect(account).approve(ve.address, tenOLABalance); + await olas.approve(ve.address, oneOLASBalance); + await olas.connect(account).approve(ve.address, tenOLASBalance); // Initial total supply must be 0 expect(await ve.totalSupply()).to.equal(0); @@ -223,8 +223,8 @@ describe("Wrapped Voting Escrow OLAS", function () { const lockDuration = oneWeek; // 1 week from now // Create locks for both addresses deployer and account - await ve.createLock(oneOLABalance, lockDuration); - await ve.connect(account).createLock(twoOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); + await ve.connect(account).createLock(twoOLASBalance, lockDuration); // Balance is time-based, it changes slightly every fraction of a time // Use both balances to check for the supply @@ -261,13 +261,13 @@ describe("Wrapped Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(ve, "WrongBlockNumber"); // Transfer OLAS to the user - await olas.transfer(user.address, tenOLABalance); + await olas.transfer(user.address, tenOLASBalance); // Approve user for 1 OLAS by voting escrow - await olas.connect(user).approve(ve.address, oneOLABalance); + await olas.connect(user).approve(ve.address, oneOLASBalance); // Define 1 week for the lock duration const lockDuration = oneWeek; // 1 week from now // Create locks for both addresses deployer and account - await ve.connect(user).createLock(oneOLABalance, lockDuration); + await ve.connect(user).createLock(oneOLASBalance, lockDuration); blockNumber = await ethers.provider.getBlockNumber("latest"); // Try to get past votes of a block number in the future @@ -280,22 +280,22 @@ describe("Wrapped Voting Escrow OLAS", function () { // Transfer 10 OLAS worth of OLAS to signers[1] const deployer = signers[0]; const owner = signers[1]; - await olas.transfer(owner.address, tenOLABalance); + await olas.transfer(owner.address, tenOLASBalance); // Approve signers[0] and signers[1] for 10 OLAS by voting escrow - await olas.approve(ve.address, tenOLABalance); - await olas.connect(owner).approve(ve.address, tenOLABalance); + await olas.approve(ve.address, tenOLASBalance); + await olas.connect(owner).approve(ve.address, tenOLASBalance); // Define 1 week for the lock duration let lockDuration = oneWeek; // Create and increase locks for both addresses signers[0] and signers[1] - await ve.createLock(twoOLABalance, lockDuration); - await ve.increaseAmount(oneOLABalance); + await ve.createLock(twoOLASBalance, lockDuration); + await ve.increaseAmount(oneOLASBalance); let blockNumber = await ethers.provider.getBlockNumber("latest"); - await ve.connect(owner).createLock(twoOLABalance, lockDuration); - await ve.connect(owner).increaseAmount(oneOLABalance); - await ve.connect(owner).increaseAmount(oneOLABalance); + await ve.connect(owner).createLock(twoOLASBalance, lockDuration); + await ve.connect(owner).increaseAmount(oneOLASBalance); + await ve.connect(owner).increaseAmount(oneOLASBalance); // The past votes before the lock must be zero let votesOwner = ethers.BigNumber.from(await wve.getPastVotes(owner.address, blockNumber)); @@ -333,21 +333,21 @@ describe("Wrapped Voting Escrow OLAS", function () { it("Should fail when calling a function that must be called from the original veOLAS", async function () { const wveProxy = await ethers.getContractAt("veOLAS", wve.address); await expect( - wveProxy.createLock(oneOLABalance, oneWeek) + wveProxy.createLock(oneOLASBalance, oneWeek) ).to.be.revertedWithCustomError(wve, "ImplementedIn"); }); it("Balance with a block number lower than a zero user point block number returns zero value", async function () { // Transfer 10 OLAS worth of OLAS to signers[1] const deployer = signers[0]; - await olas.transfer(deployer.address, tenOLABalance); + await olas.transfer(deployer.address, tenOLASBalance); // Approve signers[0] for 10 OLAS by voting escrow - await olas.approve(ve.address, tenOLABalance); + await olas.approve(ve.address, tenOLASBalance); const block = await ethers.provider.getBlock("latest"); // Create lock for signers[0] - await ve.createLock(twoOLABalance, oneWeek); + await ve.createLock(twoOLASBalance, oneWeek); // Try to get the balance value before the lock const balance = await wve.balanceOfAt(deployer.address, block.number); @@ -360,7 +360,7 @@ describe("Wrapped Voting Escrow OLAS", function () { const deployer = signers[0].address; const user = signers[1].address; // Approve signers[0] for 1 OLAS by voting escrow - await olas.approve(ve.address, oneOLABalance); + await olas.approve(ve.address, oneOLASBalance); // Initial total supply must be 0 expect(await wve.totalSupply()).to.equal(0); @@ -369,20 +369,20 @@ describe("Wrapped Voting Escrow OLAS", function () { const lockDuration = oneWeek; // 1 week from now // Create locks for both addresses signers[0] and signers[1] - await ve.createLock(oneOLABalance, lockDuration); + await ve.createLock(oneOLASBalance, lockDuration); // Try to call transfer-related functions for veOLAS await expect( - wve.approve(user, oneOLABalance) + wve.approve(user, oneOLASBalance) ).to.be.revertedWithCustomError(wve, "NonTransferable"); await expect( wve.allowance(deployer, user) ).to.be.revertedWithCustomError(wve, "NonTransferable"); await expect( - wve.transfer(user, oneOLABalance) + wve.transfer(user, oneOLASBalance) ).to.be.revertedWithCustomError(wve, "NonTransferable"); await expect( - wve.transferFrom(deployer, user, oneOLABalance) + wve.transferFrom(deployer, user, oneOLASBalance) ).to.be.revertedWithCustomError(wve, "NonTransferable"); // Try to call delegate-related functions for veOLAS diff --git a/yarn.lock b/yarn.lock index 76ffe7e..f839951 100644 --- a/yarn.lock +++ b/yarn.lock @@ -666,65 +666,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.2.1.tgz#10c1a07add192583ce8b2d4cc93439f52b390a41" - integrity sha512-aMYaRaZVQ/TmyNJIoXf1bU4k0zfinaL9Sy1day4yGlL6eiQPFfRGj9W6TZaZIoYG0XTx/mQWD7dkXJ7LdrleJA== - -"@nomicfoundation/edr-darwin-x64@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.2.1.tgz#eaa29d2ba9f91ddb5f59b872c5a54f94a6fe3095" - integrity sha512-ma0SLcjHm5L3nPHcKFJB0jv/gKGSKaxr5Z65rurX/eaYUQJ7YGMsb8er9bSCo9rjzOtxf4FoPj3grL3zGpOj8A== - -"@nomicfoundation/edr-linux-arm64-gnu@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.2.1.tgz#8149db0d742157405effe82d485ea9bfefddc795" - integrity sha512-NX3G4pBhRitWrjSGY3HTyCq3wKSm5YqrKVOCNQGl9/jcjSovqxlgzFMiTx4YZCzGntfJ/1om9AI84OWxYJjoDw== - -"@nomicfoundation/edr-linux-arm64-musl@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.2.1.tgz#7d53afe5607eb406d199a199d00209a6304ff07b" - integrity sha512-gdQ3QHkt9XRkdtOGQ8fMwS11MXdjLeZgLrqoial4V4qtMaamIMMhVczK+VEvUhD8p7G4BVmp6kmkvcsthmndmw== - -"@nomicfoundation/edr-linux-x64-gnu@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.2.1.tgz#b762c95368fcb88bbbabba4d8be5380f38967413" - integrity sha512-OqabFY37vji6mYbLD9CvG28lja68czeVw58oWByIhFV3BpBu/cyP1oAbhzk3LieylujabS3Ekpvjw2Tkf0A9RQ== - -"@nomicfoundation/edr-linux-x64-musl@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.2.1.tgz#522448c42bff7d2abd52ddcf11ae6ca3dfdd6db4" - integrity sha512-vHfFFK2EPISuQUQge+bdjXamb0EUjfl8srYSog1qfiwyLwLeuSbpyyFzDeITAgPpkkFuedTfJW553K0Hipspyg== - -"@nomicfoundation/edr-win32-arm64-msvc@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.2.1.tgz#ccfa443c274e49de93016a1060be810096dc6f1d" - integrity sha512-K/mui67RCKxghbSyvhvW3rvyVN1pa9M1Q9APUx1PtWjSSdXDFpqEY1NYsv2syb47Ca8ObJwVMF+LvnB6GvhUOQ== - -"@nomicfoundation/edr-win32-ia32-msvc@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.2.1.tgz#822b19d3e67d6dcfa5394cb6a4d55d8bab1b2f26" - integrity sha512-HHK0mXEtjvfjJrJlqcYgQCy3lZIXS1KNl2GaP8bwEIuEwx++XxXs/ThLjPepM1nhCGICij8IGy7p3KrkzRelsw== - -"@nomicfoundation/edr-win32-x64-msvc@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.2.1.tgz#7b56ff742b2724779cc9f3385815b394f76de8df" - integrity sha512-FY4eQJdj1/y8ST0RyQycx63yr+lvdYNnUkzgWf4X+vPH1lOhXae+L2NDcNCQlTDAfQcD6yz0bkBUkLrlJ8pTww== - -"@nomicfoundation/edr@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.2.1.tgz#a3d2a542dcd5dc5a8d757116d52baea05f370531" - integrity sha512-Dleau3ItHJh2n85G2J6AIPBoLgu/mOWkmrh26z3VsJE2tp/e00hUk/dqz85ncsVcBYEc6/YOn/DomWu0wSF9tQ== +"@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.2.1" - "@nomicfoundation/edr-darwin-x64" "0.2.1" - "@nomicfoundation/edr-linux-arm64-gnu" "0.2.1" - "@nomicfoundation/edr-linux-arm64-musl" "0.2.1" - "@nomicfoundation/edr-linux-x64-gnu" "0.2.1" - "@nomicfoundation/edr-linux-x64-musl" "0.2.1" - "@nomicfoundation/edr-win32-arm64-msvc" "0.2.1" - "@nomicfoundation/edr-win32-ia32-msvc" "0.2.1" - "@nomicfoundation/edr-win32-x64-msvc" "0.2.1" + "@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/ethereumjs-common@4.0.4": version "4.0.4" @@ -3177,14 +3165,14 @@ hardhat-tracer@^2.8.1: debug "^4.3.4" ethers "^5.6.1" -hardhat@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.21.0.tgz#2e23126310a6c77cd7e149e6af1dd67626b7a74f" - integrity sha512-8DlJAVJDEVHaV1sh9FLuKLLgCFv9EAJ+M+8IbjSIPgoeNo3ss5L1HgGBMfnI88c7OzMEZkdcuyGoobFeK3Orqw== +hardhat@^2.22.3: + version "2.22.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.3.tgz#50605daca6b29862397e446c42ec14c89430bec3" + integrity sha512-k8JV2ECWNchD6ahkg2BR5wKVxY0OiKot7fuxiIpRK0frRqyOljcR2vKwgWSLw6YIeDcNNA4xybj7Og7NSxr2hA== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.2.0" + "@nomicfoundation/edr" "^0.3.5" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4"