From b7bea8d93205e0a02b7b0ce4a93d06660979d8fb Mon Sep 17 00:00:00 2001 From: AL Date: Wed, 17 Apr 2024 19:23:01 +0100 Subject: [PATCH 01/14] doc and test: fuzzing VoteWeighting --- audits/internal11/fuzzing/README.md | 18 + .../corpusEchidna/covered.1713373564.html | 2072 ++++++++++++++++ .../corpusEchidna/covered.1713373572.html | 2073 +++++++++++++++++ .../fuzzing/crytic-export/combined_solc.json | 1 + audits/internal11/fuzzing/echidna_assert.yaml | 10 + .../internal11/fuzzing/echidna_overflow.yaml | 10 + audits/internal11/fuzzing/fuzzing-assert.PNG | Bin 0 -> 35484 bytes .../internal11/fuzzing/fuzzing-overflow.PNG | Bin 0 -> 35686 bytes audits/internal11/fuzzing/start_echidna.sh | 4 + contracts/test/EchidnaVoteWeightingAssert.sol | 74 + contracts/test/VoteWeightingFuzzing.sol | 523 +++++ 11 files changed, 4785 insertions(+) create mode 100644 audits/internal11/fuzzing/README.md create mode 100644 audits/internal11/fuzzing/corpusEchidna/covered.1713373564.html create mode 100644 audits/internal11/fuzzing/corpusEchidna/covered.1713373572.html create mode 100644 audits/internal11/fuzzing/crytic-export/combined_solc.json create mode 100644 audits/internal11/fuzzing/echidna_assert.yaml create mode 100644 audits/internal11/fuzzing/echidna_overflow.yaml create mode 100755 audits/internal11/fuzzing/fuzzing-assert.PNG create mode 100755 audits/internal11/fuzzing/fuzzing-overflow.PNG create mode 100644 audits/internal11/fuzzing/start_echidna.sh create mode 100644 contracts/test/EchidnaVoteWeightingAssert.sol create mode 100644 contracts/test/VoteWeightingFuzzing.sol 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 0000000000000000000000000000000000000000..7ad5782408268bfeb085d366fcefcdd665f2fd05 GIT binary patch literal 35484 zcmeFZXH-+!+c%73!G<`ZqSD3@VJv`PL25?Pv4e_&kU&%fR7#|VK#GdOI0z^RK`9vv zqEaF?l)zCDB1DLa5Fx+;LWmGTNJ4r!Pn`dKKliiV^*$foFYl-Mkj2`EPI?|PSh``Uo}Qk;k;4a0>*>u0bRXQ}MY<>OH{F|cf9A!UKD1x2qT6&**H{p` z@5DYmy~@mG>I(~X?IqU^`^D(#t!Vx6nMXstxTL4|m;I3g`_3c;@`v1V2lqDqG9CCa zpK7o4@$xysTf|%DqE= zB~6QCw=7G-`)22i)et3#0Y zUArD@0ND})vefwWC8%?u6Ys`lyN$r_+71*J;eyf|aR6If*DxHjAE+Z&{}kJ$mi;x% zD+FCE0U=ldcvqPiNyBE;!;k8R8*#DFI1%hn>(5;c#qU(ivmh!2Yut7yG^@pJTBj>EO-l7ok` zz;h_7cL4?39SL)Fzo&=d6EMaUMCe26a1~DR?%mOEH0rQ@7RbExf4tNr3z@i4fjcn) z``b4Qd3~uE+_oVL9HVb(!8y70_C4L{RbmJJ#kN)8cK`3MSj?V!2we|sjuffXqD9Dl zTq@Z$DeafRp;CPUDjL6?D$%+P90CcA(maKo2GL88DWBe70UJ4*1-f~hR;;jMx>y6P zQFd7n@lfG>Hr&M5>lQ;yam6QLq`8OiE*+@kaarLE)HA8zs7GvHp%bq+n&iSA4l!LnFr&uTP=a#$uk9NTfrk+Duoe&`#LUjvdqVjD678a7cz3r z4tZ@%cr@VUl}mnfYj$IRvAXwWQ~gJmof%C**ReUwNT_lQqX{~iK*Pv64d+53tXUnY zh)z3@FsPlR(7xUK4kw%5xpNxL+FXKb|mrFziJPeQNGX*vXo=z&y5ouzL z-%l$9o!#pA)^W!~{1)r<@Q1(H6?Is9-W8=MNK9f#6cB7{?>ue9ag}tZSyvgN657|I>W_pz2#?@Y(p6b+W?k(KGf*ZZKa*DHTB+|#KD67=8NDcCO<_}36f3UUg)#7Y6?ER)^S~7aX1}R9@|v$=R@!KzDdd(hRXJMDza}mKV>{bi@?gcQo%p$CDw&n)AXEiPEJ7M!m_@5|J zzO|GuOiucfE8~bkhrOM2kyAlu>a*RXR{L-82&1nPG;9F(yzR$>t?XWP^l(VMXBwt{ zH(=_+M}|SskhB7nxNoPYU_xJP%Af^zpavkSrapXW_tR$SG8bBjE9$w>+?=E$XygZ& z-GUq(+>OC;Uvwcn6xYFNb&^FZS0N9)D00b(Pw*YXBu%QBcNNcL!a}vIbn;T)E*Pyh z=+OWsfXA+7TF<&ne?&1);EN{?oXe+cw8tte_gqf57^MAhg1vvy z<14^&-rsv*eG|{d9+mYX150|tlmm*VeZYj)tN|YuXSyY=;v1CXWAgMVEz}2DK68x5 z-P1bgTxiF2xm2scEmf@(jF+oSD$<2BgUX$)pWoV#cQsm zCm#2PksVcwsYhJItlillB4+=K6M<3v^7n{EHrzYEop9e`zqK~|>-bH6>5b#7t$N06 zb|+tfZOaZSFB*-pe>tRpM{m%S_QeIyHij*~mP-RL*uUboO>n>7urA)~c>(f`LuLF& zFpkn9m&2>}X^Aom@5*$E2`Sf#oFlsJ*n3jHDx+hecrxg3cBu1793}#yP%<;hj7;6! ztCd&dkk0OurTh~NL2prYShOXmvv5f;kzD!e;Xl^paTKTe@0W+=3K4s}B!wdooz zIG(HEUjIinBJ+byN@FK3bLNcWy&qOvL=b<7 zEe5Yulm#x{Qriv92@+a**`@E?CP-$LLlP~D34ID%U0+(L;17%l!ehR4Ud{GJ^c}89 z;RrkG6b&yLTUi3vmtO2Fq#|&EKDR^V`j9Ijc{F*$g=@5Jml{E!ExR=~^}NDzM+L>` zYj{8ICzos33|7MFt(k3m-8l)AcEg#CMIiGdp%g=|53ya^9e=Y)ELoZLG@;N-QqmZ$ zcx`w=Qw2-q0=b3Sh#BxP58YxIQ_j=KwJ1VGJXy0p4q~#NOGSyYb)?@SV!G6U`ADLs zUt0%N4vm#}i#2qA+8s({eY`*O&6k9h<*3`FvF8cyoWu=W=$w14NjD?5WsUese3yDB z9F25)?)TL~N;eLCtE%1!1UMtV;5Jssh=ABX>zqD%N&zIppyK*F9Z~b=HFKgF}skdbho}ikv08VY@t%^Yz_^fk^;*Jlk&SP zggcOmBk@^d2e1F;4oufs7-c=lY||P9xkbRwW!RyHd&NkO=`esd79%m5_J)|X$Th69 zWMIBTaFj(-xjz~RBr;)QyhgIbb@-nJN%pwc3OUk@aTFt$|FqfojoBUD8h!*X@Dwd` zyQluiB1dlcJ!f1tV+nkk-(fd<>c_vETgPQVRzzs099m1iPQyqPDEVJRkPD*Iy#ov5%H4BGojq!wLf!&&<*a_ns_&X0rhI)lA=9F@Z@{I2`LU{ zEQ%j;fO5bT*ZSY2O`HwbHxku^F8?Wd8rYzL?Brk@TP~r{9K)-yAspk&WmbA1f!*`b)H4i>rRc+U|AbR~( z>r!XGKI2Ga!*S&Oe#WcYdwUh0#m`h4@7@h>P8+W2^ z2L<2_;j*CU6?M6q4tC58h{dCrglB|ItoBdM5y6wAab?{m^~ni=V5l~q1>m1(oWDrn zVn#U=m4v_AFF=Oj!({}5PHZNdbsmimm%y%4pw|jJt7`gz-FDjqGa>Y*7Gk6qWen3| z5AfGU=FiMdr0pmijM~56Hdp@M%&tsyu^`}hlCe*0Oa0hEx26w^cxg_xP9#Jf&%&;A zhr*3vD_6Z7;tUdAwNwtJ7b+bMG>BhW(X-KLbeg*UbJ{rnj60XojwNMrZD9B$M@lTqax3U<6 zi5j0eqy**ll;9CSYzKlNN}tndAK!cnS*9w`;+aTO_%`Iw5~U+Z(wMoxvAy;xUo4mcLe1Qybl(SM+UasfB*HT;sJI4 zVZ0q7nBWzp>Qe`9(Dxh2T70)^s|6B@TKDCHt7%Zt5mH4lIO|au8n+Xa9$(22r#ppEt}$1tZEPn*V;elx@`Goaz<8pCoeiCqb~#7SuBANk z>eExuj{deZ7|O)z#?-pOYr;kL4e3j+tu_J+7Kg&oxR^0Sb=my-;aV}c3owX*&lTrw zx+?a1bj&B_^lpVgN|QdDx)!({lZ((F6`nCy!WQhTR-jRM*N|qM6ExE$*ys6;T~|4c z!G&_F6iN1Yj+RzwF=d#^Ubl-Y3!;Tq6M#v@rv4vJS&9?8E>WqezUSPl79h`WSNJG4n+c6~P<;>LX(fC9wG{B8(Js63LDUAj4*wHMAYOFfiJNvE#)E(Nh2n0|vj164Gtt}+0m#Lc zfZm!c!$k$e-{x48KgG@PK%r(=nsiAA927&jWbB7Amjj z6=Bz1mgvsKX8zxDhg-)~#=x$N?r)Ke1fHnm+TAhY>1p?lvobqkn_b8{m17wDjn=U{ zvm;PN#bkjd&Hdw)-LQFC;OAyGJ^Y2N& z4h;1-TbIadXBx=%NB+{-wU16ZS-N;DoZsGI$Ky>dCKjXIGb+3J+PXT6&XQYb?B>ej z-5VsUQ$>-L^u)DO&{gm}#5phS-QFsA&3r<0;S z?#nAaBM=jOal_2@2bw>5;gZr?+*N^6nH?M6gQD_1pFEyXv`}QI#kRzbnYsE}T$A=$ zRp12_g+2BZyoYk7qBf#4nuxeXUo`ObG0*tH_+&`7n&G3}NYW(Evv(1Kr}2unp|*5|h4C zYv843K-~IR==4=95p%Cmq=dDZY=B)AU04>+lx6Wp_x(pZv8VVEjtfkLPfYASj7AB^ z!L1fn*E!o{rD^h%w5F9{U=vJeW2L&VA6^DL8vnBA%0>UdHCH2%nCOOQTB>#j{>t4t z(u@6WQDfVQyH&<*{EMuOzh!zkq`iqmt2`u!a-u$rDf3m1w#)8J&Mo*^MgL3Y+^V@NO-B30Ek%V~*_b01wqU5<$E094{pp`uuaJrU_<_mAA z{^asGLZmw(Ecl2@IZWOZLE_S)`sc0$m1!_UKV z(+H?jvGf0tMHm{cBA2HB$eoZ>_#V&Sg=-pIJ1lu=E+>9c{2HF)YpeEC;0llzN-Z<9 zk0R};#}vCVde6k4S1HG_ueFaEn0F^M zv+=xYsutmIHFL$UjF6-SQe)G7xFyf~w2n%oi#Dp@FNL~}Jzo|Tpk_V-G7w-=+?hJk z%ZU8CBXoa0s*8MxOIlU|4j@j#>!!Suu;zOR;X}pg^vj$VLg89N&d)JMg#pT^(IE69-x-3BQ6WW8*ltKBm8l-=L zMJkQxC=e-7VHLmaLJn?$0=&170xWoV{h z2{jBZb8Zs%oXS^$-w6@NLplWCbu-3MSH?)Y$|Yd<<_#@9&Jw3<X^BX;|eS zHda@hqBVU3SKVP>&3#?3YU{_l`JxI`Y=?CAcU_62HXGSC{i~PJ=lJGyQPK%d<8%6% zNw~7(#}D0n^HNKvzyb+Vvcxf@;21R@K|;Var4JYx{cBjhGIG`MV@;`9(>bQPU|<-k z6)U2!Sd6OTA(RppVR!#k7qU90AwH1k&!jbC-GS}5wC^QkcbKdWd`L_Q3)#Km^YCDz zVUDoWJUiLvheYM&dp+UYkL5J|irD|LWlbIVA5&J;yQcM?jzzKPL~jB)ydboTszq{>6IxRL+^$3IccHpzc)neCS&-r+His26uQx)ueF z`g?k^6Pd^T4}kSdlqeJrJmWwTC+9a0lrl@8?Z@m5I1 z9u70IHgS?USuAn0fKukG01&Ft#;RKt4z2`_Vj@d;TYtku#xX81pF!vIlH3mEilh=o zZQp>GgcGdda}|%*AS3I?m1afTx}y$P4a>fQRhmMf)1bDVWXvGFy|44WAxRgOwG;KG zTU`gQ--I}07xX6Q1c~el$HBpig+n6K9q+5^smkIrOypoCe=xGZGLu>!;qJ+0jIIc- z<|luHuCR98A-5+GRBET;E2`*KnU5r)SMKH-v3K-OoNstlNw{!#4E`=gp_EhVKwB@b z1wqZlSF8L%;Ibqlv%2b2d$(3VvMAo$Q8k(KA zSnK|LwB9R*rva|L3V@=uXx-w;_zzIibU{>#V-Jc&FB+lRDvN3^%>o~53laohVHHh{yrj!2wUh@> z9te)kzsdD`y#{7f*Xyb7O!7K;4Nb8G#F;^5*=l_S1SmAHnW z4Lw}ou;NOgqDRh}5HBe2gMMQmU#5T6Ud%9`U^XiVEqwZ?zWc&$#g$Z*+BLYmDy zaj3Xiy722k4VyirfU>xhNBJ~ZjzGJ5nV@Lg__q6O7P$Ygqsb)Bl26x!NPp@O67+6nf(qU<`rJ}p#3MilcV|- z&gqgB;`RhL!%W((o!z8{t_!wZcP<~lzG7H&Op>a2lGj@F+}MIC=6@xPMioJ){i3N5 zMirx~Y;GIu&4WT!W}T_DR2E}qCyd-4bofAz*kkI@07X6p;ZcK!^zal|gL)ZRWV#=9ki7VM#L#vB%(+nO2iykSSU*k;(z z#SYd-JgO<4DsUnpyK#GA?o0{@l{Z{vV726MSSiq}bvrw-L7=Nqy*4eWH_Q)ed5JGe z5$0_s**AO)%BpMNihB;S2_x#qhBU6}by@I#4fQ5J;+>IvuI|;TpTkeQ@~XMrEEmuD7I~qAPYKxRvnGhci+LBqGNtdXLPY zo#$fhI|@|t^YY$58pYrs-A zfijMMszvNc_xeU29ok2?U&6j75%(Cd3FGR=%a~mRJrtai+5al@Pt$t6jLv=ehLgPp^AkHJ@czVOTNdn3F3ZgLU!R0^geLcFDFQ_Bzd6jJ78krSRfvr(N|| zFcXC74b?7D2OY8~ZWjXx55sRex2mh4h~}UslOqH15L@e*RoSNtVTgTYXhre$x5M(y z%x=a@sA2e}7Hd9Opx!fOm_ng?1=Ee~$G(|j@B>j|xrGxUK~RyQvqF8Lq8#iH$hq9> znMY@3f2>{-T3bMK&{||E48Ql%j^Sl9%Af8oAdoLf*G}+eurc%5Ugv)VaG?%sp8t_R z4${_v7CD)>XAifNKIkIzD;;o3=-Z|mLPbT^LIav467_5$cw$x`d*%oHY-R=A?lTT? z8`zEfCedv~VuSGoGT<8Ti%4F)r4+XvI8*F@=z_#Y09KQ2yd0;lIG)tG1@v zFLxgdnnH>cgDlV>3QGYN?lzZ+E05A@Tn%k)ELOESV9ca0=HSKr625qQB+TNe?nTGw zlOC?!8QW%m{(*Yy!aKzaFD6a@cKg;w%U!jkqwDIn7)^ZM{_~2Co@uUm9scTQ%6PQI zdxH?27Nck$&~2oqV3YtdY;yop(=rw)I)@qEh-YzY@TIPWj+`i@`>?y+*0FWveYi^y z3M43hkMQI>szur` zRDpHAcvVPzn8<`;uzwW{wM}~ERA@iLNAY_5R}0lzaK;pQAa5q?kC&hwvOO-v{mk%M zH-Au)ZvG8|)9D;)*iG2TQwLpzV&EYdNm9S+KZS>&sKS{LSYc7Bu}N;+qA2WD zwtsyRB&dSse*bSX0x*T!1J|0YJNFQ4kb8I4!$nD!_Zz%bNt_SCD z24&4&_h1;DGa6Nfaz?$wk6&`v|;>-B(V?Ag;;#*$d$iIA4g+D*(UU~stbr$ z+^+AVIz<(jFVOP84C zLI3&5QPHxK7qo1RDppC8kxF!gofR#ywv^Cy*bS(tJ`Y`w{BH6@;Cq0R7wit$ac)oNpH7T8n~xQ zp*7g0kgd^pF!ExSnoB|tgbthNriE^lzu#5}l2zub-XZt#`2Z3iWw(D1O)$;wIJefQ zlXTF}&z!fNNQ@RWP;mXJZloXxziyDv86D##v*6`dL3S@)t2FbH?x;QnB5$@zKK-A4ms;UBE(sXkVm9n-YBZKWjN1+g zMz|2`u)l0o_a>IbN|ia!Z>Y;AJ>slDnQ`$VL?gGYoBdg*%0L}bZUMvVy>XG9PI|)9 zC6j6I<2GCV)dMHBCicLI#Ezg-v_94yGzIqeLtQo@3q6b_BI9eXT@a~Go1yg*;Dd^V z*S~yr0g^iH9z5!U-BXA3@(o`|-I~r@#PjA|mz7|+zM^GsQmb?11|)?>H!fvNgD`^+ zXwPmZZ*F`XzD?m;qZ167utvrs|E;j;_N_C}L**Y#k5^Z%XqrbopYR2msMqX@g za1LdyVaJsQ&y~#e!!y|Ps^_oqyWiTb8Ym7nskRes&7J?o#Y#7#;Ron+yF^y>;hR9} zEf>PmxHvPt1d^`!`KkDrQGb|Gh+cw)uBE3J>m_R9ie){MbH1~*$uRAbG|IC9z^jBz zxOK1^Fi}C1VJ}8?FF76R1Ar2bvuH4HQM!B+27;nb9iSB`WkpZ(laRzFq(4Ixvrj`OswY2ab8wo=iZE? zsq@$Gd)4YlkCzp&2(%!xQ)(p+?O3#&4tC8ty2GnU4eK={R+f zQniRZ$L2KnuXVFkq@y$QH26p54ml(v7EJ41 zabLM(aQl$_*qv+qh*o-2=45#bL90~F$&iFXtx^DZ0bBV{Xdk}CCGi)bxfEuJ>^%fw>1Un6<<m7ZXG!KyJHrp5t<->SvP#b%z_Et z#6~JB!NrY3-RT{uhxghKIJkFnq7)8(=}SWJrj*Q%D|kdj(lb}O4hXl+q<1=xNjdCb zLd>rP7W4Jq=o<-?Ev~5q7!W?J!5tTwWLJflRQN56Ti`QY>*On=;yWONAbpcjNbS|M|)cW?eV2SdCIwMGd;<}q5^|E zm<{z;6=ypSICOS!e6luV(|?0y+zEZ?YFFD?-8@d2My}@3>2*rdkHH*r7?fzD6E~RC z@-Io60K+5rpm!oM2&27!krjTBv_ETibG4Ky&mDPE)FpaQ& z)K5pfi4!$x;g&C|DQ1}j^btH|Ad_&Rnc!2W__G7mlK&{D12t@A^{lpP6X)~p4pccA zr-xn1umisYfYfOPXRbV2CY#rRIy(1?P-|zq^v>Di?O&S0x83>r3cKlHk?E1} z%rc{|S@gnN4!ypmNrmc2idzOaYs-ExOKKAS?E;iXqy+QEDFY=gNrzqNRo4joKc48#MGgT9(5ubK^vnC$}L;H1O(hk?hp@ILcp2B zTAQfeCNM#xuX%1UqilsB%^eqjv#rlT{87Fj@yrQZ9pOX!5hiv)L0RLDIbI$3ZxFfX zP^93#x~?5{A4?OGBKI5fr|Sx(8#MvmMf~*Mbdtg*yFa+fgdS71!H8bv>TYY)Q;;wb zTrN6|@Hyrm#^a7VLQT_NSVXD5o?hOdnw8t7;%*nIr2)-_2*)I*gq*-c2jgHl`SQlx{tq9`vOqbg7F4-f7oYNU z7AFQ*J+44 zDspt;Oh>+OJc@oRAii+l`q-8#8+RO5*jUisqcO4#ItlNqMZzBsfi9SkXY1m& z-u0Oyc->FG>-O>gmqy@Dh2{q>R!@&=Z&$*N`?aZ~5UFc5TI;N<_jgj(|GfdaG3-h# zU@e6$u4g;(smw?cjs%cAOMsg&PbBPYC)il3gcPeO$~9OBv5o6M@E|Bq zl(PY;C1sQR&|WJO7Nrv`HN#kFD0M;2dEYw2mm`9GCK$UaLrJbUhn+uQ9&jdz1aP<#^Zy%+bAsfJe3WW@-0Ytu6OmV5XXX^+^hP~ z+ei*-f=DfRm_{vTP6~eMzTuHrJxCkHeh8i%RLyO%{P;G!*|%q}I|)Y8D#-Vy+ipeI z*hixsGmqd&Ed_xsI2X<0B@-ho9mkrQ z983d8hrNnI$BtYw~(J+xEfL0~wA(J-V zTkQ3`HLc%-z{%#Vyp>K*1)@|FMym5onrM}739P$^4DjMik`X?OJX~~y2ZhUmg_A{y zb;NI;YIK?1W*aep5Hx7M0X0Jkly*wpC!Z#g48dPdx>&p!;>Ud14Q*4wDs~R8|3Dz5 zj!gN=kq8t4(ym$NsC~{h`>D!LB1Ba}O(}e~aErE+50_Y6hCV3ZE>K3G#bm{&Yir8p z&-H1`GZ>^%`GXFApaKuYSj00JE_VfWF_0+1U|(Wlo3(2TU+EH!?`FYa!!o4?oH`Wm zF3Ff?e1Z1^+iM*OKX0k4EL2MY=n$Q$iq2)<^H=w*6x6jhRX|BJtx?bf;w-JVdl zr-?+{ZPPR=BpY}t7ep6UO+zLSJa@ieAUO-<{<{8n_VaWoV8oh(i06R!Xp>d@pxIa78_ocb7_@F<5zl6Me zZJ$?eYj#p1KLNW6O!|T-v-oLvR5-U(tgWlH=3!JXxH@92?jr7k0t_;@AsH<5o>=xW0Z%1Qe2kVuV0)gau;MW@CsNfK+vkVpE4gS z=CYu0OsQ6*&3rq04%H}LqjgiaNd{CD0{%fT`&SpxEhWfWFl4aTcW)S zgkK=B?>EV{2m@6h96f0>2OIFWF7zVYYE^8@)8fr>aGB07Wp$DLf5=t4>vlen)Iub8 zfGz5o1ggfBOHPVhDzVvcTJ;kvzIso=|Ycqe^L-HNa^+L=V+0?EonUMGd6I z!}ruHBKVtoY8$;tnVU;)7mmwvl|-*TVU%aVn32$;1l9^kZz`Itzs9{TnnHk>SMHUL zEL1qG%*1Hu+wi(~hOE0Cs8TItq}@HdK66R1dC59UM3%Z+<+uppakgA|RGY6C^g+^uth+6^%pvz%}HCVaH zOgq6Dr*$R>F9rVN^1nqmy7(Hq-*!Kq{~$JQzFX%6@AMn^Z~ zJZm3!=*$cn^Rr?cD;I^^DQtAuuToT1uI19+H0hFYN6Vl#c(lIm_(S5-BZ%YC9>4nG z=rbXhquP)-!|46~$5s$^eBG~EjFA2QrK*U{0PlQVy*TFkk|aTgQ;sfcGJ$grvA{4F za{j6zLYuX8%y^&V zLDwR;2bx~C@*?V^#C8RWHDjNSwS-&MP!f?5@@@0$eKh%;mjVeOme0(vZfM9wUfG43 zFf&qV2J&Ss#7^|h{Gmg@r6JEO|FwljUzv>YzGC5?ShXRRe6rY?ax$SCm(8{A$Jw&_}^f!`bBp8`nDt{@8pytQXh{bI_LK z!pPM_+;(kkhF2-IpR%l*ba^-4IG0?eqB!}~iYbi*VgV_qY9KE%k*^Jf^S)-F5HjVs zKqdf#x!_W)F>Ex>lojQkVolJK{b z|4Dam;|*}@1&EJ4R(2mL>m@ccQWw#*^Z9~I@V<6tn&4xmdQnN}V#jm|^I1bspS-q{ zw&%HKowkpQG;jJwjFAa)5Fc52y-p^8C~?EuGUY?<@M);JknLLIQgES_3Y$j0+HO|; zmNf*#$S5=KQ}G7et8&?1sDyrDJAtc$<V{Qk`2fpxA+8Lz#=cW86GzLuiW3P3%dUSF0v-W@uL z9&A*r8sui3DF=rDye8>8V^)TQLIG_uAB@*7f~#QV+3jT;MrQa(*LGp#)P!&eOOR{9 zgC?|4wLLyHQ+KLk&Qa_Z*E`AFZHJ z_oKL!t)gAD7@ig$VKH@ihA{(*@>9B8!vXmkFC0ln*ZS73P%N$^y%_^J-ykCHmZb17f(moWaj+y0Plu#!sXA*xfixzRq;wu%{glw`%?GKiZ+IP zMFUT)yY3*$xZd&yDlmdG0pwHkW10%of7*p z>eHfY>mD0)1ewppl5MQXEQue6wyJa?6YG=H14|Jyhmp-_a7ER`!(D6 z{kl{SNExto4kMOJBqiMn73pcC0>yQ zmT<3`!a?UAaeyMMI+*oIJ1emg-+Rm3JHdTLzuXkQY* zz`&HKSJvI5fMRc|NGzvx${3kJ>?TuSZ=Y-fOs{_5-ST(hK&%$gZuL+n>K7l83Ac9R zcMI#bQDLmF+*Iwwa=ksi8A_`2Y?xl!J5Jd_wTZibW;y*d^acNn&u*!hm>Q5K!kgFxNjEV$YjIeiN21p8f2S&!cy8V8r7gS_U=W8fN8H%%_ud`oNGzm+H>F_a9}q2zy}Y>7 z*9f`UX?@lwQ)-E5-5|_s3G+*!DEfvD*|Zm~%X$(8jr|ywz7@b?)wQD|@CE)ILFJm7 z6aIZyfhycng7GqT(TsB{mqAQ0w_*0LZ=G^FRRQ!u)D!=7eigTkhA!2*WLW4SHo04@ zvFo-)7BGI;a;gKhbXd%CVyrb9*Bx42px$!hAy8ab^b6v`wk;jQ!J?!~*jA&{!rXzk zu>~2uFgv7mXmz80kgC?6a7HAZi%rbXQG2+b=PsG@r-OEGEDv{KmH1#rAC1e$$Ej*etjMp$fhDL>bkkwaReb9o>BXB1_3b+@>v(4 zn0a{ECt~LA1xdkgOmeu3OLw`bPt-1NX_wFY{TSBvQS&F$HZD1?KzDaf;~6hJ?V0_e z*|yN5B@9VB<7o<~XMDXt4`n&uk&)hepycE+&#|ifY!I$Qnq)Q%3C$>^0rQsi7<|Ex za|!{DS=F-%fTm{V0oDsGr$-%)_)4qT{1w{#HNdo|q&MoD2^8lyK%#2CQ3j!lgfGf+ z(K{Vo;1n37Gp6}AcXH(W-=Y>di_AauDZ zu6Cfd>aeWZ@yii0*dWa3cx;YT;gsQ#fG{nUNEN+pdNzC9$g;C<5to0GW|7{N$-U!*(QwRcC0_dAn8oLX4z0VvYiPNye_#F6Y>I2)7)nwo*lr8+dNdO`A-Yi5FaC;E$%~JR^^}uya|JDP zQ_o$VHS2R*jjP<`HeV5sgL|zqjx97K8T6@P%uqS73(el3L|Y9f)%w& zdyIFa-+5QBnYH<}(Jx^=V4#e!iq9nQqFH-qP|u9hDmo|e#hDCPL8q46?@8l#{3ro8&!H<{(ck9n=n(Y%tuI&WaEZmI?9 zlN{7vy=>u;7G0DRcgA#lea`rmmH;?s-E#Ex&cr@i^@A*~C^Y+O$J^Q^$A`(`{h4Ap zLl9_8O0ywc-LkbECC60g!rBb?20KZAvH_-9B<2Lw?1kNI$_}{ zIw8-u0ZwF3&3bck^3!8V5(P%FV8ItbjDtIBXBgpt2WF`}vyN1pNats~oF*(@#063d zWcJdX3&6I$UYtt)y4dz#(7lwX!rr~e%Q+7YafKx1n&keM<%5x*x&0JtBJTlxBDjer z^NFIS+8?9Mez8Bw{SnWm--!uH>TVvw%{^UA0H9Mk^pTxZ`soj`dicu>sFf79Z|lC@ z%HEON%6_TNP!W11z47E9qNj7b-#K@aN`)P~ObMf?)EuYP6EO@t%&`4MjQ@p;+^hPz~l0RJ6ab1Iq~*W6!YH;twDQvnZR2+F^ch9dKg$3)g%c`c}k~U3AWyglv&#ygECYy*M)<}l5kBP z0J^yH7&o+E@bt?bCJ8DRvi!M+{f5+P)Ewb8^N#^MBp=>d_t_bs)F^%XA(67e3`j6r z&EyS9p;x@p;wnOMX*c8aKc@q+?jRVYzJ9{Re&|1fq^;gzu&-@aAg(gSE=L=LwvSlq zN87(#8iQPZH|XzGMz1ly*A%Z(Kgd`R8~oa7fk!YaT}v6TxaFKiS-v8A_Utlkh~`Qy z!7v!w-^{4JJ{Mj@eMajM_f2)5iN92^A#zE#2k-@M(i#)~T_tQ8dJMW;wW~q&`8*|b z*_TED)3kDSb&S?xK>Nm7XTUu=k4)*(7US~MyZ%>u-yPQExxWvh;6PBTf-5QqQT0oM%j`?Y=aewB?9kTWfS-gbUnXr!UU2sIR2M05OU2L*IeB}S!Mxq7 zVIio+x|X8|^`LmyR@HXX_>fh^Vu8`ErI!m@uF{(oM*6(8-sLvhNogz!DGG~-eJ8xn z?U~6pH-PnJ@b1K$W~S547@Ni!9b)<@)PFW$uOk8fpu*SSO^S!S=B=oaS;1VWsM zq+*{^RJoNmiLl>^h6a5?GViKD@TPw$lPSEQCMQdY*2FxL`HG-YSUeJBpfwy; zh?Aa+y>@{iJX-^-B+aCBd_cT5haLr9*t1H{+-D4ky>MFXR*OT|HC%c9E6rUni}J@q zcEk7XCw_H6o#gzOWqy^pH)zL67Jb#>$6wKUcRa;QQO1X6Zw>6T60qXqyd&a#ru(lQ zn0vHto0!XWX;NU%QgL85?tt*?9T`nE%iP7Iw(C}H=3Ym$7ACnczv;t0v1qL+aYY8v zH~X+r8}w2(fFVweOisUq3p0`Un$ctAV!AG|b}XBFA|C?%1(7kn%OvK6!e}0=Zc1{qxQ0z&2Awd~rnNRb@F{eFe(uzadL1%e_eP|e z3vesMB*nW=o5T)f4T)?hvx^6Hk8J?cX0*}5&BtQRf15U|7V%sH ziKB9Kq<=y84z~GtfhMuVOP1FZB0WwB-L(*%4quxwGz1&kZ>#>y;8s}ypX(F6a!v81 zSv;{U5Z20o5fgk9!%pi$KV=@3UBGlTljkszhBk!Q%LURmh<-n(@2vBn3~misw3!02 z6?mF+%sWXqerKCsIRf#FJERnTlICt*jmVbM(j|n9X}|p zRx5M;2&zxfgA73|k->Bt+MdG7`^nk{rxg%nXb%Z)&_TfUC!xzDbhoa z1gJ&gU zMywxmlzSo%lFHHDY>p8$@m-+lkGJ95A>6PS9IbejFU+=?gc@ zlAHKOBeT~HmD^E=cw$8+LnEa7hmn{$s(rU~eeNcon7Qu#pj&^yX_v0=HTOgs>s)=b zLD*PtqrT2UHCJQ1_qqnRksVt+)pNIPIDqSYhboe9eNY}p?l;zeSN0=1FdkCjUV(X= z)Mw5P%J2)9j-{!~8ExS%;fjSFX_@h$9a5PmV)idkv#O1fZ}ux!h$hP{$8#zy1r$h(Tbukl(JkA7p_ zHlK!>@m+=_x53NsYSb1>7sFt=9%=Abk>fX(#*PU&FA$5HtV&=;l=p9YZd26qHsUE+ z9O&^F7NfqGg)PBE7~xwX4@g5tKV_6#=bLCTzE^5ir0|W9y^Vg7b&*~M39ASmC7ndC z+~NTES`3@?wAKlgVR%YW?+hrp-GY>~ul<*vy`fu=$(f6-AgL5esvj-Pb7hg(#PjhJ zXKPIV1+y%*pJ(#lV-_p})8#!Ka*y25d&b5N*>#8#Nz7csy2Qo`R$pUUEJ1TlqtF@8 zV#KP{>C7Xjf@f8g0z`afo&j4pmjPP~4smP^TZTx7b45?NJBMgYR1x%Qk2EzCac#6} zTyin$byjSW_7vwAS)?KHa$ckS7rE`9(dq`8cNE#eCp}GN7WyD5Ts5n?RKHLyG=z6o zejxmh7;b1u$*B$DhGO36Tx;V@&uZY#XGzHZmTgO}bW89*EM`5Au|C_wRv699{$}qD ze1`nAVV{S-p^oaIU2!RgID3(avMZ%fQGcZwD$}~XZsz_wy5TuPMO!R$7BxkLWKp_L zRBr^6Id3L@g06Pyp5x|s*oG%+P|=XrE6zzVjzxi*L_>l2bT^hvTOfsD13DD17zxj~ zOIio!Fz>v04^xaed!9{-%wBNqeqlt#LE0Djey5XKI(lR1yz-`5*d{l>VS z(>k|nhhnw&F$^x z#_7}gkbUQJFT5}xV0(F(;!tb%$gpx7#cRuxI?1tUhrTYPs!8V&e- zNo5x|aYC$imjzn)PJOMeW8pt*>$8P>p9eCHPtLS@%dohmYlv>})->hiSx>)V`yg#r zTSM}ucB5%O%`@IjzHh&2ZIubL{UPibBRc%lPKYO93IYcFlCQeEM=g(_NxgAK8 z%HbW+&*$Y8pT!={_mUS25coZWfQcK@1M0aC&B;l zw))H+dfhE9$d_TJw?)f1k^#h6K2?>EWTYt(gY<92R+ zg%))cH({cstP~6JD!@^V{+CbBs$WR@?q%#-;GSu3=u~ave-?hXorX z-s9_R?bF@cWPgBsORxj-Zs=-Lyb;}~`*s4hQsa%m#XF3g48Ez5b+N3ZQ!%UvnO;}S zP7OHC0F8Aw`yHm3w&^s5qL}hyc^!96?*_%y3~p%EXQ69Uq{-}!_tTXmOeH$~3hs0X zw#a3+Y0@8Qu>T&ug5HhBo^9?IU5u6ohA$n}+!-pTZBL6nTBEm>9Rq1kcUkt}C9MhR zsEwGTg-%m3U0Dl;yw|{-kS{u+gA?6WwL^)I66W7+y=#>%?e0d}7_E0GI0$h0S!WZk z^c|dS8-vq6l2{n6rB83*Gf*Bz^yMWmNRN?|)4S2B5!cRxb#kEEOfRW3nv+2a>LA)6 zv!Wkq2@pa_f!|(DG6TPY#4<)x2IMf~j)W1urFSeXi9%5}mE>patKJi@IA40B#aXBi z^9L*>IW#bwEFGw-3$4>PVtU=q(pN*A0bed}_IBVz7G9&TF~o~H+7B1WWQrgJO zH*){EhJS+*5pUDMAB<(jktmy)$#%$^(Oeh9{TM&%ksdudRnX1gE$+6)sQS2oQ+~ya z`#gJfmVX4_ec7|8Yx}Y4l{yNmvHyTseIC15jOd+_m%Hs14mm;-Z(NiiB<^Ls9iQBw z_|~9NG#6H$m7~)tjq4ZnH7G&LXE-%%)+I-z7SzFMP(Zh)Zh-E#O_)VyzKvp=zRb&ETP8-n{cFCk_j)LHTEEBK`6un;iT! zoO7mN2vishhu2hK()>^MV!Dv2lM5$|LSZiaY?^_47c@^3X`=R06nEUb(!!`{4SH)2 zdS0Fm>Bz{#Nxi1jgI6XaWrZ;T8|>NceZ-&K$`RD{)U`P+)D8^srGZiVCuXSP5HzCY=tp215f{tLBo7aItb0vg+o86=l2B^REH&VzX}u2PLy z7)MV>iA?ovw5K2Q{D(tQ+hXG4&fQuYo0MH4RZGswOaBW^@MY4vl$N%fx}+AmPo2-| zl~b?oz1VhSwG9UEDcA(6D(Sq1;pS|EXJj-daJ?SAvZ960Lue%iyo7jUQ32O^-qvRJ#Gif3_hKhX)noOYA0^D7qdT#n)l5-3qOw5?5LrQINDfyYg^q>dGL!Bl;y_(lFGHx;Y9zX- zyv`mC-#6WL+lH^yM7*+PT|cPq;YS@@YjdLmO+(G$^?QVS{`fBt#oID==-)%sjJhLI zhhq#brr7-<^oUs}F?NX!an zd$y4sVc#RhQ^r@LbbF#u{~i5D@sPs@jAD|WNm2FNuF#$HF!v5PwP3_H=EGDU)Z>IW zWb=^n_q#V{yovEp@R=|1C_J*YR3{(@187=t_?!7VDkp582Ok7-64@pw&!Vj!Nz0amYm}JxZv_Hj?J}+~ivpLFDSp1r(-{xxyJ1MMITnx)S_NJugd<0+XYmsF z$ix*yrFM8G^DaKWg;`uRb_sEC=-~7B0Oc)y86k6x)VdgOrN*JpeSf&0U?I*n#~O!< ze&~kHZA)h;M&%FU+1!XkmA*~C8(7K)-B^LU&KozcyUArsU7OC0o~2Y4BX1Vw$&8jWFP-PGIhot-&dloKy;=wTW`Gt^)Salck8lU8{!vmspLcu_$G zQtV&}J$#hS7f2_Ofn+2Q#*o6NRW%OjsC~{B$Zd4q4F6*rzdRjeTr%AcV!L=i!FxPjs7v+g|&ZWSc^yr zHU*4B9@0{?FCbM$n4J?_0V;bRw%F)sp`RVnLKjZjk1Nl0TAdP|EwkNbv20K!O{=l6 z4p>6TQ>9@2C762g-@sI!aP7*$ee=*L0@%buey$kem5&McW%2H`IY8bFd}Zs8WlzOo`a8%Un^7TGaO=K(3<((Jz5js_ zxPF#MrSI&Yl)&XHo$guKyg1_{LgY!0`s=G@T~BUN`^hY;zwp$GTP7(j%XHV#!lpnm zmvNg{ZD9E26zt&%YZgdDB&?C@j2eu$hP4qTFUKb%{9;Z?=kzSdBgF(<){_9VI#!&y zJP==0_iLn=cZR}}^cW{EGs0(5TE(d2()av|)r(C0E?4d%wbILNh?BQv!hNh(67T#S zx4OmC*zr%el{fwax4Ln$_%qxJG>3RdwfD{i0%k)%F)G5<>I(hV(nP}ubiYG-s1K@_ zUL4SAN5Jb+GWJ5Rxr|;L7*HvGVQoPMfKClH$4B^&J4->ns(xDBY zwXl@_yO$*sFrt)~SYf2>o5;n&<#4$2Ku=vkMBBhz9wy#|@gn?QVyhL0gcGuBWR5Me z{{BFBQOf`qikYpHm`z`*-H)HRl4C|-M@iC;%lGVEqHk1MLUb+ImcQ&_F)H_X>7J0- z8==)3f4fomi%<2LG)}_JTg+4sY@P2X(($SOaEE_ue#P%j{HKR848E09Wq? z9i=Z01m&(Dgu(D0Vt3S7i003tJuH12LJErnJ$@HknMjk!Y)*q4y16;{iyda7p3tFq zgK`1dkWRI8(vaf&ptria&DVe(9^O~}y@5q>E3X#r0oouiLY@?BhQ-75@%Z8#2E)Om z;z~fj8Q@Og9`R|+d$EN0P;ONtzNDi$F3G^a=mlcyo&+=9cbMPB zLY16LTOl-0Cs;LhP%_OBB!ueq7NFo_**$ZXdAcoXpmjKZWFRd7*WuNH0vkD^_4Cm1 zkiqpGdQpQicsNDr!>;D3y}drT9xc39k)Pvu zKJ-3{Bq_w7xG$l1@Or%CSc5j>*go`4sv*WRj2Nv@d-8!}r2vi<(d8h{m$x-exi5ZC zvz~F}hR{Fqu;K|kTe{Otgmhy?^!Kt|w(&O+RFC%_R`KcAk|AE3tng9xx*y14au?ua z4aG3I^x8i`STzwCkp_2}iYdLScGm5IQRNLQb_r%!OzeeXqz$dyIwD_8KlPqz=`v18 zH^W{IKh70ET2!j4&<4h0dagHbS`$KCPeH$_v_eI2Vhdms79f!HkGR&>b)Rr8tKN7Y zjUsn2FwW|KcSXTuQ`jUyb^{bO-?dn}iN@JmFimlX9rUm-vL;}i)aYyjqFjYHc7m_> z{9$j-<*I`zl-niWVq!+=2Y273FpSg&k9YwmE2&u;YseAfgFne%I9y=ZW(HOo(O!#x z1kKJh6EeCXk!Rxr_3F)!G zj97%NnY1$>TdZ`M<1U_Y)|?%6*^4UC=}Xq+;{zQ z=j)kS7oXWoFkCDJM_?J<`Cu!0KTn3ppm*3g zH;)c8QD6f=oz-iBlq8G+_Jm6jDobvT<#cn?s9PiI`a&V>Q^MhOQqQNOGSh?2LD3~- zCQoia((bJI>W%M$3Dw#e7F9b`-^@Fp2|1aQ8=PnBy99(^QLCPy+Xx$tH~oipmVHle z_X8CF25E><8`6WsncwMlGKz2sHZGBKU?J7-}h@>X&y5$jBZ$ zCwnGzo2~u0JRy;DJX&E?0aQXdPzf3QefG$RE)cmGFNN?v@Z6I$of12kOV(tUtZY4I zHSrETT2Ze7Qf*35_zUlH{u|y^(V@D}_36Lxu2{m!Pi(DR4RocV(V|Ps$(xTjsov~0 z>dwD@t~7&%mDWUSdXt2U8P)Sg;daPcJ*G2H2HS|lr&FrX-b!~UWlrW+zNpXBGT!dw zzu{nFF@ECjN!X$E|05C>i2@cT^Wm~i2Q=+h`dd+pk@eXDM^We6LVunlW^Q)}@=py2ga-<_?HYSPA=1ywBOF;IbObIH?Q) zjvtwr7j)huQnPjj(EM80A-J_ut=3qx&q;@DARTg=@iWxqSO08#MJSG%^=JMb(8z}G zup}03b}-Kfym1{uu;RzfYNI3d@tz##mS8l6g`?X+s>)!r-IZx?Kyz*M zq`mZE+DM`4{(AV_6#ND)X#AaQnA1v1dt32OJujWviVon0ulnGIKTlpc zeXjeK`8oM150-UaM3a(_#yO}XEUH?f`aUEIcLXMvE&t8*Dwrfv8%9A>FxSrJ>D`Y# z!GRNy&vbW|;-$d;T46GDT`}~k0>mRqlmv$eX&PYo>Zm4NS>*GLWCCe}Lhb&55#Ckc3s6^F7 zPa339x}Dldr(>o0$&xD;dio_M{7q&cKlm|=q44RVKKm_;A+fjtQZyZ+(Bi1OkHe5) z2>`4!czGyr@Hj&|;5mooMQvVwbYKf%Q{JAgp}oiB%}ryEc;yGyV%n?MV<^H{rMR=l zHFjsc#>8SE`p$6Ow%0-?tp!W3-gq~!`UAP%2Qkjv{7eud>NL4;&A$dQ-c+?=Fflj` zoBRMraRv+wcAkIqvR=0@F))gwYiLWL{tE|li$|sl{A6CX@8cM$Hmj_k2mQ{&l0L)3 z60L}j$xN^VU;yZbAs<|#zXS;*r~W2L7;G@F@ovI{T zx}kz!r~m&Q&G?gO_~mHE;=hY#{03Al4MRVh9_sCNvO{Ubby|(ZhNkC!ND%5vJrgqX z+1sj7f1e;+iz_bpBtwXGaykKa2d_?LRHVphb%a8lh5sy|ae-Ob)ss*Nawwpot<&T4 z>5SL*^jh3!(-{LIT%8GhvF4Q9@A<-Hm&RKV3E!@BMK!knBN5BBaNxMc7Es}$*XxWl z;rdspUVU|b$bt5(*y7W3TX{NL4w5pd!c(Vblhzc_ed$N8{T9;bi?PDs-rZ6TO}*8{#gn`;p6$fc0hzr6R(^d!A6|50*b~Y6UiMPBnNZ0ZsjQn6)gF~T z!!JZ7*w&@fJ!Gc?R3?y0>T-9P{)#via+k-?S%hTy;Pvu_P4eiRCqE zxATiJuRBFDADQ@G8Jw?hw%y-IC@C2~&yE@?B}YDTwn6L#~eENkMs%cEUL z!^1fg)T5JYi(&Rn&kXM0k-wB?fixZ(8m6qB%Ye7-OQ-)TRHouNAQkUf%*ECK29i$q zZ7PgcAcVwTJ>0YPpD{94ThpBiQ#UptaTYmMz#xoiU@SUiR&)HdAFXO(a?z@j zPfXRz-E*tuyf_Ncx5lT?$I6`MNQhksHuNM8+*$brJ<)NDf5fdu>Gdte{w65u@F>3T zgX4eid-W=BSbvSeBT@}MM&V)qSrlH_rb|8i9eZMg>9}-aiYu%X!+^s;z}C~;j+otHeIPWKVP|+ z*0BFAMP~JpesO8RcU~!OIVkSb>7YEc-gB^l9kAFCfqA>VQcnCUj5Sq#$VTb_g)tQa zn<)LL3TT+GT_c$ftEoJMv&Clo(3i78I9GMo%nO919}sNskH*($3D`~0K_*W)URmnt zXOb3BcD2Vttxs)yeqQP)yi4(@L43cdH25QM?Tiiu*-nM_dK>k2Fi)a0b%gQ=<*5(G z4@|Gp$Fk)_62CICQPI*Jl9BMi_EJ(V5H4|gKPIE=vk(y9m*@I_I%GASXHowUS+Z`% z>Nk=IXdE;B+;;#~q4SdP=jqsSz{;%6to~o6aH;t(TL*DBn6<^#{5TjYgtk0cc(%DVbc`CM@TGpO;xY>{k5!yF0@h8f41hcv zg2}oL>+>+FhlgG~MwKE0y+Gd3ShT$ ziezxfWRL*u5F3pNQGTSy@;fA9Gvn%TSyau{jQFEN{$Nou=MRPzDgC1BWpn@kLO^T) z0%8u4y+~yIhwJr^T1P+MNBY0-e5tMVfA7x!-W@Qxe;R2k7YT-@Dh?@>t>u#raNy*C zk^cPCPIa`jMJ18-HmoY zw+GF_v1Z7o*k61x@ICZPHT5gOP^O9shbC(Dg!_%gCN2N)Z=b{(9(vRo76c@i|MH_w z{WvxcetUsEQCYRnLM!-k!7+F#x19gfOI$NGGQ~$fA(s=;70@ZhHb0^Y8fYu;UO9v9 zD@k(`6hR`);F(yk`F3I+SV!WLC`ptkc%CzNk%^c>4hGgvWk&nt%PuhVGLJj_OovgM zjb4iR{@BDsgrHBVJ@FK{_0Dr=wU12E8z>x%8|FeFW)B7uQ{FHq=(Vjv4C;dAB_f8t zEq+Z}Y!veRQbp#_HnT!V#$<{(*YD=5(cpoKuW*cVk7S1t9X<%IeS{UVO8SBUUq`k1#eQ9umRM=*9E>QmXFKEXUT1~cltnv3}U%NR;n~x93>bR(pQvSZh{`}B3I73{0oP(362{IAE5ILF^BQ#gk z)UGEn^7qi=9ceE(3h}IZC-9eAdEuOe`n@4KCCYf|*$&-bhruoqh2yy=&*&({SBuZR z2J&gZ*<9!t{rehE)D4xe8I#Q0JF&qL|hXk$Rj{)|=XN?4E!feqbU5Jo4XF zDq0AyVlA4uSl7)rY3P7##bO5iwH;Bb(+JAWXGDRr$!>ijszWH39;Jha++QdfXG0b= zCh4@y>ME<46>CbfhpBdg<34WF_*EaD!8|WRH$%S`lXOaDUwhTGdJ-5;jN63V7HOT3 z_AV~9On@7(9;sVFjPOAfC_sxn7U8&4BUu}0*%QYcoT{Z$)sxw;E{h20nyZ|5t>!8d n!(ccBl+F7&66K^3NMrB>?v%+nO9VKkRd#;6XM4#v{%8Lm392;# literal 0 HcmV?d00001 diff --git a/audits/internal11/fuzzing/fuzzing-overflow.PNG b/audits/internal11/fuzzing/fuzzing-overflow.PNG new file mode 100755 index 0000000000000000000000000000000000000000..79df2503c11040afbcfb1f0b28046d214260c313 GIT binary patch literal 35686 zcmeFZdstF=+cs?3vL;DM$lRbJU@4L!pdcWdwbq9-_w&5Z`+e_s9N)j+aom3>$HKMn zx4EwCyw3Bwe%v?|=(qTrmETxcSSo>DMbJ&LvF7(M8 z@u005jC_Co#nq2L6PIQM#5z9N?tR|Xui~peww#M<`1MW~dAc@or@v#t(E$3#lUWwP zobN}Tbd9Y5%E%@Bv3U!wtooYe{v{9=bdfMFVkWZLB*y@jGe_S8)GuQk4jq9;lf$Af zD_ww0{Wd)m%P`T!uvW!Ko3BB78ZOq@)S(2N#}B{+e_1pumt%f;!Ur5#PXH1pxdhkz z3^FN6fYa|M?+!&sIPd${u45&={tFZ?p$1(KdMsH2cA8cosINpv=A4wY;b^A?x#6ig&^<*1=Kh zFphZo8lLB;%}YkJ_#S+cy+1jnSs$pW2Pto~LYd`)>E0<4_BJQAuubVBAOS@u{MjDW z*gr<}JMO~S!~oTzNsCcd$R$73d%vG>goC4~q0&60B{EyDT$NOzc5+w_Oq)RUcU`$bC)g(NyM5%##PJ+Q z9*03&sFY{MQoL|vo+K(ynwCjnX5sZ(xs1a%v26O??NSnw4pDjCkc%F(y#fzJUZ;rz$X%-O zj)wz;tdw_{RVlb*esu5fCBDB8 z?9fJ)PV9tRnz{4?nM?(r)&s3cTFOfx%aqMdK2mQ}xP@Y|t84YCve)PatIMX1n znCcg{RLc5`VbVvMJoYT!Asrpq0bH0El~p+KE-p) zU8`=O7}`?Flj@OsXqT&kN9Zow{SC@z_*A@2QIk3etHFGA(kOLun?B4BlAxdPWzVlt z>*1kqa9LtsxUMxm(k=4(aGy&n-ulO|sOBB0T)t-cqNfedGMn$AN8=l1wMExU^^$*` zGd>!&70|I@HSu(4Z-;k;eFG|CKiN2ppd$(ow%}=W_%&C*p54(c7RnkxsnN;Xo8_Jx zulJ?9!y!i^^!S9ziG2vwIZ0Bc%(SdE>(dO6s{35|x?C@4Q9@jjBhgM2QS-tfgoV03jZ)#!PD7&}# zXn1~=fg{^aMkjo@h)&P)s}>)(_iL|N!e)Ihk4l_29o5v0GwT3FS2OzHa5QtbyAp_j zTt*1O4c>#-n?mV40Q6*m0|SVd`$;4Jo{9tie*8SqkE} z8QLltv7w>!H-#niF;{#YePOG!@Autzb6>hP(8kA@%es|xXy4%v%ySV=SH;&1#qOd@ zuhqfNGY@4JZ#TTC?FSNbQq<_!!O`epP5%b**9zJwyTtS5F#uPRE4i=c{Hx=qDw>@S zQz)Y!W8bccix7E1a{0^EvNe9ZpkwGtMVL_OnDYni(mVwd2{4NPkpN2oY2jWh>*O9S=O_7n)?=OB@DxPJdFDa!DtIb zeMiRd7Yp3;r3B+(wQJ%tqIoWEPWoK~e&DqwwaSNW>clw7W1pgdC1gr;$qTK=1(tu+ zbAwHFQUVm4BWQ|i@(q)Ksq~eyDqLwQxQu_c5;7PXPeV7iOY3ZNU1B3yRbIJwqC@O} zT4GD5I=F{lVeEw(`Yzewz0;)dE@oJ>7-eO=P!Ecry;KzD1H-x*w z6Yq=>2sjP2Y5w{0e&KzwqLHrZ@W*uDGpTA;dCCf<7LKOK6M|22?A(XtX!13sT_C%k z#LI_G=eAVC#aeIqM)Bzr2U?Btu%?Cs*mZ@Nf4s@4l+e#NjoEpiUR>G~MM=XCW<*^HhPLT27@Jm~%B+JWd8+=rz@Vxw=~SLGO!NFLUE!-OjKs#F3eT;%~{jsA0b=-UG`FXR@r zCw#5A*K&I6yk|HQHf4X(!Cb*XNjWG<^=iaI6WayL?8Kciy2rI@e3w_1VOgL(&*95@~wEc`VZR*jaB;gwP8up#1) zmnuU?O3YI9Qo#-?%Tl8pr&9#JMcQU(3>;|C%a)`!b*Tm4*;JX{Ts$axm8nh`W!dcs z2+Ur1<1hR+jqW3VT73&?Nhz55D^bAYj;!#V+qP{oboPevC2M(d4W^%%kK|VJ z03p_}k{3R6zEPQo0278vr2t_1WdgsJXH!qW+@qxDLm?{EkDQrqGv*!*yap?W04I3$ zg(~-U*&V9d0LLD3wyORK2l=nzNf+7V=6_LtohQ9KqL;U|O~Upg0KIpG8j`w9&Gr z1Cw?Bs;t*D+r>IC@|_@+XA1GnX-o;8!18v?WXp6Njy$T5U$Y8=StGzQs+y&)NiI1O zn9E^s=?T2+)2(^Z63V7_?BS(Q3FrZ?b^#0y=yZI=S`IMJn5e>NVoNz7rd;i*ksu@x$dma)&lw)NCyd(^ih+~KPD2$Ya_KbNzRW1vYX3#-MJ>fo~se80$4FNW%YQMqnd z(4gow)%HNUrP59{ni*z7-Q?@VxX=dfvsAvmP_F+Mw*zBUQr&CdV6$p zLmcxr!%Y@rsB7K_DysmgTk^gpCm8?6O(@%&xPp)F)=wWjkX5Q)1_WLs-AIn?H3X_f z*b+zHq=zItE!-1T!0A;BwzEf0Mb#brh>y$kWGzy2moM_wEa=|criM(*Wpsp;cRKXm zY9rvM&IFlTxSyi+1f%sddOY9rL>Mh*g3^H3m>l@PV>~enekUJ8z3t(@Sm~a48Cgxe z3tu$ygJ@_!7T9Y_QEF^?LAOEeUUk$U1VVS|7&g64VOm~?x~YTzrFU_9!`XukKQ4-J z*sSytH~JusJ4op~^Qf3>5ql~bcI(;UQBv%N`7oCp^c**r4YEG9sX4#4Lg8Q z&C^qu2w>TwgKa6>Q9rK~kht%aJrM7`*cNpEa^=(8DGX0}7(8rzWKb5!5Jr03vT#|W zp87)ssz1^`N4`-P$;y$3$OTJksg<(c8G0Pt>*d!za8f-C;lu*-wBL-fsu+LbLUHb% zoVH0-wc6}251X4uJcFz~Z^`n$xV+g*ad~$7^?A|38*7P2(9q@{cdI{SD%EPo=A_rZ zk0X#zG^#bXXkmmAX{4VLsT8Ji*O<2tvlS;g>DKY9%peM)ZJbi|AU34hquzw%LwwRK4&h6@o_&6&h;{bD}G z1GV>xw&Zt!#Mg^_uYg$XD0{U4aYA}{O1&AIOTw1C45LYRd%LsjFA-EGgDSd@MqLd| zoGsdNGCw%g_2*@y;gLYox$dCt0(tH@dY`;QhVE~xdQ4As&rnvUti@epH#ns~my(*E z2U^QiIcuIRJzqDh{+38>@nCn&53 zAb#pQg5S^Yws|QVWqrIYi=pP8H+oaWiG<&apRq2cbVF6CW)#Lp2-Hy@puk$<>nCdQ zDIBRj)!ozSwK;HOI&C9xb%!lC7@~Ll@&vDYuqK6h-48-+)jomFgmA z>6>ppfK2#XwZfxlXyM5eaLR)iSn+aokRbQp=JYaOwjp$3o*>CNw8PaKyZ&jKWM~a< zx2-xByXXQ~<6~4u#SJpSX4-iIVzk3G{l4PRdv=4E`3x=uw`DnHA)!P9aolELSubj( z;nSZ+_Va{g;p>TNfs|D>4$!d*wAOtunognr7ox& z#_LB-MH6(CpdaQH!MVuIj8r~u-oSEdtcRM^ z`LZpn)RZvolcLop)j=rI^U=rWRK=IDF4u6IQD4;saPy}#HU!C)R~}x3g!d7|Pz;*O z%2a1=U2DP#!nIAzmni~M^B0zCCPj?Zl<^yEUhBa=eSe%dCbdSl=}uVLL44z7lv8ETwD8MOmU+mGxBV(> zwJ1W`Dbi+rWA=?vUq6MHB~fFB(I4Jzg44fFw3$LEj|5)B19!7W^p?LfWs8vHkrgw~ z{{))6&G+v92X214#ed;xfT}oEJO`;4F36tWGF*~;1RfTAZmW5fIq559MTr}jZBM2o zGZA9FcMIhVVfyez(ek#Gv{V(+cjxI32Kx^rt)6UfKzA6+a=sOCc@q^C~ z&o%^U$I)>VL`G-v0|p_sxpR{aQAc%Fwssuq%{sLw-6ZpMW}iL*q?>fpyxVGo2BB;* zE^-jxa=(v6H6x#RuH#YUs|1>b$`nW@ric?%;a|q_Wo_!sHiH-OcMOH{Pjk%rL`gN$ zF%4beq2f<32%L0aV{oKHrW{VqXrX6!~2#R zN{3l=;3BTsVDbas7;o{0%hkQ$>5Vy;x2I*`vOHkSF5M6P(~;Au>G$Gf18LyvemxaH zQKZb4OFs6U{1-5jAtA@Rhufob8#8!ocs3rbVS|R?AWu(crI)dMohZ9&O8A|01LiAR zy$h&8D=YmzxqmMMRkg%1?oOt<@7|yxZBQ4yD)d{VPg$CC`*D`KF*X!{8}BV=czdXm z_Gqvz;;o_K&&3o0VtqD^P5q6mRE)k;%=IpaMT0mzq<$PgUdWSH1PZ zEhg8p#xVW#ol$BHdHcC8Qym=a2zm|Mxm%rx!WqQd-Pro12w!HxAIk1lRq)0tJ(jP~ zf*Oy4s#dTj>!{W3PUD+!UJX>bl0Vj~3ZsfGK?acZwm~iue}p(A!y>hnRq;L8jaoU- zJEH_fFU5zV>+o9vFU%kemH8=%E?B!}->wY#NP`%Vfu9b+b_1}zI_CeGAAH*NSAJ00 z#9F7L$*weHby_dGq-*@z`jIMO?s~HLx8@9W*`$0bBvd{D9Hy9-KPY(Ue~1)Hi~ zYWQzc!5nwW#XO%Q@S#GI)cuA8jZeV~YaUkjFn?qpRiHMwkgzM+!RK`t)2A@Z-WNj0YG)vON z{2tfsmZC?zQq@J=aJY5uG)BAqk0+_Z{^MXK8&RN(z7GbUC&Tv**Xa{lJr%`c2)0{3 zP0rdA_2h75PlGd$?dntp7ID@4@$RN)wlqxS!Y9$6#V%nHT{cBxccWe*b04P+&72%w zO)pPJ)hkUcuF}t}FDE^d@yedgKIX>(n)oUDM>*>Scu>t-%#V?s#B2_$Td$y8@30BO z-cZ-55|Rt^KS?5_VYKU3Ub8@sm5hDHD-;t2bB+L?bT@*_tsys#yHjy#z95IjR2S>5EUGq+4#eLb2#nKd%W<$zOuL2iEc(=4RD|kh%p=Lt;EbAm$=DUSJ zGtfVL)mO>D2{cN3;HZO^cV1>fC=jAXGq|O1Vz-6rm4!d!b})M-dXMA$Af`f9A0#Nr zSk-%5es!dQQSELxlLAqDoBc`=FDt9X9ngYYYER5D6|!Du+BFnz;;$4->X!TgpDEGW z)rS<;wR3b+r{JpC<{eIZa>FTA_+OPaRs6-odx(UFl%^(Gv9QJm`Jq8Cf56#5U3-J@ z4?(s2I@ZNx#;%Ps@3B_}`5~1ct|qLu;lrYY{XM^|>=758DD#!kBUnjyG&^WiEutW% z)3bUnn-xgbjf=gZXQqAdG>r$}hCcatY=cvy>NI`@hhw3N)&o(dqmQQQoY831uifM( zsEX~`FCfGWV)>>DM2%oHS4}f`j*D%p3{D=*-kEns@ycKw8P%6~4!S9&uIB3^?K`zq z@y2*Vv{N-Jq5l{ki0BpZMaJDSO>Q$tscYIl*m%Eq$?P_E-j;uA`P=Q02LsV$Y1vOs z`ciuIr0Z9Kwqj17i_(c@wr$M(}4$g*o7VyZ7NjA#ezC?El z{d7|r`m3VRS4c8Dqj&hB1CS$Y{zwW^i?@^6BlXoR?`x;QYGee4cOkN*H6fPJpTg1F z`o{oG0^AsRDNTG2RwGg>QUjR`d2dW$|nopecdQ zK<|uIt+A!?GO@oniKFcpX~4iuV0h4qJ;&8yHCe!NYDbtI1sMPVy#V;-O%F9`)cuvp*uE@50F1OeFrB6 z{FOer2hLU#@?u2u+O|=5n%Et=gQ?ftcm8j0T4fzYY{5COZn^?7rJ9|;%2g>U>|pgX ztC{8Vi2p7o*c2g`xgnly`K_JUu9@()7{3_g62t>{ukXd)GI;M-Bdq2hGiqs8)vMA? zj~lJ#b)+bJY)rD&o}+;5vhOH1k}_K|5uH;FW_(5u-{^cuxr2n?Gq}QF2NwR|oM5>2 zPY;iF>_7^vp<=`i9>aqsK0H+^a(4079}OljO)qy08+Q?0!b*5XbJlP+tAZ8O-JxvS zkry*mnvvP2{&vw(pem^4UCNQ_U`KwH-;|B4B!J8?u>ZuDL8pa15z^fPvHlrcDvo%M z^8bLevZ7lBHaOv`S%EcyM+kjKc%4!JSW_kpnH zxDW=|@8O~`e$latN*Q{ycx+bImb9$~LmIIJ2aV>y@To5pCLTomYNXV88Lj&Eg83zS zuuw-YWEfd4VsO2^$j6+t9&TKnvTCe9n^(z;j87{WJPLhq^Af|5grU^GF;;9AjGLEk2hMBRrB;(wgF?B_K*%;dmyqj$2p zW~#Ajl*!$)ET=8hAZ}6?_l?AwW>QvM!98T8G#=Q#OmL^|2dO2tF1W3mfy0!au^#Nxku$}oqC@l;P=#Y zWH3CIn$)!@lQ5N4zni>U38|8ulOOah2D_6xyHwwqn~TBYmlU?Cq~I zXSe&3L};5p*xi9??0-bga*tZa+4V_1!?@RFJ98pvwP$X-tuYeJJts(apaoYTSoTm8`$^A&HbCM-DE4?r8-MTFy^Up>onXoVQ z>Em?xLfadH`)Gk&D;>7UYd8;4zNf9>GqTQy)bN4k6m?3W%t0m>F^({v`qq1!4IrkP z<(^>s*SOOLg|J_%jZ)a4w;7U~JxF`li8m}p%=6vYGHiQz&GU|Ahy5@R@OP0{d{J4w z?bXi7nScu7DGEc)wVy`a_#ee)dtrX-b>dPiVsqe)`wTLQ2sv&0tMH49HdPD0!~lD| z2jEz`60bU(NpNdfJsJ9UMY+i-W2mpR1UJ+l^n!5yAfBvNa=126Ld7_9-tiZkeb6zJ zeb20p9Y@pwaYm(!boIB$xs-yxqV@?@Q&VMQ;>^R<_~c7E-WGqd`v@c?d=u}hR5y(C zE_hnMR!Q$1$Ypoi4}T6HRdyegfDIzs7|+91#xE^qHz_9mM2V3uo%zFDoc7b0cTUtU zqlB-2^2=(+Jyn#(FSHf;@_&|O;md*QC|TK7#lFB0)USB}J!2E=A{-`(0M$%^M&~bR z5c3E3``QBa?}EZgdd-aR(a6?yJbdlS-NZP!ht11$OgFEq8etBxZ$@w>nwSEdwT%R-mO4^x4cfD86_PkO{(r-_j)Zhyk`tCE{ltyCeaKChUlMT9T=guJ zkS5@L#*bcMZIWZ-T6Y7}aMkZ9c`yD1XE?40XuzDr4>eI2Un}31OUbpvD=r&-8i{o)@H}e;j*~^Bf8zOz%L;8 zWRQT2bRnlj&`Q@C3-gMkQ`oB{qt{(zOl4VoP}`B@9>_gUI_@tj&(e6emH1xpEVzS3fc}fNj|@`1LqC)~s0|O& z-e_(*gxPY;u+jV|AWzC3uYe5Z6;rBu{dvTwRzQ} zRWv$NXeAP-Gq6vU(J$~Mr{>OCm;4duhRu9`m6woRXA_4AkkP-NcAj#PId1~;Dl)!3 z`NGaZ~xij7mj0>)x3e z-%tW;K#9%|e?a+h#M9{LXv_p|eOWTXg4*>e?$xx$G_U{)QVp)b&9@lx!9gmOr2IwJ z3N2fI=x~7<+e@f^__WgN|&Bq;PIbv0okp@03r+; zCFl#pXces)9At_swZfuPlB>!ty0)aVo5_MqIu6Us5=a0j6}y;oUy65Cz}M=}0F@+r*#nwz%6IgEC~YRmM^VRck#v8y$yss znPHf9Gdjox&3tlG$L5oy$<3=(LQxi92iU+|I7|d~zz!UT!;yv2!z%M{fsSRJAS)VU$!c@0ym8SBSF zMVBX3y{0F9pS-JuG6l;QClE6e#26Oj<9NWlYB~hnktg&uTAsM0S#Sd9*LX2V-KVYr zp27?!C}VJCAXej&CxuvAeV7giydou@KntMSfeH$r{h|8+S;sS5`BGw3qZilonF1Hf znC>{|B?HC3jq;;#k<0^WDObFhT!C~XEi0lr^KsU8LR@A8(q*IUoq$9o$?cbnP3^F- z2;U@5g$%_IXi8Np)C{H?>Ey=oHd8I0SHoETgDLL0C_#nkPpwle(dWY2IE}CDY#jiy z0ob)W^|Vo)R;l!&(y4;33KkN`QCVr>8fu1>?0m`1-kL{D*x;*B!cAE)NO1umDUSp| z5GX;E+w1L)X(-3mKI$(jPH=4S^z3NmdnRqpS3Y@`RZBvW2>M;5^a@kkU6`alL#aIbvPqp0 zVHB8A5(5OQOhk$RCOPps^(!zwPCyn+RZ#T9)37N>4# zP4%zD=imeJr0;9R!D(({d*(B+!M?*OjxN}W*k1{mQ90Jg67t-qcfG9gmX>)ln_5{% z#7}Qa}X@pjgMDi$(*z4cQ;8@uKgW1E`*ZNq#N?0`drQ<)se{FfQ&F1 zu}wXrtntyORytT%%-j&2QiZQwb`!RCM8B!IgB-o{#6&&tI3y@G5Iz|6y!w0EG&i5SBc2Gu}PB>wAa$Ol#7Yd@WG?Y_TCQH`z#b}BUeHwYJvXr{? zz}pP0{TGeak<+{uuX}ANG=MP5x;X+Z=XOo9uQcQ?%#)f}!z_-37E*o~c0N!DIgj4=pMJ#PVnhPd)jywzGF8P&B#D~x zxv44B95+yRM;d;DM-{5oEeN;H&%-#Sd3{{vxBoP6>a0*R+tWK6QZ4408%`}OzBRX% zSXk`*&maD?B>ypn|G2?_BEx@T;(yTKKLGik)Zjl!(SP#9|DR;YucXr^jf71%lh>P) zS)n8gUrjQrLuNYkn2csZC)T#(`pqiDMRT>#3~!VZ+%Uj=OC()&;_o;3T_h5wt7No{ zWIklqoP|62+{`&Gc9(kD6}kkMdmkri&fedatt zAHTZu-~tU5R!T6yQ%OJdt(zam<>0$HL!g0bxgnlg|d9{|57a#X4Uef zSy|uD0?EC`jdCZ)v8rT?nQZgMCEi$VKG`AF@&J}ej)pVz0^lPI-OlSp|0s#_5!#E2 z--{ASI)1G};da=YXvYrI@1A2}LYl`@zvs>&H^tXd?|O;f16ElL;3%{g7Vj$qu&JV3 zNNK#vuiBkO%G#?c{>3;ao4D7!45Y8~xQfhofaChpWW{!pU^`7oYg?erX-f(G$RWms zJR0%XfEf7`)}b7E7FjE8g2;erW{!n&kgv6kaNOs0A5rE^)BCM%fOfX2`R7=3Ul~7h zw^#+@ZrclJsozN$t-#W&eOKbr@SImWzM zyyQz*es}RN#2d;dh)Rb%She7j#iYO442G&^939I-bs6Z@6jDz;Q6=a zn7*-5xzT1p#h#@Wq94raHDhX8B?;4~ED%RBk#)WM$t(rQPa%X3W+({GW3rUWiN|Fw zE@DC!9+yynKZ{7tvUufdelD}yF+NW!*hh9*jhjETIs>XPiq_)hFYm^tE@R?xxQlTq zjGN!rufq|Ftkyh0b$IV1Q^;K&rsFxy7_qrhiX-qq8w-p;&7T$-H4UMKX8T{MUCS$T zK?lFyzQ+C7nf%9R$7ApQvP=?DGOT)CzUSFpqzkIIdEdB7_}YB_k(t%e)=#e$mvujd z#CRXGq$7r0r}i7iwD;*~c+M(?_#X}7g)a0UCf**NbXBrYiWjB^!<%;sCRl#(R~B zA|wW5t5KfBlOK(|tb+;n38A&-GW;%MLZP9VB`Xo3Sffd`;W1@4_oE(#1C`*g+hN>8 zPv4XA8;#gXXra-@g8NSC_ZERA0fUIy?Hp)JL70dLzmm;s`^st~1C|@+J%jcodbfC- z-dMh(nKPo_2S0VM{k*!RWDIFv$#O`w;H!E;_MRynm*=%~}aq^SDj5_53-kT}CtlkY4aIr}IQaMCxtJ$_`{ zMMrmBez zdN9^L=I<$}Z(SOl_h2SaKHWTO!VlJF-OEzjf5|!fS<&#~?z*KX+YUyiVO3c{#xU@( zKrTLQydW0lm&?@K6U2}RcWdwo-)L0wOY(GMOXf$TG{*C~h&4U1V^2hJS6L6PPX?!k z0?1+QZb7Sd8M}*$C|G7bGO!m<979>8KQ}QmoacKDJuI+9emJfwt|E^jeNUC|pPyW_ zwNO&Fz)pvuH1t#B&AHKi3-$Dic} z2YdXuY$eL_mG>;HP^ygFNiMecGCK*J<78gjnVsZF6=nw)>*mf368I#><4AQZwO4|7 zx$kk4`Ka+AYWqaBcP+vv9iw%jx~ybzWYVjIt!Cw`*j$?^nr;jB!APRXCS&A?t^^VM zx=B+qa2i)MDAA~Rks2zaEDNm`85Ppa8&4X(AaNS|0v7-$qR}p z_-Hg^K+bD@#T5Io;J3oNin4p7-oY};kqWxpQe$oi8aJx6l#LgQuPUs&l3{&wIh^xF zxMppOTgI~2reIQwW*qYtn z$*0VH`oqqH9C9n5Ye9Qb1Lb3p)T?D-1E>U)5~al4MIx8A^fvnRB$cUrPkS`NhtZe@ zp=-`?P|F!jW}iNlZth)^%{y~vy#2D|cz*>2(|sUd6ynXfMBik^=wh~lTrdLF+!$UK zew-vHi!<#NVj3aq54mlj&;z0yF_F?s@VsGw1%@`kpgQx{9JfpS_A>|4IJvpE>p>$Q z5L0l~6Om<1MP!ghlIM&G<=6IN85IB+KBWX<;r~hx}?}e`Y-6 zfsm1_!-TOq^iv3p_^-o7<5P%Q)=N5(VElVRb`JSrkIa?!vL+}@>P|1OC%ecf!F=@N zq^u{w!}RWT)bVfS)A=PB1glZN5{NpJ?sw$*uD< z#sKvo$x>$bZe(7ybrEg*mC}#5v#E=IW}GS?#D0Lz!zD*!rf#=#mlxMvc{AIlL_I`v z=`kYdJ~I7lXIK!&ES$I)Dunex5c@!;O&piw1^K1`|Cz*@CW9I(BJ+rEG#M-WXT=u< z>KZG=-km*Pd3(+&BBcUtyg7%|nNj%3tyL5{TsYbyWE9oCfV8@gy)B_E=pSF(&E;lY ze{S8KTZj5a^b|xb7W;>Nv?I=X|1CuvW`MsUE zspEe;O3^dR3a|PVq|M}~UOum$;GHTKRTEF}(Q8x6xp#h`Q+mx@L&vy1FM$s4+){9b znJaXQP0s?{)CFkl|_2cZ zXUoDOFBnc4u~c}>rVuACkI;Lq5Mb*8>vtMa26#-Cz(_L{UQ^Y^_xMS?Br^x_!5uLn zv!0}H%s4?XerTVQZfqYS>E7Tn1-=};tM$Ue$%{>k%;;9#HS^ne6;_0c*EdOsy|ngp zJmrgNA9a6)1lhnIR-x)MJXgHuxs)ad7IlnSLMZI`@=8lGeqs2gv^S~ zR410wRP_CoDrLA0$334RS5-q}QIB{3L-mx|1^(zeutKAZ&5%PlA&6l3TJ)LEKow12 zj>ogllpsS;d$)q!`w+jmUHzQ3OmR&quOf^;ZuGvReW?j{vK8CBM^TQ^Duqzoq6s5@ z+K3)(_Gcdf2mR~t$1%n_0sl6%aq%v&1E@Vei&@?O#w<~`)l>IcrX_@knre0Pp|6$akZc$>|w5BY3!&fJ|YRaa>_{0<3 z%HYgKzHDf`P)ii>j67r5S{vTpEwqH7)WPzmpyjy=pqn3-fITog6TC%VwdjyqmH>dh z<4mtZWZi8+;ne}VJ=6ihp=}rL8c|k#!Wz3pLG0~juoi2&IymN}KDA$=Zw~1*rxsJ@ zEc`^;@Qhf&!j*J^<`WK}Hf9Ra@svI*ja=zQy6(gB-vo33uLBFDuNA4|9EIj6;nNhQ zk$EO0ho_xc*T|O|d_N$%!^`^eRVe67CyTbbE|AMWArA_}6wq$15Iw2PvLBt;QrK&f#X~+=w zOJE`^A-ErcX2@mP_zOxq5rKe7c?@f(1;q&XFdSc%^7wg`1H8-VooW0+7o%9ZewOb) z4jWgp(UIaRHHmulkq^lpE|+cm=)wG0J{4*X@~PDvnI3u#S-RO1#{$#OODss77Jo!y z>Mnns64$@H=>X!!{Y5Pu%fEgKcch@LkET4xx9s+MF!1qfa)965*XB`PDNh#fGM0ka zBPCsa)>cuIz27)gYWEmf|LkWTRjLP{_9DJ7y!<5+SI8Ty<&Jav7b_Mhx(G(%xu@Ev zOscLKYfUT`t8=Ht%m?_>lsX!kHY|etHSsy{Zu8mL7@bK}83*9;wR}up92$r_CjP_N zrlE7uk+dd4wFi`0O+8p8Us%=}Q+}8btU{)LnVB=LYrN@Go1D#&44qv>FgzIdgA@a2 z`bV4G*8GnCILQCXV|~#$%h<5!8O^R7Sn;LWvSNJ;$4H%9`2gBdZ)-ej{jS0rb6RC5 zhvz)aPWua~m_CPb)znT@M@sUmr7idY^T|mCuQ_FTi8#}4jJ0oz@9QbxF>FSmPs{18 zKsUr)EPa3@xb)gxx2hVzel|%!3^+AL9%g+uob*h}>hUd25wD}>MnyytS-(&KpDHFOg)-vD#NwFT*pK6^KKwB13+uC{0UG1b+2(1)#lY9Om|p%=pRDxL zPNSBpjE0|#I3w5|Clr- z@6l)evXo52)w3tb@Ye+c!E1T!TsS*iS;Y^jQ_y1BF&EYa36A5BRtM*@y4{7w;2pY1 zv*WKdD|^J?`RpbHS0KR|CSd!wAri>C6=`M9mO=Oxv?DSW?-6jtW{>*DfLr@ z-$K60G*hdgts3?})og1Y`O>~sIA`;BPx#F0O1#4SYY1@y5a9l83Vx1_87_t_+gMZ| z)b<$7tCG&ip+`Lt`Z%bM> z>gM3VTIL}}HFwP#=YE5e9W0O&b(D!>@y3yqVEFlQ(Cg9zypfL`AHHBD5T1=bXXL_H zWU}mytudKdIg-7ICvv`ISk|h~oSd0skeQFyeE9!@Rr3_5vIorks^W)J|K?Yx|BGK$ z{_p&%@BhfJM(A62c2F6h#`w%wq3xc@84sh0d-jcU%?VCK5m;cmt--^Oi ziEQZE{vWTYJa7369$T!lB_ZxFwAGLr@td#c_wGDq70kga=|Cv|yNE>kH=^HDD-5Ne z7*o22~jN{~f8?jqiX}6V#g> zF>|-?mB-ovIJ`N+Gp&D@X=;X1srbDs*&$v#eD~+5D!8dQA2GVm47$Uv!Ucb)zaC?j z)z0h2ARiaotE92jN%=q3udr;HW|`HM%c<6vlIMn49SvLA5J6-Q7JQ5k|o$~=ZJCmZ2ZS_h&cphAdsLYX4-oPbtR zpb(WIl8^)q5FjRjKoTf zgy}4iM)MIvUwSxD>0=`l5D##=Cy{09E|>=gl@{c7~is zp7Dcy6TQ-`q7Q}6oIwd+Eh5|-Qn9%wH6JxOSZeSS96PnS0k?Y+&)`%)G1xG5`U#N^ zZ^@SuEFrn|K3Wad72<&>>}l8N5jX`Tu5{cy$Ti_Wt&q}iTq;0uS~a_xJwj-2 zDOGkm7)&>>77Eq=t0^VmdRXQ3%lAm5z-X9eCZDnH%S$GP_dNB_@6hpNL|<*`Q~Zok z`-ll6yLW^u{fq8f$5NK=P(~^BX1kfJG^}hB#2G>Q)z4*WlTl4Mm@oNNo!@8CjXj3T zi=W?rP=Q^I-&h$OZzY zg?Kw1Vorbcm$4^gT9ysz=C}lxU?aQW?M38&67v~QL&SCsRv`b?DqmN4`h>22p-607 zZ)+!Wni;~Gd9p=MG1RF35f;ZOY_hoJ>*PP9@`31SRqocu!cR7)iT{Lu|8pQrlilutvSTq6oJ*rlGe5c{rtv4lgwWpNkv1#6E` z+Dy=UDii$X67J-6r$v{K`^n;IR0_RPVRB(a=+B^aJN+7z0Ih`+4)zp9DNEPg5y>8k zpm5nuWpMXX-rhVxX&lr3q3t8+2H7kWHpywS8WL_^BO`LM6r7=8<9Yj%(3@s1!3UPv zlB;2UE$_apsa9h)vQj}(UMd4y0z-Jm$K#JzK{5h3kHa31kWVIoq}Rd6cq&g*kEIq= zKV1f}7`gU2AP-ClXs_W$+{n;$y-v zyOdM`Pt8-WNlW2eIF+tI z^h|J#gM(F`%V?ie8u*$8ptzH*{924gjM?i>`oHy51;A5%UiCgtb>G3r=50@#;F<^FdZ@V0q|J+E%sf!xth|W490a-GHw9{N7x08=o%V1TyCc*pa*7 zkoSp{T8tQm|vkiB50tNz@9*KjPi?QNoT zNn=|Xj;(RKtQ%U@YTgYBABJ@dpN^XS%ht`8MQ6K?_ZCYX8d+sXgiEW)(Ah&Ik}IJa-nyCyNHRNoYafiE>`_Kc6g*U zSB|!&oswe;kaSi(^2`9p!tUIzl^#J)E}T9n+}Wq=ju|yKb+Zk|#5L?vIv!Z;jwmjo z%#Cs;n3#kh+sY3ai=vlpXNSPYy;jY+!L6wFps}b|JNREE@;@J3PG_bgL=^S|jmzj# zzWsV+SN(?(tJL-_-U6DWx2X96eqXEy)OSqmZZ~X&K=JJ=Mv^-z9oD+-p}Yi`)~$~3 z1X1|}r|Mab=9ea@grliR4S*eJB12y8(t8%|4r$2(W<5C`P{a|d8KJ1f2IDx(&`_p>6|(8@ zf9xzeUJ2x;0kZ_L&kmb=%Jn?WO*0gnf0`~k-j07MM-4tB_&q$lVH{)Coh>hYRw8kY z@ux^~q0!I>?hTSTwmsMpHqhwLlD z#{Kd123=s(jJ^}kT|122*H`oXw; zx1}!2@K#}*Lc){X_ETW<5x!Wk`lvfZdXQawGmblh{1>Yi7_6jdHjpcfY-4>i=YEh0U3;g;HwPl!#P7!J~0;M06PiL1y( zd$t1a-8Z!AYvb>{&#qt1Z=pBt%UnHo0R3fJ#g3VKH<=2De_!zho;9zXS$5nv$e zrv0z9lV8@XW-@TbUs7(+tW)?S$^uk3Y*Q(U{rGXFlz}cOOc{`#;g$x;_MI8q_c6$8 zAUD2&Nnkz|dZ1}%+baaxTvLH{Z9bf1HV*~89tJ**t9_5gY;`>)mIp*=il zGEiaN8IIWp7O~WXPkA%?m(mT`>uQC!9w2pD-1A^?{lSg z-mQp7?5=Y%)SQD`)JMZCq|F9rU831Xo)6}KYkq~WF`2f%9D5B)Qdn%P43t0|-!}Al z#U>I;#$#KZZWq~|C_XoWvc{2<$L6QP%hb_M@LX!uM$I*8bcm&H8@P&t%82+3ENHK= z##)z~(L6r%Cn3`tB*v-MxZC3r0U@y#WEJznFpYa1XAJsyl%(riAC$Ey`hGlu429RU zCA&2qy>|#w#s~8I3Q^Gf<@09xlebpPJ&7+vek`0SuMR&iuVz}kQC`{RY>SoHFAU<8 zL)OGCYwLNt!-$OWY(=naGK$%Ggfam9)&fCDMkUJvG~25@iF~jEoUus)K40I9!Cn7F zHW)slisXjm=#PvUSUw<+P09u{tKt2i$MWulfi;=#v3#{X7H!PdY>+pzx`vKr$f`K*WYr<>GHeLb&S``IG`p5ekg>{1 z5+gUmtpVJZJ=RrLn>d&UK0Oe(BwmsGxWY=4rk2t%2b9P-oX8gGqKtqycKchuN(+hm z38ds=XdVKdSRJRZ=PY4J2y2JnO#{a zxR#CJ7JT+Ky}?bJ23nuN-(tt{2=t8iYMULrq5r*|SkUr;zK z3UTDx$j^pf?q966Zy@no&5vDWW+OY`2G+Nb$HBh3rJU+^PP35?c##?R<-!W0{Wk06 zkHAiR=P2j(YD^462uKaiT?b?e4obsL0LA-48fvd&x$A|}-M4=1uI}7b88Vd~3S~KX zh!hG^!!A}w8L^P~ZO^2}OCv8R@eoLTy}dZ1YaIBgaF2{xAR+X`Dht>ZP8;wODF5B$ z5y1~<&<|M08F{%VDBV`SSt`bef@W<16<1GDHEaRR3seR77QYG(qqM={5J#!xY$n&^ zzu+#jvV9BD*k<1}P*vMF6&U!#9a6PwZ`j=azOHt}WMrCcJjc{4~%SJv`NH3n?3fqQZh(_(dPxGGe}scRnw84!$9md3zJ zppM*iD~2EEVSjq64NS1mK=qw?f}$keE*%x~e#yfdAvcqSEqv8;PGj=-;i23-Bm-7= zH^NWj4A+b#>Xx_Cw}jVwMrp5UJ9l#DR9&Rq2}j~70R#6q()Om! z698! z@j$ic3fOsLbG!ZNGCW~jOyC^6OZ-(e>enDtUS(}<-9CtGLz8FkA-P63ZF5kVggJ!~ znFMCK7TI`i)(VlGy%nU_+OM9)a7qR8PCFm_KR~A2LAL%O% zSLrHMKf2DA-3|s+22#d|+EQ!rsrRxjN~9`5m%GeX-$5bD(JW344^%k_M7?42F7sqZ za?kS~KG(H_Q1+5uw93^TwaPe^#PE$2E*Ic^*de?&k9ZwfGsKvr|6RE}$taOa=>RzCUX@`?`GIVZ+}I1EB@Idz8=; z;UA{wQ%tHa3KIwkXEc7mj_5gA3JGXnsYqSnIbSkd7u6x zwLS=64VKt%5+T9NF#cV{POnU}<%e3iUZ}Zx~8K`~|kIg53 zds~=uQyrvU(9$H+9jE!G3j!*UOLdeugj%B?9V&KWT|lPn4<>doaRMpkI=s_63>B&$ zIE8H-v{NgxM9%(9pTop#TC-RzA&*sUYmI7Cqd0bE!qjLrs&n52N@ng4i0WR%EBi)U z?whMUt7J|%0T7Rg5FvZ4D6Z9fm4P2eBOxea7-S+M&x&8frSvJR`%aGafVY3_LkE8) zMm|}C%#5lCELDWA8u*?coNA-~7H{iT@wJN9h}WsBV|%s@kFwJpN?;{fz$^#RH) zZP#%^*uX2gHDax;VMk2DpKTna)_$0FwAPUM7YqkMXpIclmee@nKP$xmav0P?_lPB+ zMyBun2&=H>9bJpA&uy&{W5PP;T-z!)`2BkD{uvuqps2jN+tfEgP^Y|b^Y?Z&c1CcN z0#rBVJN@3mq{<%%c>vv$xfzSBVhWj^#uJC7{%?1Fw7SnK$L&pOIHe} zO&o$VzTl3TfN+mV69p^C!&KiM;Wb5YJ7_fEif*g@-Qc+}SJZ@h>;zNW`}HeCfEN4z zU5%NBc2Xn+UhkmE7199Ox{y+Xj!K?#adn(XcRoH_NVr#DqU;jM&qSppNq@q2GjKhr z@k(D`6@sB@um*m-PD!JAm15P!F4&I6MHHaStr>LMLMlX)l;1ALKIxoXy|E>9XO6Dk z669vlKZ+iIdJ#SLSzo#QuQ~u7-qAvbwOZ(~;5F#*@=QU&!h}I&RGIS1J3)@Quf)v& zeuuaftZJv-eJ*Yln#oAo7%CiFm~BZ8AU>=Pz2HhMHYHIxcW-cY7rm}+GY8++wn-z3 zxz$_QLt|Dia71J8U z9cvqC(;%N}eVcO1w=MBL*8Lvi_J+J6)zdeL`e)MtB&ibI<{P%2=Q*6F?MKKx_nZ>J;tmUneY*1V#3a3;j$cvkV38EZQ_S%7U>pCAkgLNEN z(7Muc#>dLp-ud?1)i#CbK2=n^3@-4CE=^#*JBkb>5MK)+@q7O^guF~DdWQ4@bbKP! zB-xv-#}foASMsQqtG;XAIQoUQ1assr%d2F^^2!IsGmvr2Z@3cdmGNaS(T%W63hxfN zcZ!61b>@omyrllcY#mUDse-KhC&vWR+(?~u@7A$c-@5ow$1+D0ZMgP3t%6lTF{hVt zVePX>rmHbTRz9z=?paPQLu@{vm9XnCB`kZn8BKO!qOCRO(I)3u-&>V#BzMghbwA;8 zBg9}*9qgylxijU&lAGVo94(EHStR@eFJ_%F^1KxzvB;@!c`-@?F%JqTD1<`!5LZ^Q z+|Rb?VTlJCrbp9G)h2tu`j`c3dO23h%ExF~`2={v5!~Eh(_vzmDzp;GhDy*lQl%06 ztB$rMaz;2YW#d~n`m!)8eRq_u`#O6jH*mF?Vr4MJ6oHb_kEp4QL@Qh$diuC~UMFWk z1M3`-Rtj87G4}P*bzDg(C5UV!1vU6s4Sy0V*^}MKm zCvs$I_j#)rje+O+e1=Vdn?&;IA}$q&z_~iT|(l zVrt6Q8)d+D{JhiqCCbHiGU~DB$GP5 zmzJjh#Q7Hn-BKggat{fH3+Q|wDm0=vxgnJlIptPd2z+rInQ{jNBCk;Sut&P?9(y0D zwWz!qw(szgq^xzH?S`{>WP|I2n~jabFq_M7%(qQXo&BGn#hc?iKu(rAC`H$;PvLE& zn)(VC+8z}AB87e`!QN&Ig^X?Ld{Kfa3g4;_xIsTZ7UdhtX3MHsR@)r~fZ{0AJ{3#J z;vlyu@7f0jQ-Y}VYUfl^BO8G~IIo~I9%ojz1lA3%AdyHTS?yu!azGny0v_uf1c$b& zbQ<|bGWD_{12Xl_hU}9xo*%6DV6LApX0#^&B}_}$eXlrIbJ!YVt94WmXcVaBO4K?*-+!R?wAM z(UI@1%3SCUwPs7EKx9uTYNt>fewt4I2Z5rEbtwD!aqflty5DgySM+;@=)3er$$Y+| zwSP_5rSngv9qy+vVw}Z!sX&VOuwwsS>yRv_#8wj$G{0dAix0NF;75Yvwklm4LkpC@ zs}9J%`n_$yA1tv($MU_;fH;u(#XvpzOs-BxS~FU5otKbMD0`fzw;y)o8(2~Z<7%+o z5&1Gue8X}@XA_rkp^iprA)aFC(1BRqAy!=&NiaOE)|P=drZWq~%$bNr#VLdUdUF-zNfHRzs)Q1LjwcJXl= zmh#cw3fvV(i09iIwIBNoB#Oh;(9Thh=%4N5!jQI$T0F`seIOMCtlCr(nPwlGr4c(i7q-hUM}B|GBsB%_hMi!-v>*J~Af#Lf8ai50v%G6Sv7B-UCr+2_85v z03=qPfo5cAdtCcFg`z_RX}po#oi~YJ4S#;($1g7@cP=IWJ=3wmaF+zVvP*inKA7ld zG)#GPF`WW5 zUO6YvjCI5q_y8r!1hv^8?%lWO$Fudul%<$!GmmqNdA7-=i ztS=rB##7X-HK{{MwJxIv3!J+U0vN~dx6>sRdNV})-cY7G>}6DFqx4Zz#>ecOW-1?f zGEMztMZM(kgbaaw0G$0B7db-FKEJ5Ei;MJwd_xgxDab&-abVOeC@1an{WEl!WN-8T zhB?HB%qhcCo_)~hyqObmoj40MLOmR@>aQvcI`k@~C778*2Rh3Z7*v7|7 z?!%TT>~LYy7@}tyj|V^p37{!prYq|H7zd3F4hTkBPF+XVd0yi^s$N3KG{5&6%pq9e z;m>*pYzR_97e_{|wOEti@XamcTw#;_C7qIycDH=&R-(ZO#o^GLvhby^k8mlqBV39@ z(l^6G-imknDNhGR%!?ANLbDh19zV6UNe@&c0D!vwVO5RSO5+*hB|I7tfJfOxD?(oC_lZy<1DoWw4JPSVG5{&~BpS;b=)IZG7(`@|Xoc|s-btmg}H?>9l zx|A>vo;^(ev-YlU`U z=)I1s9CkGrO?yqBZokr}&2dAO$-dfT5LdMPFNu!8vFG}PxP^GGPps7vsxW?UX#$qa zFS&0e6owfF^IicRM$ppef_D-fwB>$pM}l0Uge+MY{BXZ@KVkW%om8*XQvz8R>c%BJ{Q1W#S)!2vp-AM z&+ETsow0>~5np9o1?}Vyd}$?!))raln0{4`D}`slFnpcfAdEqN%IVo-1Aks>n^Yn> zsLlQG)4AW%>DmD%IHyRBE#3Pb!6p zsP>zlHvUSEU&y3>mYF$XbLx!7|ARkXGKcEw=y}%wka0BVx*{``D0<(#@sksqo*gb1 z{RV2pM(wQeYi#_8Y+EeG061FJ8o-*o_~5)(sW^{pV@6GVH@y}8{S9_lV^84~p#xeU z``(kADX#^>W!TSli>yBH&DA70syCI}$wWK>iDnk z80H!;@8Il<)qmg=ylabi#O@i{SmHPx`DF=qokVw*hacfJ$OYLV`0zvFkMfFf?G#XW zkDdDSGw?Br8e`a{!RK(&c)7&ZLAB$i!C%s+lD`z>c1-KIa~>e%h45eDhnH#EM%CD0v~}pUHa_>cb!nsNG0+&*k7%Q&&{-0`5whOjTCLbMLy{8 zJig~u{`bEtVE=ddEf|&fAG#0tfAmtb88Z?S-?{DV)fZl@_?j_8lw+e^r+DWcwc`0s zv{&B+B9E!9{m;MPC7_GU%*^1OI7lwY+$K+%Xl)IpcoCa>M=Il|Jca4hN*wAfTSGY==eod8r>;Dz#KDkSF3N;pKFSPM(7?CXl|b8U zn#c37_cXOx*rjm#FD>2D0eeTQ_2hYvMey(Ka+4;isB5xHptqn_O+O<#Dxc(Bg=j{c z;_=#O6*UNf;y^5QKSwbx-$nL z7V(#kh`@#{Nh22KgjJdwn-9A{;Q3rjYmRwsPk@#RGc@N@mj#xC&0(BsX(oy^M0~hS z>@F}{LrTl6YtR0&BGrPesgqw2oF;ANkP9`Tq2`~o(|$-$N%@=(#njS%Y8p?iS*67J zi5^IcLq#^^AdzYtmEsNs!;_D!?;*C=Y}6F1b#n^&bb@c967)d0^9E%Z(PvU`{p+gg zDs2`@laoBcao%#o-b|Qw@0+#k?X$8ZnLcfOwew@5C2&s0faJ*WSmNG^J%*XVJv#0f{D(YquyF{|?F_%vi$bS)tD4AmL=UcEsY;U1~SO|x^ zg3t=|+$UrD{7r^S5#xv%k6?~<#-JpN1-6mfTYz_$)A{6X%jz97Cq~e@!<1I==ypYG zR9TYfV8q@zvciTsrw>!Vrfu=!?Edg%uu+b!Oc?-M6jesgb*Mn*lWdltJoGCx{C3!r zsrPd`jnzEfsNs`kcB>uZvncDsM4D29^U3fXTxoAiykp}vu z(X`01ApWwuY4#7FA=7$vRp_}1>tl@Bse9X7@a(Y$x1CJ!7HQ5Kc~PM z^pJ{;MWF$DGj@R#gLvbUq7^ni)0_M=ZJ*ZK`aD`dA9dB?FZSy20C{@GEF6 z$X`A&Kkt+7PvFAu3zXHsY|9=ws3tr0OUQ+Yo? zGDB2FH0~PLj2_IiBdbK>8iV#|WCA~~0=&`2KAPIXN9+7L+v?UDSm{0QnDc`you^|I zB&-sd&K7EvJY+}Gfw;c*0LQabIM4VaQ5R~(S+~aM^tHM0qf~hJMo%=anx3#k9BHw! zD|5*mWtkve;ahgj*0)gV;&i}sB3wh-ec-Mj#hwqlO+d?+pmd+fATW3a=FWYy)L>S; z7(y8+vD8ek52&7t{4qYEKpARo#i_xil+=SCP`fQBC45grM4FYkT~0#XW!E8MDcc3? zO5}kMW^yg=+lWKh-!N5M8H&f_SreY;dA%g?3y9vC1I6=q*w0A#3cN0QTwr;?Q&H^2 zm;c3+g-1^qvcQ8$*aje*{`>P#OpI8?rRst2jFB0|psT7s1Ao1^QGXWrgFvZQ!JpXt WI&ziwnf5zo?D*dCyP|KslKv0r89tN% literal 0 HcmV?d00001 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/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 From 50df02665dbc7677cc30c1f39dace58e9382c56d Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 26 Apr 2024 10:29:13 +0100 Subject: [PATCH 02/14] refactor: accounting for non-evm chains for vote weighting --- contracts/VoteWeighting.sol | 305 +++++++++++++++++++----------------- hardhat.config.js | 16 +- package.json | 2 +- yarn.lock | 114 ++++++-------- 4 files changed, 229 insertions(+), 208 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index a89f716..08099dd 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -31,8 +31,25 @@ interface IVEOLAS { function getLastUserPoint(address account) external view returns (PointVoting memory pv); } -error NomineeDoesNotExist(address nominee, uint256 chainId); -error NomineeAlreadyExists(address nominee, uint256 chainId); +/// @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 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); struct Point { @@ -46,10 +63,15 @@ struct VotedSlope { uint256 end; } +struct Nominee { + bytes32 account; + uint256 chainId; +} + contract VoteWeighting 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); + event NewNomineeWeight(bytes32 indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); + event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight); + event NewNominee(bytes32 account, uint256 chainId); // 7 * 86400 seconds - all future times are rounded by week uint256 public constant WEEK = 604_800; @@ -58,22 +80,21 @@ contract VoteWeighting is IErrors { // 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; + uint256 public constant MAX_EVM_CHAIN_ID = type(uint64).max / 2 - 36; // veOLAS contract address address public immutable ve; - // TODO: Convert both to cyclic map? - // Set of (chainId | nominee) - uint256[] public setNominees; - // Mapping of (chainId | nominee) => nominee Id - mapping(uint256 => uint256) public mapNomineeIds; + // Set of Nominee structs + Nominee[] public setNominees; + // Mapping of hash(Nominee struct) => nominee Id + mapping(bytes32 => uint256) public mapNomineeIds; - // user -> (chainId | nominee) -> VotedSlope - mapping(address => mapping(uint256 => VotedSlope)) public voteUserSlopes; + // 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 (chainId | nominee) - mapping(address => mapping(uint256 => uint256)) public lastUserVote; + // 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 @@ -81,12 +102,12 @@ contract VoteWeighting is IErrors { // 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; + // 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; @@ -106,7 +127,7 @@ contract VoteWeighting is IErrors { // Set initial parameters ve = _ve; timeSum = block.timestamp / WEEK * WEEK; - setNominees.push(0); + 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. @@ -139,25 +160,22 @@ contract VoteWeighting is IErrors { } /// @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. + /// @param account Nominee account address in bytes32 form. + /// @param chainId Nominee 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; + function _getWeight(bytes32 account, uint256 chainId) internal returns (uint256) { + // Construct the nominee struct + Nominee memory nominee = Nominee(account, chainId); // Check that the nominee exists - if (mapNomineeIds[nomineeChainId] == 0) { - revert NomineeDoesNotExist(nominee, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); + if (mapNomineeIds[nomineeHash] == 0) { + revert NomineeDoesNotExist(nominee.account, nominee.chainId); } // t is always > 0 as it is set during the addNominee() call - uint256 t = timeWeight[nomineeChainId]; - Point memory pt = pointsWeight[nomineeChainId][t]; + uint256 t = timeWeight[nomineeHash]; + Point memory pt = pointsWeight[nomineeHash][t]; for (uint256 i = 0; i < 500; i++) { if (t > block.timestamp) { break; @@ -166,56 +184,82 @@ contract VoteWeighting is IErrors { uint256 dBias = pt.slope * WEEK; if (pt.bias > dBias) { pt.bias -= dBias; - uint256 dSlope = changesWeight[nomineeChainId][t]; + uint256 dSlope = changesWeight[nomineeHash][t]; pt.slope -= dSlope; } else { pt.bias = 0; pt.slope = 0; } - pointsWeight[nomineeChainId][t] = pt; + pointsWeight[nomineeHash][t] = pt; if (t > block.timestamp) { - timeWeight[nomineeChainId] = t; + timeWeight[nomineeHash] = t; } } return pt.bias; } /// @dev Add nominee address along with the chain Id. - /// @param nominee Address of the nominee. + /// @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); + } + mapNomineeIds[nomineeHash] = setNominees.length; + // Push the nominee into the list + setNominees.push(nominee); + + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + timeWeight[nomineeHash] = nextTime; + + emit NewNominee(nominee.account, nominee.chainId); + } + + /// @dev Add EVM nominee address along with the chain Id. + /// @param account Address of the nominee. /// @param chainId Chain Id. - function addNominee(address nominee, uint256 chainId) external { + function addNominee(address account, uint256 chainId) external { // Check for the zero address - if (nominee == address(0)) { + if (account == address(0)) { revert ZeroAddress(); } - // Check for the chain Id + // Check for zero chain Id if (chainId == 0) { revert ZeroValue(); } - else if (chainId > MAX_CHAIN_ID) { - revert Overflow(chainId, MAX_CHAIN_ID); + + // Check for the chain Id overflow + if (chainId > MAX_EVM_CHAIN_ID) { + revert Overflow(chainId, MAX_EVM_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; + Nominee memory nominee = Nominee(bytes32(uint256(uint160(account))), chainId); - // Check for the nominee existence - if (mapNomineeIds[nomineeChainId] > 0) { - revert NomineeAlreadyExists(nominee, 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(); } - mapNomineeIds[nomineeChainId] = setNominees.length; - // Push the nominee into the list - setNominees.push(nomineeChainId); - uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; - timeWeight[nomineeChainId] = nextTime; + // 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); - emit NewNominee(nominee, chainId); + // Record nominee instance + _addNominee(nominee); } /// @dev Checkpoint to fill data common for all nominees. @@ -224,36 +268,33 @@ contract VoteWeighting is IErrors { } /// @dev Checkpoint to fill data for both a specific nominee and common for all nominees. - /// @param nominee Address of the nominee. + /// @param account Address of the nominee. /// @param chainId Chain Id. - function checkpointNominee(address nominee, uint256 chainId) external { - _getWeight(nominee, chainId); + 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 nominee Address of the nominee. + /// @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( - address nominee, + bytes32 account, 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; + Nominee memory nominee = Nominee(account, chainId); + bytes32 nomineeHash = keccak256(abi.encode(nominee)); if (totalSum > 0) { - uint256 nomineeWeight = pointsWeight[nomineeChainId][t].bias; + uint256 nomineeWeight = pointsWeight[nomineeHash][t].bias; weight = 1e18 * nomineeWeight / totalSum; } } @@ -261,47 +302,44 @@ contract VoteWeighting is IErrors { /// @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 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( - address nominee, + bytes32 account, uint256 chainId, uint256 time ) external view returns (uint256 weight, uint256 totalSum) { - (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + (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 nominee Address of the nominee. + /// @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( - address nominee, + bytes32 account, uint256 chainId, uint256 time ) external returns (uint256 weight, uint256 totalSum) { - _getWeight(nominee, chainId); + _getWeight(account, chainId); _getSum(); - (weight, totalSum) = _nomineeRelativeWeight(nominee, chainId, time); + (weight, totalSum) = _nomineeRelativeWeight(account, chainId, time); } /// @dev Allocate voting power for changing pool weights. - /// @param nominee Address of the nominee the `msg.sender` votes for. + /// @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(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; + function voteForNomineeWeights(bytes32 account, uint256 chainId, uint256 weight) public { + // Get the nominee hash + bytes32 nomineeHash = keccak256(abi.encode(Nominee(account, chainId))); uint256 slope = uint256(uint128(IVEOLAS(ve).getLastUserPoint(msg.sender).slope)); uint256 lockEnd = IVEOLAS(ve).lockedEnd(msg.sender); @@ -318,13 +356,13 @@ contract VoteWeighting is IErrors { } // Check for the last voting time - uint256 nextAllowedVotingTime = lastUserVote[msg.sender][nomineeChainId] + WEIGHT_VOTE_DELAY; + 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][nomineeChainId]; + VotedSlope memory oldSlope = voteUserSlopes[msg.sender][nomineeHash]; uint256 oldBias; if (oldSlope.end > nextTime) { oldBias = oldSlope.slope * (oldSlope.end - nextTime); @@ -348,48 +386,49 @@ contract VoteWeighting is IErrors { // 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); + pointsWeight[nomineeHash][nextTime].bias = _maxAndSub(_getWeight(account, 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); + 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[nomineeChainId][nextTime].slope += newSlope.slope; + 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[nomineeChainId][oldSlope.end] -= oldSlope.slope; + changesWeight[nomineeHash][oldSlope.end] -= oldSlope.slope; changesSum[oldSlope.end] -= oldSlope.slope; } // Add slope changes for new slopes - changesWeight[nomineeChainId][newSlope.end] += newSlope.slope; + changesWeight[nomineeHash][newSlope.end] += newSlope.slope; changesSum[newSlope.end] += newSlope.slope; - voteUserSlopes[msg.sender][nomineeChainId] = newSlope; + voteUserSlopes[msg.sender][nomineeHash] = newSlope; // Record last action time - lastUserVote[msg.sender][nomineeChainId] = block.timestamp; + lastUserVote[msg.sender][nomineeHash] = block.timestamp; - emit VoteForNominee(msg.sender, nominee, chainId, weight); + emit VoteForNominee(msg.sender, account, chainId, weight); } /// @dev Allocate voting power for changing pool weights in batch. - /// @param nominees Set of nominees the `msg.sender` votes for. + /// @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( - address[] memory nominees, + bytes32[] memory accounts, uint256[] memory chainIds, uint256[] memory weights ) external { - if (nominees.length != chainIds.length || nominees.length != weights.length) { - revert WrongArrayLength(nominees.length, weights.length); + 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 < nominees.length; ++i) { - voteForNomineeWeights(nominees[i], chainIds[i], weights[i]); + for (uint256 i = 0; i < accounts.length; ++i) { + voteForNomineeWeights(accounts[i], chainIds[i], weights[i]); } } @@ -398,17 +437,15 @@ contract VoteWeighting is IErrors { } /// @dev Get current nominee weight. - /// @param nominee Address of the nominee. + /// @param account Address of the nominee in bytes32 form. /// @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; + 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. @@ -417,7 +454,7 @@ contract VoteWeighting is IErrors { return pointsSum[timeSum].bias; } - /// @dev Get the number of nominees. + /// @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) { @@ -425,25 +462,22 @@ contract VoteWeighting is IErrors { } /// @dev Gets the nominee Id in the global nominees set. - /// @param nominee Nominee address. + /// @param account Nominee address in bytes32 form. /// @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]; + /// @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 | chainId) values. - /// @return nominee Nominee address. - /// @return chainId Chain Id. - function getNominee(uint256 id) external view returns (address nominee, uint256 chainId) { + /// @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 @@ -452,24 +486,19 @@ contract VoteWeighting is IErrors { } 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; + + 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 | chainId) values. + /// @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 addresses. - /// @return chainIds Set of corresponding chain Ids. + /// @return nominees Set of nominee accounts in bytes32 form and chain Ids. function getNominees( uint256 startId, uint256 numNominees - ) external view returns (address[] memory nominees, uint256[] memory chainIds) + ) external view returns (Nominee[] memory nominees) { // Check for the zero id or the overflow if (startId == 0 || numNominees == 0) { @@ -487,17 +516,13 @@ contract VoteWeighting is IErrors { } // Allocate - nominees = new address[](numNominees); - chainIds = new uint256[](numNominees); + nominees = new Nominee[](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; + // Get the nominee struct + nominees[i] = setNominees[id]; } } } \ 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 b4f6697..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.22.2", + "hardhat": "^2.22.3", "@typechain/hardhat": "^9.1.0", "ethers": "^5.7.2", "@typechain/ethers-v5": "^11.1.2", diff --git a/yarn.lock b/yarn.lock index 3f7af79..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.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.4.tgz#e5aac2b7726f44cffe120bdd7e25e1f120471591" - integrity sha512-tjavrUFLWnkn0PI+jk0D83hP2jjbmeXT1QLd5NtIleyGrJ00ZWVl+sfuA2Lle3kzfOceoI2VTR0n1pZB4KJGbQ== - -"@nomicfoundation/edr-darwin-x64@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.4.tgz#cbcc0a2dcda0a7c0a900a74efc6918cff134dc23" - integrity sha512-dXO0vlIoBosp8gf5/ah3dESMymjwit0Daef1E4Ew3gZ8q3LAdku0RC+YEQJi9f0I3QNfdgIrBTzibRZUoP+kVA== - -"@nomicfoundation/edr-linux-arm64-gnu@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.4.tgz#12073f97d310176bb24ad7d48c25128ea8eff093" - integrity sha512-dv38qmFUaqkkeeA9S0JjerqruytTfHav7gbPLpZUAEXPlJGo49R0+HQxd45I0msbm6NAXbkmKEchTLApp1ohaA== - -"@nomicfoundation/edr-linux-arm64-musl@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.4.tgz#c9bc685d4d14bf21d9c3e326edd44e009e24492d" - integrity sha512-CfEsb6gdCMVIlRSpWYTxoongEKHB60V6alE/y8mkfjIo7tA95wyiuvCtyo3fpiia3wQV7XoMYgIJHObHiKLKtA== - -"@nomicfoundation/edr-linux-x64-gnu@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.4.tgz#37486cbe317b8caf7961e500fc0150c45c895a56" - integrity sha512-V0CpJA2lYWulgTR+zP11ftBAEwkpMAAki/AuMu3vd7HoPfjwIDzWDQR5KFU17qFmqAVz0ICRxsxDlvvBZ/PUxA== - -"@nomicfoundation/edr-linux-x64-musl@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.4.tgz#399278807100a1833f6c8a39c17d5beaaf7a9223" - integrity sha512-0sgTrwZajarukerU/QSb+oRdlQLnJdd7of8OlXq2wtpeTNTqemgCOwY2l2qImbWboMpVrYgcmGbINXNVPCmuJw== - -"@nomicfoundation/edr-win32-arm64-msvc@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.4.tgz#879028e2708538fd54efc349c1a4de107a15abb4" - integrity sha512-bOl3vhMtV0W9ozUMF5AZRBWw1183hhhx+e1YJdDLMaqNkBUFYi2CZbMYefDylq2OKQtOQ0gPLhZvn+z2D21Ztw== - -"@nomicfoundation/edr-win32-ia32-msvc@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.4.tgz#97d54b8cfbbafa1cd2001bb115e583f1169bf9ae" - integrity sha512-yKQCpAX0uB2dalsSwOkau3yfNXkwBJa/Ks2OPl9AjHqJ+E8AqvBEB9jRpfQrdPzElMsgZuN4mqE+wh+JxY+0Aw== - -"@nomicfoundation/edr-win32-x64-msvc@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.4.tgz#abfc447eb6bd1a9be868bec5c9d14546398ab609" - integrity sha512-fResvsL/fSucep1K5W6iOs8lqqKKovHLsAmigMzAYVovqkyZKgCGVS/D8IVxA0nxuGCOlNxFnVmwWtph3pbKWA== - -"@nomicfoundation/edr@^0.3.1": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.4.tgz#e8eaf41963460139c47b0785f1a6a2a1c1b24ae0" - integrity sha512-e4jzVeJ+VTKBFzNgKDbSVnGVbHYNZHIfMdgifQBugXPiIa6QEUzZqleh2+y4lhkXcCthnFyrTYe3jiEpUzr3cA== +"@nomicfoundation/edr-darwin-arm64@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.5.tgz#3c428000ec27501617a00f7c447054a272f99177" + integrity sha512-gIXUIiPMUy6roLHpNlxf15DumU7/YhffUf7XIB+WUjMecaySfTGyZsTGnCMJZqrDyiYqWPyPKwCV/2u/jqFAUg== + +"@nomicfoundation/edr-darwin-x64@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.5.tgz#fee26c4a83c9fc534bc0a719e88382fafeed69fe" + integrity sha512-0MrpOCXUK8gmplpYZ2Cy0holHEylvWoNeecFcrP2WJ5DLQzrB23U5JU2MvUzOJ7aL76Za1VXNBWi/UeTWdHM+w== + +"@nomicfoundation/edr-linux-arm64-gnu@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.5.tgz#c48ad44b578abb50706cd8cad607a65b1289689f" + integrity sha512-aw9f7AZMiY1dZFNePJGKho2k+nEgFgzUAyyukiKfSqUIMXoFXMf1U3Ujv848czrSq9c5XGcdDa2xnEf3daU3xg== + +"@nomicfoundation/edr-linux-arm64-musl@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.5.tgz#7cc1b12e2adf872e5a542647182262cc4582f8d9" + integrity sha512-cVFRQjyABBlsbDj+XTczYBfrCHprZ6YNzN8gGGSqAh+UGIJkAIRomK6ar27GyJLNx3HkgbuDoi/9kA0zOo/95w== + +"@nomicfoundation/edr-linux-x64-gnu@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.5.tgz#ae4366c6fad03ea6ec3e2f2bafe397661c11f054" + integrity sha512-CjOg85DfR1Vt0fQWn5U0qi26DATK9tVzo3YOZEyI0JBsnqvk43fUTPv3uUAWBrPIRg5O5kOc9xG13hSpCBBxBg== + +"@nomicfoundation/edr-linux-x64-musl@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.5.tgz#4071929fcece90f95c271f6ba455c55f35750efd" + integrity sha512-hvX8bBGpBydAVevzK8jsu2FlqVZK1RrCyTX6wGHnltgMuBaoGLHYtNHiFpteOaJw2byYMiORc2bvj+98LhJ0Ew== + +"@nomicfoundation/edr-win32-x64-msvc@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.5.tgz#6e6684e56f336c67fbda9bf75b21d7ac586631b8" + integrity sha512-IJXjW13DY5UPsx/eG5DGfXtJ7Ydwrvw/BTZ2Y93lRLHzszVpSmeVmlxjZP5IW2afTSgMLaAAsqNw4NhppRGN8A== + +"@nomicfoundation/edr@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.5.tgz#04f980386f871e1c3bbc180b290d37af0336c81d" + integrity sha512-dPSM9DuI1sr71gqWUMgLo8MjHQWO4+WNDm3iWaT6P4vUFJReZX5qwA5X+3UwIPBry8GvNY084u7yWUvB3/8rqA== optionalDependencies: - "@nomicfoundation/edr-darwin-arm64" "0.3.4" - "@nomicfoundation/edr-darwin-x64" "0.3.4" - "@nomicfoundation/edr-linux-arm64-gnu" "0.3.4" - "@nomicfoundation/edr-linux-arm64-musl" "0.3.4" - "@nomicfoundation/edr-linux-x64-gnu" "0.3.4" - "@nomicfoundation/edr-linux-x64-musl" "0.3.4" - "@nomicfoundation/edr-win32-arm64-msvc" "0.3.4" - "@nomicfoundation/edr-win32-ia32-msvc" "0.3.4" - "@nomicfoundation/edr-win32-x64-msvc" "0.3.4" + "@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.22.2: - version "2.22.2" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.2.tgz#0cadd7ec93bf39bab09f81603e75bc5e92acea3d" - integrity sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw== +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.3.1" + "@nomicfoundation/edr" "^0.3.5" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" From 7b7e0238859a2ee151e16882eeb5becd1271dc31 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 26 Apr 2024 10:57:45 +0100 Subject: [PATCH 03/14] test: adjusting tests back to 100% coverage --- contracts/VoteWeighting.sol | 2 +- test/VoteWeighting.js | 94 ++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 29 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 08099dd..21f8d18 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -220,7 +220,7 @@ contract VoteWeighting is IErrors { /// @dev Add EVM nominee address along with the chain Id. /// @param account Address of the nominee. /// @param chainId Chain Id. - function addNominee(address account, uint256 chainId) external { + function addNomineeEVM(address account, uint256 chainId) external { // Check for the zero address if (account == address(0)) { revert ZeroAddress(); diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index 4973d70..e5b8614 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -18,12 +18,21 @@ describe("Voting Escrow OLAS", function () { const E18 = 10**18; const oneOLASBalance = ethers.utils.parseEther("1"); const AddressZero = ethers.constants.AddressZero; + const HashZero = ethers.constants.HashZero; const maxU256 = ethers.constants.MaxUint256; 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(); @@ -59,39 +68,52 @@ describe("Voting Escrow OLAS", function () { 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.addNominee(AddressZero, chainId) + vw.addNomineeEVM(AddressZero, chainId) ).to.be.revertedWithCustomError(vw, "ZeroAddress"); // Try to add a zero chain Id await expect( - vw.addNominee(signers[1].address, 0) + vw.addNomineeEVM(nominee, 0) ).to.be.revertedWithCustomError(vw, "ZeroValue"); // Try to add an overflow chain Id - let overflowChainId = await vw.MAX_CHAIN_ID(); - overflowChainId = overflowChainId.add(1); + const maxEVMChainId = await vw.MAX_EVM_CHAIN_ID(); + const overflowChainId = maxEVMChainId.add(1); await expect( - vw.addNominee(signers[1].address, overflowChainId) + 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.addNominee(signers[1].address, chainId); + await vw.addNomineeEVM(nominee, chainId); // Try to add the same nominee await expect( - vw.addNominee(signers[1].address, chainId) + vw.addNomineeEVM(nominee, chainId) ).to.be.revertedWithCustomError(vw, "NomineeAlreadyExists"); // Check the nominee setup @@ -99,24 +121,30 @@ describe("Voting Escrow OLAS", function () { expect(numNominees).to.equal(1); const nomineeChainId = await vw.getNominee(1); - expect(nomineeChainId.nominee).to.equal(signers[1].address); + expect(nomineeChainId.account).to.equal(convertAddressToBytes32(nominee)); expect(nomineeChainId.chainId).to.equal(chainId); const nomineeChainIds = await vw.getNominees(1, 1); - expect(nomineeChainIds.nominees[0]).to.equal(signers[1].address); - expect(nomineeChainIds.chainIds[0]).to.equal(chainId); + expect(nomineeChainIds[0].account).to.equal(convertAddressToBytes32(nominee)); + expect(nomineeChainIds[0].chainId).to.equal(chainId); - let nomineeId = await vw.getNomineeId(signers[1].address, 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(signers[1].address, chainId + 1); + 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.addNominee(signers[1].address, chainId); + await vw.addNomineeEVM(nominee, chainId); // Try to get the zero-th nominees await expect( @@ -141,7 +169,7 @@ describe("Voting Escrow OLAS", function () { ).to.be.revertedWithCustomError(vw, "Overflow"); // Add one more nominee - await vw.addNominee(signers[1].address, chainId + 1); + await vw.addNomineeEVM(nominee, chainId + 1); // Try to get the nonexistent nominee await expect( vw.getNominee(3) @@ -159,7 +187,8 @@ describe("Voting Escrow OLAS", function () { it("Should fail with wrong input arguments", async function () { // Add a nominee let nominee = signers[1].address; - await vw.addNominee(nominee, chainId); + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); // Approve OLAS for veOLAS await olas.approve(ve.address, oneOLASBalance); @@ -196,7 +225,9 @@ describe("Voting Escrow OLAS", function () { // Try to vote for another nominee with all the voting power used nominee = signers[2].address; - await vw.addNominee(nominee, chainId); + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); + await expect( vw.voteForNomineeWeights(nominee, chainId, 1) ).to.be.revertedWithCustomError(vw, "Overflow"); @@ -230,8 +261,9 @@ describe("Voting Escrow OLAS", function () { await ve.createLock(oneOLASBalance, oneYear); // Add a nominee - const nominee = signers[1].address; - await vw.addNominee(nominee, chainId); + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); // Get the next point timestamp where votes are written after voting const block = await ethers.provider.getBlock("latest"); @@ -248,8 +280,9 @@ describe("Voting Escrow OLAS", function () { // Add one more nominee - const nominee2 = signers[2].address; - await vw.addNominee(nominee2, chainId); + 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); @@ -290,8 +323,9 @@ describe("Voting Escrow OLAS", function () { await ve.createLock(oneOLASBalance, oneYear); // Add a nominee - const nominee = signers[1].address; - await vw.addNominee(nominee, chainId); + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); // Wait for several weeks await helpers.time.increase(oneWeek * 3); @@ -318,12 +352,14 @@ describe("Voting Escrow OLAS", function () { // Add nominees const numNominees = 2; - const nominees = [signers[1].address, signers[2].address]; + let nominees = [signers[1].address, signers[2].address]; const chainIds = new Array(numNominees).fill(chainId); for (let i = 0; i < numNominees; i++) { - await vw.addNominee(nominees[i], chainIds[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); @@ -348,8 +384,9 @@ describe("Voting Escrow OLAS", function () { await ve.createLock(oneOLASBalance, oneYear); // Add a nominee - const nominee = signers[1].address; - await vw.addNominee(nominee, chainId); + let nominee = signers[1].address; + await vw.addNomineeEVM(nominee, chainId); + nominee = convertAddressToBytes32(nominee); // Vote for the nominee await vw.voteForNomineeWeights(nominee, chainId, maxVoteWeight); @@ -378,10 +415,11 @@ describe("Voting Escrow OLAS", function () { // Add nominees const numNominees = 2; - const nominees = [signers[2].address, signers[3].address]; + let nominees = [signers[2].address, signers[3].address]; for (let i = 0; i < numNominees; i++) { - await vw.addNominee(nominees[i], chainId); + 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); From be3583c445899cfa9ef03933f607e942de470311 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 26 Apr 2024 11:05:04 +0100 Subject: [PATCH 04/14] chore: solhint --- contracts/VoteWeighting.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 21f8d18..aba20e2 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.23; -import "./interfaces/IErrors.sol"; +import {IErrors} from "./interfaces/IErrors.sol"; interface IVEOLAS { // Structure for voting escrow points From 0324082d532e6541aa9b3b76f1f9d10c05a31f95 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 3 May 2024 12:24:55 +0100 Subject: [PATCH 05/14] feat: couple of view methods to get nominees info --- contracts/VoteWeighting.sol | 50 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index aba20e2..07b92ce 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -71,7 +71,7 @@ struct Nominee { contract VoteWeighting is IErrors { event NewNomineeWeight(bytes32 indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight); - event NewNominee(bytes32 account, uint256 chainId); + event NewNominee(bytes32 account, uint256 chainId, uint256 id); // 7 * 86400 seconds - all future times are rounded by week uint256 public constant WEEK = 604_800; @@ -207,14 +207,15 @@ contract VoteWeighting is IErrors { if (mapNomineeIds[nomineeHash] > 0) { revert NomineeAlreadyExists(nominee.account, nominee.chainId); } - mapNomineeIds[nomineeHash] = setNominees.length; + 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; - emit NewNominee(nominee.account, nominee.chainId); + emit NewNominee(nominee.account, nominee.chainId, id); } /// @dev Add EVM nominee address along with the chain Id. @@ -461,6 +462,13 @@ contract VoteWeighting is IErrors { 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. @@ -515,7 +523,7 @@ contract VoteWeighting is IErrors { revert Overflow(endId, totalNumNominees); } - // Allocate + // Allocate the nominee array nominees = new Nominee[](numNominees); // Traverse selected nominees @@ -525,4 +533,38 @@ contract VoteWeighting is IErrors { 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 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 From cbe0a39bc61a380d23cac396028d7ac16545fc8a Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 3 May 2024 12:48:58 +0100 Subject: [PATCH 06/14] test: coverage is back to 100% --- contracts/VoteWeighting.sol | 2 +- test/VoteWeighting.js | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 07b92ce..853769b 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -552,7 +552,7 @@ contract VoteWeighting is IErrors { // Allocate the times array nextAllowedVotingTimes = new uint256[](accounts.length); - // Traverse nominees and get next available times + // 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]); diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index e5b8614..a979211 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -119,6 +119,8 @@ describe("Voting Escrow OLAS", function () { // 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)); @@ -253,6 +255,24 @@ describe("Voting Escrow OLAS", function () { 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 () { @@ -266,8 +286,8 @@ describe("Voting Escrow OLAS", function () { nominee = convertAddressToBytes32(nominee); // Get the next point timestamp where votes are written after voting - const block = await ethers.provider.getBlock("latest"); - const nextTime = getNextTime(block.timestamp); + 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); @@ -312,6 +332,15 @@ describe("Voting Escrow OLAS", function () { // 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 () { From 826d6a4fd7d811d064ca4d088380d1e489356886 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 7 May 2024 10:20:06 +0100 Subject: [PATCH 07/14] test: adding multi-weights test --- test/VoteWeighting.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index a979211..112a94b 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -490,5 +490,48 @@ describe("Voting Escrow OLAS", function () { // 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 + // The second weight must be no bigger than the addition of a difference between first weights: + // 2000 - 1000 = 1000, so the maximum second weight might be 7000 + 1000 = 8000 + weights = [1000, 8000, 1000]; + await vw.voteForNomineeWeightsBatch(nominees, chainIds, weights); + + // Restore to the state of the snapshot + await snapshot.restore(); + }); }); }); From 28b6d21a2e5bbcd1077000d7156abd8c2153b083 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 7 May 2024 10:22:05 +0100 Subject: [PATCH 08/14] test: adding multi-weights test --- test/VoteWeighting.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index 112a94b..cd748d2 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -524,9 +524,9 @@ describe("Voting Escrow OLAS", function () { vw.voteForNomineeWeightsBatch(nominees, chainIds, weights) ).to.be.revertedWithCustomError(vw, "Overflow"); - // The first weight must be no bigger than the first one used before + // 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 might be 7000 + 1000 = 8000 + // 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); From 5e1cd6146b605c894adb76c59ba48acdaaf72243 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 7 May 2024 12:23:57 +0100 Subject: [PATCH 09/14] chore: adding vote weighting ABI --- abis/0.8.23/VoteWeighting.json | 1089 ++++++++++++++++++++++++++++++++ test/VoteWeighting.js | 1 - 2 files changed, 1089 insertions(+), 1 deletion(-) create mode 100644 abis/0.8.23/VoteWeighting.json diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json new file mode 100644 index 0000000..fe7e085 --- /dev/null +++ b/abis/0.8.23/VoteWeighting.json @@ -0,0 +1,1089 @@ +{ + "_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": "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": "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": "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": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "Underflow", + "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": "bytes32", + "name": "account", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "NewNominee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nominee", + "type": "bytes32" + }, + { + "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": "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": "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": "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": "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": [ + { + "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": "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": "0x60a06040523480156200001157600080fd5b506040516200238e3803806200238e833981016040819052620000349162000103565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811660805262093a8062000079814262000135565b62000085919062000158565b600a555060408051808201909152600080825260208201818152815460018101835591805291517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56360029092029182015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5649091015562000184565b6000602082840312156200011657600080fd5b81516001600160a01b03811681146200012e57600080fd5b9392505050565b6000826200015357634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200017e57634e487b7160e01b600052601160045260246000fd5b92915050565b6080516121e0620001ae600039600081816102850152818161101501526110e001526121e06000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80637ee8bfe91161010f578063c88d47f0116100a2578063f0cd64af11610071578063f0cd64af14610524578063f4359ce514610544578063f4da12ba1461054e578063f9572f7c1461055657600080fd5b8063c88d47f0146104bd578063dc87f536146104d0578063e4a28a52146104fb578063ec73d9061461050457600080fd5b8063a18f99ff116100de578063a18f99ff14610492578063a51248031461049a578063beaf44e8146104a2578063c2c4c5c1146104b557600080fd5b80637ee8bfe9146103fb57806385556a951461040e5780638e28764b146104395780639d1750531461046b57600080fd5b806341597036116101875780634f6ffd07116101565780634f6ffd071461036d578063609c6b87146103775780636b39ac1a146103c85780637a75b27e146103db57600080fd5b806341597036146103275780634479b5cf1461033e578063456f099714610351578063482649971461036457600080fd5b80631f850716116101c35780631f8507161461028057806326abaf24146102cc57806327ebf531146102df5780633b766b3d146102ff57600080fd5b806292a596146101f45780630c4232011461021d5780631765ab7f1461024b5780631b98dd9014610260575b600080fd5b610207610202366004611b90565b610569565b6040516102149190611bb2565b60405180910390f35b61023d61022b366004611c09565b60096020526000908152604090205481565b604051908152602001610214565b61025e610259366004611b90565b6106f1565b005b61023d61026e366004611c09565b60076020526000908152604090205481565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b61025e6102da366004611d33565b6107e9565b6102f26102ed366004611c09565b6108b0565b6040516102149190611dbb565b61031261030d366004611c09565b61099c565b60408051928352602083019190915201610214565b600a5460009081526008602052604090205461023d565b61023d61034c366004611b90565b6109ca565b61023d61035f366004611b90565b610a4e565b61023d600a5481565b61023d620d2f0081565b6103ad610385366004611dfb565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b60408051938452602084019290925290820152606001610214565b61025e6103d6366004611dfb565b610ac1565b6103ee6103e9366004611e25565b610c10565b6040516102149190611f0a565b610312610409366004611f4e565b610e64565b61023d61041c366004611dfb565b600460209081526000928352604080842090915290825290205481565b610312610447366004611b90565b60056020908152600092835260408084209091529082529020805460019091015482565b610312610479366004611c09565b6008602052600090815260409020805460019091015482565b61023d610e92565b610207610ea7565b61025e6104b0366004611b90565b610f1a565b61025e610f2d565b6103126104cb366004611f4e565b610f38565b61023d6104de366004611b90565b600660209081526000928352604080842090915290825290205481565b61023d61271081565b61023d610512366004611f7a565b60036020526000908152604090205481565b61023d610532366004611c09565b60016020526000908152604090205481565b61023d62093a8081565b61023d610f46565b61025e610564366004611f4e565b610f72565b6060821580610576575081155b156105ad576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006105b98385611fc4565b60005490915080821115610608576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff81111561062157610621611c22565b60405190808252806020026020018201604052801561066657816020015b604080518082019091526000808252602082015281526020019060019003908161063f5790505b50925060005b848110156106e85760006106808783611fc4565b90506000818154811061069557610695611fd7565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508583815181106106d4576106d4611fd7565b60209081029190910101525060010161066c565b50505092915050565b81610728576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461073e600267ffffffffffffffff612035565b610748919061205c565b67ffffffffffffffff16106107c75780602461076d600267ffffffffffffffff612035565b610777919061205c565b61078c9067ffffffffffffffff166001611fc4565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60408051808201909152828152602081018290526107e481611654565b505050565b815183511415806107fc57508051835114155b1561084057825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60005b83518110156108aa576108a284828151811061086157610861611fd7565b602002602001015184838151811061087b5761087b611fd7565b602002602001015184848151811061089557610895611fd7565b6020026020010151610f72565b600101610843565b50505050565b6040805180820190915260008082526020820152600080546108d490600190612084565b905082600003610910576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610954576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105ff565b6000838154811061096757610967611fd7565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b600081815481106109ac57600080fd5b60009182526020909120600290910201805460019091015490915082565b6040805180820182528381526020808201849052915160009283916109f191849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526005835281812060078452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610a7591849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600190925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610b0e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610b48576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610b5d600267ffffffffffffffff612035565b610b67919061205c565b67ffffffffffffffff16811115610bdd57806024610b8e600267ffffffffffffffff612035565b610b98919061205c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff1660248201526044016105ff565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526107e481611654565b606082518451141580610c2557508151845114155b15610c6957835183516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b835167ffffffffffffffff811115610c8357610c83611c22565b604051908082528060200260200182016040528015610cac578160200160208202803683370190505b50905060005b8451811015610e5c5760006040518060400160405280878481518110610cda57610cda611fd7565b60200260200101518152602001868481518110610cf957610cf9611fd7565b60200260200101518152509050600081604051602001610d199190611dbb565b6040516020818303038152906040528051906020012090506001600082815260200190815260200160002054600003610dbd57868381518110610d5e57610d5e611fd7565b6020026020010151868481518110610d7857610d78611fd7565b60200260200101516040517f31b05a800000000000000000000000000000000000000000000000000000000081526004016105ff929190918252602082015260400190565b620d2f0060046000878681518110610dd757610dd7611fd7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610e359190611fc4565b848481518110610e4757610e47611fd7565b60209081029190910101525050600101610cb2565b509392505050565b600080610e7185856117ee565b50610e7a6119b5565b50610e86858585611ab5565b90969095509350505050565b60008054610ea290600190612084565b905090565b60606000805480602002602001604051908101604052809291908181526020016000905b82821015610f1157838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610ecb565b50505050905090565b610f2482826117ee565b506107e46119b5565b610f356119b5565b50565b600080610e86858585611ab5565b6024610f5b600267ffffffffffffffff612035565b610f65919061205c565b67ffffffffffffffff1681565b6000604051806040016040528085815260200184815250604051602001610f999190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906120c1565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612166565b9050600062093a808061115e8142611fc4565b611168919061217f565b6111729190612193565b90508181106111bd576040517fd78507e100000000000000000000000000000000000000000000000000000000815233600482015260248101839052604481018290526064016105ff565b612710851115611204576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810186905261271060248201526044016105ff565b33600090815260046020908152604080832087845290915281205461122d90620d2f0090611fc4565b905042811115611278576040517f17601765000000000000000000000000000000000000000000000000000000008152336004820152426024820152604481018290526064016105ff565b33600090815260026020818152604080842089855282528084208151606081018352815481526001820154938101939093529092015491810182905291908410156112dc578382604001516112cd9190612084565b82516112d99190612193565b90505b600060405180606001604052806127108b8a6112f89190612193565b611302919061217f565b8152602081018b90526040018790529050600061131f8688612084565b825161132b9190612193565b336000908152600360209081526040909120548682015191850151929350916113549083611fc4565b61135e9190612084565b33600090815260036020526040902081905590506127108111156113b9576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016105ff565b6113d7826113c78f8f6117ee565b6113d19190611fc4565b85611b6f565b60008b81526005602090815260408083208b84529091529020556113fd826113c76119b5565b60008881526008602052604090819020919091558501518710156114a257825160008b81526005602090815260408083208b845290915290206001015461144e9161144791611fc4565b8651611b6f565b60008b81526005602090815260408083208b84528252808320600190810194909455865160089092529091209091015461148b9161144791611fc4565b6000888152600860205260409020600101556114fe565b825160008b81526005602090815260408083208b8452909152812060010180549091906114d0908490611fc4565b90915550508251600088815260086020526040812060010180549091906114f8908490611fc4565b90915550505b428560400151111561156857845160008b8152600660209081526040808320818a0151845290915281208054909190611538908490612084565b90915550508451604080870151600090815260096020529081208054909190611562908490612084565b90915550505b825160008b815260066020908152604080832081880151845290915281208054909190611596908490611fc4565b909155505082516040808501516000908152600960205290812080549091906115c0908490611fc4565b90915550503360008181526002602081815260408084208f855282528084208851815582890151600182015581890151930192909255838352600481528183208e845281529181902042905580518f81529182018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b6000816040516020016116679190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526001909352912054909150156116f457815160208301516040517f5855e248000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60008054828252600160208181526040842083905590820183558280528451600283027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810191909155908501517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101559062093a80806117778142611fc4565b611781919061217f565b61178b9190612193565b6000848152600760209081526040918290208390558651878201518351918252918101919091529081018490529091507feb6eb71567385579529ebbf34681085c503a5dbf2bc360a6dbec0db2e1ab8edc9060600160405180910390a150505050565b60408051808201825283815260208082018490529151600092839161181591849101611dbb565b604051602081830303815290604052805190602001209050600160008281526020019081526020016000205460000361188a57815160208301516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b600081815260076020908152604080832054600583528184208185528352818420825180840190935280548352600101549282019290925290915b6101f48110156119a9574283116119a9576118e362093a8084611fc4565b9250600062093a8083602001516118fa9190612193565b9050808360000151111561195457808360000181815161191a9190612084565b9052506000858152600660209081526040808320878452825290912054908401805182919061194a908390612084565b90525061195f9050565b600080845260208401525b600085815260056020908152604080832087845282529091208451815590840151600190910155428411156119a05760008581526007602052604090208490555b506001016118c5565b50519695505050505050565b600a5460008181526008602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611aad57428311611aad57611a0362093a8084611fc4565b9250600062093a808360200151611a1a9190612193565b90508083600001511115611a6c578083600001818151611a3a9190612084565b9052506000848152600960209081526040909120549084018051829190611a62908390612084565b905250611a779050565b600080845260208401525b6000848152600860209081526040909120845181559084015160019091015542841115611aa457600a8490555b506001016119e5565b505192915050565b6000808062093a80611ac7818661217f565b611ad19190612193565b600081815260086020908152604080832054815180830183528b81528084018b9052915190965093945092611b0891849101611dbb565b6040516020818303038152906040528051906020012090506000841115611b6457600081815260056020908152604080832086845290915290205484611b5682670de0b6b3a7640000612193565b611b60919061217f565b9550505b505050935093915050565b6000818311611b7f576000611b89565b611b898284612084565b9392505050565b60008060408385031215611ba357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015611bfc57611bec84835180518252602090810151910152565b9284019290850190600101611bcf565b5091979650505050505050565b600060208284031215611c1b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c9857611c98611c22565b604052919050565b600067ffffffffffffffff821115611cba57611cba611c22565b5060051b60200190565b600082601f830112611cd557600080fd5b81356020611cea611ce583611ca0565b611c51565b8083825260208201915060208460051b870101935086841115611d0c57600080fd5b602086015b84811015611d285780358352918301918301611d11565b509695505050505050565b600080600060608486031215611d4857600080fd5b833567ffffffffffffffff80821115611d6057600080fd5b611d6c87838801611cc4565b94506020860135915080821115611d8257600080fd5b611d8e87838801611cc4565b93506040860135915080821115611da457600080fd5b50611db186828701611cc4565b9150509250925092565b815181526020808301519082015260408101610a48565b803573ffffffffffffffffffffffffffffffffffffffff81168114611df657600080fd5b919050565b60008060408385031215611e0e57600080fd5b611e1783611dd2565b946020939093013593505050565b600080600060608486031215611e3a57600080fd5b833567ffffffffffffffff80821115611e5257600080fd5b611e5e87838801611cc4565b9450602091508186013581811115611e7557600080fd5b611e8188828901611cc4565b945050604086013581811115611e9657600080fd5b86019050601f81018713611ea957600080fd5b8035611eb7611ce582611ca0565b81815260059190911b82018301908381019089831115611ed657600080fd5b928401925b82841015611efb57611eec84611dd2565b82529284019290840190611edb565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611f4257835183529284019291840191600101611f26565b50909695505050505050565b600080600060608486031215611f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215611f8c57600080fd5b611b8982611dd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a4857610a48611f95565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061205057612050612006565b92169190910492915050565b67ffffffffffffffff82811682821603908082111561207d5761207d611f95565b5092915050565b81810381811115610a4857610a48611f95565b8051600f81900b8114611df657600080fd5b805167ffffffffffffffff81168114611df657600080fd5b600060a082840312156120d357600080fd5b60405160a0810181811067ffffffffffffffff821117156120f6576120f6611c22565b60405261210283612097565b815261211060208401612097565b6020820152612121604084016120a9565b6040820152612132606084016120a9565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461215a57600080fd5b60808201529392505050565b60006020828403121561217857600080fd5b5051919050565b60008261218e5761218e612006565b500490565b8082028115828204841417610a4857610a48611f9556fea2646970667358221220c90a0eb439d71108544978bf8242a893716df9ecee669e1dfad77aae0c7f38bc64736f6c63430008170033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c80637ee8bfe91161010f578063c88d47f0116100a2578063f0cd64af11610071578063f0cd64af14610524578063f4359ce514610544578063f4da12ba1461054e578063f9572f7c1461055657600080fd5b8063c88d47f0146104bd578063dc87f536146104d0578063e4a28a52146104fb578063ec73d9061461050457600080fd5b8063a18f99ff116100de578063a18f99ff14610492578063a51248031461049a578063beaf44e8146104a2578063c2c4c5c1146104b557600080fd5b80637ee8bfe9146103fb57806385556a951461040e5780638e28764b146104395780639d1750531461046b57600080fd5b806341597036116101875780634f6ffd07116101565780634f6ffd071461036d578063609c6b87146103775780636b39ac1a146103c85780637a75b27e146103db57600080fd5b806341597036146103275780634479b5cf1461033e578063456f099714610351578063482649971461036457600080fd5b80631f850716116101c35780631f8507161461028057806326abaf24146102cc57806327ebf531146102df5780633b766b3d146102ff57600080fd5b806292a596146101f45780630c4232011461021d5780631765ab7f1461024b5780631b98dd9014610260575b600080fd5b610207610202366004611b90565b610569565b6040516102149190611bb2565b60405180910390f35b61023d61022b366004611c09565b60096020526000908152604090205481565b604051908152602001610214565b61025e610259366004611b90565b6106f1565b005b61023d61026e366004611c09565b60076020526000908152604090205481565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b61025e6102da366004611d33565b6107e9565b6102f26102ed366004611c09565b6108b0565b6040516102149190611dbb565b61031261030d366004611c09565b61099c565b60408051928352602083019190915201610214565b600a5460009081526008602052604090205461023d565b61023d61034c366004611b90565b6109ca565b61023d61035f366004611b90565b610a4e565b61023d600a5481565b61023d620d2f0081565b6103ad610385366004611dfb565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b60408051938452602084019290925290820152606001610214565b61025e6103d6366004611dfb565b610ac1565b6103ee6103e9366004611e25565b610c10565b6040516102149190611f0a565b610312610409366004611f4e565b610e64565b61023d61041c366004611dfb565b600460209081526000928352604080842090915290825290205481565b610312610447366004611b90565b60056020908152600092835260408084209091529082529020805460019091015482565b610312610479366004611c09565b6008602052600090815260409020805460019091015482565b61023d610e92565b610207610ea7565b61025e6104b0366004611b90565b610f1a565b61025e610f2d565b6103126104cb366004611f4e565b610f38565b61023d6104de366004611b90565b600660209081526000928352604080842090915290825290205481565b61023d61271081565b61023d610512366004611f7a565b60036020526000908152604090205481565b61023d610532366004611c09565b60016020526000908152604090205481565b61023d62093a8081565b61023d610f46565b61025e610564366004611f4e565b610f72565b6060821580610576575081155b156105ad576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006105b98385611fc4565b60005490915080821115610608576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff81111561062157610621611c22565b60405190808252806020026020018201604052801561066657816020015b604080518082019091526000808252602082015281526020019060019003908161063f5790505b50925060005b848110156106e85760006106808783611fc4565b90506000818154811061069557610695611fd7565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508583815181106106d4576106d4611fd7565b60209081029190910101525060010161066c565b50505092915050565b81610728576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461073e600267ffffffffffffffff612035565b610748919061205c565b67ffffffffffffffff16106107c75780602461076d600267ffffffffffffffff612035565b610777919061205c565b61078c9067ffffffffffffffff166001611fc4565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60408051808201909152828152602081018290526107e481611654565b505050565b815183511415806107fc57508051835114155b1561084057825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60005b83518110156108aa576108a284828151811061086157610861611fd7565b602002602001015184838151811061087b5761087b611fd7565b602002602001015184848151811061089557610895611fd7565b6020026020010151610f72565b600101610843565b50505050565b6040805180820190915260008082526020820152600080546108d490600190612084565b905082600003610910576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610954576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105ff565b6000838154811061096757610967611fd7565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b600081815481106109ac57600080fd5b60009182526020909120600290910201805460019091015490915082565b6040805180820182528381526020808201849052915160009283916109f191849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526005835281812060078452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610a7591849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600190925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610b0e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610b48576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610b5d600267ffffffffffffffff612035565b610b67919061205c565b67ffffffffffffffff16811115610bdd57806024610b8e600267ffffffffffffffff612035565b610b98919061205c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff1660248201526044016105ff565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526107e481611654565b606082518451141580610c2557508151845114155b15610c6957835183516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b835167ffffffffffffffff811115610c8357610c83611c22565b604051908082528060200260200182016040528015610cac578160200160208202803683370190505b50905060005b8451811015610e5c5760006040518060400160405280878481518110610cda57610cda611fd7565b60200260200101518152602001868481518110610cf957610cf9611fd7565b60200260200101518152509050600081604051602001610d199190611dbb565b6040516020818303038152906040528051906020012090506001600082815260200190815260200160002054600003610dbd57868381518110610d5e57610d5e611fd7565b6020026020010151868481518110610d7857610d78611fd7565b60200260200101516040517f31b05a800000000000000000000000000000000000000000000000000000000081526004016105ff929190918252602082015260400190565b620d2f0060046000878681518110610dd757610dd7611fd7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610e359190611fc4565b848481518110610e4757610e47611fd7565b60209081029190910101525050600101610cb2565b509392505050565b600080610e7185856117ee565b50610e7a6119b5565b50610e86858585611ab5565b90969095509350505050565b60008054610ea290600190612084565b905090565b60606000805480602002602001604051908101604052809291908181526020016000905b82821015610f1157838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610ecb565b50505050905090565b610f2482826117ee565b506107e46119b5565b610f356119b5565b50565b600080610e86858585611ab5565b6024610f5b600267ffffffffffffffff612035565b610f65919061205c565b67ffffffffffffffff1681565b6000604051806040016040528085815260200184815250604051602001610f999190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906120c1565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612166565b9050600062093a808061115e8142611fc4565b611168919061217f565b6111729190612193565b90508181106111bd576040517fd78507e100000000000000000000000000000000000000000000000000000000815233600482015260248101839052604481018290526064016105ff565b612710851115611204576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810186905261271060248201526044016105ff565b33600090815260046020908152604080832087845290915281205461122d90620d2f0090611fc4565b905042811115611278576040517f17601765000000000000000000000000000000000000000000000000000000008152336004820152426024820152604481018290526064016105ff565b33600090815260026020818152604080842089855282528084208151606081018352815481526001820154938101939093529092015491810182905291908410156112dc578382604001516112cd9190612084565b82516112d99190612193565b90505b600060405180606001604052806127108b8a6112f89190612193565b611302919061217f565b8152602081018b90526040018790529050600061131f8688612084565b825161132b9190612193565b336000908152600360209081526040909120548682015191850151929350916113549083611fc4565b61135e9190612084565b33600090815260036020526040902081905590506127108111156113b9576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016105ff565b6113d7826113c78f8f6117ee565b6113d19190611fc4565b85611b6f565b60008b81526005602090815260408083208b84529091529020556113fd826113c76119b5565b60008881526008602052604090819020919091558501518710156114a257825160008b81526005602090815260408083208b845290915290206001015461144e9161144791611fc4565b8651611b6f565b60008b81526005602090815260408083208b84528252808320600190810194909455865160089092529091209091015461148b9161144791611fc4565b6000888152600860205260409020600101556114fe565b825160008b81526005602090815260408083208b8452909152812060010180549091906114d0908490611fc4565b90915550508251600088815260086020526040812060010180549091906114f8908490611fc4565b90915550505b428560400151111561156857845160008b8152600660209081526040808320818a0151845290915281208054909190611538908490612084565b90915550508451604080870151600090815260096020529081208054909190611562908490612084565b90915550505b825160008b815260066020908152604080832081880151845290915281208054909190611596908490611fc4565b909155505082516040808501516000908152600960205290812080549091906115c0908490611fc4565b90915550503360008181526002602081815260408084208f855282528084208851815582890151600182015581890151930192909255838352600481528183208e845281529181902042905580518f81529182018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b6000816040516020016116679190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526001909352912054909150156116f457815160208301516040517f5855e248000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60008054828252600160208181526040842083905590820183558280528451600283027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810191909155908501517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101559062093a80806117778142611fc4565b611781919061217f565b61178b9190612193565b6000848152600760209081526040918290208390558651878201518351918252918101919091529081018490529091507feb6eb71567385579529ebbf34681085c503a5dbf2bc360a6dbec0db2e1ab8edc9060600160405180910390a150505050565b60408051808201825283815260208082018490529151600092839161181591849101611dbb565b604051602081830303815290604052805190602001209050600160008281526020019081526020016000205460000361188a57815160208301516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b600081815260076020908152604080832054600583528184208185528352818420825180840190935280548352600101549282019290925290915b6101f48110156119a9574283116119a9576118e362093a8084611fc4565b9250600062093a8083602001516118fa9190612193565b9050808360000151111561195457808360000181815161191a9190612084565b9052506000858152600660209081526040808320878452825290912054908401805182919061194a908390612084565b90525061195f9050565b600080845260208401525b600085815260056020908152604080832087845282529091208451815590840151600190910155428411156119a05760008581526007602052604090208490555b506001016118c5565b50519695505050505050565b600a5460008181526008602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611aad57428311611aad57611a0362093a8084611fc4565b9250600062093a808360200151611a1a9190612193565b90508083600001511115611a6c578083600001818151611a3a9190612084565b9052506000848152600960209081526040909120549084018051829190611a62908390612084565b905250611a779050565b600080845260208401525b6000848152600860209081526040909120845181559084015160019091015542841115611aa457600a8490555b506001016119e5565b505192915050565b6000808062093a80611ac7818661217f565b611ad19190612193565b600081815260086020908152604080832054815180830183528b81528084018b9052915190965093945092611b0891849101611dbb565b6040516020818303038152906040528051906020012090506000841115611b6457600081815260056020908152604080832086845290915290205484611b5682670de0b6b3a7640000612193565b611b60919061217f565b9550505b505050935093915050565b6000818311611b7f576000611b89565b611b898284612084565b9392505050565b60008060408385031215611ba357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015611bfc57611bec84835180518252602090810151910152565b9284019290850190600101611bcf565b5091979650505050505050565b600060208284031215611c1b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c9857611c98611c22565b604052919050565b600067ffffffffffffffff821115611cba57611cba611c22565b5060051b60200190565b600082601f830112611cd557600080fd5b81356020611cea611ce583611ca0565b611c51565b8083825260208201915060208460051b870101935086841115611d0c57600080fd5b602086015b84811015611d285780358352918301918301611d11565b509695505050505050565b600080600060608486031215611d4857600080fd5b833567ffffffffffffffff80821115611d6057600080fd5b611d6c87838801611cc4565b94506020860135915080821115611d8257600080fd5b611d8e87838801611cc4565b93506040860135915080821115611da457600080fd5b50611db186828701611cc4565b9150509250925092565b815181526020808301519082015260408101610a48565b803573ffffffffffffffffffffffffffffffffffffffff81168114611df657600080fd5b919050565b60008060408385031215611e0e57600080fd5b611e1783611dd2565b946020939093013593505050565b600080600060608486031215611e3a57600080fd5b833567ffffffffffffffff80821115611e5257600080fd5b611e5e87838801611cc4565b9450602091508186013581811115611e7557600080fd5b611e8188828901611cc4565b945050604086013581811115611e9657600080fd5b86019050601f81018713611ea957600080fd5b8035611eb7611ce582611ca0565b81815260059190911b82018301908381019089831115611ed657600080fd5b928401925b82841015611efb57611eec84611dd2565b82529284019290840190611edb565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611f4257835183529284019291840191600101611f26565b50909695505050505050565b600080600060608486031215611f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215611f8c57600080fd5b611b8982611dd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a4857610a48611f95565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061205057612050612006565b92169190910492915050565b67ffffffffffffffff82811682821603908082111561207d5761207d611f95565b5092915050565b81810381811115610a4857610a48611f95565b8051600f81900b8114611df657600080fd5b805167ffffffffffffffff81168114611df657600080fd5b600060a082840312156120d357600080fd5b60405160a0810181811067ffffffffffffffff821117156120f6576120f6611c22565b60405261210283612097565b815261211060208401612097565b6020820152612121604084016120a9565b6040820152612132606084016120a9565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461215a57600080fd5b60808201529392505050565b60006020828403121561217857600080fd5b5051919050565b60008261218e5761218e612006565b500490565b8082028115828204841417610a4857610a48611f9556fea2646970667358221220c90a0eb439d71108544978bf8242a893716df9ecee669e1dfad77aae0c7f38bc64736f6c63430008170033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index cd748d2..fa6ef94 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -19,7 +19,6 @@ describe("Voting Escrow OLAS", function () { const oneOLASBalance = ethers.utils.parseEther("1"); const AddressZero = ethers.constants.AddressZero; const HashZero = ethers.constants.HashZero; - const maxU256 = ethers.constants.MaxUint256; function getNextTime(ts) { return Math.floor((ts + oneWeek) / oneWeek) * oneWeek; From be9a80b39c4192cce6bf5a68555083e24a6da692 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Wed, 8 May 2024 13:27:07 +0100 Subject: [PATCH 10/14] feat: remove nominee --- abis/0.8.23/VoteWeighting.json | 77 ++++++++++++++++++++++++++++------ contracts/VoteWeighting.sol | 71 +++++++++++++++++++++++++++++-- 2 files changed, 131 insertions(+), 17 deletions(-) diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json index fe7e085..08ad0f5 100644 --- a/abis/0.8.23/VoteWeighting.json +++ b/abis/0.8.23/VoteWeighting.json @@ -315,7 +315,7 @@ "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "bytes32", "name": "account", "type": "bytes32" @@ -333,7 +333,20 @@ "type": "uint256" } ], - "name": "NewNominee", + "name": "AddNominee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerUpdated", "type": "event" }, { @@ -342,7 +355,7 @@ { "indexed": true, "internalType": "bytes32", - "name": "nominee", + "name": "account", "type": "bytes32" }, { @@ -354,17 +367,11 @@ { "indexed": false, "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalWeight", + "name": "newSum", "type": "uint256" } ], - "name": "NewNomineeWeight", + "name": "RemoveNominee", "type": "event" }, { @@ -486,6 +493,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -860,6 +880,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -913,6 +946,24 @@ "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": [ { @@ -1082,8 +1133,8 @@ "type": "function" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200238e3803806200238e833981016040819052620000349162000103565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811660805262093a8062000079814262000135565b62000085919062000158565b600a555060408051808201909152600080825260208201818152815460018101835591805291517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56360029092029182015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5649091015562000184565b6000602082840312156200011657600080fd5b81516001600160a01b03811681146200012e57600080fd5b9392505050565b6000826200015357634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200017e57634e487b7160e01b600052601160045260246000fd5b92915050565b6080516121e0620001ae600039600081816102850152818161101501526110e001526121e06000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80637ee8bfe91161010f578063c88d47f0116100a2578063f0cd64af11610071578063f0cd64af14610524578063f4359ce514610544578063f4da12ba1461054e578063f9572f7c1461055657600080fd5b8063c88d47f0146104bd578063dc87f536146104d0578063e4a28a52146104fb578063ec73d9061461050457600080fd5b8063a18f99ff116100de578063a18f99ff14610492578063a51248031461049a578063beaf44e8146104a2578063c2c4c5c1146104b557600080fd5b80637ee8bfe9146103fb57806385556a951461040e5780638e28764b146104395780639d1750531461046b57600080fd5b806341597036116101875780634f6ffd07116101565780634f6ffd071461036d578063609c6b87146103775780636b39ac1a146103c85780637a75b27e146103db57600080fd5b806341597036146103275780634479b5cf1461033e578063456f099714610351578063482649971461036457600080fd5b80631f850716116101c35780631f8507161461028057806326abaf24146102cc57806327ebf531146102df5780633b766b3d146102ff57600080fd5b806292a596146101f45780630c4232011461021d5780631765ab7f1461024b5780631b98dd9014610260575b600080fd5b610207610202366004611b90565b610569565b6040516102149190611bb2565b60405180910390f35b61023d61022b366004611c09565b60096020526000908152604090205481565b604051908152602001610214565b61025e610259366004611b90565b6106f1565b005b61023d61026e366004611c09565b60076020526000908152604090205481565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b61025e6102da366004611d33565b6107e9565b6102f26102ed366004611c09565b6108b0565b6040516102149190611dbb565b61031261030d366004611c09565b61099c565b60408051928352602083019190915201610214565b600a5460009081526008602052604090205461023d565b61023d61034c366004611b90565b6109ca565b61023d61035f366004611b90565b610a4e565b61023d600a5481565b61023d620d2f0081565b6103ad610385366004611dfb565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b60408051938452602084019290925290820152606001610214565b61025e6103d6366004611dfb565b610ac1565b6103ee6103e9366004611e25565b610c10565b6040516102149190611f0a565b610312610409366004611f4e565b610e64565b61023d61041c366004611dfb565b600460209081526000928352604080842090915290825290205481565b610312610447366004611b90565b60056020908152600092835260408084209091529082529020805460019091015482565b610312610479366004611c09565b6008602052600090815260409020805460019091015482565b61023d610e92565b610207610ea7565b61025e6104b0366004611b90565b610f1a565b61025e610f2d565b6103126104cb366004611f4e565b610f38565b61023d6104de366004611b90565b600660209081526000928352604080842090915290825290205481565b61023d61271081565b61023d610512366004611f7a565b60036020526000908152604090205481565b61023d610532366004611c09565b60016020526000908152604090205481565b61023d62093a8081565b61023d610f46565b61025e610564366004611f4e565b610f72565b6060821580610576575081155b156105ad576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006105b98385611fc4565b60005490915080821115610608576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff81111561062157610621611c22565b60405190808252806020026020018201604052801561066657816020015b604080518082019091526000808252602082015281526020019060019003908161063f5790505b50925060005b848110156106e85760006106808783611fc4565b90506000818154811061069557610695611fd7565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508583815181106106d4576106d4611fd7565b60209081029190910101525060010161066c565b50505092915050565b81610728576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461073e600267ffffffffffffffff612035565b610748919061205c565b67ffffffffffffffff16106107c75780602461076d600267ffffffffffffffff612035565b610777919061205c565b61078c9067ffffffffffffffff166001611fc4565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60408051808201909152828152602081018290526107e481611654565b505050565b815183511415806107fc57508051835114155b1561084057825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60005b83518110156108aa576108a284828151811061086157610861611fd7565b602002602001015184838151811061087b5761087b611fd7565b602002602001015184848151811061089557610895611fd7565b6020026020010151610f72565b600101610843565b50505050565b6040805180820190915260008082526020820152600080546108d490600190612084565b905082600003610910576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610954576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105ff565b6000838154811061096757610967611fd7565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b600081815481106109ac57600080fd5b60009182526020909120600290910201805460019091015490915082565b6040805180820182528381526020808201849052915160009283916109f191849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526005835281812060078452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610a7591849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600190925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610b0e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610b48576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610b5d600267ffffffffffffffff612035565b610b67919061205c565b67ffffffffffffffff16811115610bdd57806024610b8e600267ffffffffffffffff612035565b610b98919061205c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff1660248201526044016105ff565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526107e481611654565b606082518451141580610c2557508151845114155b15610c6957835183516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b835167ffffffffffffffff811115610c8357610c83611c22565b604051908082528060200260200182016040528015610cac578160200160208202803683370190505b50905060005b8451811015610e5c5760006040518060400160405280878481518110610cda57610cda611fd7565b60200260200101518152602001868481518110610cf957610cf9611fd7565b60200260200101518152509050600081604051602001610d199190611dbb565b6040516020818303038152906040528051906020012090506001600082815260200190815260200160002054600003610dbd57868381518110610d5e57610d5e611fd7565b6020026020010151868481518110610d7857610d78611fd7565b60200260200101516040517f31b05a800000000000000000000000000000000000000000000000000000000081526004016105ff929190918252602082015260400190565b620d2f0060046000878681518110610dd757610dd7611fd7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610e359190611fc4565b848481518110610e4757610e47611fd7565b60209081029190910101525050600101610cb2565b509392505050565b600080610e7185856117ee565b50610e7a6119b5565b50610e86858585611ab5565b90969095509350505050565b60008054610ea290600190612084565b905090565b60606000805480602002602001604051908101604052809291908181526020016000905b82821015610f1157838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610ecb565b50505050905090565b610f2482826117ee565b506107e46119b5565b610f356119b5565b50565b600080610e86858585611ab5565b6024610f5b600267ffffffffffffffff612035565b610f65919061205c565b67ffffffffffffffff1681565b6000604051806040016040528085815260200184815250604051602001610f999190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906120c1565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612166565b9050600062093a808061115e8142611fc4565b611168919061217f565b6111729190612193565b90508181106111bd576040517fd78507e100000000000000000000000000000000000000000000000000000000815233600482015260248101839052604481018290526064016105ff565b612710851115611204576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810186905261271060248201526044016105ff565b33600090815260046020908152604080832087845290915281205461122d90620d2f0090611fc4565b905042811115611278576040517f17601765000000000000000000000000000000000000000000000000000000008152336004820152426024820152604481018290526064016105ff565b33600090815260026020818152604080842089855282528084208151606081018352815481526001820154938101939093529092015491810182905291908410156112dc578382604001516112cd9190612084565b82516112d99190612193565b90505b600060405180606001604052806127108b8a6112f89190612193565b611302919061217f565b8152602081018b90526040018790529050600061131f8688612084565b825161132b9190612193565b336000908152600360209081526040909120548682015191850151929350916113549083611fc4565b61135e9190612084565b33600090815260036020526040902081905590506127108111156113b9576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016105ff565b6113d7826113c78f8f6117ee565b6113d19190611fc4565b85611b6f565b60008b81526005602090815260408083208b84529091529020556113fd826113c76119b5565b60008881526008602052604090819020919091558501518710156114a257825160008b81526005602090815260408083208b845290915290206001015461144e9161144791611fc4565b8651611b6f565b60008b81526005602090815260408083208b84528252808320600190810194909455865160089092529091209091015461148b9161144791611fc4565b6000888152600860205260409020600101556114fe565b825160008b81526005602090815260408083208b8452909152812060010180549091906114d0908490611fc4565b90915550508251600088815260086020526040812060010180549091906114f8908490611fc4565b90915550505b428560400151111561156857845160008b8152600660209081526040808320818a0151845290915281208054909190611538908490612084565b90915550508451604080870151600090815260096020529081208054909190611562908490612084565b90915550505b825160008b815260066020908152604080832081880151845290915281208054909190611596908490611fc4565b909155505082516040808501516000908152600960205290812080549091906115c0908490611fc4565b90915550503360008181526002602081815260408084208f855282528084208851815582890151600182015581890151930192909255838352600481528183208e845281529181902042905580518f81529182018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b6000816040516020016116679190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526001909352912054909150156116f457815160208301516040517f5855e248000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60008054828252600160208181526040842083905590820183558280528451600283027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810191909155908501517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101559062093a80806117778142611fc4565b611781919061217f565b61178b9190612193565b6000848152600760209081526040918290208390558651878201518351918252918101919091529081018490529091507feb6eb71567385579529ebbf34681085c503a5dbf2bc360a6dbec0db2e1ab8edc9060600160405180910390a150505050565b60408051808201825283815260208082018490529151600092839161181591849101611dbb565b604051602081830303815290604052805190602001209050600160008281526020019081526020016000205460000361188a57815160208301516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b600081815260076020908152604080832054600583528184208185528352818420825180840190935280548352600101549282019290925290915b6101f48110156119a9574283116119a9576118e362093a8084611fc4565b9250600062093a8083602001516118fa9190612193565b9050808360000151111561195457808360000181815161191a9190612084565b9052506000858152600660209081526040808320878452825290912054908401805182919061194a908390612084565b90525061195f9050565b600080845260208401525b600085815260056020908152604080832087845282529091208451815590840151600190910155428411156119a05760008581526007602052604090208490555b506001016118c5565b50519695505050505050565b600a5460008181526008602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611aad57428311611aad57611a0362093a8084611fc4565b9250600062093a808360200151611a1a9190612193565b90508083600001511115611a6c578083600001818151611a3a9190612084565b9052506000848152600960209081526040909120549084018051829190611a62908390612084565b905250611a779050565b600080845260208401525b6000848152600860209081526040909120845181559084015160019091015542841115611aa457600a8490555b506001016119e5565b505192915050565b6000808062093a80611ac7818661217f565b611ad19190612193565b600081815260086020908152604080832054815180830183528b81528084018b9052915190965093945092611b0891849101611dbb565b6040516020818303038152906040528051906020012090506000841115611b6457600081815260056020908152604080832086845290915290205484611b5682670de0b6b3a7640000612193565b611b60919061217f565b9550505b505050935093915050565b6000818311611b7f576000611b89565b611b898284612084565b9392505050565b60008060408385031215611ba357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015611bfc57611bec84835180518252602090810151910152565b9284019290850190600101611bcf565b5091979650505050505050565b600060208284031215611c1b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c9857611c98611c22565b604052919050565b600067ffffffffffffffff821115611cba57611cba611c22565b5060051b60200190565b600082601f830112611cd557600080fd5b81356020611cea611ce583611ca0565b611c51565b8083825260208201915060208460051b870101935086841115611d0c57600080fd5b602086015b84811015611d285780358352918301918301611d11565b509695505050505050565b600080600060608486031215611d4857600080fd5b833567ffffffffffffffff80821115611d6057600080fd5b611d6c87838801611cc4565b94506020860135915080821115611d8257600080fd5b611d8e87838801611cc4565b93506040860135915080821115611da457600080fd5b50611db186828701611cc4565b9150509250925092565b815181526020808301519082015260408101610a48565b803573ffffffffffffffffffffffffffffffffffffffff81168114611df657600080fd5b919050565b60008060408385031215611e0e57600080fd5b611e1783611dd2565b946020939093013593505050565b600080600060608486031215611e3a57600080fd5b833567ffffffffffffffff80821115611e5257600080fd5b611e5e87838801611cc4565b9450602091508186013581811115611e7557600080fd5b611e8188828901611cc4565b945050604086013581811115611e9657600080fd5b86019050601f81018713611ea957600080fd5b8035611eb7611ce582611ca0565b81815260059190911b82018301908381019089831115611ed657600080fd5b928401925b82841015611efb57611eec84611dd2565b82529284019290840190611edb565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611f4257835183529284019291840191600101611f26565b50909695505050505050565b600080600060608486031215611f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215611f8c57600080fd5b611b8982611dd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a4857610a48611f95565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061205057612050612006565b92169190910492915050565b67ffffffffffffffff82811682821603908082111561207d5761207d611f95565b5092915050565b81810381811115610a4857610a48611f95565b8051600f81900b8114611df657600080fd5b805167ffffffffffffffff81168114611df657600080fd5b600060a082840312156120d357600080fd5b60405160a0810181811067ffffffffffffffff821117156120f6576120f6611c22565b60405261210283612097565b815261211060208401612097565b6020820152612121604084016120a9565b6040820152612132606084016120a9565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461215a57600080fd5b60808201529392505050565b60006020828403121561217857600080fd5b5051919050565b60008261218e5761218e612006565b500490565b8082028115828204841417610a4857610a48611f9556fea2646970667358221220c90a0eb439d71108544978bf8242a893716df9ecee669e1dfad77aae0c7f38bc64736f6c63430008170033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c80637ee8bfe91161010f578063c88d47f0116100a2578063f0cd64af11610071578063f0cd64af14610524578063f4359ce514610544578063f4da12ba1461054e578063f9572f7c1461055657600080fd5b8063c88d47f0146104bd578063dc87f536146104d0578063e4a28a52146104fb578063ec73d9061461050457600080fd5b8063a18f99ff116100de578063a18f99ff14610492578063a51248031461049a578063beaf44e8146104a2578063c2c4c5c1146104b557600080fd5b80637ee8bfe9146103fb57806385556a951461040e5780638e28764b146104395780639d1750531461046b57600080fd5b806341597036116101875780634f6ffd07116101565780634f6ffd071461036d578063609c6b87146103775780636b39ac1a146103c85780637a75b27e146103db57600080fd5b806341597036146103275780634479b5cf1461033e578063456f099714610351578063482649971461036457600080fd5b80631f850716116101c35780631f8507161461028057806326abaf24146102cc57806327ebf531146102df5780633b766b3d146102ff57600080fd5b806292a596146101f45780630c4232011461021d5780631765ab7f1461024b5780631b98dd9014610260575b600080fd5b610207610202366004611b90565b610569565b6040516102149190611bb2565b60405180910390f35b61023d61022b366004611c09565b60096020526000908152604090205481565b604051908152602001610214565b61025e610259366004611b90565b6106f1565b005b61023d61026e366004611c09565b60076020526000908152604090205481565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b61025e6102da366004611d33565b6107e9565b6102f26102ed366004611c09565b6108b0565b6040516102149190611dbb565b61031261030d366004611c09565b61099c565b60408051928352602083019190915201610214565b600a5460009081526008602052604090205461023d565b61023d61034c366004611b90565b6109ca565b61023d61035f366004611b90565b610a4e565b61023d600a5481565b61023d620d2f0081565b6103ad610385366004611dfb565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b60408051938452602084019290925290820152606001610214565b61025e6103d6366004611dfb565b610ac1565b6103ee6103e9366004611e25565b610c10565b6040516102149190611f0a565b610312610409366004611f4e565b610e64565b61023d61041c366004611dfb565b600460209081526000928352604080842090915290825290205481565b610312610447366004611b90565b60056020908152600092835260408084209091529082529020805460019091015482565b610312610479366004611c09565b6008602052600090815260409020805460019091015482565b61023d610e92565b610207610ea7565b61025e6104b0366004611b90565b610f1a565b61025e610f2d565b6103126104cb366004611f4e565b610f38565b61023d6104de366004611b90565b600660209081526000928352604080842090915290825290205481565b61023d61271081565b61023d610512366004611f7a565b60036020526000908152604090205481565b61023d610532366004611c09565b60016020526000908152604090205481565b61023d62093a8081565b61023d610f46565b61025e610564366004611f4e565b610f72565b6060821580610576575081155b156105ad576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006105b98385611fc4565b60005490915080821115610608576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff81111561062157610621611c22565b60405190808252806020026020018201604052801561066657816020015b604080518082019091526000808252602082015281526020019060019003908161063f5790505b50925060005b848110156106e85760006106808783611fc4565b90506000818154811061069557610695611fd7565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508583815181106106d4576106d4611fd7565b60209081029190910101525060010161066c565b50505092915050565b81610728576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602461073e600267ffffffffffffffff612035565b610748919061205c565b67ffffffffffffffff16106107c75780602461076d600267ffffffffffffffff612035565b610777919061205c565b61078c9067ffffffffffffffff166001611fc4565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60408051808201909152828152602081018290526107e481611654565b505050565b815183511415806107fc57508051835114155b1561084057825181516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60005b83518110156108aa576108a284828151811061086157610861611fd7565b602002602001015184838151811061087b5761087b611fd7565b602002602001015184848151811061089557610895611fd7565b6020026020010151610f72565b600101610843565b50505050565b6040805180820190915260008082526020820152600080546108d490600190612084565b905082600003610910576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610954576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105ff565b6000838154811061096757610967611fd7565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b600081815481106109ac57600080fd5b60009182526020909120600290910201805460019091015490915082565b6040805180820182528381526020808201849052915160009283916109f191849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526005835281812060078452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610a7591849101611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600190925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610b0e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610b48576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610b5d600267ffffffffffffffff612035565b610b67919061205c565b67ffffffffffffffff16811115610bdd57806024610b8e600267ffffffffffffffff612035565b610b98919061205c565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff1660248201526044016105ff565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526107e481611654565b606082518451141580610c2557508151845114155b15610c6957835183516040517f8151c110000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b835167ffffffffffffffff811115610c8357610c83611c22565b604051908082528060200260200182016040528015610cac578160200160208202803683370190505b50905060005b8451811015610e5c5760006040518060400160405280878481518110610cda57610cda611fd7565b60200260200101518152602001868481518110610cf957610cf9611fd7565b60200260200101518152509050600081604051602001610d199190611dbb565b6040516020818303038152906040528051906020012090506001600082815260200190815260200160002054600003610dbd57868381518110610d5e57610d5e611fd7565b6020026020010151868481518110610d7857610d78611fd7565b60200260200101516040517f31b05a800000000000000000000000000000000000000000000000000000000081526004016105ff929190918252602082015260400190565b620d2f0060046000878681518110610dd757610dd7611fd7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610e359190611fc4565b848481518110610e4757610e47611fd7565b60209081029190910101525050600101610cb2565b509392505050565b600080610e7185856117ee565b50610e7a6119b5565b50610e86858585611ab5565b90969095509350505050565b60008054610ea290600190612084565b905090565b60606000805480602002602001604051908101604052809291908181526020016000905b82821015610f1157838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610ecb565b50505050905090565b610f2482826117ee565b506107e46119b5565b610f356119b5565b50565b600080610e86858585611ab5565b6024610f5b600267ffffffffffffffff612035565b610f65919061205c565b67ffffffffffffffff1681565b6000604051806040016040528085815260200184815250604051602001610f999190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906120c1565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612166565b9050600062093a808061115e8142611fc4565b611168919061217f565b6111729190612193565b90508181106111bd576040517fd78507e100000000000000000000000000000000000000000000000000000000815233600482015260248101839052604481018290526064016105ff565b612710851115611204576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810186905261271060248201526044016105ff565b33600090815260046020908152604080832087845290915281205461122d90620d2f0090611fc4565b905042811115611278576040517f17601765000000000000000000000000000000000000000000000000000000008152336004820152426024820152604481018290526064016105ff565b33600090815260026020818152604080842089855282528084208151606081018352815481526001820154938101939093529092015491810182905291908410156112dc578382604001516112cd9190612084565b82516112d99190612193565b90505b600060405180606001604052806127108b8a6112f89190612193565b611302919061217f565b8152602081018b90526040018790529050600061131f8688612084565b825161132b9190612193565b336000908152600360209081526040909120548682015191850151929350916113549083611fc4565b61135e9190612084565b33600090815260036020526040902081905590506127108111156113b9576040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016105ff565b6113d7826113c78f8f6117ee565b6113d19190611fc4565b85611b6f565b60008b81526005602090815260408083208b84529091529020556113fd826113c76119b5565b60008881526008602052604090819020919091558501518710156114a257825160008b81526005602090815260408083208b845290915290206001015461144e9161144791611fc4565b8651611b6f565b60008b81526005602090815260408083208b84528252808320600190810194909455865160089092529091209091015461148b9161144791611fc4565b6000888152600860205260409020600101556114fe565b825160008b81526005602090815260408083208b8452909152812060010180549091906114d0908490611fc4565b90915550508251600088815260086020526040812060010180549091906114f8908490611fc4565b90915550505b428560400151111561156857845160008b8152600660209081526040808320818a0151845290915281208054909190611538908490612084565b90915550508451604080870151600090815260096020529081208054909190611562908490612084565b90915550505b825160008b815260066020908152604080832081880151845290915281208054909190611596908490611fc4565b909155505082516040808501516000908152600960205290812080549091906115c0908490611fc4565b90915550503360008181526002602081815260408084208f855282528084208851815582890151600182015581890151930192909255838352600481528183208e845281529181902042905580518f81529182018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b6000816040516020016116679190611dbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526001909352912054909150156116f457815160208301516040517f5855e248000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b60008054828252600160208181526040842083905590820183558280528451600283027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810191909155908501517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101559062093a80806117778142611fc4565b611781919061217f565b61178b9190612193565b6000848152600760209081526040918290208390558651878201518351918252918101919091529081018490529091507feb6eb71567385579529ebbf34681085c503a5dbf2bc360a6dbec0db2e1ab8edc9060600160405180910390a150505050565b60408051808201825283815260208082018490529151600092839161181591849101611dbb565b604051602081830303815290604052805190602001209050600160008281526020019081526020016000205460000361188a57815160208301516040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105ff565b600081815260076020908152604080832054600583528184208185528352818420825180840190935280548352600101549282019290925290915b6101f48110156119a9574283116119a9576118e362093a8084611fc4565b9250600062093a8083602001516118fa9190612193565b9050808360000151111561195457808360000181815161191a9190612084565b9052506000858152600660209081526040808320878452825290912054908401805182919061194a908390612084565b90525061195f9050565b600080845260208401525b600085815260056020908152604080832087845282529091208451815590840151600190910155428411156119a05760008581526007602052604090208490555b506001016118c5565b50519695505050505050565b600a5460008181526008602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611aad57428311611aad57611a0362093a8084611fc4565b9250600062093a808360200151611a1a9190612193565b90508083600001511115611a6c578083600001818151611a3a9190612084565b9052506000848152600960209081526040909120549084018051829190611a62908390612084565b905250611a779050565b600080845260208401525b6000848152600860209081526040909120845181559084015160019091015542841115611aa457600a8490555b506001016119e5565b505192915050565b6000808062093a80611ac7818661217f565b611ad19190612193565b600081815260086020908152604080832054815180830183528b81528084018b9052915190965093945092611b0891849101611dbb565b6040516020818303038152906040528051906020012090506000841115611b6457600081815260056020908152604080832086845290915290205484611b5682670de0b6b3a7640000612193565b611b60919061217f565b9550505b505050935093915050565b6000818311611b7f576000611b89565b611b898284612084565b9392505050565b60008060408385031215611ba357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015611bfc57611bec84835180518252602090810151910152565b9284019290850190600101611bcf565b5091979650505050505050565b600060208284031215611c1b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c9857611c98611c22565b604052919050565b600067ffffffffffffffff821115611cba57611cba611c22565b5060051b60200190565b600082601f830112611cd557600080fd5b81356020611cea611ce583611ca0565b611c51565b8083825260208201915060208460051b870101935086841115611d0c57600080fd5b602086015b84811015611d285780358352918301918301611d11565b509695505050505050565b600080600060608486031215611d4857600080fd5b833567ffffffffffffffff80821115611d6057600080fd5b611d6c87838801611cc4565b94506020860135915080821115611d8257600080fd5b611d8e87838801611cc4565b93506040860135915080821115611da457600080fd5b50611db186828701611cc4565b9150509250925092565b815181526020808301519082015260408101610a48565b803573ffffffffffffffffffffffffffffffffffffffff81168114611df657600080fd5b919050565b60008060408385031215611e0e57600080fd5b611e1783611dd2565b946020939093013593505050565b600080600060608486031215611e3a57600080fd5b833567ffffffffffffffff80821115611e5257600080fd5b611e5e87838801611cc4565b9450602091508186013581811115611e7557600080fd5b611e8188828901611cc4565b945050604086013581811115611e9657600080fd5b86019050601f81018713611ea957600080fd5b8035611eb7611ce582611ca0565b81815260059190911b82018301908381019089831115611ed657600080fd5b928401925b82841015611efb57611eec84611dd2565b82529284019290840190611edb565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611f4257835183529284019291840191600101611f26565b50909695505050505050565b600080600060608486031215611f6357600080fd5b505081359360208301359350604090920135919050565b600060208284031215611f8c57600080fd5b611b8982611dd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a4857610a48611f95565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061205057612050612006565b92169190910492915050565b67ffffffffffffffff82811682821603908082111561207d5761207d611f95565b5092915050565b81810381811115610a4857610a48611f95565b8051600f81900b8114611df657600080fd5b805167ffffffffffffffff81168114611df657600080fd5b600060a082840312156120d357600080fd5b60405160a0810181811067ffffffffffffffff821117156120f6576120f6611c22565b60405261210283612097565b815261211060208401612097565b6020820152612121604084016120a9565b6040820152612132606084016120a9565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461215a57600080fd5b60808201529392505050565b60006020828403121561217857600080fd5b5051919050565b60008261218e5761218e612006565b500490565b8082028115828204841417610a4857610a48611f9556fea2646970667358221220c90a0eb439d71108544978bf8242a893716df9ecee669e1dfad77aae0c7f38bc64736f6c63430008170033", + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620028b8380380620028b8833981016040819052620000349162000115565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b814262000147565b6200009791906200016a565b600b555060408051808201909152600080825260208201818152600180548082018255925291517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf660029092029182015590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf79091015562000196565b6000602082840312156200012857600080fd5b81516001600160a01b03811681146200014057600080fd5b9392505050565b6000826200016557634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019057634e487b7160e01b600052601160045260246000fd5b92915050565b6080516126f8620001c0600039600081816102d60152818161150a01526115d501526126f86000f3fe608060405234801561001057600080fd5b50600436106102405760003560e01c806385556a9511610145578063c54dd0d4116100bd578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146105df578063f4da12ba146105e9578063f9572f7c146105f157600080fd5b8063ec73d9061461059f578063f0cd64af146105bf57600080fd5b8063c54dd0d414610545578063c88d47f014610558578063dc87f5361461056b578063e4a28a521461059657600080fd5b8063a18f99ff11610114578063a6f9dae1116100f9578063a6f9dae114610517578063beaf44e81461052a578063c2c4c5c11461053d57600080fd5b8063a18f99ff14610507578063a51248031461050f57600080fd5b806385556a95146104635780638da5cb5b1461048e5780638e28764b146104ae5780639d175053146104e057600080fd5b806341597036116101d85780634f6ffd07116101a75780636b39ac1a1161018c5780636b39ac1a1461041d5780637a75b27e146104305780637ee8bfe91461045057600080fd5b80634f6ffd07146103be578063609c6b87146103c857600080fd5b806341597036146103785780634479b5cf1461038f578063456f0997146103a257806348264997146103b557600080fd5b80631f850716116102145780631f850716146102d157806326abaf241461031d57806327ebf531146103305780633b766b3d1461035057600080fd5b806292a596146102455780630c4232011461026e5780631765ab7f1461029c5780631b98dd90146102b1575b600080fd5b610258610253366004612079565b610604565b604051610265919061209b565b60405180910390f35b61028e61027c3660046120f2565b600a6020526000908152604090205481565b604051908152602001610265565b6102af6102aa366004612079565b61078c565b005b61028e6102bf3660046120f2565b60086020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102af61032b36600461221c565b610884565b61034361033e3660046120f2565b61094b565b60405161026591906122a4565b61036361035e3660046120f2565b610a37565b60408051928352602083019190915201610265565b600b5460009081526009602052604090205461028e565b61028e61039d366004612079565b610a65565b61028e6103b0366004612079565b610ae9565b61028e600b5481565b61028e620d2f0081565b6104026103d63660046122e4565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b6102af61042b3660046122e4565b610b5c565b61044361043e36600461230e565b610cab565b60405161026591906123f3565b61036361045e366004612437565b610eff565b61028e6104713660046122e4565b600560209081526000928352604080842090915290825290205481565b6000546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103636104bc366004612079565b60066020908152600092835260408084209091529082529020805460019091015482565b6103636104ee3660046120f2565b6009602052600090815260409020805460019091015482565b61028e610f2d565b610258610f42565b6102af610525366004612463565b610fb5565b6102af610538366004612079565b6110e2565b6102af6110f5565b6102af610553366004612079565b611100565b610363610566366004612437565b61142d565b61028e610579366004612079565b600760209081526000928352604080842090915290825290205481565b61028e61271081565b61028e6105ad366004612463565b60046020526000908152604090205481565b61028e6105cd3660046120f2565b60026020526000908152604090205481565b61028e62093a8081565b61028e61143b565b6102af6105ff366004612437565b611467565b6060821580610611575081155b15610648576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061065483856124ad565b600154909150808211156106a3576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156106bc576106bc61210b565b60405190808252806020026020018201604052801561070157816020015b60408051808201909152600080825260208201528152602001906001900390816106da5790505b50925060005b8481101561078357600061071b87836124ad565b905060018181548110610730576107306124c0565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061076f5761076f6124c0565b602090810291909101015250600101610707565b50505092915050565b816107c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246107d9600267ffffffffffffffff61251e565b6107e39190612545565b67ffffffffffffffff161061086257806024610808600267ffffffffffffffff61251e565b6108129190612545565b6108279067ffffffffffffffff1660016124ad565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b604080518082019091528281526020810182905261087f81611b4a565b505050565b8151835114158061089757508051835114155b156108db57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b60005b83518110156109455761093d8482815181106108fc576108fc6124c0565b6020026020010151848381518110610916576109166124c0565b6020026020010151848481518110610930576109306124c0565b6020026020010151611467565b6001016108de565b50505050565b60408051808201909152600080825260208201526001805460009161096f9161256d565b9050826000036109ab576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109ef576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161069a565b60018381548110610a0257610a026124c0565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60018181548110610a4757600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610a8c918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526006835281812060088452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610b10918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600290925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ba9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610be3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610bf8600267ffffffffffffffff61251e565b610c029190612545565b67ffffffffffffffff16811115610c7857806024610c29600267ffffffffffffffff61251e565b610c339190612545565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161069a565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261087f81611b4a565b606082518451141580610cc057508151845114155b15610d0457835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b835167ffffffffffffffff811115610d1e57610d1e61210b565b604051908082528060200260200182016040528015610d47578160200160208202803683370190505b50905060005b8451811015610ef75760006040518060400160405280878481518110610d7557610d756124c0565b60200260200101518152602001868481518110610d9457610d946124c0565b60200260200101518152509050600081604051602001610db491906122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003610e5857868381518110610df957610df96124c0565b6020026020010151868481518110610e1357610e136124c0565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161069a929190918252602082015260400190565b620d2f0060056000878681518110610e7257610e726124c0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610ed091906124ad565b848481518110610ee257610ee26124c0565b60209081029190910101525050600101610d4d565b509392505050565b600080610f0c8585611cdd565b50610f15611e9e565b50610f21858585611f9e565b90969095509350505050565b60018054600091610f3d9161256d565b905090565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015610fac57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f66565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611028576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161069a565b73ffffffffffffffffffffffffffffffffffffffff8116611075576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6110ec8282611cdd565b5061087f611e9e565b6110fd611e9e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611173576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161069a565b6000604051806040016040528084815260200183815250905060008160405160200161119f91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526002909352908220549092509081900361122a576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b6000828152600260205260408120556001805461124890829061256d565b81548110611258576112586124c0565b6000918252602091829020604080518082018252600290930290910180548352600101548284015251909450611290918591016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260029093529120829055600180549193508491839081106112ee576112ee6124c0565b6000918252602091829020835160029092020190815591015160019182015580548061131c5761131c612580565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560010181905591556113648686611cdd565b90506000611370611e9e565b9050600062093a808061138381426124ad565b61138d91906125af565b61139791906125c3565b60008681526006602090815260408083208484528252808320839055888352600890915281208290559091506113cd848461256d565b600083815260096020908152604091829020839055600b85905581518b81529081018390529192508a917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a2505050505050505050565b600080610f21858585611f9e565b6024611450600267ffffffffffffffff61251e565b61145a9190612545565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161148e91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115759190612604565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906126a9565b9050600062093a808061165381426124ad565b61165d91906125af565b61166791906125c3565b90508181106116b2576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161069a565b6127108511156116f9576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161069a565b33600090815260056020908152604080832087845290915281205461172290620d2f00906124ad565b90504281111561176d576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161069a565b3360009081526003602090815260408083208884528252808320815160608101835281548152600182015493810193909352600201549082018190529091908410156117d2578382604001516117c3919061256d565b82516117cf91906125c3565b90505b600060405180606001604052806127108b8a6117ee91906125c3565b6117f891906125af565b8152602081018b905260400187905290506000611815868861256d565b825161182191906125c3565b3360009081526004602090815260409091205486820151918501519293509161184a90836124ad565b611854919061256d565b33600090815260046020526040902081905590506127108111156118af576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161069a565b6118cd826118bd8f8f611cdd565b6118c791906124ad565b85612058565b60008b81526006602090815260408083208b84529091529020556118f3826118bd611e9e565b600088815260096020526040908190209190915585015187101561199857825160008b81526006602090815260408083208b84529091529020600101546119449161193d916124ad565b8651612058565b60008b81526006602090815260408083208b8452825280832060019081019490945586516009909252909120909101546119819161193d916124ad565b6000888152600960205260409020600101556119f4565b825160008b81526006602090815260408083208b8452909152812060010180549091906119c69084906124ad565b90915550508251600088815260096020526040812060010180549091906119ee9084906124ad565b90915550505b4285604001511115611a5e57845160008b8152600760209081526040808320818a0151845290915281208054909190611a2e90849061256d565b909155505084516040808701516000908152600a6020529081208054909190611a5890849061256d565b90915550505b825160008b815260076020908152604080832081880151845290915281208054909190611a8c9084906124ad565b909155505082516040808501516000908152600a6020529081208054909190611ab69084906124ad565b90915550503360008181526003602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600582528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b600081604051602001611b5d91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600290935291205490915015611bea57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b6001805460008381526002602081815260408320849055838501855593825285517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691840291820155928501517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7909301929092559062093a8080611c6f81426124ad565b611c7991906125af565b611c8391906125c3565b60008481526008602090815260409182902083905586518782015183519081529182018690529293507fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a250505050565b604080518082018252838152602080820184905291516000928391611d04918491016122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003611d73576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b600081815260086020908152604080832054600683528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015611e9257428311611e9257611dcc62093a80846124ad565b9250600062093a808360200151611de391906125c3565b90508083600001511115611e3d578083600001818151611e03919061256d565b90525060008581526007602090815260408083208784528252909120549084018051829190611e3390839061256d565b905250611e489050565b600080845260208401525b60008581526006602090815260408083208784528252909120845181559084015160019091015542841115611e895760008581526008602052604090208490555b50600101611dae565b50519695505050505050565b600b5460008181526009602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611f9657428311611f9657611eec62093a80846124ad565b9250600062093a808360200151611f0391906125c3565b90508083600001511115611f55578083600001818151611f23919061256d565b9052506000848152600a60209081526040909120549084018051829190611f4b90839061256d565b905250611f609050565b600080845260208401525b6000848152600960209081526040909120845181559084015160019091015542841115611f8d57600b8490555b50600101611ece565b505192915050565b6000808062093a80611fb081866125af565b611fba91906125c3565b600081815260096020908152604080832054815180830183528b81528084018b9052915190965093945092611ff1918491016122a4565b604051602081830303815290604052805190602001209050600084111561204d5760008181526006602090815260408083208684529091529020548461203f82670de0b6b3a76400006125c3565b61204991906125af565b9550505b505050935093915050565b6000818311612068576000612072565b612072828461256d565b9392505050565b6000806040838503121561208c57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156120e5576120d584835180518252602090810151910152565b92840192908501906001016120b8565b5091979650505050505050565b60006020828403121561210457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121815761218161210b565b604052919050565b600067ffffffffffffffff8211156121a3576121a361210b565b5060051b60200190565b600082601f8301126121be57600080fd5b813560206121d36121ce83612189565b61213a565b8083825260208201915060208460051b8701019350868411156121f557600080fd5b602086015b8481101561221157803583529183019183016121fa565b509695505050505050565b60008060006060848603121561223157600080fd5b833567ffffffffffffffff8082111561224957600080fd5b612255878388016121ad565b9450602086013591508082111561226b57600080fd5b612277878388016121ad565b9350604086013591508082111561228d57600080fd5b5061229a868287016121ad565b9150509250925092565b815181526020808301519082015260408101610ae3565b803573ffffffffffffffffffffffffffffffffffffffff811681146122df57600080fd5b919050565b600080604083850312156122f757600080fd5b612300836122bb565b946020939093013593505050565b60008060006060848603121561232357600080fd5b833567ffffffffffffffff8082111561233b57600080fd5b612347878388016121ad565b945060209150818601358181111561235e57600080fd5b61236a888289016121ad565b94505060408601358181111561237f57600080fd5b86019050601f8101871361239257600080fd5b80356123a06121ce82612189565b81815260059190911b820183019083810190898311156123bf57600080fd5b928401925b828410156123e4576123d5846122bb565b825292840192908401906123c4565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561242b5783518352928401929184019160010161240f565b50909695505050505050565b60008060006060848603121561244c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561247557600080fd5b612072826122bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612539576125396124ef565b92169190910492915050565b67ffffffffffffffff8281168282160390808211156125665761256661247e565b5092915050565b81810381811115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826125be576125be6124ef565b500490565b8082028115828204841417610ae357610ae361247e565b8051600f81900b81146122df57600080fd5b805167ffffffffffffffff811681146122df57600080fd5b600060a0828403121561261657600080fd5b60405160a0810181811067ffffffffffffffff821117156126395761263961210b565b604052612645836125da565b8152612653602084016125da565b6020820152612664604084016125ec565b6040820152612675606084016125ec565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461269d57600080fd5b60808201529392505050565b6000602082840312156126bb57600080fd5b505191905056fea2646970667358221220a8457b91f8f737e3edc92ce46e3b378fb8f129f97e4c52c1dc24d7f232f8a12064736f6c63430008170033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102405760003560e01c806385556a9511610145578063c54dd0d4116100bd578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146105df578063f4da12ba146105e9578063f9572f7c146105f157600080fd5b8063ec73d9061461059f578063f0cd64af146105bf57600080fd5b8063c54dd0d414610545578063c88d47f014610558578063dc87f5361461056b578063e4a28a521461059657600080fd5b8063a18f99ff11610114578063a6f9dae1116100f9578063a6f9dae114610517578063beaf44e81461052a578063c2c4c5c11461053d57600080fd5b8063a18f99ff14610507578063a51248031461050f57600080fd5b806385556a95146104635780638da5cb5b1461048e5780638e28764b146104ae5780639d175053146104e057600080fd5b806341597036116101d85780634f6ffd07116101a75780636b39ac1a1161018c5780636b39ac1a1461041d5780637a75b27e146104305780637ee8bfe91461045057600080fd5b80634f6ffd07146103be578063609c6b87146103c857600080fd5b806341597036146103785780634479b5cf1461038f578063456f0997146103a257806348264997146103b557600080fd5b80631f850716116102145780631f850716146102d157806326abaf241461031d57806327ebf531146103305780633b766b3d1461035057600080fd5b806292a596146102455780630c4232011461026e5780631765ab7f1461029c5780631b98dd90146102b1575b600080fd5b610258610253366004612079565b610604565b604051610265919061209b565b60405180910390f35b61028e61027c3660046120f2565b600a6020526000908152604090205481565b604051908152602001610265565b6102af6102aa366004612079565b61078c565b005b61028e6102bf3660046120f2565b60086020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102af61032b36600461221c565b610884565b61034361033e3660046120f2565b61094b565b60405161026591906122a4565b61036361035e3660046120f2565b610a37565b60408051928352602083019190915201610265565b600b5460009081526009602052604090205461028e565b61028e61039d366004612079565b610a65565b61028e6103b0366004612079565b610ae9565b61028e600b5481565b61028e620d2f0081565b6104026103d63660046122e4565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b6102af61042b3660046122e4565b610b5c565b61044361043e36600461230e565b610cab565b60405161026591906123f3565b61036361045e366004612437565b610eff565b61028e6104713660046122e4565b600560209081526000928352604080842090915290825290205481565b6000546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103636104bc366004612079565b60066020908152600092835260408084209091529082529020805460019091015482565b6103636104ee3660046120f2565b6009602052600090815260409020805460019091015482565b61028e610f2d565b610258610f42565b6102af610525366004612463565b610fb5565b6102af610538366004612079565b6110e2565b6102af6110f5565b6102af610553366004612079565b611100565b610363610566366004612437565b61142d565b61028e610579366004612079565b600760209081526000928352604080842090915290825290205481565b61028e61271081565b61028e6105ad366004612463565b60046020526000908152604090205481565b61028e6105cd3660046120f2565b60026020526000908152604090205481565b61028e62093a8081565b61028e61143b565b6102af6105ff366004612437565b611467565b6060821580610611575081155b15610648576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061065483856124ad565b600154909150808211156106a3576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156106bc576106bc61210b565b60405190808252806020026020018201604052801561070157816020015b60408051808201909152600080825260208201528152602001906001900390816106da5790505b50925060005b8481101561078357600061071b87836124ad565b905060018181548110610730576107306124c0565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061076f5761076f6124c0565b602090810291909101015250600101610707565b50505092915050565b816107c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246107d9600267ffffffffffffffff61251e565b6107e39190612545565b67ffffffffffffffff161061086257806024610808600267ffffffffffffffff61251e565b6108129190612545565b6108279067ffffffffffffffff1660016124ad565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b604080518082019091528281526020810182905261087f81611b4a565b505050565b8151835114158061089757508051835114155b156108db57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b60005b83518110156109455761093d8482815181106108fc576108fc6124c0565b6020026020010151848381518110610916576109166124c0565b6020026020010151848481518110610930576109306124c0565b6020026020010151611467565b6001016108de565b50505050565b60408051808201909152600080825260208201526001805460009161096f9161256d565b9050826000036109ab576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109ef576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161069a565b60018381548110610a0257610a026124c0565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60018181548110610a4757600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610a8c918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526006835281812060088452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610b10918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600290925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ba9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610be3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610bf8600267ffffffffffffffff61251e565b610c029190612545565b67ffffffffffffffff16811115610c7857806024610c29600267ffffffffffffffff61251e565b610c339190612545565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161069a565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261087f81611b4a565b606082518451141580610cc057508151845114155b15610d0457835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b835167ffffffffffffffff811115610d1e57610d1e61210b565b604051908082528060200260200182016040528015610d47578160200160208202803683370190505b50905060005b8451811015610ef75760006040518060400160405280878481518110610d7557610d756124c0565b60200260200101518152602001868481518110610d9457610d946124c0565b60200260200101518152509050600081604051602001610db491906122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003610e5857868381518110610df957610df96124c0565b6020026020010151868481518110610e1357610e136124c0565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161069a929190918252602082015260400190565b620d2f0060056000878681518110610e7257610e726124c0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610ed091906124ad565b848481518110610ee257610ee26124c0565b60209081029190910101525050600101610d4d565b509392505050565b600080610f0c8585611cdd565b50610f15611e9e565b50610f21858585611f9e565b90969095509350505050565b60018054600091610f3d9161256d565b905090565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015610fac57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f66565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611028576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161069a565b73ffffffffffffffffffffffffffffffffffffffff8116611075576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6110ec8282611cdd565b5061087f611e9e565b6110fd611e9e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611173576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161069a565b6000604051806040016040528084815260200183815250905060008160405160200161119f91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526002909352908220549092509081900361122a576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b6000828152600260205260408120556001805461124890829061256d565b81548110611258576112586124c0565b6000918252602091829020604080518082018252600290930290910180548352600101548284015251909450611290918591016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260029093529120829055600180549193508491839081106112ee576112ee6124c0565b6000918252602091829020835160029092020190815591015160019182015580548061131c5761131c612580565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560010181905591556113648686611cdd565b90506000611370611e9e565b9050600062093a808061138381426124ad565b61138d91906125af565b61139791906125c3565b60008681526006602090815260408083208484528252808320839055888352600890915281208290559091506113cd848461256d565b600083815260096020908152604091829020839055600b85905581518b81529081018390529192508a917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a2505050505050505050565b600080610f21858585611f9e565b6024611450600267ffffffffffffffff61251e565b61145a9190612545565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161148e91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115759190612604565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906126a9565b9050600062093a808061165381426124ad565b61165d91906125af565b61166791906125c3565b90508181106116b2576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161069a565b6127108511156116f9576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161069a565b33600090815260056020908152604080832087845290915281205461172290620d2f00906124ad565b90504281111561176d576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161069a565b3360009081526003602090815260408083208884528252808320815160608101835281548152600182015493810193909352600201549082018190529091908410156117d2578382604001516117c3919061256d565b82516117cf91906125c3565b90505b600060405180606001604052806127108b8a6117ee91906125c3565b6117f891906125af565b8152602081018b905260400187905290506000611815868861256d565b825161182191906125c3565b3360009081526004602090815260409091205486820151918501519293509161184a90836124ad565b611854919061256d565b33600090815260046020526040902081905590506127108111156118af576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161069a565b6118cd826118bd8f8f611cdd565b6118c791906124ad565b85612058565b60008b81526006602090815260408083208b84529091529020556118f3826118bd611e9e565b600088815260096020526040908190209190915585015187101561199857825160008b81526006602090815260408083208b84529091529020600101546119449161193d916124ad565b8651612058565b60008b81526006602090815260408083208b8452825280832060019081019490945586516009909252909120909101546119819161193d916124ad565b6000888152600960205260409020600101556119f4565b825160008b81526006602090815260408083208b8452909152812060010180549091906119c69084906124ad565b90915550508251600088815260096020526040812060010180549091906119ee9084906124ad565b90915550505b4285604001511115611a5e57845160008b8152600760209081526040808320818a0151845290915281208054909190611a2e90849061256d565b909155505084516040808701516000908152600a6020529081208054909190611a5890849061256d565b90915550505b825160008b815260076020908152604080832081880151845290915281208054909190611a8c9084906124ad565b909155505082516040808501516000908152600a6020529081208054909190611ab69084906124ad565b90915550503360008181526003602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600582528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b600081604051602001611b5d91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600290935291205490915015611bea57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b6001805460008381526002602081815260408320849055838501855593825285517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691840291820155928501517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7909301929092559062093a8080611c6f81426124ad565b611c7991906125af565b611c8391906125c3565b60008481526008602090815260409182902083905586518782015183519081529182018690529293507fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a250505050565b604080518082018252838152602080820184905291516000928391611d04918491016122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003611d73576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b600081815260086020908152604080832054600683528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015611e9257428311611e9257611dcc62093a80846124ad565b9250600062093a808360200151611de391906125c3565b90508083600001511115611e3d578083600001818151611e03919061256d565b90525060008581526007602090815260408083208784528252909120549084018051829190611e3390839061256d565b905250611e489050565b600080845260208401525b60008581526006602090815260408083208784528252909120845181559084015160019091015542841115611e895760008581526008602052604090208490555b50600101611dae565b50519695505050505050565b600b5460008181526009602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611f9657428311611f9657611eec62093a80846124ad565b9250600062093a808360200151611f0391906125c3565b90508083600001511115611f55578083600001818151611f23919061256d565b9052506000848152600a60209081526040909120549084018051829190611f4b90839061256d565b905250611f609050565b600080845260208401525b6000848152600960209081526040909120845181559084015160019091015542841115611f8d57600b8490555b50600101611ece565b505192915050565b6000808062093a80611fb081866125af565b611fba91906125c3565b600081815260096020908152604080832054815180830183528b81528084018b9052915190965093945092611ff1918491016122a4565b604051602081830303815290604052805190602001209050600084111561204d5760008181526006602090815260408083208684529091529020548461203f82670de0b6b3a76400006125c3565b61204991906125af565b9550505b505050935093915050565b6000818311612068576000612072565b612072828461256d565b9392505050565b6000806040838503121561208c57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156120e5576120d584835180518252602090810151910152565b92840192908501906001016120b8565b5091979650505050505050565b60006020828403121561210457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121815761218161210b565b604052919050565b600067ffffffffffffffff8211156121a3576121a361210b565b5060051b60200190565b600082601f8301126121be57600080fd5b813560206121d36121ce83612189565b61213a565b8083825260208201915060208460051b8701019350868411156121f557600080fd5b602086015b8481101561221157803583529183019183016121fa565b509695505050505050565b60008060006060848603121561223157600080fd5b833567ffffffffffffffff8082111561224957600080fd5b612255878388016121ad565b9450602086013591508082111561226b57600080fd5b612277878388016121ad565b9350604086013591508082111561228d57600080fd5b5061229a868287016121ad565b9150509250925092565b815181526020808301519082015260408101610ae3565b803573ffffffffffffffffffffffffffffffffffffffff811681146122df57600080fd5b919050565b600080604083850312156122f757600080fd5b612300836122bb565b946020939093013593505050565b60008060006060848603121561232357600080fd5b833567ffffffffffffffff8082111561233b57600080fd5b612347878388016121ad565b945060209150818601358181111561235e57600080fd5b61236a888289016121ad565b94505060408601358181111561237f57600080fd5b86019050601f8101871361239257600080fd5b80356123a06121ce82612189565b81815260059190911b820183019083810190898311156123bf57600080fd5b928401925b828410156123e4576123d5846122bb565b825292840192908401906123c4565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561242b5783518352928401929184019160010161240f565b50909695505050505050565b60008060006060848603121561244c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561247557600080fd5b612072826122bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612539576125396124ef565b92169190910492915050565b67ffffffffffffffff8281168282160390808211156125665761256661247e565b5092915050565b81810381811115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826125be576125be6124ef565b500490565b8082028115828204841417610ae357610ae361247e565b8051600f81900b81146122df57600080fd5b805167ffffffffffffffff811681146122df57600080fd5b600060a0828403121561261657600080fd5b60405160a0810181811067ffffffffffffffff821117156126395761263961210b565b604052612645836125da565b8152612653602084016125da565b6020820152612664604084016125ec565b6040820152612675606084016125ec565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461269d57600080fd5b60808201529392505050565b6000602082840312156126bb57600080fd5b505191905056fea2646970667358221220a8457b91f8f737e3edc92ce46e3b378fb8f129f97e4c52c1dc24d7f232f8a12064736f6c63430008170033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 853769b..23aad9d 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -69,9 +69,10 @@ struct Nominee { } contract VoteWeighting is IErrors { - event NewNomineeWeight(bytes32 indexed nominee, uint256 chainId, uint256 weight, uint256 totalWeight); + event OwnerUpdated(address indexed owner); event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight); - event NewNominee(bytes32 account, uint256 chainId, uint256 id); + 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; @@ -83,6 +84,8 @@ contract VoteWeighting is IErrors { 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; // Set of Nominee structs Nominee[] public setNominees; @@ -125,6 +128,7 @@ contract VoteWeighting is IErrors { } // Set initial parameters + owner = msg.sender; ve = _ve; timeSum = block.timestamp / WEEK * WEEK; setNominees.push(Nominee(bytes32(0), 0)); @@ -170,7 +174,7 @@ contract VoteWeighting is IErrors { // Check that the nominee exists bytes32 nomineeHash = keccak256(abi.encode(nominee)); if (mapNomineeIds[nomineeHash] == 0) { - revert NomineeDoesNotExist(nominee.account, nominee.chainId); + revert NomineeDoesNotExist(account, chainId); } // t is always > 0 as it is set during the addNominee() call @@ -215,7 +219,7 @@ contract VoteWeighting is IErrors { uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; timeWeight[nomineeHash] = nextTime; - emit NewNominee(nominee.account, nominee.chainId, id); + emit AddNominee(nominee.account, nominee.chainId, id); } /// @dev Add EVM nominee address along with the chain Id. @@ -263,6 +267,23 @@ contract VoteWeighting is IErrors { _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 Checkpoint to fill data common for all nominees. function checkpoint() external { _getSum(); @@ -437,6 +458,48 @@ contract VoteWeighting is IErrors { 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); + } + + // 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(); + + // Set nominee weight to zero + uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; + pointsWeight[nomineeHash][nextTime].bias = 0; + timeWeight[nomineeHash] = nextTime; + + uint256 oldWeight = _getWeight(account, chainId); + uint256 oldSum = _getSum(); + pointsSum[nextTime].bias = oldSum - oldWeight; + timeSum = nextTime; + + emit RemoveNominee(account, chainId, newSum); + } + /// @dev Get current nominee weight. /// @param account Address of the nominee in bytes32 form. /// @param chainId Chain Id. From 67f227fcfb387a768a3f4449436dd863220c7d26 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Wed, 8 May 2024 18:44:37 +0100 Subject: [PATCH 11/14] test: back to 100% coverage --- contracts/VoteWeighting.sol | 84 ++++++++++++++++++--- test/VoteWeighting.js | 144 ++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+), 12 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 23aad9d..e6c4c36 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -52,6 +52,16 @@ error NomineeAlreadyExists(bytes32 account, uint256 chainId); /// @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); + struct Point { uint256 bias; uint256 slope; @@ -91,6 +101,8 @@ contract VoteWeighting is IErrors { 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; @@ -171,9 +183,9 @@ contract VoteWeighting is IErrors { // Construct the nominee struct Nominee memory nominee = Nominee(account, chainId); - // Check that the nominee exists + // Check that the nominee exists or has been removed bytes32 nomineeHash = keccak256(abi.encode(nominee)); - if (mapNomineeIds[nomineeHash] == 0) { + if (!mapRemovedNominees[nomineeHash] && mapNomineeIds[nomineeHash] == 0) { revert NomineeDoesNotExist(account, chainId); } @@ -211,6 +223,12 @@ contract VoteWeighting is IErrors { 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 @@ -363,6 +381,11 @@ contract VoteWeighting is IErrors { // 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; @@ -477,6 +500,21 @@ contract VoteWeighting is IErrors { 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 from the map mapNomineeIds[nomineeHash] = 0; // Shuffle the current last nominee id in the set to be placed to the removed one @@ -487,19 +525,41 @@ contract VoteWeighting is IErrors { // Pop the last element from the set setNominees.pop(); - // Set nominee weight to zero - uint256 nextTime = (block.timestamp + WEEK) / WEEK * WEEK; - pointsWeight[nomineeHash][nextTime].bias = 0; - timeWeight[nomineeHash] = nextTime; + emit RemoveNominee(account, chainId, newSum); + } - uint256 oldWeight = _getWeight(account, chainId); - uint256 oldSum = _getSum(); - pointsSum[nextTime].bias = oldSum - oldWeight; - timeSum = nextTime; + /// @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)); - emit RemoveNominee(account, chainId, newSum); + // 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. diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index fa6ef94..ffcd476 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -63,6 +63,28 @@ describe("Voting Escrow OLAS", function () { 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"); + }); }); context("Adding nominees", async function () { @@ -532,5 +554,127 @@ describe("Voting Escrow OLAS", function () { // 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(); + }); }); }); From 9cb7ed3ae6b50954c4504c16e1f84decaa984c4b Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Wed, 8 May 2024 19:57:34 +0100 Subject: [PATCH 12/14] refactor: account for nominee enabling --- abis/0.8.23/VoteWeighting.json | 99 +++++++++++++++++++++++++++++++++- contracts/VoteWeighting.sol | 40 +++++++++++++- test/VoteWeighting.js | 43 +++++++++++++++ 3 files changed, 179 insertions(+), 3 deletions(-) diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json index 08ad0f5..33f956c 100644 --- a/abis/0.8.23/VoteWeighting.json +++ b/abis/0.8.23/VoteWeighting.json @@ -152,6 +152,38 @@ "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": [ { @@ -493,6 +525,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newDispenser", + "type": "address" + } + ], + "name": "changeDispenser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -574,6 +619,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "dispenser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getAllNominees", @@ -812,6 +870,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "mapRemovedNominees", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -964,6 +1041,24 @@ "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": [ { @@ -1133,8 +1228,8 @@ "type": "function" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b50604051620028b8380380620028b8833981016040819052620000349162000115565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b814262000147565b6200009791906200016a565b600b555060408051808201909152600080825260208201818152600180548082018255925291517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf660029092029182015590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf79091015562000196565b6000602082840312156200012857600080fd5b81516001600160a01b03811681146200014057600080fd5b9392505050565b6000826200016557634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019057634e487b7160e01b600052601160045260246000fd5b92915050565b6080516126f8620001c0600039600081816102d60152818161150a01526115d501526126f86000f3fe608060405234801561001057600080fd5b50600436106102405760003560e01c806385556a9511610145578063c54dd0d4116100bd578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146105df578063f4da12ba146105e9578063f9572f7c146105f157600080fd5b8063ec73d9061461059f578063f0cd64af146105bf57600080fd5b8063c54dd0d414610545578063c88d47f014610558578063dc87f5361461056b578063e4a28a521461059657600080fd5b8063a18f99ff11610114578063a6f9dae1116100f9578063a6f9dae114610517578063beaf44e81461052a578063c2c4c5c11461053d57600080fd5b8063a18f99ff14610507578063a51248031461050f57600080fd5b806385556a95146104635780638da5cb5b1461048e5780638e28764b146104ae5780639d175053146104e057600080fd5b806341597036116101d85780634f6ffd07116101a75780636b39ac1a1161018c5780636b39ac1a1461041d5780637a75b27e146104305780637ee8bfe91461045057600080fd5b80634f6ffd07146103be578063609c6b87146103c857600080fd5b806341597036146103785780634479b5cf1461038f578063456f0997146103a257806348264997146103b557600080fd5b80631f850716116102145780631f850716146102d157806326abaf241461031d57806327ebf531146103305780633b766b3d1461035057600080fd5b806292a596146102455780630c4232011461026e5780631765ab7f1461029c5780631b98dd90146102b1575b600080fd5b610258610253366004612079565b610604565b604051610265919061209b565b60405180910390f35b61028e61027c3660046120f2565b600a6020526000908152604090205481565b604051908152602001610265565b6102af6102aa366004612079565b61078c565b005b61028e6102bf3660046120f2565b60086020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102af61032b36600461221c565b610884565b61034361033e3660046120f2565b61094b565b60405161026591906122a4565b61036361035e3660046120f2565b610a37565b60408051928352602083019190915201610265565b600b5460009081526009602052604090205461028e565b61028e61039d366004612079565b610a65565b61028e6103b0366004612079565b610ae9565b61028e600b5481565b61028e620d2f0081565b6104026103d63660046122e4565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b6102af61042b3660046122e4565b610b5c565b61044361043e36600461230e565b610cab565b60405161026591906123f3565b61036361045e366004612437565b610eff565b61028e6104713660046122e4565b600560209081526000928352604080842090915290825290205481565b6000546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103636104bc366004612079565b60066020908152600092835260408084209091529082529020805460019091015482565b6103636104ee3660046120f2565b6009602052600090815260409020805460019091015482565b61028e610f2d565b610258610f42565b6102af610525366004612463565b610fb5565b6102af610538366004612079565b6110e2565b6102af6110f5565b6102af610553366004612079565b611100565b610363610566366004612437565b61142d565b61028e610579366004612079565b600760209081526000928352604080842090915290825290205481565b61028e61271081565b61028e6105ad366004612463565b60046020526000908152604090205481565b61028e6105cd3660046120f2565b60026020526000908152604090205481565b61028e62093a8081565b61028e61143b565b6102af6105ff366004612437565b611467565b6060821580610611575081155b15610648576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061065483856124ad565b600154909150808211156106a3576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156106bc576106bc61210b565b60405190808252806020026020018201604052801561070157816020015b60408051808201909152600080825260208201528152602001906001900390816106da5790505b50925060005b8481101561078357600061071b87836124ad565b905060018181548110610730576107306124c0565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061076f5761076f6124c0565b602090810291909101015250600101610707565b50505092915050565b816107c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246107d9600267ffffffffffffffff61251e565b6107e39190612545565b67ffffffffffffffff161061086257806024610808600267ffffffffffffffff61251e565b6108129190612545565b6108279067ffffffffffffffff1660016124ad565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b604080518082019091528281526020810182905261087f81611b4a565b505050565b8151835114158061089757508051835114155b156108db57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b60005b83518110156109455761093d8482815181106108fc576108fc6124c0565b6020026020010151848381518110610916576109166124c0565b6020026020010151848481518110610930576109306124c0565b6020026020010151611467565b6001016108de565b50505050565b60408051808201909152600080825260208201526001805460009161096f9161256d565b9050826000036109ab576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109ef576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161069a565b60018381548110610a0257610a026124c0565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60018181548110610a4757600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610a8c918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526006835281812060088452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610b10918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600290925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ba9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610be3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610bf8600267ffffffffffffffff61251e565b610c029190612545565b67ffffffffffffffff16811115610c7857806024610c29600267ffffffffffffffff61251e565b610c339190612545565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161069a565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261087f81611b4a565b606082518451141580610cc057508151845114155b15610d0457835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b835167ffffffffffffffff811115610d1e57610d1e61210b565b604051908082528060200260200182016040528015610d47578160200160208202803683370190505b50905060005b8451811015610ef75760006040518060400160405280878481518110610d7557610d756124c0565b60200260200101518152602001868481518110610d9457610d946124c0565b60200260200101518152509050600081604051602001610db491906122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003610e5857868381518110610df957610df96124c0565b6020026020010151868481518110610e1357610e136124c0565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161069a929190918252602082015260400190565b620d2f0060056000878681518110610e7257610e726124c0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610ed091906124ad565b848481518110610ee257610ee26124c0565b60209081029190910101525050600101610d4d565b509392505050565b600080610f0c8585611cdd565b50610f15611e9e565b50610f21858585611f9e565b90969095509350505050565b60018054600091610f3d9161256d565b905090565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015610fac57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f66565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611028576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161069a565b73ffffffffffffffffffffffffffffffffffffffff8116611075576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6110ec8282611cdd565b5061087f611e9e565b6110fd611e9e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611173576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161069a565b6000604051806040016040528084815260200183815250905060008160405160200161119f91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526002909352908220549092509081900361122a576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b6000828152600260205260408120556001805461124890829061256d565b81548110611258576112586124c0565b6000918252602091829020604080518082018252600290930290910180548352600101548284015251909450611290918591016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260029093529120829055600180549193508491839081106112ee576112ee6124c0565b6000918252602091829020835160029092020190815591015160019182015580548061131c5761131c612580565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560010181905591556113648686611cdd565b90506000611370611e9e565b9050600062093a808061138381426124ad565b61138d91906125af565b61139791906125c3565b60008681526006602090815260408083208484528252808320839055888352600890915281208290559091506113cd848461256d565b600083815260096020908152604091829020839055600b85905581518b81529081018390529192508a917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a2505050505050505050565b600080610f21858585611f9e565b6024611450600267ffffffffffffffff61251e565b61145a9190612545565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161148e91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115759190612604565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906126a9565b9050600062093a808061165381426124ad565b61165d91906125af565b61166791906125c3565b90508181106116b2576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161069a565b6127108511156116f9576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161069a565b33600090815260056020908152604080832087845290915281205461172290620d2f00906124ad565b90504281111561176d576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161069a565b3360009081526003602090815260408083208884528252808320815160608101835281548152600182015493810193909352600201549082018190529091908410156117d2578382604001516117c3919061256d565b82516117cf91906125c3565b90505b600060405180606001604052806127108b8a6117ee91906125c3565b6117f891906125af565b8152602081018b905260400187905290506000611815868861256d565b825161182191906125c3565b3360009081526004602090815260409091205486820151918501519293509161184a90836124ad565b611854919061256d565b33600090815260046020526040902081905590506127108111156118af576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161069a565b6118cd826118bd8f8f611cdd565b6118c791906124ad565b85612058565b60008b81526006602090815260408083208b84529091529020556118f3826118bd611e9e565b600088815260096020526040908190209190915585015187101561199857825160008b81526006602090815260408083208b84529091529020600101546119449161193d916124ad565b8651612058565b60008b81526006602090815260408083208b8452825280832060019081019490945586516009909252909120909101546119819161193d916124ad565b6000888152600960205260409020600101556119f4565b825160008b81526006602090815260408083208b8452909152812060010180549091906119c69084906124ad565b90915550508251600088815260096020526040812060010180549091906119ee9084906124ad565b90915550505b4285604001511115611a5e57845160008b8152600760209081526040808320818a0151845290915281208054909190611a2e90849061256d565b909155505084516040808701516000908152600a6020529081208054909190611a5890849061256d565b90915550505b825160008b815260076020908152604080832081880151845290915281208054909190611a8c9084906124ad565b909155505082516040808501516000908152600a6020529081208054909190611ab69084906124ad565b90915550503360008181526003602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600582528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b600081604051602001611b5d91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600290935291205490915015611bea57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b6001805460008381526002602081815260408320849055838501855593825285517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691840291820155928501517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7909301929092559062093a8080611c6f81426124ad565b611c7991906125af565b611c8391906125c3565b60008481526008602090815260409182902083905586518782015183519081529182018690529293507fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a250505050565b604080518082018252838152602080820184905291516000928391611d04918491016122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003611d73576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b600081815260086020908152604080832054600683528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015611e9257428311611e9257611dcc62093a80846124ad565b9250600062093a808360200151611de391906125c3565b90508083600001511115611e3d578083600001818151611e03919061256d565b90525060008581526007602090815260408083208784528252909120549084018051829190611e3390839061256d565b905250611e489050565b600080845260208401525b60008581526006602090815260408083208784528252909120845181559084015160019091015542841115611e895760008581526008602052604090208490555b50600101611dae565b50519695505050505050565b600b5460008181526009602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611f9657428311611f9657611eec62093a80846124ad565b9250600062093a808360200151611f0391906125c3565b90508083600001511115611f55578083600001818151611f23919061256d565b9052506000848152600a60209081526040909120549084018051829190611f4b90839061256d565b905250611f609050565b600080845260208401525b6000848152600960209081526040909120845181559084015160019091015542841115611f8d57600b8490555b50600101611ece565b505192915050565b6000808062093a80611fb081866125af565b611fba91906125c3565b600081815260096020908152604080832054815180830183528b81528084018b9052915190965093945092611ff1918491016122a4565b604051602081830303815290604052805190602001209050600084111561204d5760008181526006602090815260408083208684529091529020548461203f82670de0b6b3a76400006125c3565b61204991906125af565b9550505b505050935093915050565b6000818311612068576000612072565b612072828461256d565b9392505050565b6000806040838503121561208c57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156120e5576120d584835180518252602090810151910152565b92840192908501906001016120b8565b5091979650505050505050565b60006020828403121561210457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121815761218161210b565b604052919050565b600067ffffffffffffffff8211156121a3576121a361210b565b5060051b60200190565b600082601f8301126121be57600080fd5b813560206121d36121ce83612189565b61213a565b8083825260208201915060208460051b8701019350868411156121f557600080fd5b602086015b8481101561221157803583529183019183016121fa565b509695505050505050565b60008060006060848603121561223157600080fd5b833567ffffffffffffffff8082111561224957600080fd5b612255878388016121ad565b9450602086013591508082111561226b57600080fd5b612277878388016121ad565b9350604086013591508082111561228d57600080fd5b5061229a868287016121ad565b9150509250925092565b815181526020808301519082015260408101610ae3565b803573ffffffffffffffffffffffffffffffffffffffff811681146122df57600080fd5b919050565b600080604083850312156122f757600080fd5b612300836122bb565b946020939093013593505050565b60008060006060848603121561232357600080fd5b833567ffffffffffffffff8082111561233b57600080fd5b612347878388016121ad565b945060209150818601358181111561235e57600080fd5b61236a888289016121ad565b94505060408601358181111561237f57600080fd5b86019050601f8101871361239257600080fd5b80356123a06121ce82612189565b81815260059190911b820183019083810190898311156123bf57600080fd5b928401925b828410156123e4576123d5846122bb565b825292840192908401906123c4565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561242b5783518352928401929184019160010161240f565b50909695505050505050565b60008060006060848603121561244c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561247557600080fd5b612072826122bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612539576125396124ef565b92169190910492915050565b67ffffffffffffffff8281168282160390808211156125665761256661247e565b5092915050565b81810381811115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826125be576125be6124ef565b500490565b8082028115828204841417610ae357610ae361247e565b8051600f81900b81146122df57600080fd5b805167ffffffffffffffff811681146122df57600080fd5b600060a0828403121561261657600080fd5b60405160a0810181811067ffffffffffffffff821117156126395761263961210b565b604052612645836125da565b8152612653602084016125da565b6020820152612664604084016125ec565b6040820152612675606084016125ec565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461269d57600080fd5b60808201529392505050565b6000602082840312156126bb57600080fd5b505191905056fea2646970667358221220a8457b91f8f737e3edc92ce46e3b378fb8f129f97e4c52c1dc24d7f232f8a12064736f6c63430008170033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102405760003560e01c806385556a9511610145578063c54dd0d4116100bd578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146105df578063f4da12ba146105e9578063f9572f7c146105f157600080fd5b8063ec73d9061461059f578063f0cd64af146105bf57600080fd5b8063c54dd0d414610545578063c88d47f014610558578063dc87f5361461056b578063e4a28a521461059657600080fd5b8063a18f99ff11610114578063a6f9dae1116100f9578063a6f9dae114610517578063beaf44e81461052a578063c2c4c5c11461053d57600080fd5b8063a18f99ff14610507578063a51248031461050f57600080fd5b806385556a95146104635780638da5cb5b1461048e5780638e28764b146104ae5780639d175053146104e057600080fd5b806341597036116101d85780634f6ffd07116101a75780636b39ac1a1161018c5780636b39ac1a1461041d5780637a75b27e146104305780637ee8bfe91461045057600080fd5b80634f6ffd07146103be578063609c6b87146103c857600080fd5b806341597036146103785780634479b5cf1461038f578063456f0997146103a257806348264997146103b557600080fd5b80631f850716116102145780631f850716146102d157806326abaf241461031d57806327ebf531146103305780633b766b3d1461035057600080fd5b806292a596146102455780630c4232011461026e5780631765ab7f1461029c5780631b98dd90146102b1575b600080fd5b610258610253366004612079565b610604565b604051610265919061209b565b60405180910390f35b61028e61027c3660046120f2565b600a6020526000908152604090205481565b604051908152602001610265565b6102af6102aa366004612079565b61078c565b005b61028e6102bf3660046120f2565b60086020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102af61032b36600461221c565b610884565b61034361033e3660046120f2565b61094b565b60405161026591906122a4565b61036361035e3660046120f2565b610a37565b60408051928352602083019190915201610265565b600b5460009081526009602052604090205461028e565b61028e61039d366004612079565b610a65565b61028e6103b0366004612079565b610ae9565b61028e600b5481565b61028e620d2f0081565b6104026103d63660046122e4565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b6102af61042b3660046122e4565b610b5c565b61044361043e36600461230e565b610cab565b60405161026591906123f3565b61036361045e366004612437565b610eff565b61028e6104713660046122e4565b600560209081526000928352604080842090915290825290205481565b6000546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103636104bc366004612079565b60066020908152600092835260408084209091529082529020805460019091015482565b6103636104ee3660046120f2565b6009602052600090815260409020805460019091015482565b61028e610f2d565b610258610f42565b6102af610525366004612463565b610fb5565b6102af610538366004612079565b6110e2565b6102af6110f5565b6102af610553366004612079565b611100565b610363610566366004612437565b61142d565b61028e610579366004612079565b600760209081526000928352604080842090915290825290205481565b61028e61271081565b61028e6105ad366004612463565b60046020526000908152604090205481565b61028e6105cd3660046120f2565b60026020526000908152604090205481565b61028e62093a8081565b61028e61143b565b6102af6105ff366004612437565b611467565b6060821580610611575081155b15610648576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061065483856124ad565b600154909150808211156106a3576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156106bc576106bc61210b565b60405190808252806020026020018201604052801561070157816020015b60408051808201909152600080825260208201528152602001906001900390816106da5790505b50925060005b8481101561078357600061071b87836124ad565b905060018181548110610730576107306124c0565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061076f5761076f6124c0565b602090810291909101015250600101610707565b50505092915050565b816107c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246107d9600267ffffffffffffffff61251e565b6107e39190612545565b67ffffffffffffffff161061086257806024610808600267ffffffffffffffff61251e565b6108129190612545565b6108279067ffffffffffffffff1660016124ad565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b604080518082019091528281526020810182905261087f81611b4a565b505050565b8151835114158061089757508051835114155b156108db57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b60005b83518110156109455761093d8482815181106108fc576108fc6124c0565b6020026020010151848381518110610916576109166124c0565b6020026020010151848481518110610930576109306124c0565b6020026020010151611467565b6001016108de565b50505050565b60408051808201909152600080825260208201526001805460009161096f9161256d565b9050826000036109ab576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109ef576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161069a565b60018381548110610a0257610a026124c0565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60018181548110610a4757600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610a8c918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526006835281812060088452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610b10918491016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600290925290205495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ba9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610be3576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610bf8600267ffffffffffffffff61251e565b610c029190612545565b67ffffffffffffffff16811115610c7857806024610c29600267ffffffffffffffff61251e565b610c339190612545565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161069a565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261087f81611b4a565b606082518451141580610cc057508151845114155b15610d0457835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b835167ffffffffffffffff811115610d1e57610d1e61210b565b604051908082528060200260200182016040528015610d47578160200160208202803683370190505b50905060005b8451811015610ef75760006040518060400160405280878481518110610d7557610d756124c0565b60200260200101518152602001868481518110610d9457610d946124c0565b60200260200101518152509050600081604051602001610db491906122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003610e5857868381518110610df957610df96124c0565b6020026020010151868481518110610e1357610e136124c0565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161069a929190918252602082015260400190565b620d2f0060056000878681518110610e7257610e726124c0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054610ed091906124ad565b848481518110610ee257610ee26124c0565b60209081029190910101525050600101610d4d565b509392505050565b600080610f0c8585611cdd565b50610f15611e9e565b50610f21858585611f9e565b90969095509350505050565b60018054600091610f3d9161256d565b905090565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015610fac57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f66565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611028576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161069a565b73ffffffffffffffffffffffffffffffffffffffff8116611075576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6110ec8282611cdd565b5061087f611e9e565b6110fd611e9e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611173576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161069a565b6000604051806040016040528084815260200183815250905060008160405160200161119f91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526002909352908220549092509081900361122a576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b6000828152600260205260408120556001805461124890829061256d565b81548110611258576112586124c0565b6000918252602091829020604080518082018252600290930290910180548352600101548284015251909450611290918591016122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260029093529120829055600180549193508491839081106112ee576112ee6124c0565b6000918252602091829020835160029092020190815591015160019182015580548061131c5761131c612580565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560010181905591556113648686611cdd565b90506000611370611e9e565b9050600062093a808061138381426124ad565b61138d91906125af565b61139791906125c3565b60008681526006602090815260408083208484528252808320839055888352600890915281208290559091506113cd848461256d565b600083815260096020908152604091829020839055600b85905581518b81529081018390529192508a917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a2505050505050505050565b600080610f21858585611f9e565b6024611450600267ffffffffffffffff61251e565b61145a9190612545565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161148e91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101207fc4698ee5000000000000000000000000000000000000000000000000000000008252336004830152915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c4698ee59060240160a060405180830381865afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115759190612604565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906126a9565b9050600062093a808061165381426124ad565b61165d91906125af565b61166791906125c3565b90508181106116b2576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161069a565b6127108511156116f9576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161069a565b33600090815260056020908152604080832087845290915281205461172290620d2f00906124ad565b90504281111561176d576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161069a565b3360009081526003602090815260408083208884528252808320815160608101835281548152600182015493810193909352600201549082018190529091908410156117d2578382604001516117c3919061256d565b82516117cf91906125c3565b90505b600060405180606001604052806127108b8a6117ee91906125c3565b6117f891906125af565b8152602081018b905260400187905290506000611815868861256d565b825161182191906125c3565b3360009081526004602090815260409091205486820151918501519293509161184a90836124ad565b611854919061256d565b33600090815260046020526040902081905590506127108111156118af576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161069a565b6118cd826118bd8f8f611cdd565b6118c791906124ad565b85612058565b60008b81526006602090815260408083208b84529091529020556118f3826118bd611e9e565b600088815260096020526040908190209190915585015187101561199857825160008b81526006602090815260408083208b84529091529020600101546119449161193d916124ad565b8651612058565b60008b81526006602090815260408083208b8452825280832060019081019490945586516009909252909120909101546119819161193d916124ad565b6000888152600960205260409020600101556119f4565b825160008b81526006602090815260408083208b8452909152812060010180549091906119c69084906124ad565b90915550508251600088815260096020526040812060010180549091906119ee9084906124ad565b90915550505b4285604001511115611a5e57845160008b8152600760209081526040808320818a0151845290915281208054909190611a2e90849061256d565b909155505084516040808701516000908152600a6020529081208054909190611a5890849061256d565b90915550505b825160008b815260076020908152604080832081880151845290915281208054909190611a8c9084906124ad565b909155505082516040808501516000908152600a6020529081208054909190611ab69084906124ad565b90915550503360008181526003602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600582528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b600081604051602001611b5d91906122a4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600290935291205490915015611bea57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161069a565b6001805460008381526002602081815260408320849055838501855593825285517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691840291820155928501517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7909301929092559062093a8080611c6f81426124ad565b611c7991906125af565b611c8391906125c3565b60008481526008602090815260409182902083905586518782015183519081529182018690529293507fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a250505050565b604080518082018252838152602080820184905291516000928391611d04918491016122a4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002054600003611d73576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161069a565b600081815260086020908152604080832054600683528184208185528352818420825180840190935280548352600101549282019290925290915b6101f4811015611e9257428311611e9257611dcc62093a80846124ad565b9250600062093a808360200151611de391906125c3565b90508083600001511115611e3d578083600001818151611e03919061256d565b90525060008581526007602090815260408083208784528252909120549084018051829190611e3390839061256d565b905250611e489050565b600080845260208401525b60008581526006602090815260408083208784528252909120845181559084015160019091015542841115611e895760008581526008602052604090208490555b50600101611dae565b50519695505050505050565b600b5460008181526009602090815260408083208151808301909252805482526001015491810191909152909190825b6101f4811015611f9657428311611f9657611eec62093a80846124ad565b9250600062093a808360200151611f0391906125c3565b90508083600001511115611f55578083600001818151611f23919061256d565b9052506000848152600a60209081526040909120549084018051829190611f4b90839061256d565b905250611f609050565b600080845260208401525b6000848152600960209081526040909120845181559084015160019091015542841115611f8d57600b8490555b50600101611ece565b505192915050565b6000808062093a80611fb081866125af565b611fba91906125c3565b600081815260096020908152604080832054815180830183528b81528084018b9052915190965093945092611ff1918491016122a4565b604051602081830303815290604052805190602001209050600084111561204d5760008181526006602090815260408083208684529091529020548461203f82670de0b6b3a76400006125c3565b61204991906125af565b9550505b505050935093915050565b6000818311612068576000612072565b612072828461256d565b9392505050565b6000806040838503121561208c57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156120e5576120d584835180518252602090810151910152565b92840192908501906001016120b8565b5091979650505050505050565b60006020828403121561210457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121815761218161210b565b604052919050565b600067ffffffffffffffff8211156121a3576121a361210b565b5060051b60200190565b600082601f8301126121be57600080fd5b813560206121d36121ce83612189565b61213a565b8083825260208201915060208460051b8701019350868411156121f557600080fd5b602086015b8481101561221157803583529183019183016121fa565b509695505050505050565b60008060006060848603121561223157600080fd5b833567ffffffffffffffff8082111561224957600080fd5b612255878388016121ad565b9450602086013591508082111561226b57600080fd5b612277878388016121ad565b9350604086013591508082111561228d57600080fd5b5061229a868287016121ad565b9150509250925092565b815181526020808301519082015260408101610ae3565b803573ffffffffffffffffffffffffffffffffffffffff811681146122df57600080fd5b919050565b600080604083850312156122f757600080fd5b612300836122bb565b946020939093013593505050565b60008060006060848603121561232357600080fd5b833567ffffffffffffffff8082111561233b57600080fd5b612347878388016121ad565b945060209150818601358181111561235e57600080fd5b61236a888289016121ad565b94505060408601358181111561237f57600080fd5b86019050601f8101871361239257600080fd5b80356123a06121ce82612189565b81815260059190911b820183019083810190898311156123bf57600080fd5b928401925b828410156123e4576123d5846122bb565b825292840192908401906123c4565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561242b5783518352928401929184019160010161240f565b50909695505050505050565b60008060006060848603121561244c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561247557600080fd5b612072826122bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612539576125396124ef565b92169190910492915050565b67ffffffffffffffff8281168282160390808211156125665761256661247e565b5092915050565b81810381811115610ae357610ae361247e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826125be576125be6124ef565b500490565b8082028115828204841417610ae357610ae361247e565b8051600f81900b81146122df57600080fd5b805167ffffffffffffffff811681146122df57600080fd5b600060a0828403121561261657600080fd5b60405160a0810181811067ffffffffffffffff821117156126395761263961210b565b604052612645836125da565b8152612653602084016125da565b6020820152612664604084016125ec565b6040820152612675606084016125ec565b606082015260808301516fffffffffffffffffffffffffffffffff8116811461269d57600080fd5b60808201529392505050565b6000602082840312156126bb57600080fd5b505191905056fea2646970667358221220a8457b91f8f737e3edc92ce46e3b378fb8f129f97e4c52c1dc24d7f232f8a12064736f6c63430008170033", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002ebf38038062002ebf833981016040819052620000349162000119565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b81426200014b565b6200009791906200016e565b600d55506040805180820190915260008082526020820181815260028054600181018255928190529251919092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101556200019a565b6000602082840312156200012c57600080fd5b81516001600160a01b03811681146200014457600080fd5b9392505050565b6000826200016957634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019457634e487b7160e01b600052601160045260246000fd5b92915050565b608051612cfb620001c460003960008181610342015281816119ca0152611aaa0152612cfb6000f3fe608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212207ff2d3fd628521fd4b80fb77475677c5118e40eda5abb526b328f5da06c8703564736f6c63430008170033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212207ff2d3fd628521fd4b80fb77475677c5118e40eda5abb526b328f5da06c8703564736f6c63430008170033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index e6c4c36..f7f0faf 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -3,6 +3,18 @@ pragma solidity ^0.8.23; import {IErrors} from "./interfaces/IErrors.sol"; +// Dispenser interface +interface IDispenser { + /// @dev Enables nominee in dispenser. + /// @param nomineeHash Nominee hash. + function enableNominee(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) @@ -96,6 +108,8 @@ contract VoteWeighting is IErrors { address public immutable ve; // Contract owner address address public owner; + // Dispenser contract + address public dispenser; // Set of Nominee structs Nominee[] public setNominees; @@ -132,7 +146,7 @@ contract VoteWeighting is IErrors { uint256 public timeSum; /// @dev Contract constructor. - /// @param _ve `VotingEscrow` contract address. + /// @param _ve Voting Escrow contract address. constructor(address _ve) { // Check for the zero address if (_ve == address(0)) { @@ -237,6 +251,12 @@ contract VoteWeighting is IErrors { 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).enableNominee(nomineeHash); + } + emit AddNominee(nominee.account, nominee.chainId, id); } @@ -302,6 +322,18 @@ contract VoteWeighting is IErrors { 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(); @@ -515,6 +547,12 @@ contract VoteWeighting is IErrors { // 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 diff --git a/test/VoteWeighting.js b/test/VoteWeighting.js index ffcd476..0657487 100644 --- a/test/VoteWeighting.js +++ b/test/VoteWeighting.js @@ -85,6 +85,19 @@ describe("Voting Escrow OLAS", function () { 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 () { @@ -676,5 +689,35 @@ describe("Voting Escrow OLAS", function () { // 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(); + }); }); }); From 48e32b45dbb7429be562ce91e67a29ecb6e1f6ed Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Wed, 8 May 2024 20:05:55 +0100 Subject: [PATCH 13/14] refactor: use own errors --- abis/0.8.23/VoteWeighting.json | 153 +-------------------------------- contracts/VoteWeighting.sol | 39 ++++++++- 2 files changed, 38 insertions(+), 154 deletions(-) diff --git a/abis/0.8.23/VoteWeighting.json b/abis/0.8.23/VoteWeighting.json index 33f956c..7b8f6b3 100644 --- a/abis/0.8.23/VoteWeighting.json +++ b/abis/0.8.23/VoteWeighting.json @@ -14,22 +14,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "provided", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - } - ], - "name": "InsufficientAllowance", - "type": "error" - }, { "inputs": [ { @@ -51,75 +35,6 @@ "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": [ { @@ -184,33 +99,6 @@ "name": "NomineeRemoved", "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": [ { @@ -259,27 +147,6 @@ "name": "Underflow", "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": [ { @@ -317,22 +184,6 @@ "name": "WrongArrayLength", "type": "error" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "providedBlockNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actualBlockNumber", - "type": "uint256" - } - ], - "name": "WrongBlockNumber", - "type": "error" - }, { "inputs": [], "name": "ZeroAddress", @@ -1228,8 +1079,8 @@ "type": "function" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002ebf38038062002ebf833981016040819052620000349162000119565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b81426200014b565b6200009791906200016e565b600d55506040805180820190915260008082526020820181815260028054600181018255928190529251919092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101556200019a565b6000602082840312156200012c57600080fd5b81516001600160a01b03811681146200014457600080fd5b9392505050565b6000826200016957634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019457634e487b7160e01b600052601160045260246000fd5b92915050565b608051612cfb620001c460003960008181610342015281816119ca0152611aaa0152612cfb6000f3fe608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212207ff2d3fd628521fd4b80fb77475677c5118e40eda5abb526b328f5da06c8703564736f6c63430008170033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212207ff2d3fd628521fd4b80fb77475677c5118e40eda5abb526b328f5da06c8703564736f6c63430008170033", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002ebf38038062002ebf833981016040819052620000349162000119565b6001600160a01b0381166200005c5760405163d92e233d60e01b815260040160405180910390fd5b600080546001600160a01b031916331790556001600160a01b03811660805262093a806200008b81426200014b565b6200009791906200016e565b600d55506040805180820190915260008082526020820181815260028054600181018255928190529251919092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101556200019a565b6000602082840312156200012c57600080fd5b81516001600160a01b03811681146200014457600080fd5b9392505050565b6000826200016957634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200019457634e487b7160e01b600052601160045260246000fd5b92915050565b608051612cfb620001c460003960008181610342015281816119ca0152611aaa0152612cfb6000f3fe608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212200951e03c92e772052c87670f684b4d3391c691297c78fda6f79467922caa7a2b64736f6c63430008170033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102ac5760003560e01c806385556a951161017b578063c54dd0d4116100d8578063ec73d9061161008c578063f4359ce511610071578063f4359ce5146106c4578063f4da12ba146106ce578063f9572f7c146106d657600080fd5b8063ec73d90614610684578063f0cd64af146106a457600080fd5b8063dc87f536116100bd578063dc87f53614610630578063e09d894d1461065b578063e4a28a521461067b57600080fd5b8063c54dd0d41461060a578063c88d47f01461061d57600080fd5b8063a51248031161012f578063b174b41c11610114578063b174b41c146105bc578063beaf44e8146105ef578063c2c4c5c11461060257600080fd5b8063a5124803146105a1578063a6f9dae1146105a957600080fd5b80638e28764b116101605780638e28764b146105405780639d17505314610572578063a18f99ff1461059957600080fd5b806385556a95146104f55780638da5cb5b1461052057600080fd5b80634159703611610229578063609c6b87116101dd5780636b39ac1a116101c25780636b39ac1a146104af5780637a75b27e146104c25780637ee8bfe9146104e257600080fd5b8063609c6b87146104475780636a28a33c1461049c57600080fd5b8063456f09971161020e578063456f09971461042157806348264997146104345780634f6ffd071461043d57600080fd5b806341597036146103f75780634479b5cf1461040e57600080fd5b80631f8507161161028057806327ebf5311161026557806327ebf5311461039c5780632a53b2af146103bc5780633b766b3d146103cf57600080fd5b80631f8507161461033d57806326abaf241461038957600080fd5b806292a596146102b15780630c423201146102da5780631765ab7f146103085780631b98dd901461031d575b600080fd5b6102c46102bf36600461267c565b6106e9565b6040516102d1919061269e565b60405180910390f35b6102fa6102e83660046126f5565b600c6020526000908152604090205481565b6040519081526020016102d1565b61031b61031636600461267c565b610871565b005b6102fa61032b3660046126f5565b600a6020526000908152604090205481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b61031b61039736600461281f565b610969565b6103af6103aa3660046126f5565b610a30565b6040516102d191906128a7565b61031b6103ca3660046128e7565b610b1e565b6103e26103dd3660046126f5565b610bd8565b604080519283526020830191909152016102d1565b600d546000908152600b60205260409020546102fa565b6102fa61041c36600461267c565b610c06565b6102fa61042f36600461267c565b610c8a565b6102fa600d5481565b6102fa620d2f0081565b610481610455366004612902565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d1565b61031b6104aa36600461267c565b610cfd565b61031b6104bd366004612902565b610ef1565b6104d56104d036600461292c565b611040565b6040516102d19190612a11565b6103e26104f0366004612a55565b611294565b6102fa610503366004612902565b600760209081526000928352604080842090915290825290205481565b6000546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6103e261054e36600461267c565b60086020908152600092835260408084209091529082529020805460019091015482565b6103e26105803660046126f5565b600b602052600090815260409020805460019091015482565b6102fa6112c2565b6102c46112d9565b61031b6105b73660046128e7565b61134c565b6105df6105ca3660046126f5565b60046020526000908152604090205460ff1681565b60405190151581526020016102d1565b61031b6105fd36600461267c565b611479565b61031b61148c565b61031b61061836600461267c565b611497565b6103e261062b366004612a55565b6118ae565b6102fa61063e36600461267c565b600960209081526000928352604080842090915290825290205481565b6001546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102fa61271081565b6102fa6106923660046128e7565b60066020526000908152604090205481565b6102fa6106b23660046126f5565b60036020526000908152604090205481565b6102fa62093a8081565b6102fa6118bc565b61031b6106e4366004612a55565b6118e8565b60608215806106f6575081155b1561072d576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107398385612ab0565b60025490915080821115610788576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044015b60405180910390fd5b8367ffffffffffffffff8111156107a1576107a161270e565b6040519080825280602002602001820160405280156107e657816020015b60408051808201909152600080825260208201528152602001906001900390816107bf5790505b50925060005b848110156108685760006108008783612ab0565b90506002818154811061081557610815612ac3565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505085838151811061085457610854612ac3565b6020908102919091010152506001016107ec565b50505092915050565b816108a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060246108be600267ffffffffffffffff612b21565b6108c89190612b48565b67ffffffffffffffff1610610947578060246108ed600267ffffffffffffffff612b21565b6108f79190612b48565b61090c9067ffffffffffffffff166001612ab0565b6040517fc076384b0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60408051808201909152828152602081018290526109648161201f565b505050565b8151835114158061097c57508051835114155b156109c057825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60005b8351811015610a2a57610a228482815181106109e1576109e1612ac3565b60200260200101518483815181106109fb576109fb612ac3565b6020026020010151848481518110610a1557610a15612ac3565b60200260200101516118e8565b6001016109c3565b50505050565b6040805180820190915260008082526020820152600254600090610a5690600190612b70565b905082600003610a92576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ad6576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161077f565b60028381548110610ae957610ae9612ac3565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b91576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60028181548110610be857600080fd5b60009182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291516000928391610c2d918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815260088352818120600a8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291516000928391610cb1918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600390925290205495945050505050565b60006040518060400160405280848152602001838152509050600081604051602001610d2991906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff16610db2576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b33600090815260056020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610e28576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610e92578051600083815260096020908152604080832081860151845290915281208054909190610e62908490612b70565b909155505080516040808301516000908152600c6020529081208054909190610e8c908490612b70565b90915550505b3360009081526006602090815260409091205490820151610eb39082612b70565b336000908152600660209081526040808320939093556005815282822095825294909452832083815560018101849055600201929092555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f78576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f8d600267ffffffffffffffff612b21565b610f979190612b48565b67ffffffffffffffff1681111561100d57806024610fbe600267ffffffffffffffff612b21565b610fc89190612b48565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161077f565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff83168152602081018290526109648161201f565b60608251845114158061105557508151845114155b1561109957835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b835167ffffffffffffffff8111156110b3576110b361270e565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b845181101561128c576000604051806040016040528087848151811061110a5761110a612ac3565b6020026020010151815260200186848151811061112957611129612ac3565b6020026020010151815250905060008160405160200161114991906128a7565b60405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036111ed5786838151811061118e5761118e612ac3565b60200260200101518684815181106111a8576111a8612ac3565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161077f929190918252602082015260400190565b620d2f006007600087868151811061120757611207612ac3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020546112659190612ab0565b84848151811061127757611277612ac3565b602090810291909101015250506001016110e2565b509392505050565b6000806112a185856122ac565b506112aa6124a1565b506112b68585856125a1565b90969095509350505050565b6002546000906112d490600190612b70565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015611343578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906112fd565b50505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bf576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161077f565b73ffffffffffffffffffffffffffffffffffffffff811661140c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61148382826122ac565b506109646124a1565b6114946124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461150a576000546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161077f565b6000604051806040016040528084815260200183815250905060008160405160200161153691906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935290822054909250908190036115c1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b60006115cd86866122ac565b905060006115d96124a1565b9050600062093a80806115ec8142612ab0565b6115f69190612b83565b6116009190612b97565b60008681526008602090815260408083208484528252808320839055888352600a90915281208290559091506116368484612b70565b6000838152600b60209081526040808320849055600d8690558983526004909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555490915073ffffffffffffffffffffffffffffffffffffffff168015611726576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e90602401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050505b6000878152600360205260408120556002805461174590600190612b70565b8154811061175557611755612ac3565b600091825260209182902060408051808201825260029093029091018054835260010154828401525190995061178d918a91016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815260039093529120879055600280549198508991889081106117eb576117eb612ac3565b90600052602060002090600202016000820151816000015560208201518160010155905050600280548061182157611821612bae565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301928302018181556001015590556040518a907f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab069061189a908c908690918252602082015260400190565b60405180910390a250505050505050505050565b6000806112b68585856125a1565b60246118d1600267ffffffffffffffff612b21565b6118db9190612b48565b67ffffffffffffffff1681565b600060405180604001604052808581526020018481525060405160200161190f91906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff1615611999576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161077f565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612c07565b602001516040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201526fffffffffffffffffffffffffffffffff909116915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634deafcae90602401602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612cac565b9050600062093a8080611b288142612ab0565b611b329190612b83565b611b3c9190612b97565b9050818110611b87576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161077f565b612710851115611bce576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161077f565b336000908152600760209081526040808320878452909152812054611bf790620d2f0090612ab0565b905042811115611c42576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161077f565b336000908152600560209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611ca757838260400151611c989190612b70565b8251611ca49190612b97565b90505b600060405180606001604052806127108b8a611cc39190612b97565b611ccd9190612b83565b8152602081018b905260400187905290506000611cea8688612b70565b8251611cf69190612b97565b33600090815260066020908152604090912054868201519185015192935091611d1f9083612ab0565b611d299190612b70565b3360009081526006602052604090208190559050612710811115611d84576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161077f565b611da282611d928f8f6122ac565b611d9c9190612ab0565b8561265b565b60008b81526008602090815260408083208b8452909152902055611dc882611d926124a1565b6000888152600b60205260409081902091909155850151871015611e6d57825160008b81526008602090815260408083208b8452909152902060010154611e1991611e1291612ab0565b865161265b565b60008b81526008602090815260408083208b845282528083206001908101949094558651600b90925290912090910154611e5691611e1291612ab0565b6000888152600b6020526040902060010155611ec9565b825160008b81526008602090815260408083208b845290915281206001018054909190611e9b908490612ab0565b909155505082516000888152600b602052604081206001018054909190611ec3908490612ab0565b90915550505b4285604001511115611f3357845160008b8152600960209081526040808320818a0151845290915281208054909190611f03908490612b70565b909155505084516040808701516000908152600c6020529081208054909190611f2d908490612b70565b90915550505b825160008b815260096020908152604080832081880151845290915281208054909190611f61908490612ab0565b909155505082516040808501516000908152600c6020529081208054909190611f8b908490612ab0565b90915550503360008181526005602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600782528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b60008160405160200161203291906128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008181526003909352912054909150156120bf57815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b60008181526004602052604090205460ff161561211857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b600280546000838152600360209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061219d8142612ab0565b6121a79190612b83565b6121b19190612b97565b6000848152600a6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff168015612265576040517f03e510200000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8216906303e5102090602401600060405180830381600087803b15801561224c57600080fd5b505af1158015612260573d6000803e3d6000fd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b6040805180820182528381526020808201849052915160009283916122d3918491016128a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600490935291205490915060ff161580156123355750600081815260036020526040902054155b15612376576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161077f565b6000818152600a6020908152604080832054600883528184208185528352818420825180840190935280548352600101549282019290925290915b6101f481101561249557428311612495576123cf62093a8084612ab0565b9250600062093a8083602001516123e69190612b97565b905080836000015111156124405780836000018181516124069190612b70565b90525060008581526009602090815260408083208784528252909120549084018051829190612436908390612b70565b90525061244b9050565b600080845260208401525b6000858152600860209081526040808320878452825290912084518155908401516001909101554284111561248c576000858152600a602052604090208490555b506001016123b1565b50519695505050505050565b600d546000818152600b602090815260408083208151808301909252805482526001015491810191909152909190825b6101f481101561259957428311612599576124ef62093a8084612ab0565b9250600062093a8083602001516125069190612b97565b905080836000015111156125585780836000018181516125269190612b70565b9052506000848152600c6020908152604090912054908401805182919061254e908390612b70565b9052506125639050565b600080845260208401525b6000848152600b6020908152604090912084518155908401516001909101554284111561259057600d8490555b506001016124d1565b505192915050565b6000808062093a806125b38186612b83565b6125bd9190612b97565b6000818152600b6020908152604080832054815180830183528b81528084018b90529151909650939450926125f4918491016128a7565b60405160208183030381529060405280519060200120905060008411156126505760008181526008602090815260408083208684529091529020548461264282670de0b6b3a7640000612b97565b61264c9190612b83565b9550505b505050935093915050565b600081831161266b576000612675565b6126758284612b70565b9392505050565b6000806040838503121561268f57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156126e8576126d884835180518252602090810151910152565b92840192908501906001016126bb565b5091979650505050505050565b60006020828403121561270757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127845761278461270e565b604052919050565b600067ffffffffffffffff8211156127a6576127a661270e565b5060051b60200190565b600082601f8301126127c157600080fd5b813560206127d66127d18361278c565b61273d565b8083825260208201915060208460051b8701019350868411156127f857600080fd5b602086015b8481101561281457803583529183019183016127fd565b509695505050505050565b60008060006060848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016127b0565b9450602086013591508082111561286e57600080fd5b61287a878388016127b0565b9350604086013591508082111561289057600080fd5b5061289d868287016127b0565b9150509250925092565b815181526020808301519082015260408101610c84565b803573ffffffffffffffffffffffffffffffffffffffff811681146128e257600080fd5b919050565b6000602082840312156128f957600080fd5b612675826128be565b6000806040838503121561291557600080fd5b61291e836128be565b946020939093013593505050565b60008060006060848603121561294157600080fd5b833567ffffffffffffffff8082111561295957600080fd5b612965878388016127b0565b945060209150818601358181111561297c57600080fd5b612988888289016127b0565b94505060408601358181111561299d57600080fd5b86019050601f810187136129b057600080fd5b80356129be6127d18261278c565b81815260059190911b820183019083810190898311156129dd57600080fd5b928401925b82841015612a02576129f3846128be565b825292840192908401906129e2565b80955050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612a4957835183529284019291840191600101612a2d565b50909695505050505050565b600080600060608486031215612a6a57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b3c57612b3c612af2565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612b6957612b69612a81565b5092915050565b81810381811115610c8457610c84612a81565b600082612b9257612b92612af2565b500490565b8082028115828204841417610c8457610c84612a81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8051600f81900b81146128e257600080fd5b805167ffffffffffffffff811681146128e257600080fd5b600060a08284031215612c1957600080fd5b60405160a0810181811067ffffffffffffffff82111715612c3c57612c3c61270e565b604052612c4883612bdd565b8152612c5660208401612bdd565b6020820152612c6760408401612bef565b6040820152612c7860608401612bef565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ca057600080fd5b60808201529392505050565b600060208284031215612cbe57600080fd5b505191905056fea26469706673582212200951e03c92e772052c87670f684b4d3391c691297c78fda6f79467922caa7a2b64736f6c63430008170033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index f7f0faf..6c3f6eb 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.23; -import {IErrors} from "./interfaces/IErrors.sol"; - // Dispenser interface interface IDispenser { /// @dev Enables nominee in dispenser. @@ -43,6 +41,27 @@ interface IVEOLAS { 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. @@ -58,6 +77,12 @@ error NomineeDoesNotExist(bytes32 account, uint256 chainId); /// @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. @@ -74,23 +99,31 @@ error NomineeNotRemoved(bytes32 account, uint256 chainId); /// @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; } -contract VoteWeighting is IErrors { + +/// @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); From a916df0f4f3c4d52754ffb543a756f21f25aec99 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 13 May 2024 13:15:36 +0100 Subject: [PATCH 14/14] chore: adding names --- contracts/VoteWeighting.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 6c3f6eb..b5ea92d 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.23; // Dispenser interface interface IDispenser { - /// @dev Enables nominee in dispenser. + /// @dev Records nominee addition in dispenser. /// @param nomineeHash Nominee hash. - function enableNominee(bytes32 nomineeHash) external; + function addNominee(bytes32 nomineeHash) external; /// @dev Records nominee removal. /// @param nomineeHash Nominee hash. @@ -287,7 +287,7 @@ contract VoteWeighting { // Enable nominee in dispenser, if applicable address localDispenser = dispenser; if (localDispenser != address(0)) { - IDispenser(localDispenser).enableNominee(nomineeHash); + IDispenser(localDispenser).addNominee(nomineeHash); } emit AddNominee(nominee.account, nominee.chainId, id);