From 2a54ae79a02a02fcd8f67a109fea1f82c68963f4 Mon Sep 17 00:00:00 2001 From: Jameson Hodge Date: Sun, 5 Dec 2021 19:53:20 -0500 Subject: [PATCH] add setRewardPerSecond, distributeRewards tasks --- deployments/ropsten/EscrowPool.json | 2079 --------------------------- hardhat.config.ts | 2 + tasks/distributeRewards.ts | 17 + tasks/setRewardPerSecond.ts | 19 + 4 files changed, 38 insertions(+), 2079 deletions(-) delete mode 100644 deployments/ropsten/EscrowPool.json create mode 100644 tasks/distributeRewards.ts create mode 100644 tasks/setRewardPerSecond.ts diff --git a/deployments/ropsten/EscrowPool.json b/deployments/ropsten/EscrowPool.json deleted file mode 100644 index d40d9ff..0000000 --- a/deployments/ropsten/EscrowPool.json +++ /dev/null @@ -1,2079 +0,0 @@ -{ - "address": "0x7f6ac7CdcaE1476B043031581d852E68A4C363C8", - "abi": [ - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" - }, - { - "internalType": "address", - "name": "_depositToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_escrowPool", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_escrowPortion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_escrowDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxBonus", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxLockDuration", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "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": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "duration", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - } - ], - "name": "Deposited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_receiver", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_escrowedAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_nonEscrowedAmount", - "type": "uint256" - } - ], - "name": "RewardsClaimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "by", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "rewardsDistributed", - "type": "uint256" - } - ], - "name": "RewardsDistributed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "by", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "fundsWithdrawn", - "type": "uint256" - } - ], - "name": "RewardsWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "by", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "TokenSaved", - "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": "uint256", - "name": "depositId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Withdrawn", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_LOCK_DURATION", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "POINTS_MULTIPLIER", - "outputs": [ - { - "internalType": "uint128", - "name": "", - "type": "uint128" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TOKEN_SAVER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "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": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint32", - "name": "pos", - "type": "uint32" - } - ], - "name": "checkpoints", - "outputs": [ - { - "components": [ - { - "internalType": "uint32", - "name": "fromBlock", - "type": "uint32" - }, - { - "internalType": "uint224", - "name": "votes", - "type": "uint224" - } - ], - "internalType": "struct ERC20Votes.Checkpoint", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_receiver", - "type": "address" - } - ], - "name": "claimRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "cumulativeRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "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": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "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": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_receiver", - "type": "address" - } - ], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "depositToken", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "depositsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "start", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "end", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "distributeRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "escrowDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "escrowPool", - "outputs": [ - { - "internalType": "contract ITimeLockPool", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "escrowPortion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "getDepositsOf", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "start", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "end", - "type": "uint64" - } - ], - "internalType": "struct TimeLockPool.Deposit[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "getDepositsOfLength", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_lockDuration", - "type": "uint256" - } - ], - "name": "getMultiplier", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "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": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "getTotalDeposit", - "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" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "maxBonus", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maxLockDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "numCheckpoints", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "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": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "pointsCorrection", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pointsPerShare", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardToken", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "address", - "name": "_receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "saveToken", - "outputs": [], - "stateMutability": "nonpayable", - "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": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_depositId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_receiver", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "withdrawableRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "withdrawnRewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "withdrawnRewardsOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x771dbad08d963d5d7ad85f00ee951395c017dd74cf3521969948fbedde71c409", - "receipt": { - "to": null, - "from": "0xCAa58677fa6a5437B0eDD37659f94DdBEa575945", - "contractAddress": "0x7f6ac7CdcaE1476B043031581d852E68A4C363C8", - "transactionIndex": 8, - "gasUsed": "3721273", - "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000001000000000000000000000000000030000000000000000000800000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000020000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x34ff80c3d27037cf5802623e05fe11d954fe1e9a8875467248b7d4ce498d6e50", - "transactionHash": "0x771dbad08d963d5d7ad85f00ee951395c017dd74cf3521969948fbedde71c409", - "logs": [ - { - "transactionIndex": 8, - "blockNumber": 11533361, - "transactionHash": "0x771dbad08d963d5d7ad85f00ee951395c017dd74cf3521969948fbedde71c409", - "address": "0x7f6ac7CdcaE1476B043031581d852E68A4C363C8", - "topics": [ - "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000caa58677fa6a5437b0edd37659f94ddbea575945", - "0x000000000000000000000000caa58677fa6a5437b0edd37659f94ddbea575945" - ], - "data": "0x", - "logIndex": 5, - "blockHash": "0x34ff80c3d27037cf5802623e05fe11d954fe1e9a8875467248b7d4ce498d6e50" - } - ], - "blockNumber": 11533361, - "cumulativeGasUsed": "6581135", - "status": 1, - "byzantium": true - }, - "args": [ - "Escrowed Flux Token", - "EFLX", - "0x23FF74Af1a1e8Ef4433d761943Eb164F927bA2e2", - "0x23FF74Af1a1e8Ef4433d761943Eb164F927bA2e2", - "0x0000000000000000000000000000000000000000", - 0, - 0, - 0, - 315360000 - ], - "solcInputHash": "4dd4042dc1c15f899b33729ede82d124", - "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_escrowPool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_escrowPortion\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_escrowDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxBonus\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxLockDuration\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_escrowedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_nonEscrowedAmount\",\"type\":\"uint256\"}],\"name\":\"RewardsClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardsDistributed\",\"type\":\"uint256\"}],\"name\":\"RewardsDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsWithdrawn\",\"type\":\"uint256\"}],\"name\":\"RewardsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokenSaved\",\"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\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_LOCK_DURATION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POINTS_MULTIPLIER\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_SAVER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"cumulativeRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"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\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"depositsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"start\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"end\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"distributeRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"escrowDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"escrowPool\",\"outputs\":[{\"internalType\":\"contract ITimeLockPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"escrowPortion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDepositsOf\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"start\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"end\",\"type\":\"uint64\"}],\"internalType\":\"struct TimeLockPool.Deposit[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getDepositsOfLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_lockDuration\",\"type\":\"uint256\"}],\"name\":\"getMultiplier\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getTotalDeposit\",\"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\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxBonus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxLockDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"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\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pointsCorrection\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pointsPerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"saveToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_depositId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"withdrawableRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"withdrawnRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"withdrawnRewardsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"cumulativeRewardsOf(address)\":{\"details\":\"accumulativeFundsOf(account) = withdrawableRewardsOf(account) + withdrawnRewardsOf(account) = (pointsPerShare * balanceOf(account) + pointsCorrection[account]) / POINTS_MULTIPLIER\",\"params\":{\"_account\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of rewards that `account` has earned in total.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"grantRole(bytes32,address)\":{\"details\":\"Overload {grantRole} to track enumerable memberships\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Overload {renounceRole} to track enumerable memberships\"},\"revokeRole(bytes32,address)\":{\"details\":\"Overload {revokeRole} to track enumerable memberships\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"},\"withdrawableRewardsOf(address)\":{\"details\":\"Returns the total amount of rewards a given address is able to withdraw.\",\"params\":{\"_account\":\"Address of a reward recipient\"},\"returns\":{\"_0\":\"A uint256 representing the rewards `account` can withdraw\"}},\"withdrawnRewardsOf(address)\":{\"params\":{\"_account\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of rewards that `account` has withdrawn.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cumulativeRewardsOf(address)\":{\"notice\":\"View the amount of rewards that an address has earned in total.\"},\"withdrawnRewardsOf(address)\":{\"notice\":\"View the amount of rewards that an address has withdrawn.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLockNonTransferablePool.sol\":\"TimeLockNonTransferablePool\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":800},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role, _msgSender());\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n function _grantRole(bytes32 role, address account) private {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n function _revokeRole(bytes32 role, address account) private {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x183481af1c40d2efb26b86f63d6fe9e22f24c87e436d60a69f261b38500e7cd6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {grantRole} to track enumerable memberships\\n */\\n function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {\\n super.grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {revokeRole} to track enumerable memberships\\n */\\n function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {\\n super.revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n\\n /**\\n * @dev Overload {renounceRole} to track enumerable memberships\\n */\\n function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {\\n super.renounceRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n\\n /**\\n * @dev Overload {_setupRole} to track enumerable memberships\\n */\\n function _setupRole(bytes32 role, address account) internal virtual override {\\n super._setupRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n}\\n\",\"keccak256\":\"0x313834fba9dbefee1df7717a5e3063ebf567d276e67bc925a03c7f8423f4c50e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xfe0edb09653ed10e8a1bfe03eb9b0ff06775666eee817a95bd3d0799f1ee2b44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x6a9a31f278ee3ed0568ab7e3c09ecb72bf92f922475a274760b4c58f87f9ad0c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @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 *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\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 *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this\\n * will significantly increase the base gas cost of transfers.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual {\\n return _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n return _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x5ededcc80abc4797cdad3c0344c510a6aee060460f3fb8ec5983c4cfaeaef5e7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private immutable _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n assembly {\\n size := extcodesize(account)\\n }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n}\\n\",\"keccak256\":\"0x391d3ba97ab6856a16b225d6ee29617ad15ff00db70f3b4df1ab5ea33aa47c9d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @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 *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a / b + (a % b == 0 ? 0 : 1);\\n }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits.\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x08d867b4c0bb782b9135691fa732b6846e0f133006489c3aa505abd1f6de56cb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastvalue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastvalue;\\n // Update the index for the moved value\\n set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n return _values(set._inner);\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x3778dc944f4a696335878bad8beca60f38b7c79b7a0bd8ddbeb618bd502a95ae\",\"license\":\"MIT\"},\"contracts/TimeLockNonTransferablePool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\nimport \\\"./TimeLockPool.sol\\\";\\n\\ncontract TimeLockNonTransferablePool is TimeLockPool {\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n address _depositToken,\\n address _rewardToken,\\n address _escrowPool,\\n uint256 _escrowPortion,\\n uint256 _escrowDuration,\\n uint256 _maxBonus,\\n uint256 _maxLockDuration\\n ) TimeLockPool(_name, _symbol, _depositToken, _rewardToken, _escrowPool, _escrowPortion, _escrowDuration, _maxBonus, _maxLockDuration) {\\n\\n }\\n\\n // disable transfers\\n function _transfer(address _from, address _to, uint256 _amount) internal override {\\n revert(\\\"NON_TRANSFERABLE\\\");\\n }\\n}\",\"keccak256\":\"0xdcbca8d420aba082fe9a9e509d8619add4f0ae1dc09c573e0ff816a758609f72\",\"license\":\"MIT\"},\"contracts/TimeLockPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\nimport \\\"./base/BasePool.sol\\\";\\nimport \\\"./interfaces/ITimeLockPool.sol\\\";\\n\\ncontract TimeLockPool is BasePool, ITimeLockPool {\\n using Math for uint256;\\n using SafeERC20 for IERC20;\\n\\n uint256 public immutable maxBonus;\\n uint256 public immutable maxLockDuration;\\n uint256 public constant MIN_LOCK_DURATION = 10 minutes;\\n \\n mapping(address => Deposit[]) public depositsOf;\\n\\n struct Deposit {\\n uint256 amount;\\n uint64 start;\\n uint64 end;\\n }\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n address _depositToken,\\n address _rewardToken,\\n address _escrowPool,\\n uint256 _escrowPortion,\\n uint256 _escrowDuration,\\n uint256 _maxBonus,\\n uint256 _maxLockDuration\\n ) BasePool(_name, _symbol, _depositToken, _rewardToken, _escrowPool, _escrowPortion, _escrowDuration) {\\n require(_maxLockDuration >= MIN_LOCK_DURATION, \\\"TimeLockPool.constructor: max lock duration must be greater or equal to mininmum lock duration\\\");\\n maxBonus = _maxBonus;\\n maxLockDuration = _maxLockDuration;\\n }\\n\\n event Deposited(uint256 amount, uint256 duration, address indexed receiver, address indexed from);\\n event Withdrawn(uint256 indexed depositId, address indexed receiver, address indexed from, uint256 amount);\\n\\n function deposit(uint256 _amount, uint256 _duration, address _receiver) external override {\\n require(_amount > 0, \\\"TimeLockPool.deposit: cannot deposit 0\\\");\\n // Don't allow locking > maxLockDuration\\n uint256 duration = _duration.min(maxLockDuration);\\n // Enforce min lockup duration to prevent flash loan or MEV transaction ordering\\n duration = duration.max(MIN_LOCK_DURATION);\\n\\n depositToken.safeTransferFrom(_msgSender(), address(this), _amount);\\n\\n depositsOf[_receiver].push(Deposit({\\n amount: _amount,\\n start: uint64(block.timestamp),\\n end: uint64(block.timestamp) + uint64(duration)\\n }));\\n\\n uint256 mintAmount = _amount * getMultiplier(duration) / 1e18;\\n\\n _mint(_receiver, mintAmount);\\n emit Deposited(_amount, duration, _receiver, _msgSender());\\n }\\n\\n function withdraw(uint256 _depositId, address _receiver) external {\\n require(_depositId < depositsOf[_msgSender()].length, \\\"TimeLockPool.withdraw: Deposit does not exist\\\");\\n Deposit memory userDeposit = depositsOf[_msgSender()][_depositId];\\n require(block.timestamp >= userDeposit.end, \\\"TimeLockPool.withdraw: too soon\\\");\\n\\n // No risk of wrapping around on casting to uint256 since deposit end always > deposit start and types are 64 bits\\n uint256 shareAmount = userDeposit.amount * getMultiplier(uint256(userDeposit.end - userDeposit.start)) / 1e18;\\n\\n // remove Deposit\\n depositsOf[_msgSender()][_depositId] = depositsOf[_msgSender()][depositsOf[_msgSender()].length - 1];\\n depositsOf[_msgSender()].pop();\\n\\n // burn pool shares\\n _burn(_msgSender(), shareAmount);\\n \\n // return tokens\\n depositToken.safeTransfer(_receiver, userDeposit.amount);\\n emit Withdrawn(_depositId, _receiver, _msgSender(), userDeposit.amount);\\n }\\n\\n function getMultiplier(uint256 _lockDuration) public view returns(uint256) {\\n return 1e18 + (maxBonus * _lockDuration / maxLockDuration);\\n }\\n\\n function getTotalDeposit(address _account) public view returns(uint256) {\\n uint256 total;\\n for(uint256 i = 0; i < depositsOf[_account].length; i++) {\\n total += depositsOf[_account][i].amount;\\n }\\n\\n return total;\\n }\\n\\n function getDepositsOf(address _account) public view returns(Deposit[] memory) {\\n return depositsOf[_account];\\n }\\n\\n function getDepositsOfLength(address _account) public view returns(uint256) {\\n return depositsOf[_account].length;\\n }\\n}\",\"keccak256\":\"0x738987c9f92b60ea100d7e295d962c7d6ce18fc3338902d61c2a10ed9cb9caf0\",\"license\":\"MIT\"},\"contracts/base/AbstractRewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\nimport \\\"../interfaces/IAbstractRewards.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Based on: https://github.com/indexed-finance/dividends/blob/master/contracts/base/AbstractDividends.sol\\n * Renamed dividends to rewards.\\n * @dev (OLD) Many functions in this contract were taken from this repository:\\n * https://github.com/atpar/funds-distribution-token/blob/master/contracts/FundsDistributionToken.sol\\n * which is an example implementation of ERC 2222, the draft for which can be found at\\n * https://github.com/atpar/funds-distribution-token/blob/master/EIP-DRAFT.md\\n *\\n * This contract has been substantially modified from the original and does not comply with ERC 2222.\\n * Many functions were renamed as \\\"rewards\\\" rather than \\\"funds\\\" and the core functionality was separated\\n * into this abstract contract which can be inherited by anything tracking ownership of reward shares.\\n */\\nabstract contract AbstractRewards is IAbstractRewards {\\n using SafeCast for uint128;\\n using SafeCast for uint256;\\n using SafeCast for int256;\\n\\n/* ======== Constants ======== */\\n uint128 public constant POINTS_MULTIPLIER = type(uint128).max;\\n\\n/* ======== Internal Function References ======== */\\n function(address) view returns (uint256) private immutable getSharesOf;\\n function() view returns (uint256) private immutable getTotalShares;\\n\\n/* ======== Storage ======== */\\n uint256 public pointsPerShare;\\n mapping(address => int256) public pointsCorrection;\\n mapping(address => uint256) public withdrawnRewards;\\n\\n constructor(\\n function(address) view returns (uint256) getSharesOf_,\\n function() view returns (uint256) getTotalShares_\\n ) {\\n getSharesOf = getSharesOf_;\\n getTotalShares = getTotalShares_;\\n }\\n\\n/* ======== Public View Functions ======== */\\n /**\\n * @dev Returns the total amount of rewards a given address is able to withdraw.\\n * @param _account Address of a reward recipient\\n * @return A uint256 representing the rewards `account` can withdraw\\n */\\n function withdrawableRewardsOf(address _account) public view override returns (uint256) {\\n return cumulativeRewardsOf(_account) - withdrawnRewards[_account];\\n }\\n\\n /**\\n * @notice View the amount of rewards that an address has withdrawn.\\n * @param _account The address of a token holder.\\n * @return The amount of rewards that `account` has withdrawn.\\n */\\n function withdrawnRewardsOf(address _account) public view override returns (uint256) {\\n return withdrawnRewards[_account];\\n }\\n\\n /**\\n * @notice View the amount of rewards that an address has earned in total.\\n * @dev accumulativeFundsOf(account) = withdrawableRewardsOf(account) + withdrawnRewardsOf(account)\\n * = (pointsPerShare * balanceOf(account) + pointsCorrection[account]) / POINTS_MULTIPLIER\\n * @param _account The address of a token holder.\\n * @return The amount of rewards that `account` has earned in total.\\n */\\n function cumulativeRewardsOf(address _account) public view override returns (uint256) {\\n return ((pointsPerShare * getSharesOf(_account)).toInt256() + pointsCorrection[_account]).toUint256() / POINTS_MULTIPLIER;\\n }\\n\\n/* ======== Dividend Utility Functions ======== */\\n\\n /** \\n * @notice Distributes rewards to token holders.\\n * @dev It reverts if the total shares is 0.\\n * It emits the `RewardsDistributed` event if the amount to distribute is greater than 0.\\n * About undistributed rewards:\\n * In each distribution, there is a small amount which does not get distributed,\\n * which is `(amount * POINTS_MULTIPLIER) % totalShares()`.\\n * With a well-chosen `POINTS_MULTIPLIER`, the amount of funds that are not getting\\n * distributed in a distribution can be less than 1 (base unit).\\n */\\n function _distributeRewards(uint256 _amount) internal {\\n uint256 shares = getTotalShares();\\n require(shares > 0, \\\"AbstractRewards._distributeRewards: total share supply is zero\\\");\\n\\n if (_amount > 0) {\\n pointsPerShare = pointsPerShare + (_amount * POINTS_MULTIPLIER / shares);\\n emit RewardsDistributed(msg.sender, _amount);\\n }\\n }\\n\\n /**\\n * @notice Prepares collection of owed rewards\\n * @dev It emits a `RewardsWithdrawn` event if the amount of withdrawn rewards is\\n * greater than 0.\\n */\\n function _prepareCollect(address _account) internal returns (uint256) {\\n uint256 _withdrawableDividend = withdrawableRewardsOf(_account);\\n if (_withdrawableDividend > 0) {\\n withdrawnRewards[_account] = withdrawnRewards[_account] + _withdrawableDividend;\\n emit RewardsWithdrawn(_account, _withdrawableDividend);\\n }\\n return _withdrawableDividend;\\n }\\n\\n function _correctPointsForTransfer(address _from, address _to, uint256 _shares) internal {\\n int256 _magCorrection = (pointsPerShare * _shares).toInt256();\\n pointsCorrection[_from] = pointsCorrection[_from] + _magCorrection;\\n pointsCorrection[_to] = pointsCorrection[_to] - _magCorrection;\\n }\\n\\n /**\\n * @dev Increases or decreases the points correction for `account` by\\n * `shares*pointsPerShare`.\\n */\\n function _correctPoints(address _account, int256 _shares) internal {\\n pointsCorrection[_account] = pointsCorrection[_account] + (_shares * (int256(pointsPerShare)));\\n }\\n}\",\"keccak256\":\"0x33d03ee39331a95d9e8d8ac9cc441ab5a5c1dcd6eed6c7c0542db5a3378d0557\",\"license\":\"MIT\"},\"contracts/base/BasePool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/SafeCast.sol\\\";\\n\\nimport \\\"../interfaces/IBasePool.sol\\\";\\nimport \\\"../interfaces/ITimeLockPool.sol\\\";\\n\\nimport \\\"./AbstractRewards.sol\\\";\\nimport \\\"./TokenSaver.sol\\\";\\n\\nabstract contract BasePool is ERC20Votes, AbstractRewards, IBasePool, TokenSaver {\\n using SafeERC20 for IERC20;\\n using SafeCast for uint256;\\n using SafeCast for int256;\\n\\n IERC20 public immutable depositToken;\\n IERC20 public immutable rewardToken;\\n ITimeLockPool public immutable escrowPool;\\n uint256 public immutable escrowPortion; // how much is escrowed 1e18 == 100%\\n uint256 public immutable escrowDuration; // escrow duration in seconds\\n\\n event RewardsClaimed(address indexed _from, address indexed _receiver, uint256 _escrowedAmount, uint256 _nonEscrowedAmount);\\n\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n address _depositToken,\\n address _rewardToken,\\n address _escrowPool,\\n uint256 _escrowPortion,\\n uint256 _escrowDuration\\n ) ERC20Permit(_name) ERC20(_name, _symbol) AbstractRewards(balanceOf, totalSupply) {\\n require(_escrowPortion <= 1e18, \\\"BasePool.constructor: Cannot escrow more than 100%\\\");\\n require(_depositToken != address(0), \\\"BasePool.constructor: Deposit token must be set\\\");\\n depositToken = IERC20(_depositToken);\\n rewardToken = IERC20(_rewardToken);\\n escrowPool = ITimeLockPool(_escrowPool);\\n escrowPortion = _escrowPortion;\\n escrowDuration = _escrowDuration;\\n\\n if(_rewardToken != address(0) && _escrowPool != address(0)) {\\n IERC20(_rewardToken).safeApprove(_escrowPool, type(uint256).max);\\n }\\n }\\n\\n function _mint(address _account, uint256 _amount) internal virtual override {\\n\\t\\tsuper._mint(_account, _amount);\\n _correctPoints(_account, -(_amount.toInt256()));\\n\\t}\\n\\t\\n\\tfunction _burn(address _account, uint256 _amount) internal virtual override {\\n\\t\\tsuper._burn(_account, _amount);\\n _correctPoints(_account, _amount.toInt256());\\n\\t}\\n\\n function _transfer(address _from, address _to, uint256 _value) internal virtual override {\\n\\t\\tsuper._transfer(_from, _to, _value);\\n _correctPointsForTransfer(_from, _to, _value);\\n\\t}\\n\\n function distributeRewards(uint256 _amount) external override {\\n rewardToken.safeTransferFrom(_msgSender(), address(this), _amount);\\n _distributeRewards(_amount);\\n }\\n\\n function claimRewards(address _receiver) external {\\n uint256 rewardAmount = _prepareCollect(_msgSender());\\n uint256 escrowedRewardAmount = rewardAmount * escrowPortion / 1e18;\\n uint256 nonEscrowedRewardAmount = rewardAmount - escrowedRewardAmount;\\n\\n if(escrowedRewardAmount != 0 && address(escrowPool) != address(0)) {\\n escrowPool.deposit(escrowedRewardAmount, escrowDuration, _receiver);\\n }\\n\\n // ignore dust\\n if(nonEscrowedRewardAmount > 1) {\\n rewardToken.safeTransfer(_receiver, nonEscrowedRewardAmount);\\n }\\n\\n emit RewardsClaimed(_msgSender(), _receiver, escrowedRewardAmount, nonEscrowedRewardAmount);\\n }\\n\\n}\",\"keccak256\":\"0x1c8effb463f1640b7bc25fdcf53086de469177c3d7240b8d38ce42c977bc2805\",\"license\":\"MIT\"},\"contracts/base/TokenSaver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControlEnumerable.sol\\\";\\n\\ncontract TokenSaver is AccessControlEnumerable {\\n using SafeERC20 for IERC20;\\n\\n bytes32 public constant TOKEN_SAVER_ROLE = keccak256(\\\"TOKEN_SAVER_ROLE\\\");\\n\\n event TokenSaved(address indexed by, address indexed receiver, address indexed token, uint256 amount);\\n\\n modifier onlyTokenSaver() {\\n require(hasRole(TOKEN_SAVER_ROLE, _msgSender()), \\\"TokenSaver.onlyTokenSaver: permission denied\\\");\\n _;\\n }\\n\\n constructor() {\\n _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());\\n }\\n\\n function saveToken(address _token, address _receiver, uint256 _amount) external onlyTokenSaver {\\n IERC20(_token).safeTransfer(_receiver, _amount);\\n emit TokenSaved(_msgSender(), _receiver, _token, _amount);\\n }\\n\\n}\",\"keccak256\":\"0x2404fc7856d000857ec7fbe6be7fcad1fb32daa26dbb6fa8ab2f782ef47539e7\",\"license\":\"MIT\"},\"contracts/interfaces/IAbstractRewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\n\\ninterface IAbstractRewards {\\n\\t/**\\n\\t * @dev Returns the total amount of rewards a given address is able to withdraw.\\n\\t * @param account Address of a reward recipient\\n\\t * @return A uint256 representing the rewards `account` can withdraw\\n\\t */\\n\\tfunction withdrawableRewardsOf(address account) external view returns (uint256);\\n\\n /**\\n\\t * @dev View the amount of funds that an address has withdrawn.\\n\\t * @param account The address of a token holder.\\n\\t * @return The amount of funds that `account` has withdrawn.\\n\\t */\\n\\tfunction withdrawnRewardsOf(address account) external view returns (uint256);\\n\\n\\t/**\\n\\t * @dev View the amount of funds that an address has earned in total.\\n\\t * accumulativeFundsOf(account) = withdrawableRewardsOf(account) + withdrawnRewardsOf(account)\\n\\t * = (pointsPerShare * balanceOf(account) + pointsCorrection[account]) / POINTS_MULTIPLIER\\n\\t * @param account The address of a token holder.\\n\\t * @return The amount of funds that `account` has earned in total.\\n\\t */\\n\\tfunction cumulativeRewardsOf(address account) external view returns (uint256);\\n\\n\\t/**\\n\\t * @dev This event emits when new funds are distributed\\n\\t * @param by the address of the sender who distributed funds\\n\\t * @param rewardsDistributed the amount of funds received for distribution\\n\\t */\\n\\tevent RewardsDistributed(address indexed by, uint256 rewardsDistributed);\\n\\n\\t/**\\n\\t * @dev This event emits when distributed funds are withdrawn by a token holder.\\n\\t * @param by the address of the receiver of funds\\n\\t * @param fundsWithdrawn the amount of funds that were withdrawn\\n\\t */\\n\\tevent RewardsWithdrawn(address indexed by, uint256 fundsWithdrawn);\\n}\",\"keccak256\":\"0xf06fc3f862ee5bc79e62efce5b8ae991e2056936adf017aebb4331d1be20eea8\",\"license\":\"MIT\"},\"contracts/interfaces/IBasePool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\ninterface IBasePool {\\n function distributeRewards(uint256 _amount) external;\\n}\\n\\n\",\"keccak256\":\"0x326015d67bcd9fde881c04f0ca39b7ca4fbd1959b748cb9ca9560f2377975be7\",\"license\":\"MIT\"},\"contracts/interfaces/ITimeLockPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.7;\\ninterface ITimeLockPool {\\n function deposit(uint256 _amount, uint256 _duration, address _receiver) external;\\n}\",\"keccak256\":\"0x4430654365baa59a9c3a5b7cd8a8b1a4808565a8547119f0cf2040d4349e541c\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6102606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162004c8138038062004c818339810160408190526200005a9162000a9e565b888888888888888888888888888888886200039060201b620005ec17620003ab60201b62000e76178880604051806040016040528060018152602001603160f81b8152508b8b8160039080519060200190620000b892919062000926565b508051620000ce90600490602084019062000926565b5050825160208085019190912083519184019190912060c082905260e08190524660a0529091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f62000123818484620003b1565b60805261010052505050505060c091821b6001600160c01b031990811661014052911b16610160526200015f6000620001593390565b620003fb565b670de0b6b3a7640000821115620001d85760405162461bcd60e51b815260206004820152603260248201527f42617365506f6f6c2e636f6e7374727563746f723a2043616e6e6f7420657363604482015271726f77206d6f7265207468616e203130302560701b60648201526084015b60405180910390fd5b6001600160a01b038516620002485760405162461bcd60e51b815260206004820152602f60248201527f42617365506f6f6c2e636f6e7374727563746f723a204465706f73697420746f60448201526e1ad95b881b5d5cdd081899481cd95d608a1b6064820152608401620001cf565b6001600160601b0319606086811b82166101805285811b82166101a05284901b166101c0526101e08290526102008190526001600160a01b038416158015906200029a57506001600160a01b03831615155b15620002c757620002c783600019866001600160a01b03166200043e60201b62001cd8179092919060201c565b505050505050506102588110156200036e5760405162461bcd60e51b815260206004820152605e60248201527f54696d654c6f636b506f6f6c2e636f6e7374727563746f723a206d6178206c6f60448201527f636b206475726174696f6e206d7573742062652067726561746572206f72206560648201527f7175616c20746f206d696e696e6d756d206c6f636b206475726174696f6e0000608482015260a401620001cf565b61022091909152610240525062000c5a9e505050505050505050505050505050565b6001600160a01b031660009081526020819052604090205490565b60025490565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090505b9392505050565b6200041282826200059860201b62001e361760201c565b6000828152600d602090815260409091206200043991839062001e44620005a8821b17901c565b505050565b801580620004cc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200048f57600080fd5b505afa158015620004a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ca919062000b67565b155b620005405760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620001cf565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915262000439918591620005c816565b620005a48282620006a6565b5050565b6000620005bf836001600160a01b0384166200074a565b90505b92915050565b600062000624826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200079c60201b62001e59179092919060201c565b80519091501562000439578080602001905181019062000645919062000a7a565b620004395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620001cf565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16620005a4576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620007063390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008181526001830160205260408120546200079357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005c2565b506000620005c2565b6060620007ad8484600085620007b5565b949350505050565b606082471015620008185760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620001cf565b843b620008685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001cf565b600080866001600160a01b0316858760405162000886919062000b81565b60006040518083038185875af1925050503d8060008114620008c5576040519150601f19603f3d011682016040523d82523d6000602084013e620008ca565b606091505b509092509050620008dd828286620008e8565b979650505050505050565b60608315620008f9575081620003f4565b8251156200090a5782518084602001fd5b8160405162461bcd60e51b8152600401620001cf919062000b9f565b828054620009349062000c07565b90600052602060002090601f016020900481019282620009585760008555620009a3565b82601f106200097357805160ff1916838001178555620009a3565b82800160010185558215620009a3579182015b82811115620009a357825182559160200191906001019062000986565b50620009b1929150620009b5565b5090565b5b80821115620009b15760008155600101620009b6565b80516001600160a01b0381168114620009e457600080fd5b919050565b600082601f830112620009fb57600080fd5b81516001600160401b038082111562000a185762000a1862000c44565b604051601f8301601f19908116603f0116810190828211818310171562000a435762000a4362000c44565b8160405283815286602085880101111562000a5d57600080fd5b62000a7084602083016020890162000bd4565b9695505050505050565b60006020828403121562000a8d57600080fd5b81518015158114620003f457600080fd5b60008060008060008060008060006101208a8c03121562000abe57600080fd5b89516001600160401b038082111562000ad657600080fd5b62000ae48d838e01620009e9565b9a5060208c015191508082111562000afb57600080fd5b5062000b0a8c828d01620009e9565b98505062000b1b60408b01620009cc565b965062000b2b60608b01620009cc565b955062000b3b60808b01620009cc565b945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b60006020828403121562000b7a57600080fd5b5051919050565b6000825162000b9581846020870162000bd4565b9190910192915050565b602081526000825180602084015262000bc081604085016020870162000bd4565b601f01601f19169190910160400192915050565b60005b8381101562000bf157818101518382015260200162000bd7565b8381111562000c01576000848401525b50505050565b600181811c9082168062000c1c57607f821691505b6020821081141562000c3e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05161010051610120516101405160c01c6101605160c01c6101805160601c6101a05160601c6101c05160601c6101e051610200516102205161024051613f1862000d69600039600081816107760152818161129f01526117190152600081816104dc015261173e0152600081816105030152611b380152600081816108ad0152611aa701526000818161059401528181611af20152611b6e0152600081816109a3015281816110490152611be101526000818161087301528181610ca701526112d8015260006123ea01526000610e2901526000611970015260006121ae015260006121fd015260006121d80152600061215c015260006121850152613f186000f3fe608060405234801561001057600080fd5b50600436106103825760003560e01c8063804d9426116101de578063adf8252d1161010f578063d1f52983116100ad578063dd6624e41161007c578063dd6624e41461092e578063ef5cfb8c1461094e578063f1127ed814610961578063f7c618c11461099e57600080fd5b8063d1f52983146108a8578063d505accf146108cf578063d547741f146108e2578063dd62ed3e146108f557600080fd5b8063b8162dd2116100e9578063b8162dd214610832578063c3cda5201461085b578063c89039c51461086e578063ca15c8731461089557600080fd5b8063adf8252d146107c6578063ae22192e146107d9578063b182eb911461081257600080fd5b806395d89b411161017c578063a16cdbb111610156578063a16cdbb114610771578063a217fddf14610798578063a457c2d7146107a0578063a9059cbb146107b357600080fd5b806395d89b41146107435780639ab24eb01461074b5780639afdb2c21461075e57600080fd5b80638e539e8c116101b85780638e539e8c146106ac5780638f2203f6146106bf5780639010d07c146106f757806391d148541461070a57600080fd5b8063804d942614610666578063857184d1146106865780638dbdbe6d1461069957600080fd5b80633a46b1a8116102b85780636fcfff451161025657806378b4330f1161023057806378b4330f1461062e5780637cd0b5c7146106375780637e245d791461064a5780637ecebe001461065357600080fd5b80636fcfff45146105b657806370a08231146105de57806376175b061461060757600080fd5b8063587cde1e11610292578063587cde1e1461052557806359974e38146105695780635c19a95c1461057c57806368570e6a1461058f57600080fd5b80633a46b1a8146104c457806354c5b696146104d757806357c2c2ba146104fe57600080fd5b806323b872dd11610325578063313ce567116102ff578063313ce567146104875780633644e5151461049657806336568abe1461049e57806339509351146104b157600080fd5b806323b872dd1461043e578063248a9ca3146104515780632f2ff15d1461047457600080fd5b8063095ea7b311610361578063095ea7b3146103d957806310accecc146103ec57806318160ddd1461040d57806318f9e2911461041557600080fd5b8062f714ce1461038757806301ffc9a71461039c57806306fdde03146103c4575b600080fd5b61039a610395366004613a6d565b6109c5565b005b6103af6103aa366004613ab2565b610d19565b60405190151581526020015b60405180910390f35b6103cc610d44565b6040516103bb9190613c2e565b6103af6103e7366004613970565b610dd6565b6103ff6103fa36600461387c565b610dec565b6040519081526020016103bb565b6002546103ff565b6103ff61042336600461387c565b6001600160a01b03166000908152600b602052604090205490565b6103af61044c3660046138ca565b610e7c565b6103ff61045f366004613a54565b6000908152600c602052604090206001015490565b61039a610482366004613a6d565b610f3d565b604051601281526020016103bb565b6103ff610f64565b61039a6104ac366004613a6d565b610f73565b6103af6104bf366004613970565b610f95565b6103ff6104d2366004613970565b610fd1565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b61055161053336600461387c565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b0390911681526020016103bb565b61039a610577366004613a54565b611044565b61039a61058a36600461387c565b611085565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b6105c96105c436600461387c565b61108f565b60405163ffffffff90911681526020016103bb565b6103ff6105ec36600461387c565b6001600160a01b031660009081526020819052604090205490565b6103ff7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d81565b6103ff61025881565b6103ff61064536600461387c565b6110b1565b6103ff60095481565b6103ff61066136600461387c565b6110dd565b61067961067436600461387c565b6110fb565b6040516103bb9190613bc7565b6103ff61069436600461387c565b611199565b61039a6106a7366004613af5565b611221565b6103ff6106ba366004613a54565b61143b565b6106d66fffffffffffffffffffffffffffffffff81565b6040516fffffffffffffffffffffffffffffffff90911681526020016103bb565b610551610705366004613a90565b611497565b6103af610718366004613a6d565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6103cc6114af565b6103ff61075936600461387c565b6114be565b61039a61076c3660046138ca565b611545565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6103ff600081565b6103af6107ae366004613970565b611657565b6103af6107c1366004613970565b611708565b6103ff6107d4366004613a54565b611715565b6107ec6107e7366004613970565b61177e565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103bb565b6103ff61082036600461387c565b600a6020526000908152604090205481565b6103ff61084036600461387c565b6001600160a01b03166000908152600e602052604090205490565b61039a61086936600461399a565b6117cf565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6108a3366004613a54565b611905565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b61039a6108dd366004613906565b61191c565b61039a6108f0366004613a6d565b611a80565b6103ff610903366004613897565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103ff61093c36600461387c565b600b6020526000908152604090205481565b61039a61095c36600461387c565b611a8a565b61097461096f3660046139f2565b611c54565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016103bb565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b336000908152600e60205260409020548210610a4e5760405162461bcd60e51b815260206004820152602d60248201527f54696d654c6f636b506f6f6c2e77697468647261773a204465706f736974206460448201527f6f6573206e6f742065786973740000000000000000000000000000000000000060648201526084015b60405180910390fd5b336000908152600e60205260408120805484908110610a6f57610a6f613edf565b6000918252602091829020604080516060810182526002909302909101805483526001015467ffffffffffffffff80821694840194909452600160401b90049092169181018290529150421015610b085760405162461bcd60e51b815260206004820152601f60248201527f54696d654c6f636b506f6f6c2e77697468647261773a20746f6f20736f6f6e006044820152606401610a45565b6000670de0b6b3a7640000610b3983602001518460400151610b2a9190613dc4565b67ffffffffffffffff16611715565b8351610b459190613d8e565b610b4f9190613ce5565b336000908152600e60205260409020805491925090610b7090600190613dad565b81548110610b8057610b80613edf565b9060005260206000209060020201600e6000610b993390565b6001600160a01b03166001600160a01b031681526020019081526020016000208581548110610bca57610bca613edf565b600091825260208083208454600293909302019182556001938401805494909201805467ffffffffffffffff95861667ffffffffffffffff1982168117835593546fffffffffffffffffffffffffffffffff19909116909317600160401b93849004909516909202939093179055338152600e90915260409020805480610c5357610c53613ec9565b60008281526020812060026000199093019283020190815560010180546fffffffffffffffffffffffffffffffff191690559055610c97610c913390565b82611e70565b8151610ccf906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908590611e8c565b815160405190815233906001600160a01b0385169086907fe5df19de43c8c04fd192bc68e484b2593570925fbb6ad8c07ccafbc2aa5c37a19060200160405180910390a450505050565b60006001600160e01b03198216635a05180f60e01b1480610d3e5750610d3e82611ebc565b92915050565b606060038054610d5390613e30565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90613e30565b8015610dcc5780601f10610da157610100808354040283529160200191610dcc565b820191906000526020600020905b815481529060010190602001808311610daf57829003601f168201915b5050505050905090565b6000610de3338484611ef1565b50600192915050565b6001600160a01b0381166000908152600a60205260408120546fffffffffffffffffffffffffffffffff90610e6c90610e5d610e4b8663ffffffff7f000000000000000000000000000000000000000000000000000000000000000016565b600954610e589190613d8e565b612015565b610e679190613c61565b612098565b610d3e9190613ce5565b60025490565b6000610e898484846120ea565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f235760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610a45565b610f308533858403611ef1565b60019150505b9392505050565b610f478282612132565b6000828152600d60205260409020610f5f9082611e44565b505050565b6000610f6e612158565b905090565b610f7d828261224b565b6000828152600d60205260409020610f5f90826122d3565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610de3918590610fcc908690613ca1565b611ef1565b60004382106110225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610a45565b6001600160a01b0383166000908152600760205260409020610f3690836122e8565b6110797f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330846123a5565b611082816123e3565b50565b61108233826124fd565b6001600160a01b038116600090815260076020526040812054610d3e9061258e565b6001600160a01b0381166000908152600b60205260408120546110d383610dec565b610d3e9190613dad565b6001600160a01b038116600090815260056020526040812054610d3e565b6001600160a01b0381166000908152600e60209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561118e57600084815260209081902060408051606081018252600286029092018054835260019081015467ffffffffffffffff80821685870152600160401b90910416918301919091529083529092019101611133565b505050509050919050565b60008060005b6001600160a01b0384166000908152600e602052604090205481101561121a576001600160a01b0384166000908152600e602052604090208054829081106111e9576111e9613edf565b906000526020600020906002020160000154826112069190613ca1565b91508061121281613e65565b91505061119f565b5092915050565b600083116112975760405162461bcd60e51b815260206004820152602660248201527f54696d654c6f636b506f6f6c2e6465706f7369743a2063616e6e6f742064657060448201527f6f736974203000000000000000000000000000000000000000000000000000006064820152608401610a45565b60006112c3837f000000000000000000000000000000000000000000000000000000000000000061260a565b90506112d181610258612620565b90506113087f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330876123a5565b600e6000836001600160a01b03166001600160a01b0316815260200190815260200160002060405180606001604052808681526020014267ffffffffffffffff168152602001834261135a9190613cb9565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551600290940201928355840151910180546040909401518316600160401b026fffffffffffffffffffffffffffffffff199094169190921617919091179055670de0b6b3a76400006113ce83611715565b6113d89087613d8e565b6113e29190613ce5565b90506113ee8382612630565b604080518681526020810184905233916001600160a01b038616917f34194be2f096bdb2ad418add902a4da76d3d6f6d387d86d857f56c7711ecca70910160405180910390a35050505050565b600043821061148c5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610a45565b610d3e6008836122e8565b6000828152600d60205260408120610f369083612650565b606060048054610d5390613e30565b6001600160a01b0381166000908152600760205260408120548015611532576001600160a01b0383166000908152600760205260409020611500600183613dad565b8154811061151057611510613edf565b60009182526020909120015464010000000090046001600160e01b0316611535565b60005b6001600160e01b03169392505050565b61156f7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d33610718565b6115e15760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e53617665722e6f6e6c79546f6b656e53617665723a207065726d6960448201527f7373696f6e2064656e69656400000000000000000000000000000000000000006064820152608401610a45565b6115f56001600160a01b0384168383611e8c565b826001600160a01b0316826001600160a01b03166116103390565b6001600160a01b03167f30d87cec6b4c56cede1018725d1e6d9304e2f7ee6d25b004b7e2183f793f26bc8460405161164a91815260200190565b60405180910390a4505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116f15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610a45565b6116fe3385858403611ef1565b5060019392505050565b6000610de33384846120ea565b60007f0000000000000000000000000000000000000000000000000000000000000000611762837f0000000000000000000000000000000000000000000000000000000000000000613d8e565b61176c9190613ce5565b610d3e90670de0b6b3a7640000613ca1565b600e602052816000526040600020818154811061179a57600080fd5b60009182526020909120600290910201805460019091015490925067ffffffffffffffff8082169250600160401b9091041683565b8342111561181f5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610a45565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611899906118919060a0016040516020818303038152906040528051906020012061265c565b8585856126aa565b90506118a4816126d2565b86146118f25760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610a45565b6118fc81886124fd565b50505050505050565b6000818152600d60205260408120610d3e906126fa565b8342111561196c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610a45565b60007f000000000000000000000000000000000000000000000000000000000000000088888861199b8c6126d2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006119f68261265c565b90506000611a06828787876126aa565b9050896001600160a01b0316816001600160a01b031614611a695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610a45565b611a748a8a8a611ef1565b50505050505050505050565b610f7d8282612704565b6000611a953361272a565b90506000670de0b6b3a7640000611acc7f000000000000000000000000000000000000000000000000000000000000000084613d8e565b611ad69190613ce5565b90506000611ae48284613dad565b90508115801590611b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611bcb57604051638dbdbe6d60e01b8152600481018390527f000000000000000000000000000000000000000000000000000000000000000060248201526001600160a01b0385811660448301527f00000000000000000000000000000000000000000000000000000000000000001690638dbdbe6d90606401600060405180830381600087803b158015611bb257600080fd5b505af1158015611bc6573d6000803e3d6000fd5b505050505b6001811115611c0857611c086001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168583611e8c565b60408051838152602081018390526001600160a01b0386169133917fd92c424393cb3ccdf7d5e36602e3bfa34f24490579ba47978f4bcfad496995f2910160405180910390a350505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110611c9857611c98613edf565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b801580611d615750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015611d2757600080fd5b505afa158015611d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f9190613adc565b155b611dd35760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610a45565b6040516001600160a01b038316602482015260448101829052610f5f90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127bf565b611e4082826128a4565b5050565b6000610f36836001600160a01b038416612946565b6060611e688484600085612995565b949350505050565b611e7a8282612ad4565b611e4082611e8783612015565b612aec565b6040516001600160a01b038316602482015260448101829052610f5f90849063a9059cbb60e01b90606401611dff565b60006001600160e01b03198216637965db0b60e01b1480610d3e57506301ffc9a760e01b6001600160e01b0319831614610d3e565b6001600160a01b038316611f535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a45565b6001600160a01b038216611fb45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a45565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160ff1b038211156120945760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160448201527f6e20696e743235360000000000000000000000000000000000000000000000006064820152608401610a45565b5090565b6000808212156120945760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610a45565b60405162461bcd60e51b815260206004820152601060248201527f4e4f4e5f5452414e5346455241424c45000000000000000000000000000000006044820152606401610a45565b6000828152600c602052604090206001015461214e8133612b3c565b610f5f83836128a4565b60007f00000000000000000000000000000000000000000000000000000000000000004614156121a757507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03811633146122c95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a45565b611e408282612bbc565b6000610f36836001600160a01b038416612c3f565b8154600090815b8181101561234c5760006123038284612d32565b90508486828154811061231857612318613edf565b60009182526020909120015463ffffffff16111561233857809250612346565b612343816001613ca1565b91505b506122ef565b8115612390578461235e600184613dad565b8154811061236e5761236e613edf565b60009182526020909120015464010000000090046001600160e01b0316612393565b60005b6001600160e01b031695945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526123dd9085906323b872dd60e01b90608401611dff565b50505050565b60006124117f000000000000000000000000000000000000000000000000000000000000000063ffffffff16565b9050600081116124895760405162461bcd60e51b815260206004820152603e60248201527f4162737472616374526577617264732e5f64697374726962757465526577617260448201527f64733a20746f74616c20736861726520737570706c79206973207a65726f00006064820152608401610a45565b8115611e4057806124aa6fffffffffffffffffffffffffffffffff84613d8e565b6124b49190613ce5565b6009546124c19190613ca1565b60095560405182815233907fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece0869060200160405180910390a25050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46123dd828483612d4d565b600063ffffffff8211156120945760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610a45565b60008183106126195781610f36565b5090919050565b6000818310156126195781610f36565b61263a8282612e8a565b611e408261264783612015565b611e8790613e80565b6000610f368383612f21565b6000610d3e612669612158565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006126bb87878787612f4b565b915091506126c881613038565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000610d3e825490565b6000828152600c60205260409020600101546127208133612b3c565b610f5f8383612bbc565b600080612736836110b1565b90508015610d3e576001600160a01b0383166000908152600b6020526040902054612762908290613ca1565b6001600160a01b0384166000818152600b6020526040908190209290925590517f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e503161906127b19084815260200190565b60405180910390a292915050565b6000612814826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e599092919063ffffffff16565b805190915015610f5f57808060200190518101906128329190613a32565b610f5f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a45565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16611e40576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff191660011790556129023390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600081815260018301602052604081205461298d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d3e565b506000610d3e565b606082471015612a0d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a45565b843b612a5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a45565b600080866001600160a01b03168587604051612a779190613b2a565b60006040518083038185875af1925050503d8060008114612ab4576040519150601f19603f3d011682016040523d82523d6000602084013e612ab9565b606091505b5091509150612ac98282866131f3565b979650505050505050565b612ade828261322c565b6123dd60086133818361338d565b600954612af99082613d07565b6001600160a01b0383166000908152600a6020526040902054612b1c9190613c61565b6001600160a01b039092166000908152600a602052604090209190915550565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16611e4057612b7a816001600160a01b03166014613506565b612b85836020613506565b604051602001612b96929190613b46565b60408051601f198184030181529082905262461bcd60e51b8252610a4591600401613c2e565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff1615611e40576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015612d28576000612c63600183613dad565b8554909150600090612c7790600190613dad565b9050818114612cdc576000866000018281548110612c9757612c97613edf565b9060005260206000200154905080876000018481548110612cba57612cba613edf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ced57612ced613ec9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d3e565b6000915050610d3e565b6000612d416002848418613ce5565b610f3690848416613ca1565b816001600160a01b0316836001600160a01b031614158015612d6f5750600081115b15610f5f576001600160a01b03831615612dfd576001600160a01b03831660009081526007602052604081208190612daa906133818561338d565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612df2929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610f5f576001600160a01b03821660009081526007602052604081208190612e33906136af8561338d565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612e7b929190918252602082015260400190565b60405180910390a25050505050565b612e9482826136bb565b6002546001600160e01b031015612f135760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610a45565b6123dd60086136af8361338d565b6000826000018281548110612f3857612f38613edf565b9060005260206000200154905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f82575060009050600361302f565b8460ff16601b14158015612f9a57508460ff16601c14155b15612fab575060009050600461302f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612fff573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130285760006001925092505061302f565b9150600090505b94509492505050565b600081600481111561304c5761304c613eb3565b14156130555750565b600181600481111561306957613069613eb3565b14156130b75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a45565b60028160048111156130cb576130cb613eb3565b14156131195760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a45565b600381600481111561312d5761312d613eb3565b14156131865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a45565b600481600481111561319a5761319a613eb3565b14156110825760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a45565b60608315613202575081610f36565b8251156132125782518084602001fd5b8160405162461bcd60e51b8152600401610a459190613c2e565b6001600160a01b03821661328c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a45565b6001600160a01b038216600090815260208190526040902054818110156133005760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a45565b6001600160a01b038316600090815260208190526040812083830390556002805484929061332f908490613dad565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610f5f8360008461379e565b6000610f368284613dad565b8254600090819080156133d857856133a6600183613dad565b815481106133b6576133b6613edf565b60009182526020909120015464010000000090046001600160e01b03166133db565b60005b6001600160e01b031692506133f483858763ffffffff16565b91506000811180156134325750438661340e600184613dad565b8154811061341e5761341e613edf565b60009182526020909120015463ffffffff16145b1561349257613440826137d0565b8661344c600184613dad565b8154811061345c5761345c613edf565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506134fd565b8560405180604001604052806134a74361258e565b63ffffffff1681526020016134bb856137d0565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60606000613515836002613d8e565b613520906002613ca1565b67ffffffffffffffff81111561353857613538613ef5565b6040519080825280601f01601f191660200182016040528015613562576020820181803683370190505b509050600360fc1b8160008151811061357d5761357d613edf565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106135ac576135ac613edf565b60200101906001600160f81b031916908160001a90535060006135d0846002613d8e565b6135db906001613ca1565b90505b6001811115613660577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061361c5761361c613edf565b1a60f81b82828151811061363257613632613edf565b60200101906001600160f81b031916908160001a90535060049490941c9361365981613e19565b90506135de565b508315610f365760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a45565b6000610f368284613ca1565b6001600160a01b0382166137115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a45565b80600260008282546137239190613ca1565b90915550506001600160a01b03821660009081526020819052604081208054839290613750908490613ca1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611e40600083835b6001600160a01b03838116600090815260066020526040808220548584168352912054610f5f92918216911683612d4d565b60006001600160e01b038211156120945760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610a45565b80356001600160a01b038116811461386657600080fd5b919050565b803560ff8116811461386657600080fd5b60006020828403121561388e57600080fd5b610f368261384f565b600080604083850312156138aa57600080fd5b6138b38361384f565b91506138c16020840161384f565b90509250929050565b6000806000606084860312156138df57600080fd5b6138e88461384f565b92506138f66020850161384f565b9150604084013590509250925092565b600080600080600080600060e0888a03121561392157600080fd5b61392a8861384f565b96506139386020890161384f565b955060408801359450606088013593506139546080890161386b565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561398357600080fd5b61398c8361384f565b946020939093013593505050565b60008060008060008060c087890312156139b357600080fd5b6139bc8761384f565b955060208701359450604087013593506139d86060880161386b565b92506080870135915060a087013590509295509295509295565b60008060408385031215613a0557600080fd5b613a0e8361384f565b9150602083013563ffffffff81168114613a2757600080fd5b809150509250929050565b600060208284031215613a4457600080fd5b81518015158114610f3657600080fd5b600060208284031215613a6657600080fd5b5035919050565b60008060408385031215613a8057600080fd5b823591506138c16020840161384f565b60008060408385031215613aa357600080fd5b50508035926020909101359150565b600060208284031215613ac457600080fd5b81356001600160e01b031981168114610f3657600080fd5b600060208284031215613aee57600080fd5b5051919050565b600080600060608486031215613b0a57600080fd5b8335925060208401359150613b216040850161384f565b90509250925092565b60008251613b3c818460208701613ded565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613b7e816017850160208801613ded565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613bbb816028840160208801613ded565b01602801949350505050565b602080825282518282018190526000919060409081850190868401855b82811015613c21578151805185528681015167ffffffffffffffff9081168887015290860151168585015260609093019290850190600101613be4565b5091979650505050505050565b6020815260008251806020840152613c4d816040850160208701613ded565b601f01601f19169190910160400192915050565b6000808212826001600160ff1b0303841381151615613c8257613c82613e9d565b600160ff1b8390038412811615613c9b57613c9b613e9d565b50500190565b60008219821115613cb457613cb4613e9d565b500190565b600067ffffffffffffffff808316818516808303821115613cdc57613cdc613e9d565b01949350505050565b600082613d0257634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160ff1b03600084136000841385830485118282161615613d2f57613d2f613e9d565b600160ff1b6000871282811687830589121615613d4e57613d4e613e9d565b60008712925087820587128484161615613d6a57613d6a613e9d565b87850587128184161615613d8057613d80613e9d565b505050929093029392505050565b6000816000190483118215151615613da857613da8613e9d565b500290565b600082821015613dbf57613dbf613e9d565b500390565b600067ffffffffffffffff83811690831681811015613de557613de5613e9d565b039392505050565b60005b83811015613e08578181015183820152602001613df0565b838111156123dd5750506000910152565b600081613e2857613e28613e9d565b506000190190565b600181811c90821680613e4457607f821691505b602082108114156126f457634e487b7160e01b600052602260045260246000fd5b6000600019821415613e7957613e79613e9d565b5060010190565b6000600160ff1b821415613e9657613e96613e9d565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea164736f6c6343000807000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103825760003560e01c8063804d9426116101de578063adf8252d1161010f578063d1f52983116100ad578063dd6624e41161007c578063dd6624e41461092e578063ef5cfb8c1461094e578063f1127ed814610961578063f7c618c11461099e57600080fd5b8063d1f52983146108a8578063d505accf146108cf578063d547741f146108e2578063dd62ed3e146108f557600080fd5b8063b8162dd2116100e9578063b8162dd214610832578063c3cda5201461085b578063c89039c51461086e578063ca15c8731461089557600080fd5b8063adf8252d146107c6578063ae22192e146107d9578063b182eb911461081257600080fd5b806395d89b411161017c578063a16cdbb111610156578063a16cdbb114610771578063a217fddf14610798578063a457c2d7146107a0578063a9059cbb146107b357600080fd5b806395d89b41146107435780639ab24eb01461074b5780639afdb2c21461075e57600080fd5b80638e539e8c116101b85780638e539e8c146106ac5780638f2203f6146106bf5780639010d07c146106f757806391d148541461070a57600080fd5b8063804d942614610666578063857184d1146106865780638dbdbe6d1461069957600080fd5b80633a46b1a8116102b85780636fcfff451161025657806378b4330f1161023057806378b4330f1461062e5780637cd0b5c7146106375780637e245d791461064a5780637ecebe001461065357600080fd5b80636fcfff45146105b657806370a08231146105de57806376175b061461060757600080fd5b8063587cde1e11610292578063587cde1e1461052557806359974e38146105695780635c19a95c1461057c57806368570e6a1461058f57600080fd5b80633a46b1a8146104c457806354c5b696146104d757806357c2c2ba146104fe57600080fd5b806323b872dd11610325578063313ce567116102ff578063313ce567146104875780633644e5151461049657806336568abe1461049e57806339509351146104b157600080fd5b806323b872dd1461043e578063248a9ca3146104515780632f2ff15d1461047457600080fd5b8063095ea7b311610361578063095ea7b3146103d957806310accecc146103ec57806318160ddd1461040d57806318f9e2911461041557600080fd5b8062f714ce1461038757806301ffc9a71461039c57806306fdde03146103c4575b600080fd5b61039a610395366004613a6d565b6109c5565b005b6103af6103aa366004613ab2565b610d19565b60405190151581526020015b60405180910390f35b6103cc610d44565b6040516103bb9190613c2e565b6103af6103e7366004613970565b610dd6565b6103ff6103fa36600461387c565b610dec565b6040519081526020016103bb565b6002546103ff565b6103ff61042336600461387c565b6001600160a01b03166000908152600b602052604090205490565b6103af61044c3660046138ca565b610e7c565b6103ff61045f366004613a54565b6000908152600c602052604090206001015490565b61039a610482366004613a6d565b610f3d565b604051601281526020016103bb565b6103ff610f64565b61039a6104ac366004613a6d565b610f73565b6103af6104bf366004613970565b610f95565b6103ff6104d2366004613970565b610fd1565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b61055161053336600461387c565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b0390911681526020016103bb565b61039a610577366004613a54565b611044565b61039a61058a36600461387c565b611085565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b6105c96105c436600461387c565b61108f565b60405163ffffffff90911681526020016103bb565b6103ff6105ec36600461387c565b6001600160a01b031660009081526020819052604090205490565b6103ff7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d81565b6103ff61025881565b6103ff61064536600461387c565b6110b1565b6103ff60095481565b6103ff61066136600461387c565b6110dd565b61067961067436600461387c565b6110fb565b6040516103bb9190613bc7565b6103ff61069436600461387c565b611199565b61039a6106a7366004613af5565b611221565b6103ff6106ba366004613a54565b61143b565b6106d66fffffffffffffffffffffffffffffffff81565b6040516fffffffffffffffffffffffffffffffff90911681526020016103bb565b610551610705366004613a90565b611497565b6103af610718366004613a6d565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6103cc6114af565b6103ff61075936600461387c565b6114be565b61039a61076c3660046138ca565b611545565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6103ff600081565b6103af6107ae366004613970565b611657565b6103af6107c1366004613970565b611708565b6103ff6107d4366004613a54565b611715565b6107ec6107e7366004613970565b61177e565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103bb565b6103ff61082036600461387c565b600a6020526000908152604090205481565b6103ff61084036600461387c565b6001600160a01b03166000908152600e602052604090205490565b61039a61086936600461399a565b6117cf565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6108a3366004613a54565b611905565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b61039a6108dd366004613906565b61191c565b61039a6108f0366004613a6d565b611a80565b6103ff610903366004613897565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103ff61093c36600461387c565b600b6020526000908152604090205481565b61039a61095c36600461387c565b611a8a565b61097461096f3660046139f2565b611c54565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016103bb565b6105517f000000000000000000000000000000000000000000000000000000000000000081565b336000908152600e60205260409020548210610a4e5760405162461bcd60e51b815260206004820152602d60248201527f54696d654c6f636b506f6f6c2e77697468647261773a204465706f736974206460448201527f6f6573206e6f742065786973740000000000000000000000000000000000000060648201526084015b60405180910390fd5b336000908152600e60205260408120805484908110610a6f57610a6f613edf565b6000918252602091829020604080516060810182526002909302909101805483526001015467ffffffffffffffff80821694840194909452600160401b90049092169181018290529150421015610b085760405162461bcd60e51b815260206004820152601f60248201527f54696d654c6f636b506f6f6c2e77697468647261773a20746f6f20736f6f6e006044820152606401610a45565b6000670de0b6b3a7640000610b3983602001518460400151610b2a9190613dc4565b67ffffffffffffffff16611715565b8351610b459190613d8e565b610b4f9190613ce5565b336000908152600e60205260409020805491925090610b7090600190613dad565b81548110610b8057610b80613edf565b9060005260206000209060020201600e6000610b993390565b6001600160a01b03166001600160a01b031681526020019081526020016000208581548110610bca57610bca613edf565b600091825260208083208454600293909302019182556001938401805494909201805467ffffffffffffffff95861667ffffffffffffffff1982168117835593546fffffffffffffffffffffffffffffffff19909116909317600160401b93849004909516909202939093179055338152600e90915260409020805480610c5357610c53613ec9565b60008281526020812060026000199093019283020190815560010180546fffffffffffffffffffffffffffffffff191690559055610c97610c913390565b82611e70565b8151610ccf906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908590611e8c565b815160405190815233906001600160a01b0385169086907fe5df19de43c8c04fd192bc68e484b2593570925fbb6ad8c07ccafbc2aa5c37a19060200160405180910390a450505050565b60006001600160e01b03198216635a05180f60e01b1480610d3e5750610d3e82611ebc565b92915050565b606060038054610d5390613e30565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90613e30565b8015610dcc5780601f10610da157610100808354040283529160200191610dcc565b820191906000526020600020905b815481529060010190602001808311610daf57829003601f168201915b5050505050905090565b6000610de3338484611ef1565b50600192915050565b6001600160a01b0381166000908152600a60205260408120546fffffffffffffffffffffffffffffffff90610e6c90610e5d610e4b8663ffffffff7f000000000000000000000000000000000000000000000000000000000000000016565b600954610e589190613d8e565b612015565b610e679190613c61565b612098565b610d3e9190613ce5565b60025490565b6000610e898484846120ea565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f235760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610a45565b610f308533858403611ef1565b60019150505b9392505050565b610f478282612132565b6000828152600d60205260409020610f5f9082611e44565b505050565b6000610f6e612158565b905090565b610f7d828261224b565b6000828152600d60205260409020610f5f90826122d3565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610de3918590610fcc908690613ca1565b611ef1565b60004382106110225760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610a45565b6001600160a01b0383166000908152600760205260409020610f3690836122e8565b6110797f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330846123a5565b611082816123e3565b50565b61108233826124fd565b6001600160a01b038116600090815260076020526040812054610d3e9061258e565b6001600160a01b0381166000908152600b60205260408120546110d383610dec565b610d3e9190613dad565b6001600160a01b038116600090815260056020526040812054610d3e565b6001600160a01b0381166000908152600e60209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561118e57600084815260209081902060408051606081018252600286029092018054835260019081015467ffffffffffffffff80821685870152600160401b90910416918301919091529083529092019101611133565b505050509050919050565b60008060005b6001600160a01b0384166000908152600e602052604090205481101561121a576001600160a01b0384166000908152600e602052604090208054829081106111e9576111e9613edf565b906000526020600020906002020160000154826112069190613ca1565b91508061121281613e65565b91505061119f565b5092915050565b600083116112975760405162461bcd60e51b815260206004820152602660248201527f54696d654c6f636b506f6f6c2e6465706f7369743a2063616e6e6f742064657060448201527f6f736974203000000000000000000000000000000000000000000000000000006064820152608401610a45565b60006112c3837f000000000000000000000000000000000000000000000000000000000000000061260a565b90506112d181610258612620565b90506113087f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330876123a5565b600e6000836001600160a01b03166001600160a01b0316815260200190815260200160002060405180606001604052808681526020014267ffffffffffffffff168152602001834261135a9190613cb9565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551600290940201928355840151910180546040909401518316600160401b026fffffffffffffffffffffffffffffffff199094169190921617919091179055670de0b6b3a76400006113ce83611715565b6113d89087613d8e565b6113e29190613ce5565b90506113ee8382612630565b604080518681526020810184905233916001600160a01b038616917f34194be2f096bdb2ad418add902a4da76d3d6f6d387d86d857f56c7711ecca70910160405180910390a35050505050565b600043821061148c5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610a45565b610d3e6008836122e8565b6000828152600d60205260408120610f369083612650565b606060048054610d5390613e30565b6001600160a01b0381166000908152600760205260408120548015611532576001600160a01b0383166000908152600760205260409020611500600183613dad565b8154811061151057611510613edf565b60009182526020909120015464010000000090046001600160e01b0316611535565b60005b6001600160e01b03169392505050565b61156f7fd9d917c4034cff8a8c5fa1e40f9fbaf906b827c33ae3ab1fcabbb616cb8ef24d33610718565b6115e15760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e53617665722e6f6e6c79546f6b656e53617665723a207065726d6960448201527f7373696f6e2064656e69656400000000000000000000000000000000000000006064820152608401610a45565b6115f56001600160a01b0384168383611e8c565b826001600160a01b0316826001600160a01b03166116103390565b6001600160a01b03167f30d87cec6b4c56cede1018725d1e6d9304e2f7ee6d25b004b7e2183f793f26bc8460405161164a91815260200190565b60405180910390a4505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116f15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610a45565b6116fe3385858403611ef1565b5060019392505050565b6000610de33384846120ea565b60007f0000000000000000000000000000000000000000000000000000000000000000611762837f0000000000000000000000000000000000000000000000000000000000000000613d8e565b61176c9190613ce5565b610d3e90670de0b6b3a7640000613ca1565b600e602052816000526040600020818154811061179a57600080fd5b60009182526020909120600290910201805460019091015490925067ffffffffffffffff8082169250600160401b9091041683565b8342111561181f5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610a45565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611899906118919060a0016040516020818303038152906040528051906020012061265c565b8585856126aa565b90506118a4816126d2565b86146118f25760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610a45565b6118fc81886124fd565b50505050505050565b6000818152600d60205260408120610d3e906126fa565b8342111561196c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610a45565b60007f000000000000000000000000000000000000000000000000000000000000000088888861199b8c6126d2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006119f68261265c565b90506000611a06828787876126aa565b9050896001600160a01b0316816001600160a01b031614611a695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610a45565b611a748a8a8a611ef1565b50505050505050505050565b610f7d8282612704565b6000611a953361272a565b90506000670de0b6b3a7640000611acc7f000000000000000000000000000000000000000000000000000000000000000084613d8e565b611ad69190613ce5565b90506000611ae48284613dad565b90508115801590611b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611bcb57604051638dbdbe6d60e01b8152600481018390527f000000000000000000000000000000000000000000000000000000000000000060248201526001600160a01b0385811660448301527f00000000000000000000000000000000000000000000000000000000000000001690638dbdbe6d90606401600060405180830381600087803b158015611bb257600080fd5b505af1158015611bc6573d6000803e3d6000fd5b505050505b6001811115611c0857611c086001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168583611e8c565b60408051838152602081018390526001600160a01b0386169133917fd92c424393cb3ccdf7d5e36602e3bfa34f24490579ba47978f4bcfad496995f2910160405180910390a350505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110611c9857611c98613edf565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b801580611d615750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015611d2757600080fd5b505afa158015611d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f9190613adc565b155b611dd35760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610a45565b6040516001600160a01b038316602482015260448101829052610f5f90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127bf565b611e4082826128a4565b5050565b6000610f36836001600160a01b038416612946565b6060611e688484600085612995565b949350505050565b611e7a8282612ad4565b611e4082611e8783612015565b612aec565b6040516001600160a01b038316602482015260448101829052610f5f90849063a9059cbb60e01b90606401611dff565b60006001600160e01b03198216637965db0b60e01b1480610d3e57506301ffc9a760e01b6001600160e01b0319831614610d3e565b6001600160a01b038316611f535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a45565b6001600160a01b038216611fb45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a45565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160ff1b038211156120945760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160448201527f6e20696e743235360000000000000000000000000000000000000000000000006064820152608401610a45565b5090565b6000808212156120945760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610a45565b60405162461bcd60e51b815260206004820152601060248201527f4e4f4e5f5452414e5346455241424c45000000000000000000000000000000006044820152606401610a45565b6000828152600c602052604090206001015461214e8133612b3c565b610f5f83836128a4565b60007f00000000000000000000000000000000000000000000000000000000000000004614156121a757507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03811633146122c95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a45565b611e408282612bbc565b6000610f36836001600160a01b038416612c3f565b8154600090815b8181101561234c5760006123038284612d32565b90508486828154811061231857612318613edf565b60009182526020909120015463ffffffff16111561233857809250612346565b612343816001613ca1565b91505b506122ef565b8115612390578461235e600184613dad565b8154811061236e5761236e613edf565b60009182526020909120015464010000000090046001600160e01b0316612393565b60005b6001600160e01b031695945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526123dd9085906323b872dd60e01b90608401611dff565b50505050565b60006124117f000000000000000000000000000000000000000000000000000000000000000063ffffffff16565b9050600081116124895760405162461bcd60e51b815260206004820152603e60248201527f4162737472616374526577617264732e5f64697374726962757465526577617260448201527f64733a20746f74616c20736861726520737570706c79206973207a65726f00006064820152608401610a45565b8115611e4057806124aa6fffffffffffffffffffffffffffffffff84613d8e565b6124b49190613ce5565b6009546124c19190613ca1565b60095560405182815233907fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece0869060200160405180910390a25050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46123dd828483612d4d565b600063ffffffff8211156120945760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610a45565b60008183106126195781610f36565b5090919050565b6000818310156126195781610f36565b61263a8282612e8a565b611e408261264783612015565b611e8790613e80565b6000610f368383612f21565b6000610d3e612669612158565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006126bb87878787612f4b565b915091506126c881613038565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000610d3e825490565b6000828152600c60205260409020600101546127208133612b3c565b610f5f8383612bbc565b600080612736836110b1565b90508015610d3e576001600160a01b0383166000908152600b6020526040902054612762908290613ca1565b6001600160a01b0384166000818152600b6020526040908190209290925590517f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e503161906127b19084815260200190565b60405180910390a292915050565b6000612814826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e599092919063ffffffff16565b805190915015610f5f57808060200190518101906128329190613a32565b610f5f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a45565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16611e40576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff191660011790556129023390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600081815260018301602052604081205461298d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d3e565b506000610d3e565b606082471015612a0d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a45565b843b612a5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a45565b600080866001600160a01b03168587604051612a779190613b2a565b60006040518083038185875af1925050503d8060008114612ab4576040519150601f19603f3d011682016040523d82523d6000602084013e612ab9565b606091505b5091509150612ac98282866131f3565b979650505050505050565b612ade828261322c565b6123dd60086133818361338d565b600954612af99082613d07565b6001600160a01b0383166000908152600a6020526040902054612b1c9190613c61565b6001600160a01b039092166000908152600a602052604090209190915550565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16611e4057612b7a816001600160a01b03166014613506565b612b85836020613506565b604051602001612b96929190613b46565b60408051601f198184030181529082905262461bcd60e51b8252610a4591600401613c2e565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff1615611e40576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015612d28576000612c63600183613dad565b8554909150600090612c7790600190613dad565b9050818114612cdc576000866000018281548110612c9757612c97613edf565b9060005260206000200154905080876000018481548110612cba57612cba613edf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ced57612ced613ec9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d3e565b6000915050610d3e565b6000612d416002848418613ce5565b610f3690848416613ca1565b816001600160a01b0316836001600160a01b031614158015612d6f5750600081115b15610f5f576001600160a01b03831615612dfd576001600160a01b03831660009081526007602052604081208190612daa906133818561338d565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612df2929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610f5f576001600160a01b03821660009081526007602052604081208190612e33906136af8561338d565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612e7b929190918252602082015260400190565b60405180910390a25050505050565b612e9482826136bb565b6002546001600160e01b031015612f135760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610a45565b6123dd60086136af8361338d565b6000826000018281548110612f3857612f38613edf565b9060005260206000200154905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f82575060009050600361302f565b8460ff16601b14158015612f9a57508460ff16601c14155b15612fab575060009050600461302f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612fff573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130285760006001925092505061302f565b9150600090505b94509492505050565b600081600481111561304c5761304c613eb3565b14156130555750565b600181600481111561306957613069613eb3565b14156130b75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a45565b60028160048111156130cb576130cb613eb3565b14156131195760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a45565b600381600481111561312d5761312d613eb3565b14156131865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a45565b600481600481111561319a5761319a613eb3565b14156110825760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a45565b60608315613202575081610f36565b8251156132125782518084602001fd5b8160405162461bcd60e51b8152600401610a459190613c2e565b6001600160a01b03821661328c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a45565b6001600160a01b038216600090815260208190526040902054818110156133005760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a45565b6001600160a01b038316600090815260208190526040812083830390556002805484929061332f908490613dad565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610f5f8360008461379e565b6000610f368284613dad565b8254600090819080156133d857856133a6600183613dad565b815481106133b6576133b6613edf565b60009182526020909120015464010000000090046001600160e01b03166133db565b60005b6001600160e01b031692506133f483858763ffffffff16565b91506000811180156134325750438661340e600184613dad565b8154811061341e5761341e613edf565b60009182526020909120015463ffffffff16145b1561349257613440826137d0565b8661344c600184613dad565b8154811061345c5761345c613edf565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506134fd565b8560405180604001604052806134a74361258e565b63ffffffff1681526020016134bb856137d0565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60606000613515836002613d8e565b613520906002613ca1565b67ffffffffffffffff81111561353857613538613ef5565b6040519080825280601f01601f191660200182016040528015613562576020820181803683370190505b509050600360fc1b8160008151811061357d5761357d613edf565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106135ac576135ac613edf565b60200101906001600160f81b031916908160001a90535060006135d0846002613d8e565b6135db906001613ca1565b90505b6001811115613660577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061361c5761361c613edf565b1a60f81b82828151811061363257613632613edf565b60200101906001600160f81b031916908160001a90535060049490941c9361365981613e19565b90506135de565b508315610f365760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a45565b6000610f368284613ca1565b6001600160a01b0382166137115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a45565b80600260008282546137239190613ca1565b90915550506001600160a01b03821660009081526020819052604081208054839290613750908490613ca1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611e40600083835b6001600160a01b03838116600090815260066020526040808220548584168352912054610f5f92918216911683612d4d565b60006001600160e01b038211156120945760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610a45565b80356001600160a01b038116811461386657600080fd5b919050565b803560ff8116811461386657600080fd5b60006020828403121561388e57600080fd5b610f368261384f565b600080604083850312156138aa57600080fd5b6138b38361384f565b91506138c16020840161384f565b90509250929050565b6000806000606084860312156138df57600080fd5b6138e88461384f565b92506138f66020850161384f565b9150604084013590509250925092565b600080600080600080600060e0888a03121561392157600080fd5b61392a8861384f565b96506139386020890161384f565b955060408801359450606088013593506139546080890161386b565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561398357600080fd5b61398c8361384f565b946020939093013593505050565b60008060008060008060c087890312156139b357600080fd5b6139bc8761384f565b955060208701359450604087013593506139d86060880161386b565b92506080870135915060a087013590509295509295509295565b60008060408385031215613a0557600080fd5b613a0e8361384f565b9150602083013563ffffffff81168114613a2757600080fd5b809150509250929050565b600060208284031215613a4457600080fd5b81518015158114610f3657600080fd5b600060208284031215613a6657600080fd5b5035919050565b60008060408385031215613a8057600080fd5b823591506138c16020840161384f565b60008060408385031215613aa357600080fd5b50508035926020909101359150565b600060208284031215613ac457600080fd5b81356001600160e01b031981168114610f3657600080fd5b600060208284031215613aee57600080fd5b5051919050565b600080600060608486031215613b0a57600080fd5b8335925060208401359150613b216040850161384f565b90509250925092565b60008251613b3c818460208701613ded565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613b7e816017850160208801613ded565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613bbb816028840160208801613ded565b01602801949350505050565b602080825282518282018190526000919060409081850190868401855b82811015613c21578151805185528681015167ffffffffffffffff9081168887015290860151168585015260609093019290850190600101613be4565b5091979650505050505050565b6020815260008251806020840152613c4d816040850160208701613ded565b601f01601f19169190910160400192915050565b6000808212826001600160ff1b0303841381151615613c8257613c82613e9d565b600160ff1b8390038412811615613c9b57613c9b613e9d565b50500190565b60008219821115613cb457613cb4613e9d565b500190565b600067ffffffffffffffff808316818516808303821115613cdc57613cdc613e9d565b01949350505050565b600082613d0257634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160ff1b03600084136000841385830485118282161615613d2f57613d2f613e9d565b600160ff1b6000871282811687830589121615613d4e57613d4e613e9d565b60008712925087820587128484161615613d6a57613d6a613e9d565b87850587128184161615613d8057613d80613e9d565b505050929093029392505050565b6000816000190483118215151615613da857613da8613e9d565b500290565b600082821015613dbf57613dbf613e9d565b500390565b600067ffffffffffffffff83811690831681811015613de557613de5613e9d565b039392505050565b60005b83811015613e08578181015183820152602001613df0565b838111156123dd5750506000910152565b600081613e2857613e28613e9d565b506000190190565b600181811c90821680613e4457607f821691505b602082108114156126f457634e487b7160e01b600052602260045260246000fd5b6000600019821415613e7957613e79613e9d565b5060010190565b6000600160ff1b821415613e9657613e96613e9d565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea164736f6c6343000807000a", - "devdoc": { - "kind": "dev", - "methods": { - "DOMAIN_SEPARATOR()": { - "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." - }, - "allowance(address,address)": { - "details": "See {IERC20-allowance}." - }, - "approve(address,uint256)": { - "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address." - }, - "balanceOf(address)": { - "details": "See {IERC20-balanceOf}." - }, - "checkpoints(address,uint32)": { - "details": "Get the `pos`-th checkpoint for `account`." - }, - "cumulativeRewardsOf(address)": { - "details": "accumulativeFundsOf(account) = withdrawableRewardsOf(account) + withdrawnRewardsOf(account) = (pointsPerShare * balanceOf(account) + pointsCorrection[account]) / POINTS_MULTIPLIER", - "params": { - "_account": "The address of a token holder." - }, - "returns": { - "_0": "The amount of rewards that `account` has earned in total." - } - }, - "decimals()": { - "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." - }, - "decreaseAllowance(address,uint256)": { - "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." - }, - "delegate(address)": { - "details": "Delegate votes from the sender to `delegatee`." - }, - "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { - "details": "Delegates votes from signer to `delegatee`" - }, - "delegates(address)": { - "details": "Get the address `account` is currently delegating to." - }, - "getPastTotalSupply(uint256)": { - "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" - }, - "getPastVotes(address,uint256)": { - "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" - }, - "getRoleAdmin(bytes32)": { - "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." - }, - "getRoleMember(bytes32,uint256)": { - "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." - }, - "getRoleMemberCount(bytes32)": { - "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." - }, - "getVotes(address)": { - "details": "Gets the current votes balance for `account`" - }, - "grantRole(bytes32,address)": { - "details": "Overload {grantRole} to track enumerable memberships" - }, - "hasRole(bytes32,address)": { - "details": "Returns `true` if `account` has been granted `role`." - }, - "increaseAllowance(address,uint256)": { - "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." - }, - "name()": { - "details": "Returns the name of the token." - }, - "nonces(address)": { - "details": "See {IERC20Permit-nonces}." - }, - "numCheckpoints(address)": { - "details": "Get number of checkpoints for `account`." - }, - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { - "details": "See {IERC20Permit-permit}." - }, - "renounceRole(bytes32,address)": { - "details": "Overload {renounceRole} to track enumerable memberships" - }, - "revokeRole(bytes32,address)": { - "details": "Overload {revokeRole} to track enumerable memberships" - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "symbol()": { - "details": "Returns the symbol of the token, usually a shorter version of the name." - }, - "totalSupply()": { - "details": "See {IERC20-totalSupply}." - }, - "transfer(address,uint256)": { - "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." - }, - "transferFrom(address,address,uint256)": { - "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`." - }, - "withdrawableRewardsOf(address)": { - "details": "Returns the total amount of rewards a given address is able to withdraw.", - "params": { - "_account": "Address of a reward recipient" - }, - "returns": { - "_0": "A uint256 representing the rewards `account` can withdraw" - } - }, - "withdrawnRewardsOf(address)": { - "params": { - "_account": "The address of a token holder." - }, - "returns": { - "_0": "The amount of rewards that `account` has withdrawn." - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "cumulativeRewardsOf(address)": { - "notice": "View the amount of rewards that an address has earned in total." - }, - "withdrawnRewardsOf(address)": { - "notice": "View the amount of rewards that an address has withdrawn." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 599, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_balances", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 605, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_allowances", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 607, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_totalSupply", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 609, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_name", - "offset": 0, - "slot": "3", - "type": "t_string_storage" - }, - { - "astId": 611, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_symbol", - "offset": 0, - "slot": "4", - "type": "t_string_storage" - }, - { - "astId": 1901, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_nonces", - "offset": 0, - "slot": "5", - "type": "t_mapping(t_address,t_struct(Counter)2632_storage)" - }, - { - "astId": 1230, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_delegates", - "offset": 0, - "slot": "6", - "type": "t_mapping(t_address,t_address)" - }, - { - "astId": 1236, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_checkpoints", - "offset": 0, - "slot": "7", - "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1221_storage)dyn_storage)" - }, - { - "astId": 1240, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_totalSupplyCheckpoints", - "offset": 0, - "slot": "8", - "type": "t_array(t_struct(Checkpoint)1221_storage)dyn_storage" - }, - { - "astId": 5871, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "pointsPerShare", - "offset": 0, - "slot": "9", - "type": "t_uint256" - }, - { - "astId": 5875, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "pointsCorrection", - "offset": 0, - "slot": "10", - "type": "t_mapping(t_address,t_int256)" - }, - { - "astId": 5879, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "withdrawnRewards", - "offset": 0, - "slot": "11", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 24, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_roles", - "offset": 0, - "slot": "12", - "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" - }, - { - "astId": 325, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_roleMembers", - "offset": 0, - "slot": "13", - "type": "t_mapping(t_bytes32,t_struct(AddressSet)4237_storage)" - }, - { - "astId": 5096, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "depositsOf", - "offset": 0, - "slot": "14", - "type": "t_mapping(t_address,t_array(t_struct(Deposit)5103_storage)dyn_storage)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_bytes32)dyn_storage": { - "base": "t_bytes32", - "encoding": "dynamic_array", - "label": "bytes32[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(Checkpoint)1221_storage)dyn_storage": { - "base": "t_struct(Checkpoint)1221_storage", - "encoding": "dynamic_array", - "label": "struct ERC20Votes.Checkpoint[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(Deposit)5103_storage)dyn_storage": { - "base": "t_struct(Deposit)5103_storage", - "encoding": "dynamic_array", - "label": "struct TimeLockPool.Deposit[]", - "numberOfBytes": "32" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_int256": { - "encoding": "inplace", - "label": "int256", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_array(t_struct(Checkpoint)1221_storage)dyn_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct ERC20Votes.Checkpoint[])", - "numberOfBytes": "32", - "value": "t_array(t_struct(Checkpoint)1221_storage)dyn_storage" - }, - "t_mapping(t_address,t_array(t_struct(Deposit)5103_storage)dyn_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct TimeLockPool.Deposit[])", - "numberOfBytes": "32", - "value": "t_array(t_struct(Deposit)5103_storage)dyn_storage" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_int256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => int256)", - "numberOfBytes": "32", - "value": "t_int256" - }, - "t_mapping(t_address,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_address,t_struct(Counter)2632_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct Counters.Counter)", - "numberOfBytes": "32", - "value": "t_struct(Counter)2632_storage" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_bytes32,t_struct(AddressSet)4237_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct EnumerableSet.AddressSet)", - "numberOfBytes": "32", - "value": "t_struct(AddressSet)4237_storage" - }, - "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct AccessControl.RoleData)", - "numberOfBytes": "32", - "value": "t_struct(RoleData)19_storage" - }, - "t_mapping(t_bytes32,t_uint256)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(AddressSet)4237_storage": { - "encoding": "inplace", - "label": "struct EnumerableSet.AddressSet", - "members": [ - { - "astId": 4236, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_inner", - "offset": 0, - "slot": "0", - "type": "t_struct(Set)3936_storage" - } - ], - "numberOfBytes": "64" - }, - "t_struct(Checkpoint)1221_storage": { - "encoding": "inplace", - "label": "struct ERC20Votes.Checkpoint", - "members": [ - { - "astId": 1218, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "fromBlock", - "offset": 0, - "slot": "0", - "type": "t_uint32" - }, - { - "astId": 1220, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "votes", - "offset": 4, - "slot": "0", - "type": "t_uint224" - } - ], - "numberOfBytes": "32" - }, - "t_struct(Counter)2632_storage": { - "encoding": "inplace", - "label": "struct Counters.Counter", - "members": [ - { - "astId": 2631, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_value", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(Deposit)5103_storage": { - "encoding": "inplace", - "label": "struct TimeLockPool.Deposit", - "members": [ - { - "astId": 5098, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "amount", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 5100, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "start", - "offset": 0, - "slot": "1", - "type": "t_uint64" - }, - { - "astId": 5102, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "end", - "offset": 8, - "slot": "1", - "type": "t_uint64" - } - ], - "numberOfBytes": "64" - }, - "t_struct(RoleData)19_storage": { - "encoding": "inplace", - "label": "struct AccessControl.RoleData", - "members": [ - { - "astId": 16, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "members", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 18, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "adminRole", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - } - ], - "numberOfBytes": "64" - }, - "t_struct(Set)3936_storage": { - "encoding": "inplace", - "label": "struct EnumerableSet.Set", - "members": [ - { - "astId": 3931, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_values", - "offset": 0, - "slot": "0", - "type": "t_array(t_bytes32)dyn_storage" - }, - { - "astId": 3935, - "contract": "contracts/TimeLockNonTransferablePool.sol:TimeLockNonTransferablePool", - "label": "_indexes", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_uint256)" - } - ], - "numberOfBytes": "64" - }, - "t_uint224": { - "encoding": "inplace", - "label": "uint224", - "numberOfBytes": "28" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint32": { - "encoding": "inplace", - "label": "uint32", - "numberOfBytes": "4" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - } - } - } -} \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 93bbe77..2dbf409 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,6 +12,8 @@ if(!process.env.COMPILE_ONLY) { require("./tasks/deploy"); require("./tasks/balanceOf"); require("./tasks/fetchData"); + require("./tasks/setRewardPerSecond"); + require("./tasks/distributeRewards"); } import { resolve } from "path"; diff --git a/tasks/distributeRewards.ts b/tasks/distributeRewards.ts new file mode 100644 index 0000000..f4742c7 --- /dev/null +++ b/tasks/distributeRewards.ts @@ -0,0 +1,17 @@ +import { task } from "hardhat/config"; + +task("distributeRewards") + .setAction(async (taskArgs, { ethers, deployments, getNamedAccounts }) => { + const { execute } = deployments; + const { deployer } = await getNamedAccounts(); + + const txn = await execute( + "LiquidityMiningManager", + {from: deployer, log: true, gasLimit: 8000000}, + "distributeRewards", + ); + + console.log(` Transaction hash: ${txn.transactionHash}`); + }); + +module.exports = {}; diff --git a/tasks/setRewardPerSecond.ts b/tasks/setRewardPerSecond.ts new file mode 100644 index 0000000..08c8ed2 --- /dev/null +++ b/tasks/setRewardPerSecond.ts @@ -0,0 +1,19 @@ +import { task } from "hardhat/config"; + +task("setRewardPerSecond") + .addParam("amount", "Amount of rewards per second in 1e18") + .setAction(async (taskArgs, { ethers, deployments, getNamedAccounts }) => { + const { execute } = deployments; + const { deployer } = await getNamedAccounts(); + + const txn = await execute( + "LiquidityMiningManager", + {from: deployer, log: true}, + "setRewardPerSecond", + taskArgs.amount + ); + + console.log(` Transaction hash: ${txn.transactionHash}`); + }); + +module.exports = {};