@venusprotocol/venus-protocol 7.0.0-dev.3 → 7.0.0-dev.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deployments/sepolia/XVSStore.json +13 -13
- package/deployments/sepolia/XVSVault.json +88 -88
- package/deployments/sepolia/XVSVaultProxy.json +17 -17
- package/deployments/sepolia/solcInputs/7830d2b3dd486e9651687b362529ec15.json +345 -0
- package/deployments/sepolia.json +3 -3
- package/deployments/sepolia_addresses.json +3 -3
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"address": "
|
|
2
|
+
"address": "0x4129dF6BB93E9ABb9CC40816E63Be77c3042Ef27",
|
|
3
3
|
"abi": [
|
|
4
4
|
{
|
|
5
5
|
"inputs": [],
|
|
@@ -1550,28 +1550,28 @@
|
|
|
1550
1550
|
"type": "function"
|
|
1551
1551
|
}
|
|
1552
1552
|
],
|
|
1553
|
-
"transactionHash": "
|
|
1553
|
+
"transactionHash": "0x48829bb551aca5a5ee29cf837f7ea521ecc3837312168deb2304d954288beedc",
|
|
1554
1554
|
"receipt": {
|
|
1555
1555
|
"to": null,
|
|
1556
1556
|
"from": "0x03862dFa5D0be8F64509C001cb8C6188194469DF",
|
|
1557
|
-
"contractAddress": "
|
|
1558
|
-
"transactionIndex":
|
|
1557
|
+
"contractAddress": "0x4129dF6BB93E9ABb9CC40816E63Be77c3042Ef27",
|
|
1558
|
+
"transactionIndex": 149,
|
|
1559
1559
|
"gasUsed": "4701756",
|
|
1560
1560
|
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
1561
|
-
"blockHash": "
|
|
1562
|
-
"transactionHash": "
|
|
1561
|
+
"blockHash": "0xaae5a26ac369fda0e965c9ffdc76efbac441c65914f8597d6ac099517c4db49e",
|
|
1562
|
+
"transactionHash": "0x48829bb551aca5a5ee29cf837f7ea521ecc3837312168deb2304d954288beedc",
|
|
1563
1563
|
"logs": [],
|
|
1564
|
-
"blockNumber":
|
|
1565
|
-
"cumulativeGasUsed": "
|
|
1564
|
+
"blockNumber": 4960754,
|
|
1565
|
+
"cumulativeGasUsed": "19914068",
|
|
1566
1566
|
"status": 1,
|
|
1567
1567
|
"byzantium": true
|
|
1568
1568
|
},
|
|
1569
1569
|
"args": [],
|
|
1570
|
-
"numDeployments":
|
|
1571
|
-
"solcInputHash": "
|
|
1572
|
-
"metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Claim\",\"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\":\"DelegateChangedV2\",\"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\":\"DelegateVotesChangedV2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ExecutedWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IPrime\",\"name\":\"oldPrimeToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IPrime\",\"name\":\"newPrimeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldPrimeRewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPrimeRewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPrimePoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPrimePoolId\",\"type\":\"uint256\"}],\"name\":\"NewPrimeToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardPerBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lockPeriod\",\"type\":\"uint256\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldAllocPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAllocPoints\",\"type\":\"uint256\"}],\"name\":\"PoolUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RequestedWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReward\",\"type\":\"uint256\"}],\"name\":\"RewardAmountUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldXvs\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldStore\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newXvs\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newStore\",\"type\":\"address\"}],\"name\":\"StoreUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldOwedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newOwedAmount\",\"type\":\"uint256\"}],\"name\":\"VaultDebtUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"VaultPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"VaultResumed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"WithdrawalLockingPeriodUpdated\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"DELEGATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DOMAIN_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_LOCK_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract XVSVaultProxy\",\"name\":\"xvsVaultProxy\",\"type\":\"address\"}],\"name\":\"_become\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV5\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"contract IBEP20\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_rewardPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockPeriod\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"votes\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"claim\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"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\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"executeWithdrawal\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getEligibleWithdrawalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"withdrawalAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getRequestedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardDebt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pendingWithdrawals\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getWithdrawalRequests\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"lockedUntil\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"afterUpgrade\",\"type\":\"uint128\"}],\"internalType\":\"struct XVSVaultStorageV1.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isStakedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pendingAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingRewardTransfers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingWithdrawalsBeforeUpgrade\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"beforeUpgradeWithdrawalAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pendingXVSVaultImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfos\",\"outputs\":[{\"internalType\":\"contract IBEP20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardPerShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockPeriod\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"}],\"name\":\"poolLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primePoolId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primeRewardToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primeToken\",\"outputs\":[{\"internalType\":\"contract IPrime\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardTokenAmountsPerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAccessControlAddress\",\"type\":\"address\"}],\"name\":\"setAccessControl\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract IPrime\",\"name\":\"_primeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_primeRewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_primePoolId\",\"type\":\"uint256\"}],\"name\":\"setPrimeToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_rewardAmount\",\"type\":\"uint256\"}],\"name\":\"setRewardAmountPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"setWithdrawalLockingPeriod\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_xvs\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_xvsStore\",\"type\":\"address\"}],\"name\":\"setXvsStore\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totalAllocPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"updatePool\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"vaultPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"xvsAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"xvsStore\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"methods\":{\"add(address,uint256,address,uint256,uint256)\":{\"details\":\"This vault DOES NOT support deflationary tokens \\u2014 it expects that the amount of transferred tokens would equal the actually deposited amount. In practice this means that this vault DOES NOT support USDT and similar tokens (that do not provide these guarantees).\",\"params\":{\"_allocPoint\":\"Number of allocation points assigned to this pool\",\"_lockPeriod\":\"A period between withdrawal request and a moment when it's executable\",\"_rewardPerBlock\":\"Initial reward per block, in terms of _rewardToken\",\"_rewardToken\":\"Reward token address\",\"_token\":\"Staked token\"}},\"claim(address,address,uint256)\":{\"params\":{\"_account\":\"The account for which to claim rewards\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"delegate(address)\":{\"params\":{\"delegatee\":\"The address to delegate votes to\"}},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"delegatee\":\"The address to delegate votes to\",\"expiry\":\"The time at which to expire the signature\",\"nonce\":\"The contract state required to match the signature\",\"r\":\"Half of the ECDSA signature pair\",\"s\":\"Half of the ECDSA signature pair\",\"v\":\"The recovery byte of the signature\"}},\"deposit(address,uint256,uint256)\":{\"params\":{\"_amount\":\"The amount to deposit to vault\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"executeWithdrawal(address,uint256)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"getCurrentVotes(address)\":{\"params\":{\"account\":\"The address to get votes balance\"},\"return\":\"The number of current votes for `account`\"},\"getEligibleWithdrawalAmount(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"withdrawalAmount Amount that the user can withdraw\"},\"getPriorVotes(address,uint256)\":{\"params\":{\"account\":\"The address of the account to check\",\"blockNumber\":\"The block number to get the vote balance at\"},\"return\":\"The balance that user staked\"},\"getRequestedAmount(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"Total amount of requested but not yet executed withdrawals (including both executable and locked ones)\"},\"getUserInfo(address,uint256,address)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\",\"_user\":\"User address\"},\"return\":\"amount Deposited amountrewardDebt Reward debt (technical value used to track past payouts)pendingWithdrawals Requested but not yet executed withdrawals\"},\"getWithdrawalRequests(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"An array of withdrawal requests\"},\"pendingReward(address,uint256,address)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\",\"_user\":\"User address\"},\"return\":\"Reward the user is eligible for in this pool, in terms of _rewardToken\"},\"pendingWithdrawalsBeforeUpgrade(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The address of the user\"},\"return\":\"beforeUpgradeWithdrawalAmount Total pending withdrawal amount in requests made before the vault upgrade\"},\"poolLength(address)\":{\"params\":{\"rewardToken\":\"Reward token address\"},\"return\":\"Number of pools that distribute the specified token as a reward\"},\"requestWithdrawal(address,uint256,uint256)\":{\"params\":{\"_amount\":\"The amount to withdraw from the vault\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"set(address,uint256,uint256)\":{\"params\":{\"_allocPoint\":\"Number of allocation points assigned to this pool\",\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}},\"setAccessControl(address)\":{\"details\":\"Admin function to set the access control address\",\"params\":{\"newAccessControlAddress\":\"New address for the access control\"}},\"setPrimeToken(address,address,uint256)\":{\"params\":{\"_primePoolId\":\"pool id for reward\",\"_primeRewardToken\":\"address of reward token\",\"_primeToken\":\"address of the prime token contract\"}},\"setRewardAmountPerBlock(address,uint256)\":{\"params\":{\"_rewardAmount\":\"Number of allocation points assigned to this pool\",\"_rewardToken\":\"Reward token address\"}},\"setWithdrawalLockingPeriod(address,uint256,uint256)\":{\"params\":{\"_newPeriod\":\"New lock period\",\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}},\"updatePool(address,uint256)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}}},\"title\":\"XVS Vault\"},\"userdoc\":{\"methods\":{\"_become(address)\":{\"notice\":\"* Admin Functions **\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"add(address,uint256,address,uint256,uint256)\":{\"notice\":\"Add a new token pool\"},\"claim(address,address,uint256)\":{\"notice\":\"Claim rewards for pool\"},\"delegate(address)\":{\"notice\":\"Delegate votes from `msg.sender` to `delegatee`\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Delegates votes from signatory to `delegatee`\"},\"deposit(address,uint256,uint256)\":{\"notice\":\"Deposit XVSVault for XVS allocation\"},\"executeWithdrawal(address,uint256)\":{\"notice\":\"Execute withdrawal to XVSVault for XVS allocation\"},\"getCurrentVotes(address)\":{\"notice\":\"Gets the current votes balance for `account`\"},\"getEligibleWithdrawalAmount(address,uint256,address)\":{\"notice\":\"Get unlocked withdrawal amount\"},\"getPriorVotes(address,uint256)\":{\"notice\":\"Determine the xvs stake balance for an account\"},\"getRequestedAmount(address,uint256,address)\":{\"notice\":\"Get requested amount\"},\"getUserInfo(address,uint256,address)\":{\"notice\":\"Get user info with reward token address and pid\"},\"getWithdrawalRequests(address,uint256,address)\":{\"notice\":\"Returns the array of withdrawal requests that have not been executed yet\"},\"pause()\":{\"notice\":\"Pauses vault\"},\"pendingReward(address,uint256,address)\":{\"notice\":\"View function to see pending XVSs on frontend\"},\"pendingWithdrawalsBeforeUpgrade(address,uint256,address)\":{\"notice\":\"Gets the total pending withdrawal amount of a user before upgrade\"},\"poolLength(address)\":{\"notice\":\"Returns the number of pools with the specified reward token\"},\"requestWithdrawal(address,uint256,uint256)\":{\"notice\":\"Request withdrawal to XVSVault for XVS allocation\"},\"resume()\":{\"notice\":\"Resume vault\"},\"set(address,uint256,uint256)\":{\"notice\":\"Update the given pool's reward allocation point\"},\"setAccessControl(address)\":{\"notice\":\"Sets the address of the access control of this contract\"},\"setPrimeToken(address,address,uint256)\":{\"notice\":\"Sets the address of the prime token contract\"},\"setRewardAmountPerBlock(address,uint256)\":{\"notice\":\"Update the given reward token's amount per block\"},\"setWithdrawalLockingPeriod(address,uint256,uint256)\":{\"notice\":\"Update the lock period after which a requested withdrawal can be executed\"},\"updatePool(address,uint256)\":{\"notice\":\"Update reward variables of the given pool to be up-to-date\"}},\"notice\":\"The XVS Vault allows XVS holders to lock their XVS to recieve voting rights in Venus governance and are rewarded with XVS.\"}},\"settings\":{\"compilationTarget\":{\"contracts/XVSVault/XVSVault.sol\":\"XVSVault\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV5.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.5.16;\\n\\nimport \\\"./IAccessControlManagerV5.sol\\\";\\n\\n/**\\n * @title AccessControlledV5\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.5.16)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\ncontract AccessControlledV5 {\\n /// @notice Access control manager contract\\n IAccessControlManagerV5 private _accessControlManager;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n\\n /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV5) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV5(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert(\\\"Unauthorized\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4b724928650b944935bc91713782a8cf5bbd9cdb98b3e3fedf31e611c7e6df19\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV5.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.5.16;\\n\\n/**\\n * @title IAccessControlManagerV5\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV5` contract.\\n */\\ninterface IAccessControlManagerV5 {\\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 */\\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 /**\\n * @notice Gives a function call permission to one single account\\n * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE\\n * \\t\\tMay emit a {RoleGranted} event.\\n * @param contractAddress address of contract for which call permissions will be granted\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n */\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n /**\\n * @notice Revokes an account's permission to a particular function call\\n * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE\\n * \\t\\tMay emit a {RoleRevoked} event.\\n * @param contractAddress address of contract for which call permissions will be revoked\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n */\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n /**\\n * @notice Verifies if the given account can call a praticular contract's function\\n * @dev Since the contract is calling itself this function, we can get contracts address with msg.sender\\n * @param account address (eoa or contract) for which call permissions will be checked\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n * @return false if the user account cannot call the particular contract function\\n *\\n */\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x3563db4c75f7aa0b8a982bab591907dda192438a2368511b62a9c587a3e54226\"},\"contracts/Tokens/Prime/IPrime.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.5.16;\\n\\n/**\\n * @title IPrime\\n * @author Venus\\n * @notice Interface for Prime Token\\n */\\ninterface IPrime {\\n /**\\n * @notice Executed by XVSVault whenever user's XVSVault balance changes\\n * @param user the account address whose balance was updated\\n */\\n function xvsUpdated(address user) external;\\n\\n /**\\n * @notice accrues interest and updates score for an user for a specific market\\n * @param user the account address for which to accrue interest and update score\\n * @param market the market for which to accrue interest and update score\\n */\\n function accrueInterestAndUpdateScore(address user, address market) external;\\n\\n /**\\n * @notice Distributes income from market since last distribution\\n * @param vToken the market for which to distribute the income\\n */\\n function accrueInterest(address vToken) external;\\n}\\n\",\"keccak256\":\"0xa4f8ba3fbd95f83e1a056be73247f4c715904d94f47639d226746c2bc7b13484\"},\"contracts/Utils/Address.sol\":{\"content\":\"pragma solidity ^0.5.5;\\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 // According to EIP-1052, 0x0 is the value returned for not-yet created accounts\\n // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned\\n // for accounts without code, i.e. `keccak256('')`\\n bytes32 codehash;\\n bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n codehash := extcodehash(account)\\n }\\n return (codehash != accountHash && codehash != 0x0);\\n }\\n\\n /**\\n * @dev Converts an `address` into `address payable`. Note that this is\\n * simply a type cast: the actual underlying value is not changed.\\n *\\n * _Available since v2.4.0._\\n */\\n function toPayable(address account) internal pure returns (address payable) {\\n return address(uint160(account));\\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 * _Available since v2.4.0._\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-call-value\\n // solium-disable-next-line security/no-call-value\\n (bool success, ) = recipient.call.value(amount)(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n}\\n\",\"keccak256\":\"0x3c2ef780599a2ae6913282b982633f07e405a4a9c8511590df571e2b773aef9d\"},\"contracts/Utils/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Adapted from OpenZeppelin Contracts v4.3.2 (utils/cryptography/ECDSA.sol)\\n\\n// SPDX-Copyright-Text: OpenZeppelin, 2021\\n// SPDX-Copyright-Text: Venus, 2021\\n\\npragma solidity ^0.5.16;\\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 */\\ncontract 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`. 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, uint8 v, bytes32 r, bytes32 s) 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 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, uint8 v, bytes32 r, bytes32 s) 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\",\"keccak256\":\"0xf27d7ad488b72c627370afa6e9acc520d4834a082363d1dc46b5573ac40a2d0a\"},\"contracts/Utils/IBEP20.sol\":{\"content\":\"pragma solidity ^0.5.0;\\n\\n/**\\n * @dev Interface of the BEP20 standard as defined in the EIP. Does not include\\n * the optional functions; to access them see {BEP20Detailed}.\\n */\\ninterface IBEP20 {\\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(address sender, address recipient, uint256 amount) 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\":\"0x839b08895eb1ad83502d3631e8e9e3a856d2a8c63c46f070d604af7b26c62c07\"},\"contracts/Utils/SafeBEP20.sol\":{\"content\":\"pragma solidity ^0.5.0;\\n\\nimport \\\"./SafeMath.sol\\\";\\nimport \\\"./IBEP20.sol\\\";\\nimport \\\"./Address.sol\\\";\\n\\n/**\\n * @title SafeBEP20\\n * @dev Wrappers around BEP20 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 SafeBEP20 for BEP20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeBEP20 {\\n using SafeMath for uint256;\\n using Address for address;\\n\\n function safeTransfer(IBEP20 token, address to, uint256 value) internal {\\n callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(IBEP20 token, address from, address to, uint256 value) internal {\\n callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n function safeApprove(IBEP20 token, address spender, uint256 value) 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 // solhint-disable-next-line max-line-length\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeBEP20: approve from non-zero to non-zero allowance\\\"\\n );\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(IBEP20 token, address spender, uint256 value) internal {\\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(IBEP20 token, address spender, uint256 value) internal {\\n uint256 newAllowance = token.allowance(address(this), spender).sub(\\n value,\\n \\\"SafeBEP20: decreased allowance below zero\\\"\\n );\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\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(IBEP20 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.\\n\\n // A Solidity high level call has three parts:\\n // 1. The target address is checked to verify it contains contract code\\n // 2. The call itself is made, and success asserted\\n // 3. The return value is decoded, which in turn checks the size of the returned data.\\n // solhint-disable-next-line max-line-length\\n require(address(token).isContract(), \\\"SafeBEP20: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = address(token).call(data);\\n require(success, \\\"SafeBEP20: low-level call failed\\\");\\n\\n if (returndata.length > 0) {\\n // Return data is optional\\n // solhint-disable-next-line max-line-length\\n require(abi.decode(returndata, (bool)), \\\"SafeBEP20: BEP20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x540ef6ddc47232a59d3ab0e95537f7a7d1c8a36f8dba315b010e60c6487bd768\"},\"contracts/Utils/SafeCast.sol\":{\"content\":\"pragma solidity ^0.5.16;\\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 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 < 2 ** 128, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(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 < 2 ** 64, \\\"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 < 2 ** 32, \\\"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 < 2 ** 16, \\\"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 < 2 ** 8, \\\"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 >= -2 ** 127 && value < 2 ** 127, \\\"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 >= -2 ** 63 && value < 2 ** 63, \\\"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 >= -2 ** 31 && value < 2 ** 31, \\\"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 >= -2 ** 15 && value < 2 ** 15, \\\"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 >= -2 ** 7 && value < 2 ** 7, \\\"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 require(value < 2 ** 255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0xe6222292bd226980fd73c00eaf3a102c8638777aa3f9c7cd9b0d0fb621da0661\"},\"contracts/Utils/SafeMath.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * 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 */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n return add(a, b, \\\"SafeMath: addition overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, errorMessage);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n return div(a, b, \\\"SafeMath: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n // Solidity only automatically asserts when dividing by 0\\n require(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b != 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0x9431fd772ed4abc038cdfe9ce6c0066897bd1685ad45848748d1952935d5b8ef\"},\"contracts/XVSVault/XVSStore.sol\":{\"content\":\"pragma solidity 0.5.16;\\nimport \\\"../Utils/SafeBEP20.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\n\\n/**\\n * @title XVS Store\\n * @author Venus\\n * @notice XVS Store responsible for distributing XVS rewards\\n */\\ncontract XVSStore {\\n using SafeMath for uint256;\\n using SafeBEP20 for IBEP20;\\n\\n /// @notice The Admin Address\\n address public admin;\\n\\n /// @notice The pending admin address\\n address public pendingAdmin;\\n\\n /// @notice The Owner Address\\n address public owner;\\n\\n /// @notice The reward tokens\\n mapping(address => bool) public rewardTokens;\\n\\n /// @notice Emitted when pendingAdmin is changed\\n event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);\\n\\n /// @notice Event emitted when admin changed\\n event AdminTransferred(address indexed oldAdmin, address indexed newAdmin);\\n\\n /// @notice Event emitted when owner changed\\n event OwnerTransferred(address indexed oldOwner, address indexed newOwner);\\n\\n constructor() public {\\n admin = msg.sender;\\n }\\n\\n modifier onlyAdmin() {\\n require(msg.sender == admin, \\\"only admin can\\\");\\n _;\\n }\\n\\n modifier onlyOwner() {\\n require(msg.sender == owner, \\\"only owner can\\\");\\n _;\\n }\\n\\n /**\\n * @notice Safely transfer rewards. Only active reward tokens can be sent using this function.\\n * Only callable by owner\\n * @dev Safe reward token transfer function, just in case if rounding error causes pool to not have enough tokens.\\n * @param token Reward token to transfer\\n * @param _to Destination address of the reward\\n * @param _amount Amount to transfer\\n */\\n function safeRewardTransfer(address token, address _to, uint256 _amount) external onlyOwner {\\n require(rewardTokens[token] == true, \\\"only reward token can\\\");\\n\\n if (address(token) != address(0)) {\\n uint256 tokenBalance = IBEP20(token).balanceOf(address(this));\\n if (_amount > tokenBalance) {\\n IBEP20(token).safeTransfer(_to, tokenBalance);\\n } else {\\n IBEP20(token).safeTransfer(_to, _amount);\\n }\\n }\\n }\\n\\n /**\\n * @notice Allows the admin to propose a new admin\\n * Only callable admin\\n * @param _admin Propose an account as admin of the XVS store\\n */\\n function setPendingAdmin(address _admin) external onlyAdmin {\\n address oldPendingAdmin = pendingAdmin;\\n pendingAdmin = _admin;\\n emit NewPendingAdmin(oldPendingAdmin, _admin);\\n }\\n\\n /**\\n * @notice Allows an account that is pending as admin to accept the role\\n * nly calllable by the pending admin\\n */\\n function acceptAdmin() external {\\n require(msg.sender == pendingAdmin, \\\"only pending admin\\\");\\n address oldAdmin = admin;\\n address oldPendingAdmin = pendingAdmin;\\n\\n admin = pendingAdmin;\\n pendingAdmin = address(0);\\n\\n emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);\\n emit AdminTransferred(oldAdmin, admin);\\n }\\n\\n /**\\n * @notice Set the contract owner\\n * @param _owner The address of the owner to set\\n * Only callable admin\\n */\\n function setNewOwner(address _owner) external onlyAdmin {\\n require(_owner != address(0), \\\"new owner is the zero address\\\");\\n address oldOwner = owner;\\n owner = _owner;\\n emit OwnerTransferred(oldOwner, _owner);\\n }\\n\\n /**\\n * @notice Set or disable a reward token\\n * @param _tokenAddress The address of a token to set as active or inactive\\n * @param status Set whether a reward token is active or not\\n */\\n function setRewardToken(address _tokenAddress, bool status) external {\\n require(msg.sender == admin || msg.sender == owner, \\\"only admin or owner can\\\");\\n rewardTokens[_tokenAddress] = status;\\n }\\n\\n /**\\n * @notice Security function to allow the owner of the contract to withdraw from the contract\\n * @param _tokenAddress Reward token address to withdraw\\n * @param _amount Amount of token to withdraw\\n */\\n function emergencyRewardWithdraw(address _tokenAddress, uint256 _amount) external onlyOwner {\\n IBEP20(_tokenAddress).safeTransfer(address(msg.sender), _amount);\\n }\\n}\\n\",\"keccak256\":\"0x8082f92b13448bd4fa982c93c763439f10fe016a5f3be6d613dfe3cca68501ef\"},\"contracts/XVSVault/XVSVault.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\n\\npragma solidity 0.5.16;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../Utils/ECDSA.sol\\\";\\nimport \\\"../Utils/SafeBEP20.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\nimport \\\"./XVSVaultStorage.sol\\\";\\nimport \\\"./XVSVaultErrorReporter.sol\\\";\\nimport \\\"../Tokens/Prime/IPrime.sol\\\";\\nimport \\\"../Utils/SafeCast.sol\\\";\\nimport \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV5.sol\\\";\\nimport { XVSStore } from \\\"./XVSStore.sol\\\";\\nimport { XVSVaultProxy } from \\\"./XVSVaultProxy.sol\\\";\\n\\n/**\\n * @title XVS Vault\\n * @author Venus\\n * @notice The XVS Vault allows XVS holders to lock their XVS to recieve voting rights in Venus governance and are rewarded with XVS.\\n */\\ncontract XVSVault is XVSVaultStorage, ECDSA, AccessControlledV5 {\\n using SafeMath for uint256;\\n using SafeCast for uint256;\\n using SafeBEP20 for IBEP20;\\n\\n /// @notice The upper bound for the lock period in a pool, 10 years\\n uint256 public constant MAX_LOCK_PERIOD = 60 * 60 * 24 * 365 * 10;\\n\\n /// @notice Event emitted when deposit\\n event Deposit(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when execute withrawal\\n event ExecutedWithdrawal(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when request withrawal\\n event RequestedWithdrawal(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice An event thats emitted when an account changes its delegate\\n event DelegateChangedV2(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /// @notice An event thats emitted when a delegate account's vote balance changes\\n event DelegateVotesChangedV2(address indexed delegate, uint previousBalance, uint newBalance);\\n\\n /// @notice An event emitted when the reward store address is updated\\n event StoreUpdated(address oldXvs, address oldStore, address newXvs, address newStore);\\n\\n /// @notice An event emitted when the withdrawal locking period is updated for a pool\\n event WithdrawalLockingPeriodUpdated(address indexed rewardToken, uint indexed pid, uint oldPeriod, uint newPeriod);\\n\\n /// @notice An event emitted when the reward amount per block is modified for a pool\\n event RewardAmountUpdated(address indexed rewardToken, uint oldReward, uint newReward);\\n\\n /// @notice An event emitted when a new pool is added\\n event PoolAdded(\\n address indexed rewardToken,\\n uint indexed pid,\\n address indexed token,\\n uint allocPoints,\\n uint rewardPerBlock,\\n uint lockPeriod\\n );\\n\\n /// @notice An event emitted when a pool allocation points are updated\\n event PoolUpdated(address indexed rewardToken, uint indexed pid, uint oldAllocPoints, uint newAllocPoints);\\n\\n /// @notice Event emitted when reward claimed\\n event Claim(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when vault is paused\\n event VaultPaused(address indexed admin);\\n\\n /// @notice Event emitted when vault is resumed after pause\\n event VaultResumed(address indexed admin);\\n\\n /// @notice Event emitted when protocol logs a debt to a user due to insufficient funds for pending reward distribution\\n event VaultDebtUpdated(\\n address indexed rewardToken,\\n address indexed userAddress,\\n uint256 oldOwedAmount,\\n uint256 newOwedAmount\\n );\\n\\n /// @notice Emitted when prime token contract address is changed\\n event NewPrimeToken(\\n IPrime indexed oldPrimeToken,\\n IPrime indexed newPrimeToken,\\n address oldPrimeRewardToken,\\n address newPrimeRewardToken,\\n uint256 oldPrimePoolId,\\n uint256 newPrimePoolId\\n );\\n\\n constructor() public {\\n admin = msg.sender;\\n }\\n\\n modifier onlyAdmin() {\\n require(msg.sender == admin, \\\"only admin can\\\");\\n _;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n */\\n modifier nonReentrant() {\\n require(_notEntered, \\\"re-entered\\\");\\n _notEntered = false;\\n _;\\n _notEntered = true; // get a gas-refund post-Istanbul\\n }\\n\\n /**\\n * @dev Prevents functions to execute when vault is paused.\\n */\\n modifier isActive() {\\n require(!vaultPaused, \\\"Vault is paused\\\");\\n _;\\n }\\n\\n /**\\n * @notice Pauses vault\\n */\\n function pause() external {\\n _checkAccessAllowed(\\\"pause()\\\");\\n require(!vaultPaused, \\\"Vault is already paused\\\");\\n vaultPaused = true;\\n emit VaultPaused(msg.sender);\\n }\\n\\n /**\\n * @notice Resume vault\\n */\\n function resume() external {\\n _checkAccessAllowed(\\\"resume()\\\");\\n require(vaultPaused, \\\"Vault is not paused\\\");\\n vaultPaused = false;\\n emit VaultResumed(msg.sender);\\n }\\n\\n /**\\n * @notice Returns the number of pools with the specified reward token\\n * @param rewardToken Reward token address\\n * @return Number of pools that distribute the specified token as a reward\\n */\\n function poolLength(address rewardToken) external view returns (uint256) {\\n return poolInfos[rewardToken].length;\\n }\\n\\n /**\\n * @notice Add a new token pool\\n * @dev This vault DOES NOT support deflationary tokens \\u2014 it expects that\\n * the amount of transferred tokens would equal the actually deposited\\n * amount. In practice this means that this vault DOES NOT support USDT\\n * and similar tokens (that do not provide these guarantees).\\n * @param _rewardToken Reward token address\\n * @param _allocPoint Number of allocation points assigned to this pool\\n * @param _token Staked token\\n * @param _rewardPerBlock Initial reward per block, in terms of _rewardToken\\n * @param _lockPeriod A period between withdrawal request and a moment when it's executable\\n */\\n function add(\\n address _rewardToken,\\n uint256 _allocPoint,\\n IBEP20 _token,\\n uint256 _rewardPerBlock,\\n uint256 _lockPeriod\\n ) external {\\n _checkAccessAllowed(\\\"add(address,uint256,address,uint256,uint256)\\\");\\n _ensureNonzeroAddress(_rewardToken);\\n _ensureNonzeroAddress(address(_token));\\n require(address(xvsStore) != address(0), \\\"Store contract address is empty\\\");\\n require(_allocPoint > 0, \\\"Alloc points must not be zero\\\");\\n\\n massUpdatePools(_rewardToken);\\n\\n PoolInfo[] storage poolInfo = poolInfos[_rewardToken];\\n\\n uint256 length = poolInfo.length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n require(poolInfo[pid].token != _token, \\\"Pool already added\\\");\\n }\\n\\n // We use balanceOf to get the supply amount, so shouldn't be possible to\\n // configure pools with different reward token but the same staked token\\n require(!isStakedToken[address(_token)], \\\"Token exists in other pool\\\");\\n\\n totalAllocPoints[_rewardToken] = totalAllocPoints[_rewardToken].add(_allocPoint);\\n\\n rewardTokenAmountsPerBlock[_rewardToken] = _rewardPerBlock;\\n\\n poolInfo.push(\\n PoolInfo({\\n token: _token,\\n allocPoint: _allocPoint,\\n lastRewardBlock: block.number,\\n accRewardPerShare: 0,\\n lockPeriod: _lockPeriod\\n })\\n );\\n isStakedToken[address(_token)] = true;\\n\\n XVSStore(xvsStore).setRewardToken(_rewardToken, true);\\n\\n emit PoolAdded(_rewardToken, poolInfo.length - 1, address(_token), _allocPoint, _rewardPerBlock, _lockPeriod);\\n }\\n\\n /**\\n * @notice Update the given pool's reward allocation point\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _allocPoint Number of allocation points assigned to this pool\\n */\\n function set(address _rewardToken, uint256 _pid, uint256 _allocPoint) external {\\n _checkAccessAllowed(\\\"set(address,uint256,uint256)\\\");\\n _ensureValidPool(_rewardToken, _pid);\\n\\n massUpdatePools(_rewardToken);\\n\\n PoolInfo[] storage poolInfo = poolInfos[_rewardToken];\\n uint256 newTotalAllocPoints = totalAllocPoints[_rewardToken].sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n require(newTotalAllocPoints > 0, \\\"Alloc points per reward token must not be zero\\\");\\n\\n uint256 oldAllocPoints = poolInfo[_pid].allocPoint;\\n poolInfo[_pid].allocPoint = _allocPoint;\\n totalAllocPoints[_rewardToken] = newTotalAllocPoints;\\n\\n emit PoolUpdated(_rewardToken, _pid, oldAllocPoints, _allocPoint);\\n }\\n\\n /**\\n * @notice Update the given reward token's amount per block\\n * @param _rewardToken Reward token address\\n * @param _rewardAmount Number of allocation points assigned to this pool\\n */\\n function setRewardAmountPerBlock(address _rewardToken, uint256 _rewardAmount) external {\\n _checkAccessAllowed(\\\"setRewardAmountPerBlock(address,uint256)\\\");\\n require(XVSStore(xvsStore).rewardTokens(_rewardToken), \\\"Invalid reward token\\\");\\n massUpdatePools(_rewardToken);\\n uint256 oldReward = rewardTokenAmountsPerBlock[_rewardToken];\\n rewardTokenAmountsPerBlock[_rewardToken] = _rewardAmount;\\n\\n emit RewardAmountUpdated(_rewardToken, oldReward, _rewardAmount);\\n }\\n\\n /**\\n * @notice Update the lock period after which a requested withdrawal can be executed\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _newPeriod New lock period\\n */\\n function setWithdrawalLockingPeriod(address _rewardToken, uint256 _pid, uint256 _newPeriod) external {\\n _checkAccessAllowed(\\\"setWithdrawalLockingPeriod(address,uint256,uint256)\\\");\\n _ensureValidPool(_rewardToken, _pid);\\n require(_newPeriod > 0 && _newPeriod < MAX_LOCK_PERIOD, \\\"Invalid new locking period\\\");\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n uint256 oldPeriod = pool.lockPeriod;\\n pool.lockPeriod = _newPeriod;\\n\\n emit WithdrawalLockingPeriodUpdated(_rewardToken, _pid, oldPeriod, _newPeriod);\\n }\\n\\n /**\\n * @notice Deposit XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _amount The amount to deposit to vault\\n */\\n function deposit(address _rewardToken, uint256 _pid, uint256 _amount) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n _updatePool(_rewardToken, _pid);\\n require(pendingWithdrawalsBeforeUpgrade(_rewardToken, _pid, msg.sender) == 0, \\\"execute pending withdrawal\\\");\\n\\n if (user.amount > 0) {\\n uint256 pending = _computeReward(user, pool);\\n if (pending > 0) {\\n _transferReward(_rewardToken, msg.sender, pending);\\n emit Claim(msg.sender, _rewardToken, _pid, pending);\\n }\\n }\\n pool.token.safeTransferFrom(msg.sender, address(this), _amount);\\n user.amount = user.amount.add(_amount);\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n // Update Delegate Amount\\n if (address(pool.token) == xvsAddress) {\\n _moveDelegates(address(0), delegates[msg.sender], safe96(_amount, \\\"XVSVault::deposit: votes overflow\\\"));\\n }\\n\\n if (primeRewardToken == _rewardToken && _pid == primePoolId) {\\n primeToken.xvsUpdated(msg.sender);\\n }\\n\\n emit Deposit(msg.sender, _rewardToken, _pid, _amount);\\n }\\n\\n /**\\n * @notice Claim rewards for pool\\n * @param _account The account for which to claim rewards\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n */\\n function claim(address _account, address _rewardToken, uint256 _pid) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][_account];\\n _updatePool(_rewardToken, _pid);\\n require(pendingWithdrawalsBeforeUpgrade(_rewardToken, _pid, _account) == 0, \\\"execute pending withdrawal\\\");\\n\\n if (user.amount > 0) {\\n uint256 pending = _computeReward(user, pool);\\n\\n if (pending > 0) {\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n _transferReward(_rewardToken, _account, pending);\\n emit Claim(_account, _rewardToken, _pid, pending);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pushes withdrawal request to the requests array and updates\\n * the pending withdrawals amount. The requests are always sorted\\n * by unlock time (descending) so that the earliest to execute requests\\n * are always at the end of the array.\\n * @param _user The user struct storage pointer\\n * @param _requests The user's requests array storage pointer\\n * @param _amount The amount being requested\\n */\\n function pushWithdrawalRequest(\\n UserInfo storage _user,\\n WithdrawalRequest[] storage _requests,\\n uint _amount,\\n uint _lockedUntil\\n ) internal {\\n uint i = _requests.length;\\n _requests.push(WithdrawalRequest(0, 0, 1));\\n // Keep it sorted so that the first to get unlocked request is always at the end\\n for (; i > 0 && _requests[i - 1].lockedUntil <= _lockedUntil; --i) {\\n _requests[i] = _requests[i - 1];\\n }\\n _requests[i] = WithdrawalRequest(_amount, _lockedUntil.toUint128(), 1);\\n _user.pendingWithdrawals = _user.pendingWithdrawals.add(_amount);\\n }\\n\\n /**\\n * @notice Pops the requests with unlock time < now from the requests\\n * array and deducts the computed amount from the user's pending\\n * withdrawals counter. Assumes that the requests array is sorted\\n * by unclock time (descending).\\n * @dev This function **removes** the eligible requests from the requests\\n * array. If this function is called, the withdrawal should actually\\n * happen (or the transaction should be reverted).\\n * @param _user The user struct storage pointer\\n * @param _requests The user's requests array storage pointer\\n * @return beforeUpgradeWithdrawalAmount The amount eligible for withdrawal before upgrade (this amount should be\\n * sent to the user, otherwise the state would be inconsistent).\\n * @return afterUpgradeWithdrawalAmount The amount eligible for withdrawal after upgrade (this amount should be\\n * sent to the user, otherwise the state would be inconsistent).\\n */\\n function popEligibleWithdrawalRequests(\\n UserInfo storage _user,\\n WithdrawalRequest[] storage _requests\\n ) internal returns (uint beforeUpgradeWithdrawalAmount, uint afterUpgradeWithdrawalAmount) {\\n // Since the requests are sorted by their unlock time, we can just\\n // pop them from the array and stop at the first not-yet-eligible one\\n for (uint i = _requests.length; i > 0 && isUnlocked(_requests[i - 1]); --i) {\\n if (_requests[i - 1].afterUpgrade == 1) {\\n afterUpgradeWithdrawalAmount = afterUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n } else {\\n beforeUpgradeWithdrawalAmount = beforeUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n }\\n\\n _requests.pop();\\n }\\n _user.pendingWithdrawals = _user.pendingWithdrawals.sub(\\n afterUpgradeWithdrawalAmount.add(beforeUpgradeWithdrawalAmount)\\n );\\n return (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount);\\n }\\n\\n /**\\n * @notice Checks if the request is eligible for withdrawal.\\n * @param _request The request struct storage pointer\\n * @return True if the request is eligible for withdrawal, false otherwise\\n */\\n function isUnlocked(WithdrawalRequest storage _request) private view returns (bool) {\\n return _request.lockedUntil <= block.timestamp;\\n }\\n\\n /**\\n * @notice Execute withdrawal to XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n */\\n function executeWithdrawal(address _rewardToken, uint256 _pid) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][msg.sender];\\n\\n uint256 beforeUpgradeWithdrawalAmount;\\n uint256 afterUpgradeWithdrawalAmount;\\n\\n (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount) = popEligibleWithdrawalRequests(user, requests);\\n require(beforeUpgradeWithdrawalAmount > 0 || afterUpgradeWithdrawalAmount > 0, \\\"nothing to withdraw\\\");\\n\\n // Having both old-style and new-style requests is not allowed and shouldn't be possible\\n require(beforeUpgradeWithdrawalAmount == 0 || afterUpgradeWithdrawalAmount == 0, \\\"inconsistent state\\\");\\n\\n if (beforeUpgradeWithdrawalAmount > 0) {\\n _updatePool(_rewardToken, _pid);\\n uint256 pending = user.amount.mul(pool.accRewardPerShare).div(1e12).sub(user.rewardDebt);\\n XVSStore(xvsStore).safeRewardTransfer(_rewardToken, msg.sender, pending);\\n user.amount = user.amount.sub(beforeUpgradeWithdrawalAmount);\\n user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12);\\n pool.token.safeTransfer(address(msg.sender), beforeUpgradeWithdrawalAmount);\\n } else {\\n user.amount = user.amount.sub(afterUpgradeWithdrawalAmount);\\n totalPendingWithdrawals[_rewardToken][_pid] = totalPendingWithdrawals[_rewardToken][_pid].sub(\\n afterUpgradeWithdrawalAmount\\n );\\n pool.token.safeTransfer(address(msg.sender), afterUpgradeWithdrawalAmount);\\n }\\n\\n emit ExecutedWithdrawal(\\n msg.sender,\\n _rewardToken,\\n _pid,\\n beforeUpgradeWithdrawalAmount.add(afterUpgradeWithdrawalAmount)\\n );\\n }\\n\\n /**\\n * @notice Returns before and after upgrade pending withdrawal amount\\n * @param _requests The user's requests array storage pointer\\n * @return beforeUpgradeWithdrawalAmount The amount eligible for withdrawal before upgrade\\n * @return afterUpgradeWithdrawalAmount The amount eligible for withdrawal after upgrade\\n */\\n function getRequestedWithdrawalAmount(\\n WithdrawalRequest[] storage _requests\\n ) internal view returns (uint beforeUpgradeWithdrawalAmount, uint afterUpgradeWithdrawalAmount) {\\n for (uint i = _requests.length; i > 0; --i) {\\n if (_requests[i - 1].afterUpgrade == 1) {\\n afterUpgradeWithdrawalAmount = afterUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n } else {\\n beforeUpgradeWithdrawalAmount = beforeUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n }\\n }\\n return (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount);\\n }\\n\\n /**\\n * @notice Request withdrawal to XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _amount The amount to withdraw from the vault\\n */\\n function requestWithdrawal(address _rewardToken, uint256 _pid, uint256 _amount) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n require(_amount > 0, \\\"requested amount cannot be zero\\\");\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n require(user.amount >= user.pendingWithdrawals.add(_amount), \\\"requested amount is invalid\\\");\\n\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][msg.sender];\\n\\n uint beforeUpgradeWithdrawalAmount;\\n\\n (beforeUpgradeWithdrawalAmount, ) = getRequestedWithdrawalAmount(requests);\\n require(beforeUpgradeWithdrawalAmount == 0, \\\"execute pending withdrawal\\\");\\n\\n _updatePool(_rewardToken, _pid);\\n uint256 pending = _computeReward(user, pool);\\n _transferReward(_rewardToken, msg.sender, pending);\\n\\n uint lockedUntil = pool.lockPeriod.add(block.timestamp);\\n\\n pushWithdrawalRequest(user, requests, _amount, lockedUntil);\\n totalPendingWithdrawals[_rewardToken][_pid] = totalPendingWithdrawals[_rewardToken][_pid].add(_amount);\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n // Update Delegate Amount\\n if (address(pool.token) == xvsAddress) {\\n _moveDelegates(\\n delegates[msg.sender],\\n address(0),\\n safe96(_amount, \\\"XVSVault::requestWithdrawal: votes overflow\\\")\\n );\\n }\\n\\n if (primeRewardToken == _rewardToken && _pid == primePoolId) {\\n primeToken.xvsUpdated(msg.sender);\\n }\\n\\n emit Claim(msg.sender, _rewardToken, _pid, pending);\\n emit RequestedWithdrawal(msg.sender, _rewardToken, _pid, _amount);\\n }\\n\\n /**\\n * @notice Get unlocked withdrawal amount\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return withdrawalAmount Amount that the user can withdraw\\n */\\n function getEligibleWithdrawalAmount(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (uint withdrawalAmount) {\\n _ensureValidPool(_rewardToken, _pid);\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n // Since the requests are sorted by their unlock time, we can take\\n // the entries from the end of the array and stop at the first\\n // not-yet-eligible one\\n for (uint i = requests.length; i > 0 && isUnlocked(requests[i - 1]); --i) {\\n withdrawalAmount = withdrawalAmount.add(requests[i - 1].amount);\\n }\\n return withdrawalAmount;\\n }\\n\\n /**\\n * @notice Get requested amount\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return Total amount of requested but not yet executed withdrawals (including both executable and locked ones)\\n */\\n function getRequestedAmount(address _rewardToken, uint256 _pid, address _user) external view returns (uint256) {\\n _ensureValidPool(_rewardToken, _pid);\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n return user.pendingWithdrawals;\\n }\\n\\n /**\\n * @notice Returns the array of withdrawal requests that have not been executed yet\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return An array of withdrawal requests\\n */\\n function getWithdrawalRequests(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (WithdrawalRequest[] memory) {\\n _ensureValidPool(_rewardToken, _pid);\\n return withdrawalRequests[_rewardToken][_pid][_user];\\n }\\n\\n /**\\n * @notice View function to see pending XVSs on frontend\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _user User address\\n * @return Reward the user is eligible for in this pool, in terms of _rewardToken\\n */\\n function pendingReward(address _rewardToken, uint256 _pid, address _user) external view returns (uint256) {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n uint256 accRewardPerShare = pool.accRewardPerShare;\\n uint256 supply = pool.token.balanceOf(address(this)).sub(totalPendingWithdrawals[_rewardToken][_pid]);\\n uint256 curBlockNumber = block.number;\\n uint256 rewardTokenPerBlock = rewardTokenAmountsPerBlock[_rewardToken];\\n if (curBlockNumber > pool.lastRewardBlock && supply != 0) {\\n uint256 multiplier = curBlockNumber.sub(pool.lastRewardBlock);\\n uint256 reward = multiplier.mul(rewardTokenPerBlock).mul(pool.allocPoint).div(\\n totalAllocPoints[_rewardToken]\\n );\\n accRewardPerShare = accRewardPerShare.add(reward.mul(1e12).div(supply));\\n }\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n (, uint256 afterUpgradeWithdrawalAmount) = getRequestedWithdrawalAmount(requests);\\n return user.amount.sub(afterUpgradeWithdrawalAmount).mul(accRewardPerShare).div(1e12).sub(user.rewardDebt);\\n }\\n\\n // Update reward variables for all pools. Be careful of gas spending!\\n function massUpdatePools(address _rewardToken) internal {\\n uint256 length = poolInfos[_rewardToken].length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n _updatePool(_rewardToken, pid);\\n }\\n }\\n\\n /**\\n * @notice Update reward variables of the given pool to be up-to-date\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n */\\n function updatePool(address _rewardToken, uint256 _pid) external isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n _updatePool(_rewardToken, _pid);\\n }\\n\\n // Update reward variables of the given pool to be up-to-date.\\n function _updatePool(address _rewardToken, uint256 _pid) internal {\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n if (block.number <= pool.lastRewardBlock) {\\n return;\\n }\\n uint256 supply = pool.token.balanceOf(address(this));\\n supply = supply.sub(totalPendingWithdrawals[_rewardToken][_pid]);\\n if (supply == 0) {\\n pool.lastRewardBlock = block.number;\\n return;\\n }\\n uint256 curBlockNumber = block.number;\\n uint256 multiplier = curBlockNumber.sub(pool.lastRewardBlock);\\n uint256 reward = multiplier.mul(rewardTokenAmountsPerBlock[_rewardToken]).mul(pool.allocPoint).div(\\n totalAllocPoints[_rewardToken]\\n );\\n pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(supply));\\n pool.lastRewardBlock = block.number;\\n }\\n\\n function _ensureValidPool(address rewardToken, uint256 pid) internal view {\\n require(pid < poolInfos[rewardToken].length, \\\"vault: pool exists?\\\");\\n }\\n\\n /**\\n * @notice Get user info with reward token address and pid\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _user User address\\n * @return amount Deposited amount\\n * @return rewardDebt Reward debt (technical value used to track past payouts)\\n * @return pendingWithdrawals Requested but not yet executed withdrawals\\n */\\n function getUserInfo(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (uint256 amount, uint256 rewardDebt, uint256 pendingWithdrawals) {\\n _ensureValidPool(_rewardToken, _pid);\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n amount = user.amount;\\n rewardDebt = user.rewardDebt;\\n pendingWithdrawals = user.pendingWithdrawals;\\n }\\n\\n /**\\n * @notice Gets the total pending withdrawal amount of a user before upgrade\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The address of the user\\n * @return beforeUpgradeWithdrawalAmount Total pending withdrawal amount in requests made before the vault upgrade\\n */\\n function pendingWithdrawalsBeforeUpgrade(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) public view returns (uint256 beforeUpgradeWithdrawalAmount) {\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n (beforeUpgradeWithdrawalAmount, ) = getRequestedWithdrawalAmount(requests);\\n return beforeUpgradeWithdrawalAmount;\\n }\\n\\n /**\\n * @notice Get the XVS stake balance of an account (excluding the pending withdrawals)\\n * @param account The address of the account to check\\n * @return The balance that user staked\\n */\\n function getStakeAmount(address account) internal view returns (uint96) {\\n require(xvsAddress != address(0), \\\"XVSVault::getStakeAmount: xvs address is not set\\\");\\n\\n PoolInfo[] storage poolInfo = poolInfos[xvsAddress];\\n\\n uint256 length = poolInfo.length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n if (address(poolInfo[pid].token) == address(xvsAddress)) {\\n UserInfo storage user = userInfos[xvsAddress][pid][account];\\n return safe96(user.amount.sub(user.pendingWithdrawals), \\\"XVSVault::getStakeAmount: votes overflow\\\");\\n }\\n }\\n return uint96(0);\\n }\\n\\n /**\\n * @notice Delegate votes from `msg.sender` to `delegatee`\\n * @param delegatee The address to delegate votes to\\n */\\n function delegate(address delegatee) external isActive {\\n return _delegate(msg.sender, delegatee);\\n }\\n\\n /**\\n * @notice Delegates votes from signatory to `delegatee`\\n * @param delegatee The address to delegate votes to\\n * @param nonce The contract state required to match the signature\\n * @param expiry The time at which to expire the signature\\n * @param v The recovery byte of the signature\\n * @param r Half of the ECDSA signature pair\\n * @param s Half of the ECDSA signature pair\\n */\\n function delegateBySig(\\n address delegatee,\\n uint nonce,\\n uint expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external isActive {\\n bytes32 domainSeparator = keccak256(\\n abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(\\\"XVSVault\\\")), getChainId(), address(this))\\n );\\n bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));\\n bytes32 digest = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n address signatory = ECDSA.recover(digest, v, r, s);\\n require(nonce == nonces[signatory]++, \\\"XVSVault::delegateBySig: invalid nonce\\\");\\n require(block.timestamp <= expiry, \\\"XVSVault::delegateBySig: signature expired\\\");\\n return _delegate(signatory, delegatee);\\n }\\n\\n /**\\n * @notice Gets the current votes balance for `account`\\n * @param account The address to get votes balance\\n * @return The number of current votes for `account`\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n uint32 nCheckpoints = numCheckpoints[account];\\n return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;\\n }\\n\\n function _delegate(address delegator, address delegatee) internal {\\n address currentDelegate = delegates[delegator];\\n uint96 delegatorBalance = getStakeAmount(delegator);\\n delegates[delegator] = delegatee;\\n\\n emit DelegateChangedV2(delegator, currentDelegate, delegatee);\\n\\n _moveDelegates(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {\\n if (srcRep != dstRep && amount > 0) {\\n if (srcRep != address(0)) {\\n uint32 srcRepNum = numCheckpoints[srcRep];\\n uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;\\n uint96 srcRepNew = sub96(srcRepOld, amount, \\\"XVSVault::_moveVotes: vote amount underflows\\\");\\n _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);\\n }\\n\\n if (dstRep != address(0)) {\\n uint32 dstRepNum = numCheckpoints[dstRep];\\n uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;\\n uint96 dstRepNew = add96(dstRepOld, amount, \\\"XVSVault::_moveVotes: vote amount overflows\\\");\\n _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {\\n uint32 blockNumber = safe32(block.number, \\\"XVSVault::_writeCheckpoint: block number exceeds 32 bits\\\");\\n\\n if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {\\n checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;\\n } else {\\n checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);\\n numCheckpoints[delegatee] = nCheckpoints + 1;\\n }\\n\\n emit DelegateVotesChangedV2(delegatee, oldVotes, newVotes);\\n }\\n\\n function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {\\n require(n < 2 ** 32, errorMessage);\\n return uint32(n);\\n }\\n\\n function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {\\n require(n < 2 ** 96, errorMessage);\\n return uint96(n);\\n }\\n\\n function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {\\n uint96 c = a + b;\\n require(c >= a, errorMessage);\\n return c;\\n }\\n\\n function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n function getChainId() internal pure returns (uint) {\\n uint256 chainId;\\n assembly {\\n chainId := chainid()\\n }\\n return chainId;\\n }\\n\\n /**\\n * @notice Determine the xvs stake balance for an account\\n * @param account The address of the account to check\\n * @param blockNumber The block number to get the vote balance at\\n * @return The balance that user staked\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n require(blockNumber < block.number, \\\"XVSVault::getPriorVotes: not yet determined\\\");\\n\\n uint32 nCheckpoints = numCheckpoints[account];\\n if (nCheckpoints == 0) {\\n return 0;\\n }\\n\\n // First check most recent balance\\n if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {\\n return checkpoints[account][nCheckpoints - 1].votes;\\n }\\n\\n // Next check implicit zero balance\\n if (checkpoints[account][0].fromBlock > blockNumber) {\\n return 0;\\n }\\n\\n uint32 lower = 0;\\n uint32 upper = nCheckpoints - 1;\\n while (upper > lower) {\\n uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow\\n Checkpoint memory cp = checkpoints[account][center];\\n if (cp.fromBlock == blockNumber) {\\n return cp.votes;\\n } else if (cp.fromBlock < blockNumber) {\\n lower = center;\\n } else {\\n upper = center - 1;\\n }\\n }\\n return checkpoints[account][lower].votes;\\n }\\n\\n /*** Admin Functions ***/\\n\\n function _become(XVSVaultProxy xvsVaultProxy) external {\\n require(msg.sender == xvsVaultProxy.admin(), \\\"only proxy admin can change brains\\\");\\n require(xvsVaultProxy._acceptImplementation() == 0, \\\"change not authorized\\\");\\n }\\n\\n function setXvsStore(address _xvs, address _xvsStore) external onlyAdmin {\\n _ensureNonzeroAddress(_xvs);\\n _ensureNonzeroAddress(_xvsStore);\\n\\n address oldXvsContract = xvsAddress;\\n address oldStore = xvsStore;\\n require(oldXvsContract == address(0), \\\"already initialized\\\");\\n\\n xvsAddress = _xvs;\\n xvsStore = _xvsStore;\\n\\n _notEntered = true;\\n\\n emit StoreUpdated(oldXvsContract, oldStore, _xvs, _xvsStore);\\n }\\n\\n /**\\n * @notice Sets the address of the prime token contract\\n * @param _primeToken address of the prime token contract\\n * @param _primeRewardToken address of reward token\\n * @param _primePoolId pool id for reward\\n */\\n function setPrimeToken(IPrime _primeToken, address _primeRewardToken, uint256 _primePoolId) external onlyAdmin {\\n require(address(_primeToken) != address(0), \\\"prime token cannot be zero address\\\");\\n require(_primeRewardToken != address(0), \\\"reward cannot be zero address\\\");\\n\\n _ensureValidPool(_primeRewardToken, _primePoolId);\\n\\n emit NewPrimeToken(primeToken, _primeToken, primeRewardToken, _primeRewardToken, primePoolId, _primePoolId);\\n\\n primeToken = _primeToken;\\n primeRewardToken = _primeRewardToken;\\n primePoolId = _primePoolId;\\n }\\n\\n /**\\n * @notice Sets the address of the access control of this contract\\n * @dev Admin function to set the access control address\\n * @param newAccessControlAddress New address for the access control\\n */\\n function setAccessControl(address newAccessControlAddress) external onlyAdmin {\\n _setAccessControlManager(newAccessControlAddress);\\n }\\n\\n /**\\n * @dev Reverts if the provided address is a zero address\\n * @param address_ Address to check\\n */\\n function _ensureNonzeroAddress(address address_) internal pure {\\n require(address_ != address(0), \\\"zero address not allowed\\\");\\n }\\n\\n /**\\n * @dev Transfers the reward to the user, taking into account the rewards store\\n * balance and the previous debt. If there are not enough rewards in the store,\\n * transfers the available funds and records the debt amount in pendingRewardTransfers.\\n * @param rewardToken Reward token address\\n * @param userAddress User address\\n * @param amount Reward amount, in reward tokens\\n */\\n function _transferReward(address rewardToken, address userAddress, uint256 amount) internal {\\n address xvsStore_ = xvsStore;\\n uint256 storeBalance = IBEP20(rewardToken).balanceOf(xvsStore_);\\n uint256 debtDueToFailedTransfers = pendingRewardTransfers[rewardToken][userAddress];\\n uint256 fullAmount = amount.add(debtDueToFailedTransfers);\\n\\n if (fullAmount <= storeBalance) {\\n if (debtDueToFailedTransfers != 0) {\\n pendingRewardTransfers[rewardToken][userAddress] = 0;\\n emit VaultDebtUpdated(rewardToken, userAddress, debtDueToFailedTransfers, 0);\\n }\\n XVSStore(xvsStore_).safeRewardTransfer(rewardToken, userAddress, fullAmount);\\n return;\\n }\\n // Overflow isn't possible due to the check above\\n uint256 newOwedAmount = fullAmount - storeBalance;\\n pendingRewardTransfers[rewardToken][userAddress] = newOwedAmount;\\n emit VaultDebtUpdated(rewardToken, userAddress, debtDueToFailedTransfers, newOwedAmount);\\n XVSStore(xvsStore_).safeRewardTransfer(rewardToken, userAddress, storeBalance);\\n }\\n\\n /**\\n * @dev Computes cumulative reward for all user's shares\\n * @param user UserInfo storage struct\\n * @param pool PoolInfo storage struct\\n */\\n function _cumulativeReward(UserInfo storage user, PoolInfo storage pool) internal view returns (uint256) {\\n return user.amount.sub(user.pendingWithdrawals).mul(pool.accRewardPerShare).div(1e12);\\n }\\n\\n /**\\n * @dev Computes the reward for all user's shares\\n * @param user UserInfo storage struct\\n * @param pool PoolInfo storage struct\\n */\\n function _computeReward(UserInfo storage user, PoolInfo storage pool) internal view returns (uint256) {\\n return _cumulativeReward(user, pool).sub(user.rewardDebt);\\n }\\n}\\n\",\"keccak256\":\"0xdd9ab5b2392ef97f571c57b7dea203ade0598bd5609ee9bce7b9f8c01f42805f\"},\"contracts/XVSVault/XVSVaultErrorReporter.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\ncontract XVSVaultErrorReporter {\\n enum Error {\\n NO_ERROR,\\n UNAUTHORIZED\\n }\\n\\n enum FailureInfo {\\n ACCEPT_ADMIN_PENDING_ADMIN_CHECK,\\n ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK,\\n SET_PENDING_ADMIN_OWNER_CHECK,\\n SET_PENDING_IMPLEMENTATION_OWNER_CHECK\\n }\\n\\n /**\\n * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary\\n * contract-specific code that enables us to report opaque error codes from upgradeable contracts.\\n **/\\n event Failure(uint error, uint info, uint detail);\\n\\n /**\\n * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator\\n */\\n function fail(Error err, FailureInfo info) internal returns (uint) {\\n emit Failure(uint(err), uint(info), 0);\\n\\n return uint(err);\\n }\\n\\n /**\\n * @dev use this when reporting an opaque error from an upgradeable collaborator contract\\n */\\n function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {\\n emit Failure(uint(err), uint(info), opaqueError);\\n\\n return uint(err);\\n }\\n}\\n\",\"keccak256\":\"0xa79877a281d024f0d03dbf1842a36a972ee6c1aa36ba93e3d646726d40684a26\"},\"contracts/XVSVault/XVSVaultProxy.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\nimport \\\"./XVSVaultStorage.sol\\\";\\nimport \\\"./XVSVaultErrorReporter.sol\\\";\\n\\n/**\\n * @title XVS Vault Proxy\\n * @author Venus\\n * @notice XVS Vault Proxy contract\\n */\\ncontract XVSVaultProxy is XVSVaultAdminStorage, XVSVaultErrorReporter {\\n /**\\n * @notice Emitted when pendingXVSVaultImplementation is changed\\n */\\n event NewPendingImplementation(address oldPendingImplementation, address newPendingImplementation);\\n\\n /**\\n * @notice Emitted when pendingXVSVaultImplementation is accepted, which means XVS Vault implementation is updated\\n */\\n event NewImplementation(address oldImplementation, address newImplementation);\\n\\n /**\\n * @notice Emitted when pendingAdmin is changed\\n */\\n event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);\\n\\n /**\\n * @notice Emitted when pendingAdmin is accepted, which means admin is updated\\n */\\n event NewAdmin(address oldAdmin, address newAdmin);\\n\\n constructor() public {\\n // Set admin to caller\\n admin = msg.sender;\\n }\\n\\n /*** Admin Functions ***/\\n function _setPendingImplementation(address newPendingImplementation) public returns (uint) {\\n if (msg.sender != admin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_IMPLEMENTATION_OWNER_CHECK);\\n }\\n\\n address oldPendingImplementation = pendingXVSVaultImplementation;\\n\\n pendingXVSVaultImplementation = newPendingImplementation;\\n\\n emit NewPendingImplementation(oldPendingImplementation, pendingXVSVaultImplementation);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Accepts new implementation of XVS Vault. msg.sender must be pendingImplementation\\n * @dev Admin function for new implementation to accept it's role as implementation\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _acceptImplementation() public returns (uint) {\\n // Check caller is pendingImplementation\\n if (msg.sender != pendingXVSVaultImplementation) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK);\\n }\\n\\n // Save current values for inclusion in log\\n address oldImplementation = implementation;\\n address oldPendingImplementation = pendingXVSVaultImplementation;\\n\\n implementation = pendingXVSVaultImplementation;\\n\\n pendingXVSVaultImplementation = address(0);\\n\\n emit NewImplementation(oldImplementation, implementation);\\n emit NewPendingImplementation(oldPendingImplementation, pendingXVSVaultImplementation);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.\\n * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.\\n * @param newPendingAdmin New pending admin.\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _setPendingAdmin(address newPendingAdmin) public returns (uint) {\\n // Check caller = admin\\n if (msg.sender != admin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK);\\n }\\n\\n // Save current value, if any, for inclusion in log\\n address oldPendingAdmin = pendingAdmin;\\n\\n // Store pendingAdmin with value newPendingAdmin\\n pendingAdmin = newPendingAdmin;\\n\\n // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin)\\n emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin\\n * @dev Admin function for pending admin to accept role and update admin\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _acceptAdmin() public returns (uint) {\\n // Check caller is pendingAdmin\\n if (msg.sender != pendingAdmin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK);\\n }\\n\\n // Save current values for inclusion in log\\n address oldAdmin = admin;\\n address oldPendingAdmin = pendingAdmin;\\n\\n // Store admin with value pendingAdmin\\n admin = pendingAdmin;\\n\\n // Clear the pending value\\n pendingAdmin = address(0);\\n\\n emit NewAdmin(oldAdmin, admin);\\n emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @dev Delegates execution to an implementation contract.\\n * It returns to the external caller whatever the implementation returns\\n * or forwards reverts.\\n */\\n function() external payable {\\n // delegate all other functions to current implementation\\n (bool success, ) = implementation.delegatecall(msg.data);\\n\\n assembly {\\n let free_mem_ptr := mload(0x40)\\n returndatacopy(free_mem_ptr, 0, returndatasize)\\n\\n switch success\\n case 0 {\\n revert(free_mem_ptr, returndatasize)\\n }\\n default {\\n return(free_mem_ptr, returndatasize)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb39af917833659fe38f2f76924deda420babed8259b27741dc6cb402ade4d124\"},\"contracts/XVSVault/XVSVaultStorage.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\nimport \\\"../Utils/SafeMath.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\nimport \\\"../Tokens/Prime/IPrime.sol\\\";\\n\\ncontract XVSVaultAdminStorage {\\n /**\\n * @notice Administrator for this contract\\n */\\n address public admin;\\n\\n /**\\n * @notice Pending administrator for this contract\\n */\\n address public pendingAdmin;\\n\\n /**\\n * @notice Active brains of XVS Vault\\n */\\n address public implementation;\\n\\n /**\\n * @notice Pending brains of XVS Vault\\n */\\n address public pendingXVSVaultImplementation;\\n}\\n\\ncontract XVSVaultStorageV1 is XVSVaultAdminStorage {\\n /// @notice Guard variable for re-entrancy checks\\n bool internal _notEntered;\\n\\n /// @notice The reward token store\\n address public xvsStore;\\n\\n /// @notice The xvs token address\\n address public xvsAddress;\\n\\n // Reward tokens created per block indentified by reward token address.\\n mapping(address => uint256) public rewardTokenAmountsPerBlock;\\n\\n /// @notice Info of each user.\\n struct UserInfo {\\n uint256 amount;\\n uint256 rewardDebt;\\n uint256 pendingWithdrawals;\\n }\\n\\n // Info of each pool.\\n struct PoolInfo {\\n IBEP20 token; // Address of token contract to stake.\\n uint256 allocPoint; // How many allocation points assigned to this pool.\\n uint256 lastRewardBlock; // Last block number that reward tokens distribution occurs.\\n uint256 accRewardPerShare; // Accumulated per share, times 1e12. See below.\\n uint256 lockPeriod; // Min time between withdrawal request and its execution.\\n }\\n\\n // Infomation about a withdrawal request\\n struct WithdrawalRequest {\\n uint256 amount;\\n uint128 lockedUntil;\\n uint128 afterUpgrade;\\n }\\n\\n // Info of each user that stakes tokens.\\n mapping(address => mapping(uint256 => mapping(address => UserInfo))) internal userInfos;\\n\\n // Info of each pool.\\n mapping(address => PoolInfo[]) public poolInfos;\\n\\n // Total allocation points. Must be the sum of all allocation points in all pools.\\n mapping(address => uint256) public totalAllocPoints;\\n\\n // Info of requested but not yet executed withdrawals\\n mapping(address => mapping(uint256 => mapping(address => WithdrawalRequest[]))) internal withdrawalRequests;\\n\\n /// @notice DEPRECATED A record of each accounts delegate (before the voting power fix)\\n mapping(address => address) private __oldDelegatesSlot;\\n\\n /// @notice A checkpoint for marking number of votes from a given block\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint96 votes;\\n }\\n\\n /// @notice DEPRECATED A record of votes checkpoints for each account, by index (before the voting power fix)\\n mapping(address => mapping(uint32 => Checkpoint)) private __oldCheckpointsSlot;\\n\\n /// @notice DEPRECATED The number of checkpoints for each account (before the voting power fix)\\n mapping(address => uint32) private __oldNumCheckpointsSlot;\\n\\n /// @notice A record of states for signing / validating signatures\\n mapping(address => uint) public nonces;\\n\\n /// @notice The EIP-712 typehash for the contract's domain\\n bytes32 public constant DOMAIN_TYPEHASH =\\n keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n\\n /// @notice The EIP-712 typehash for the delegation struct used by the contract\\n bytes32 public constant DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n}\\n\\ncontract XVSVaultStorage is XVSVaultStorageV1 {\\n /// @notice A record of each accounts delegate\\n mapping(address => address) public delegates;\\n\\n /// @notice A record of votes checkpoints for each account, by index\\n mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;\\n\\n /// @notice The number of checkpoints for each account\\n mapping(address => uint32) public numCheckpoints;\\n\\n /// @notice Tracks pending withdrawals for all users for a particular reward token and pool id\\n mapping(address => mapping(uint256 => uint256)) internal totalPendingWithdrawals;\\n\\n /// @notice pause indicator for Vault\\n bool public vaultPaused;\\n\\n /// @notice if the token is added to any of the pools\\n mapping(address => bool) public isStakedToken;\\n\\n /// @notice Amount we owe to users because of failed transfer attempts\\n mapping(address => mapping(address => uint256)) public pendingRewardTransfers;\\n\\n /// @notice Prime token contract address\\n IPrime public primeToken;\\n\\n /// @notice Reward token for which prime token is issued for staking\\n address public primeRewardToken;\\n\\n /// @notice Pool ID for which prime token is issued for staking\\n uint256 public primePoolId;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[46] private __gap;\\n}\\n\",\"keccak256\":\"0x6389c160d86eab54ce1a8a5138c39f38d858381b7d8881d146cd937feab3dac9\"}},\"version\":1}",
|
|
1573
|
-
"bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916331790556153a6806100326000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638456cb5911610182578063c2102596116100e9578063e7a324dc116100a2578063f55401621161007c578063f55401621461061c578063f851a44014610624578063fba1b1f91461062c578063fe5a451a1461063f576102bb565b8063e7a324dc146105eb578063e8f2be6f146105f3578063f1127ed8146105fb576102bb565b8063c210259614610577578063c3c754a814610597578063c3cda520146105aa578063d7ae45e2146105bd578063dae66bbe146105d0578063de0368b2146105e3576102bb565b80639e2b6c4d1161013b5780639e2b6c4d1461050e578063a09eab7a14610521578063a9d69a6914610534578063add8933714610547578063b4a0bdf31461054f578063b4b5ea5714610564576102bb565b80638456cb59146104875780638ed7333d1461048f57806392e35000146104a257806393c7c4d1146104c657806398e1b31b146104d9578063996cba68146104fb576102bb565b80634298bdbd116102265780636fcfff45116101df5780636fcfff45146103f957806373d025d614610419578063782d6fe11461042e5780637ac924561461044e5780637ecebe00146104615780638308d7e914610474576102bb565b80634298bdbd14610392578063587cde1e146103a55780635c19a95c146103b85780635c60da1b146103cb5780635ff56315146103d35780636dd77cbd146103e6576102bb565b806320606b701161027857806320606b701461033f57806324f52bbf14610347578063267822471461035c5780632eda5c6c14610364578063358ae036146103775780633d4180f91461037f576102bb565b8063046f7da2146102c05780630af13728146102ca5780630efe6a8b146102f3578063115b512f1461030657806319129e5a146103195780631d504dc61461032c575b600080fd5b6102c8610647565b005b6102dd6102d8366004613de7565b6106d2565b6040516102ea9190614d0d565b60405180910390f35b6102c8610301366004613e9f565b610718565b6102c8610314366004613e9f565b610a0d565b6102c8610327366004613cf4565b610dc1565b6102c861033a366004613fc7565b610df7565b6102dd610f28565b61034f610f3f565b6040516102ea9190614bab565b61034f610f4e565b6102dd610372366004613cf4565b610f5d565b61034f610f6f565b6102dd61038d366004613d30565b610f7e565b6102dd6103a0366004613cf4565b610f9b565b61034f6103b3366004613cf4565b610fad565b6102c86103c6366004613cf4565b610fc8565b61034f610ff5565b6102c86103e1366004613d30565b611004565b6102dd6103f4366004613de7565b6110f8565b61040c610407366004613cf4565b6111ad565b6040516102ea919061508b565b6104216111c5565b6040516102ea9190614cff565b61044161043c366004613db7565b6111ce565b6040516102ea91906150b4565b6102c861045c366004613db7565b6113dd565b6102dd61046f366004613cf4565b611726565b6102c8610482366004613e9f565b611738565b6102c86118de565b6102c861049d366004613db7565b611963565b6104b56104b0366004613db7565b61199e565b6040516102ea959493929190614d7a565b6102c86104d4366004613db7565b6119f3565b6104ec6104e7366004613de7565b611b19565b6040516102ea93929190615070565b6102c8610509366004613d6a565b611b6b565b6102c861051c366004613e9f565b611cfd565b6102dd61052f366004613de7565b611de8565b6102dd610542366004613de7565b61202d565b61034f61206f565b61055761207e565b6040516102ea9190614d6c565b610441610572366004613cf4565b61208d565b61058a610585366004613de7565b612100565b6040516102ea9190614cee565b6104216105a5366004613cf4565b6121ba565b6102c86105b8366004613ed1565b6121cf565b6102dd6105cb366004613cf4565b612373565b6102c86105de366004613fa6565b61238e565b61034f61249a565b6102dd6124a9565b6102dd6124b5565b61060e610609366004613f58565b6124bb565b6040516102ea929190615099565b6102dd6124f0565b61034f6124f8565b6102c861063a366004613e2a565b612507565b6105576127d3565b61067060405180604001604052806008815260200167726573756d65282960c01b8152506127e2565b60135460ff1661069b5760405162461bcd60e51b815260040161069290614e37565b60405180910390fd5b6013805460ff1916905560405133907fd2619572a1464e0df0bb351d834fd47f3350984d7bfdb1ab69cfcb0b8e42141590600090a2565b60006106de8484612884565b506001600160a01b0380841660009081526007602090815260408083208684528252808320938516835292905220600201545b9392505050565b600354600160a01b900460ff166107415760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156107715760405162461bcd60e51b815260040161069290614e27565b61077b8383612884565b6001600160a01b038316600090815260086020526040812080548490811061079f57fe5b600091825260208083206001600160a01b038816845260078252604080852088865283528085203386529092529220600590910290910191506107e285856128bb565b6107ed85853361202d565b1561080a5760405162461bcd60e51b815260040161069290614f37565b80541561087f57600061081d8284612a76565b9050801561087d57610830863383612a8a565b84866001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645846040516108749190614d0d565b60405180910390a45b505b815461089c906001600160a01b031633308663ffffffff612d0316565b80546108ae908463ffffffff612d6416565b81556108ba8183612da6565b600182015560055482546001600160a01b039081169116141561092157336000908152600f6020908152604080832054815160608101909252602180835261092194936001600160a01b039092169261091c9289929061525890830139612dd4565b612e03565b6017546001600160a01b03868116911614801561093f575060185484145b156109a7576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610974903390600401614bb9565b600060405180830381600087803b15801561098e57600080fd5b505af11580156109a2573d6000803e3d6000fd5b505050505b83856001600160a01b0316336001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7866040516109eb9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b179055505050565b600354600160a01b900460ff16610a365760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615610a665760405162461bcd60e51b815260040161069290614e27565b610a708383612884565b60008111610a905760405162461bcd60e51b815260040161069290614f57565b6001600160a01b0383166000908152600760209081526040808320858452825280832033845290915290206002810154610ad0908363ffffffff612d6416565b81541015610af05760405162461bcd60e51b815260040161069290615017565b6001600160a01b0384166000908152600860205260408120805485908110610b1457fe5b600091825260208083206001600160a01b0389168452600a825260408085208986528352808520338652909252908320600590920201925090610b5682612f95565b5090508015610b775760405162461bcd60e51b815260040161069290614f37565b610b8187876128bb565b6000610b8d8585612a76565b9050610b9a883383612a8a565b6004840154600090610bb2904263ffffffff612d6416565b9050610bc086858984613039565b6001600160a01b03891660009081526012602090815260408083208b8452909152902054610bf4908863ffffffff612d6416565b6001600160a01b038a1660009081526012602090815260408083208c8452909152902055610c228686612da6565b600187015560055485546001600160a01b0390811691161415610c8557336000908152600f6020908152604080832054815160608101909252602b808352610c85946001600160a01b0390921693919261091c928d929061520590830139612dd4565b6017546001600160a01b038a81169116148015610ca3575060185488145b15610d0b576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610cd8903390600401614bb9565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b505050505b87896001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464585604051610d4f9190614d0d565b60405180910390a487896001600160a01b0316336001600160a01b03167f88a254a0ef28a0b9e957ff600beae69870f6f924065147f3627c3f814e60ec118a604051610d9b9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b17905550505050505050565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161069290614fa7565b610df48161321d565b50565b806001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3057600080fd5b505afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e689190810190613d12565b6001600160a01b0316336001600160a01b031614610e985760405162461bcd60e51b815260040161069290615027565b806001600160a01b031663c1e803346040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f0b9190810190613fe5565b15610df45760405162461bcd60e51b815260040161069290614fb7565b604051610f3490614b95565b604051809103902081565b6004546001600160a01b031681565b6001546001600160a01b031681565b60066020526000908152604090205481565b6005546001600160a01b031681565b601560209081526000928352604080842090915290825290205481565b60096020526000908152604090205481565b600f602052600090815260409020546001600160a01b031681565b60135460ff1615610feb5760405162461bcd60e51b815260040161069290614e27565b610df433826132a2565b6002546001600160a01b031681565b6000546001600160a01b0316331461102e5760405162461bcd60e51b815260040161069290614fa7565b61103782613331565b61104081613331565b6005546004546001600160a01b03918216911681156110715760405162461bcd60e51b815260040161069290614ef7565b600580546001600160a01b038087166001600160a01b03199283161790925560048054928616929091169190911790556003805460ff60a01b1916600160a01b1790556040517f559f314bb90394a4a9ceb724f365b36a53587d894352c43d12901fd680101456906110ea908490849088908890614c2a565b60405180910390a150505050565b60006111048484612884565b6001600160a01b038085166000908152600a60209081526040808320878452825280832093861683529290522080545b600081118015611164575061116482600183038154811061115157fe5b9060005260206000209060020201613357565b156111a45761119982600183038154811061117b57fe5b6000918252602090912060029091020154849063ffffffff612d6416565b925060001901611134565b50509392505050565b60116020526000908152604090205463ffffffff1681565b60135460ff1681565b60004382106111ef5760405162461bcd60e51b815260040161069290614f07565b6001600160a01b03831660009081526011602052604090205463ffffffff168061121d5760009150506113d7565b6001600160a01b038416600090815260106020908152604080832063ffffffff600019860181168552925290912054168310611299576001600160a01b03841660009081526010602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506113d7565b6001600160a01b038416600090815260106020908152604080832083805290915290205463ffffffff168310156112d45760009150506113d7565b600060001982015b8163ffffffff168163ffffffff16111561139757600282820363ffffffff16048103611306613c85565b506001600160a01b038716600090815260106020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415611372576020015194506113d79350505050565b805163ffffffff1687111561138957819350611390565b6001820392505b50506112dc565b506001600160a01b038516600090815260106020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b600354600160a01b900460ff166114065760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156114365760405162461bcd60e51b815260040161069290614e27565b6114408282612884565b6001600160a01b038216600090815260086020526040812080548390811061146457fe5b600091825260208083206001600160a01b038716808552600783526040808620888752845280862033808852908552818720928752600a85528187208988528552818720908752909352918420600590930201935091806114c5848461336c565b9092509050811515806114d85750600081115b6114f45760405162461bcd60e51b815260040161069290614fc7565b8115806114ff575080155b61151b5760405162461bcd60e51b815260040161069290614de7565b81156116345761152b87876128bb565b6000611571856001015461156564e8d4a510006115598a600301548a6000015461346390919063ffffffff16565b9063ffffffff61349d16565b9063ffffffff6134df16565b6004805460405163135b33cd60e31b81529293506001600160a01b031691639ad99e68916115a5918c913391879101614c02565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505086546115ea925090508463ffffffff6134df16565b808655600387015461160d9164e8d4a5100091611559919063ffffffff61346316565b6001860155855461162e906001600160a01b0316338563ffffffff61352116565b506116b8565b8354611646908263ffffffff6134df16565b84556001600160a01b038716600090815260126020908152604080832089845290915290205461167c908263ffffffff6134df16565b6001600160a01b0380891660009081526012602090815260408083208b845290915290209190915585546116b89116338363ffffffff61352116565b856001600160a01b038816337fe31da05fae6db869f5ea51f4b638aa6884070b6c87f18f63bd2291a12cb2f5186116f5868663ffffffff612d6416565b6040516117029190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b1790555050505050565b600e6020526000908152604090205481565b6117766040518060400160405280601c81526020017f73657428616464726573732c75696e743235362c75696e7432353629000000008152506127e2565b6117808383612884565b61178983613543565b6001600160a01b038316600090815260086020526040812080549091906118029084906117f6908590889081106117bc57fe5b60009182526020808320600160059093020191909101546001600160a01b038b16835260099091526040909120549063ffffffff6134df16565b9063ffffffff612d6416565b9050600081116118245760405162461bcd60e51b815260040161069290615037565b600082858154811061183257fe5b90600052602060002090600502016001015490508383868154811061185357fe5b9060005260206000209060050201600101819055508160096000886001600160a01b03166001600160a01b031681526020019081526020016000208190555084866001600160a01b03167f6ee09c6cb801194690c195c69f465aaf7c80255cbeafaab9600f47ed79de2ca983876040516118ce929190615062565b60405180910390a3505050505050565b611906604051806040016040528060078152602001667061757365282960c81b8152506127e2565b60135460ff16156119295760405162461bcd60e51b815260040161069290614eb7565b6013805460ff1916600117905560405133907fdffada2889ebfab9224c24069d833f3de835d8cf99872d49e7b7ba5fccb7a46f90600090a2565b60135460ff16156119865760405162461bcd60e51b815260040161069290614e27565b6119908282612884565b61199a82826128bb565b5050565b600860205281600052604060002081815481106119b757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b611a146040518060600160405280602881526020016152b1602891396127e2565b60048054604051633d6ac5b360e21b81526001600160a01b039091169163f5ab16cc91611a4391869101614bab565b60206040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a939190810190613f88565b611aaf5760405162461bcd60e51b815260040161069290614f97565b611ab882613543565b6001600160a01b0382166000818152600660205260409081902080549084905590519091907fad96cee0d692f0250b98e085504f399da6733854908215f6203fe3c69366d9f590611b0c9084908690615062565b60405180910390a2505050565b6000806000611b288686612884565b5050506001600160a01b03928316600090815260076020908152604080832094835293815283822092909416815292529020805460018201546002909201549092565b600354600160a01b900460ff16611b945760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615611bc45760405162461bcd60e51b815260040161069290614e27565b611bce8282612884565b6001600160a01b0382166000908152600860205260408120805483908110611bf257fe5b600091825260208083206001600160a01b0380881685526007835260408086208887528452808620918a1686529252922060059091029091019150611c3784846128bb565b611c4284848761202d565b15611c5f5760405162461bcd60e51b815260040161069290614f37565b805415611ce3576000611c728284612a76565b90508015611ce157611c848284612da6565b6001830155611c94858783612a8a565b83856001600160a01b0316876001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464584604051611cd89190614d0d565b60405180910390a45b505b50506003805460ff60a01b1916600160a01b179055505050565b611d1e6040518060600160405280603381526020016152d9603391396127e2565b611d288383612884565b600081118015611d3b57506312cc030081105b611d575760405162461bcd60e51b815260040161069290614fd7565b6001600160a01b0383166000908152600860205260408120805484908110611d7b57fe5b9060005260206000209060050201905060008160040154905082826004018190555083856001600160a01b03167f0bcf80c5060ccf99b7a993c57a94b232fc2c5c04bd74c7c7d174595fee6bc31f8386604051611dd9929190615062565b60405180910390a35050505050565b6000611df48484612884565b6001600160a01b0384166000908152600860205260408120805485908110611e1857fe5b600091825260208083206001600160a01b03808a168086526007845260408087208b885285528087208a8416885285528087206003600590970290940195860154918752601285528087208b885290945283862054855494516370a0823160e01b8152959750929590949093611eef939216906370a0823190611e9f903090600401614bab565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115659190810190613fe5565b6001600160a01b0389166000908152600660205260409020546002860154919250439182118015611f1f57508215155b15611fb5576000611f3d8760020154846134df90919063ffffffff16565b6001600160a01b038c1660009081526009602052604081205460018a01549293509091611f85919061155990611f79868863ffffffff61346316565b9063ffffffff61346316565b9050611fb0611fa3866115598464e8d4a5100063ffffffff61346316565b879063ffffffff612d6416565b955050505b6001600160a01b03808b166000908152600a602090815260408083208d84528252808320938c16835292905290812090611fee82612f95565b91505061201d876001015461156564e8d4a510006115598a611f79878e600001546134df90919063ffffffff16565b9c9b505050505050505050505050565b6001600160a01b038084166000908152600a602090815260408083208684528252808320938516835292905290812061206581612f95565b5095945050505050565b6017546001600160a01b031681565b6047546001600160a01b031690565b6001600160a01b03811660009081526011602052604081205463ffffffff16806120b85760006120f7565b6001600160a01b0383166000908152601060209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9150505b919050565b606061210c8484612884565b6001600160a01b038085166000908152600a602090815260408083208784528252808320938616835292815282822080548451818402810184019095528085529092909184015b828210156121ad5760008481526020908190206040805160608101825260028602909201805483526001908101546001600160801b0380821685870152600160801b90910416918301919091529083529092019101612153565b5050505090509392505050565b60146020526000908152604090205460ff1681565b60135460ff16156121f25760405162461bcd60e51b815260040161069290614e27565b600060405161220090614b95565b604080519182900382208282019091526008825267161594d5985d5b1d60c21b6020909201919091527fddfcc46608a8bd52ebf900f03a24cc97b73a6046cec8c5d0f74a211e376e967a612252613578565b306040516020016122669493929190614d29565b604051602081830303815290604052805190602001209050600060405161228c90614ba0565b6040519081900381206122a7918a908a908a90602001614d1b565b604051602081830303815290604052805190602001209050600082826040516020016122d4929190614b64565b60405160208183030381529060405280519060200120905060006122fa8288888861357c565b6001600160a01b0381166000908152600e60205260409020805460018101909155909150891461233c5760405162461bcd60e51b815260040161069290614e97565b8742111561235c5760405162461bcd60e51b815260040161069290614e77565b612366818b6132a2565b505050505b505050505050565b6001600160a01b031660009081526008602052604090205490565b6000546001600160a01b031633146123b85760405162461bcd60e51b815260040161069290614fa7565b6001600160a01b0383166123de5760405162461bcd60e51b815260040161069290614e87565b6001600160a01b0382166124045760405162461bcd60e51b815260040161069290614f17565b61240e8282612884565b6016546017546018546040516001600160a01b03808816948116937f8def9436d6e31b89ed00948ba91d0cb6936eada5154cb1b45b55683fb9e492379361245d93919092169188918890614c83565b60405180910390a3601680546001600160a01b039485166001600160a01b0319918216179091556017805493909416921691909117909155601855565b6003546001600160a01b031681565b604051610f3490614ba0565b60185481565b601060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6312cc030081565b6000546001600160a01b031681565b6125286040518060600160405280602c8152602001615338602c91396127e2565b61253185613331565b61253a83613331565b6004546001600160a01b03166125625760405162461bcd60e51b815260040161069290614e07565b600084116125825760405162461bcd60e51b815260040161069290614fe7565b61258b85613543565b6001600160a01b0385166000908152600860205260408120805490915b8181101561260657856001600160a01b03168382815481106125c657fe5b60009182526020909120600590910201546001600160a01b031614156125fe5760405162461bcd60e51b815260040161069290614f77565b6001016125a8565b506001600160a01b03851660009081526014602052604090205460ff16156126405760405162461bcd60e51b815260040161069290614ee7565b6001600160a01b038716600090815260096020526040902054612669908763ffffffff612d6416565b6001600160a01b0388811660009081526009602090815260408083209490945560068152838220889055835160a0810185528984168082528183018c81524383880190815260608401868152608085018c81528b5460018082018e558d8a52888a209751600590920290970180546001600160a01b031916918b169190911781559351848701559151600284015551600383015551600491820155908452601490925291849020805460ff1916831790558054935163fb66fb4d60e01b8152939092169263fb66fb4d92612741928c92909101614cb8565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b50505050846001600160a01b03166001838054905003886001600160a01b03167fd7fa4bff1cd2253c0789c3291a786a6f6b1a3b4569a75af683a15d52abb6a0bf8988886040516127c293929190615070565b60405180910390a450505050505050565b6016546001600160a01b031681565b6047546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab906128159033908690600401614bc7565b60206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128659190810190613f88565b90508061199a5760405162461bcd60e51b815260040161069290614e47565b6001600160a01b038216600090815260086020526040902054811061199a5760405162461bcd60e51b815260040161069290614df7565b6001600160a01b03821660009081526008602052604081208054839081106128df57fe5b9060005260206000209060050201905080600201544311612900575061199a565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612930903090600401614bab565b60206040518083038186803b15801561294857600080fd5b505afa15801561295c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129809190810190613fe5565b6001600160a01b03851660009081526012602090815260408083208784529091529020549091506129b890829063ffffffff6134df16565b9050806129cc57504360029091015561199a565b600282015443906000906129e790839063ffffffff6134df16565b6001600160a01b03871660009081526009602090815260408083205460018901546006909352908320549394509192612a30929161155991611f7990879063ffffffff61346316565b9050612a5f612a4e856115598464e8d4a5100063ffffffff61346316565b60038701549063ffffffff612d6416565b600386015550504360029093019290925550505050565b600061071183600101546115658585612da6565b600480546040516370a0823160e01b81526001600160a01b03918216926000928716916370a0823191612abf91869101614bab565b60206040518083038186803b158015612ad757600080fd5b505afa158015612aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0f9190810190613fe5565b6001600160a01b038087166000908152601560209081526040808320938916835292905290812054919250612b4a858363ffffffff612d6416565b9050828111612c28578115612bbd576001600160a01b038088166000818152601560209081526040808320948b1680845294909152808220829055517f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216091612bb491879190615047565b60405180910390a35b60405163135b33cd60e31b81526001600160a01b03851690639ad99e6890612bed908a908a908690600401614c68565b600060405180830381600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b5050505050505050612cfe565b6001600160a01b038088166000818152601560209081526040808320948b168084529490915290819020868503908190559051909291907f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216090612c8e9087908690615062565b60405180910390a360405163135b33cd60e31b81526001600160a01b03861690639ad99e6890612cc6908b908b908990600401614c68565b600060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b5050505050505050505b505050565b604051612d5e9085906323b872dd60e01b90612d2790879087908790602401614c68565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135a6565b50505050565b600061071183836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525061368b565b600061071164e8d4a510006115598460030154611f79876002015488600001546134df90919063ffffffff16565b600081600160601b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b509192915050565b816001600160a01b0316836001600160a01b031614158015612e2e57506000816001600160601b0316115b15612cfe576001600160a01b03831615612ee6576001600160a01b03831660009081526011602052604081205463ffffffff169081612e6e576000612ead565b6001600160a01b0385166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612ed482856040518060600160405280602c815260200161530c602c91396136bb565b9050612ee2868484846136fa565b5050505b6001600160a01b03821615612cfe576001600160a01b03821660009081526011602052604081205463ffffffff169081612f21576000612f60565b6001600160a01b0384166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612f8782856040518060600160405280602b81526020016151da602b91396138af565b905061236b858484846136fa565b805460009081905b801561303357836001820381548110612fb257fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156130155761300e846001830381548110612ff057fe5b6000918252602090912060029091020154839063ffffffff612d6416565b915061302a565b61302784600183038154811061117b57fe5b92505b60001901612f9d565b50915091565b8254604080516060810182526000808252602080830182815260019484018581528587018a5589845291909220925160028602909301928355905191909201805492516001600160801b03908116600160801b029281166001600160801b0319909416939093179092161790555b6000811180156130e25750818460018303815481106130c257fe5b60009182526020909120600160029092020101546001600160801b031611155b15613169578360018203815481106130f657fe5b906000526020600020906002020184828154811061311057fe5b600091825260209091208254600290920201908155600191820180549290910180546001600160801b0319166001600160801b03938416178082559154600160801b9081900484160291909216179055600019016130a7565b6040518060600160405280848152602001613183846138e2565b6001600160801b0316815260200160016001600160801b03168152508482815481106131ab57fe5b60009182526020918290208351600292830290910190815591830151600190920180546040909401516001600160801b03199094166001600160801b03938416178316600160801b939094169290920292909217905585015461320e9084612d64565b85600201819055505050505050565b6001600160a01b0381166132435760405162461bcd60e51b815260040161069290614ec7565b604780546001600160a01b038381166001600160a01b03198316179092556040519116907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0906132969083908590614be7565b60405180910390a15050565b6001600160a01b038083166000908152600f6020526040812054909116906132c98461390b565b6001600160a01b038581166000818152600f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f0cc323ffec3ea49cbcddc0de1480978126d350c6a45dff33ad2f1cda6ae992619190a4612d5e828483612e03565b6001600160a01b038116610df45760405162461bcd60e51b815260040161069290614f27565b60010154426001600160801b03909116111590565b805460009081905b600081118015613391575061339184600183038154811061115157fe5b15613432578360018203815481106133a557fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156133ea576133e3846001830381548110612ff057fe5b91506133ff565b6133fc84600183038154811061117b57fe5b92505b8380548061340957fe5b600082815260208120600019928301600281029091018281556001019190915590915501613374565b50613457613446828463ffffffff612d6416565b60028601549063ffffffff6134df16565b60028501559250929050565b600082613472575060006113d7565b8282028284828161347f57fe5b04146107115760405162461bcd60e51b815260040161069290614f67565b600061071183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a21565b600061071183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a58565b604051612cfe90849063a9059cbb60e01b90612d279086908690602401614cd3565b6001600160a01b038116600090815260086020526040812054905b81811015612cfe5761357083826128bb565b60010161355e565b4690565b600080600061358d87878787613a7c565b9150915061359a81613b5c565b5090505b949350505050565b6135b8826001600160a01b0316613c25565b6135d45760405162461bcd60e51b815260040161069290615007565b60006060836001600160a01b0316836040516135f09190614b58565b6000604051808303816000865af19150503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b5091509150816136545760405162461bcd60e51b815260040161069290614ff7565b805115612d5e578080602001905161366f9190810190613f88565b612d5e5760405162461bcd60e51b815260040161069290614e67565b600083830182858210156136b25760405162461bcd60e51b81526004016106929190614dc6565b50949350505050565b6000836001600160601b0316836001600160601b0316111582906136f25760405162461bcd60e51b81526004016106929190614dc6565b505050900390565b600061371e4360405180606001604052806038815260200161527960389139613c5e565b905060008463ffffffff1611801561376757506001600160a01b038516600090815260106020908152604080832063ffffffff6000198901811685529252909120548282169116145b156137c6576001600160a01b0385166000908152601060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055613865565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152601083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252601190935292909220805460018801909316929091169190911790555b846001600160a01b03167f6adb589fed1e8542fb7a6b10f00a85e02265e77f9ae3ca8ff93b22983e1af9a084846040516138a09291906150c2565b60405180910390a25050505050565b6000838301826001600160601b0380871690831610156136b25760405162461bcd60e51b81526004016106929190614dc6565b6000600160801b82106139075760405162461bcd60e51b815260040161069290614ea7565b5090565b6005546000906001600160a01b03166139365760405162461bcd60e51b815260040161069290614e57565b6005546001600160a01b03166000908152600860205260408120805490915b81811015613a165760055483546001600160a01b039091169084908390811061397a57fe5b60009182526020909120600590910201546001600160a01b03161415613a0e576005546001600160a01b039081166000908152600760209081526040808320858452825280832093891683529290522060028101548154613a03916139e5919063ffffffff6134df16565b60405180606001604052806028815260200161523060289139612dd4565b9450505050506120fb565b600101613955565b506000949350505050565b60008183613a425760405162461bcd60e51b81526004016106929190614dc6565b506000838581613a4e57fe5b0495945050505050565b600081848411156136f25760405162461bcd60e51b81526004016106929190614dc6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613ab35750600090506003613b53565b8460ff16601b14158015613acb57508460ff16601c14155b15613adc5750600090506004613b53565b600060018787878760405160008152602001604052604051613b019493929190614d51565b6020604051602081039080840390855afa158015613b23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b4c57506000915060019050613b53565b9150600090505b94509492505050565b6000816004811115613b6a57fe5b1415613b7557610df4565b6001816004811115613b8357fe5b1415613ba15760405162461bcd60e51b815260040161069290614dd7565b6002816004811115613baf57fe5b1415613bcd5760405162461bcd60e51b815260040161069290614e17565b6003816004811115613bdb57fe5b1415613bf95760405162461bcd60e51b815260040161069290614ed7565b6004816004811115613c0757fe5b1415610df45760405162461bcd60e51b815260040161069290614f47565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061359e575050151592915050565b600081600160201b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b604080518082019091526000808252602082015290565b80356113d781615198565b80516113d781615198565b80516113d7816151ac565b80356113d7816151b5565b80356113d7816151be565b80516113d7816151b5565b80356113d7816151c7565b80356113d7816151d0565b600060208284031215613d0657600080fd5b600061359e8484613c9c565b600060208284031215613d2457600080fd5b600061359e8484613ca7565b60008060408385031215613d4357600080fd5b6000613d4f8585613c9c565b9250506020613d6085828601613c9c565b9150509250929050565b600080600060608486031215613d7f57600080fd5b6000613d8b8686613c9c565b9350506020613d9c86828701613c9c565b9250506040613dad86828701613cbd565b9150509250925092565b60008060408385031215613dca57600080fd5b6000613dd68585613c9c565b9250506020613d6085828601613cbd565b600080600060608486031215613dfc57600080fd5b6000613e088686613c9c565b9350506020613e1986828701613cbd565b9250506040613dad86828701613c9c565b600080600080600060a08688031215613e4257600080fd5b6000613e4e8888613c9c565b9550506020613e5f88828901613cbd565b9450506040613e7088828901613cc8565b9350506060613e8188828901613cbd565b9250506080613e9288828901613cbd565b9150509295509295909350565b600080600060608486031215613eb457600080fd5b6000613ec08686613c9c565b9350506020613d9c86828701613cbd565b60008060008060008060c08789031215613eea57600080fd5b6000613ef68989613c9c565b9650506020613f0789828a01613cbd565b9550506040613f1889828a01613cbd565b9450506060613f2989828a01613ce9565b9350506080613f3a89828a01613cbd565b92505060a0613f4b89828a01613cbd565b9150509295509295509295565b60008060408385031215613f6b57600080fd5b6000613f778585613c9c565b9250506020613d6085828601613cde565b600060208284031215613f9a57600080fd5b600061359e8484613cb2565b600080600060608486031215613fbb57600080fd5b6000613d8b8686613cc8565b600060208284031215613fd957600080fd5b600061359e8484613cc8565b600060208284031215613ff757600080fd5b600061359e8484613cd3565b600061400f8383614af8565b505060600190565b61402081615141565b82525050565b614020816150f0565b600061403a826150e3565b61404481856150e7565b935061404f836150dd565b8060005b8381101561407d5781516140678882614003565b9750614072836150dd565b925050600101614053565b509495945050505050565b614020816150fb565b61402081615100565b6140206140a682615100565b615100565b60006140b6826150e3565b6140c081856120fb565b93506140d0818560208601615162565b9290920192915050565b61402081615103565b6140208161514c565b60006140f7826150e3565b61410181856150e7565b9350614111818560208601615162565b61411a8161518e565b9093019392505050565b60006141316018836150e7565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000815260200192915050565b600061416a6012836150e7565b71696e636f6e73697374656e7420737461746560701b815260200192915050565b60006141986013836150e7565b727661756c743a20706f6f6c206578697374733f60681b815260200192915050565b60006141c7601f836150e7565b7f53746f726520636f6e7472616374206164647265737320697320656d70747900815260200192915050565b6000614200601f836150e7565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800815260200192915050565b6000614239600f836150e7565b6e15985d5b1d081a5cc81c185d5cd959608a1b815260200192915050565b60006142646013836150e7565b7215985d5b1d081a5cc81b9bdd081c185d5cd959606a1b815260200192915050565b6000614293600c836150e7565b6b155b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006142bb6030836150e7565b7f5856535661756c743a3a6765745374616b65416d6f756e743a2078767320616481526f191c995cdcc81a5cc81b9bdd081cd95d60821b602082015260400192915050565b600061430d602a836150e7565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000614359602a836150e7565b7f5856535661756c743a3a64656c656761746542795369673a207369676e6174758152691c9948195e1c1a5c995960b21b602082015260400192915050565b60006143a56022836150e7565b7f7072696d6520746f6b656e2063616e6e6f74206265207a65726f206164647265815261737360f01b602082015260400192915050565b60006143e96026836150e7565b7f5856535661756c743a3a64656c656761746542795369673a20696e76616c6964815265206e6f6e636560d01b602082015260400192915050565b60006144316002836120fb565b61190160f01b815260020192915050565b600061444f6027836150e7565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20318152663238206269747360c81b602082015260400192915050565b60006144986017836150e7565b7f5661756c7420697320616c726561647920706175736564000000000000000000815260200192915050565b60006144d16025836150e7565b7f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164815264647265737360d81b602082015260400192915050565b60006145186022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c815261756560f01b602082015260400192915050565b600061455c601a836150e7565b7f546f6b656e2065786973747320696e206f7468657220706f6f6c000000000000815260200192915050565b60006145956013836150e7565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b60006145c4602b836150e7565b7f5856535661756c743a3a6765745072696f72566f7465733a206e6f742079657481526a0819195d195c9b5a5b995960aa1b602082015260400192915050565b6000614611601d836150e7565b7f7265776172642063616e6e6f74206265207a65726f2061646472657373000000815260200192915050565b600061464a6018836150e7565b7f7a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000815260200192915050565b6000614683601a836150e7565b7f657865637574652070656e64696e67207769746864726177616c000000000000815260200192915050565b60006146bc6022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c815261756560f01b602082015260400192915050565b60006147006043836120fb565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061476b601f836150e7565b7f72657175657374656420616d6f756e742063616e6e6f74206265207a65726f00815260200192915050565b60006147a46021836150e7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006147e76012836150e7565b71141bdbdb08185b1c9958591e48185919195960721b815260200192915050565b6000614815600a836150e7565b691c994b595b9d195c995960b21b815260200192915050565b600061483b6014836150e7565b7324b73b30b634b2103932bbb0b932103a37b5b2b760611b815260200192915050565b600061486b600e836150e7565b6d37b7363c9030b236b4b71031b0b760911b815260200192915050565b60006148956015836150e7565b7418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b815260200192915050565b60006148c66013836150e7565b726e6f7468696e6720746f20776974686472617760681b815260200192915050565b60006148f5601a836150e7565b7f496e76616c6964206e6577206c6f636b696e6720706572696f64000000000000815260200192915050565b600061492e601d836150e7565b7f416c6c6f6320706f696e7473206d757374206e6f74206265207a65726f000000815260200192915050565b60006149676020836150e7565b7f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b60006149a0603a836120fb565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b60006149ff601f836150e7565b7f5361666542455032303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000614a38601b836150e7565b7f72657175657374656420616d6f756e7420697320696e76616c69640000000000815260200192915050565b6000614a716022836150e7565b7f6f6e6c792070726f78792061646d696e2063616e206368616e676520627261698152616e7360f01b602082015260400192915050565b6000614ab5602e836150e7565b7f416c6c6f6320706f696e7473207065722072657761726420746f6b656e206d7581526d7374206e6f74206265207a65726f60901b602082015260400192915050565b80516060830190614b098482614091565b506020820151614b1c6020850182614b2b565b506040820151612d5e60408501825b6140208161510e565b61402081615126565b6140208161512f565b61402081615157565b61402081615135565b600061071182846140ab565b6000614b6f82614424565b9150614b7b828561409a565b602082019150614b8b828461409a565b5060200192915050565b60006113d7826146f3565b60006113d782614993565b602081016113d78284614026565b602081016113d78284614017565b60408101614bd58285614017565b818103602083015261359e81846140ec565b60408101614bf58285614026565b6107116020830184614026565b60608101614c108286614026565b614c1d6020830185614017565b61359e6040830184614091565b60808101614c388287614026565b614c456020830186614026565b614c526040830185614026565b614c5f6060830184614026565b95945050505050565b60608101614c768286614026565b614c1d6020830185614026565b60808101614c918287614026565b614c9e6020830186614026565b614cab6040830185614091565b614c5f6060830184614091565b60408101614cc68285614026565b6107116020830184614088565b60408101614ce18285614026565b6107116020830184614091565b60208082528101610711818461402f565b602081016113d78284614088565b602081016113d78284614091565b60808101614c918287614091565b60808101614d378287614091565b614d446020830186614091565b614c526040830185614091565b60808101614d5f8287614091565b614c9e6020830186614b3d565b602081016113d782846140da565b60a08101614d8882886140da565b614d956020830187614091565b614da26040830186614091565b614daf6060830185614091565b614dbc6080830184614091565b9695505050505050565b6020808252810161071181846140ec565b602080825281016113d781614124565b602080825281016113d78161415d565b602080825281016113d78161418b565b602080825281016113d7816141ba565b602080825281016113d7816141f3565b602080825281016113d78161422c565b602080825281016113d781614257565b602080825281016113d781614286565b602080825281016113d7816142ae565b602080825281016113d781614300565b602080825281016113d78161434c565b602080825281016113d781614398565b602080825281016113d7816143dc565b602080825281016113d781614442565b602080825281016113d78161448b565b602080825281016113d7816144c4565b602080825281016113d78161450b565b602080825281016113d78161454f565b602080825281016113d781614588565b602080825281016113d7816145b7565b602080825281016113d781614604565b602080825281016113d78161463d565b602080825281016113d781614676565b602080825281016113d7816146af565b602080825281016113d78161475e565b602080825281016113d781614797565b602080825281016113d7816147da565b602080825281016113d781614808565b602080825281016113d78161482e565b602080825281016113d78161485e565b602080825281016113d781614888565b602080825281016113d7816148b9565b602080825281016113d7816148e8565b602080825281016113d781614921565b602080825281016113d78161495a565b602080825281016113d7816149f2565b602080825281016113d781614a2b565b602080825281016113d781614a64565b602080825281016113d781614aa8565b604081016150558285614091565b61071160208301846140e3565b60408101614ce18285614091565b6060810161507e8286614091565b614c1d6020830185614091565b602081016113d78284614b34565b604081016150a78285614b34565b6107116020830184614b4f565b602081016113d78284614b4f565b604081016150d08285614b46565b6107116020830184614b46565b60200190565b5190565b90815260200190565b60006113d78261511a565b151590565b90565b60006113d7826150f0565b6001600160801b031690565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b60006113d782615103565b60006113d782615100565b60006113d782615135565b60005b8381101561517d578181015183820152602001615165565b83811115612d5e5750506000910152565b601f01601f191690565b6151a1816150f0565b8114610df457600080fd5b6151a1816150fb565b6151a181615100565b6151a181615103565b6151a181615126565b6151a18161512f56fe5856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77735856535661756c743a3a726571756573745769746864726177616c3a20766f746573206f766572666c6f775856535661756c743a3a6765745374616b65416d6f756e743a20766f746573206f766572666c6f775856535661756c743a3a6465706f7369743a20766f746573206f766572666c6f775856535661756c743a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473736574526577617264416d6f756e74506572426c6f636b28616464726573732c75696e74323536297365745769746864726177616c4c6f636b696e67506572696f6428616464726573732c75696e743235362c75696e74323536295856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777361646428616464726573732c75696e743235362c616464726573732c75696e743235362c75696e7432353629a365627a7a723158206fcd6577817fe07166c8f22ad5e6c4a8771a4690f6356182a14a0bf96f9a45af6c6578706572696d656e74616cf564736f6c63430005100040",
|
|
1574
|
-
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638456cb5911610182578063c2102596116100e9578063e7a324dc116100a2578063f55401621161007c578063f55401621461061c578063f851a44014610624578063fba1b1f91461062c578063fe5a451a1461063f576102bb565b8063e7a324dc146105eb578063e8f2be6f146105f3578063f1127ed8146105fb576102bb565b8063c210259614610577578063c3c754a814610597578063c3cda520146105aa578063d7ae45e2146105bd578063dae66bbe146105d0578063de0368b2146105e3576102bb565b80639e2b6c4d1161013b5780639e2b6c4d1461050e578063a09eab7a14610521578063a9d69a6914610534578063add8933714610547578063b4a0bdf31461054f578063b4b5ea5714610564576102bb565b80638456cb59146104875780638ed7333d1461048f57806392e35000146104a257806393c7c4d1146104c657806398e1b31b146104d9578063996cba68146104fb576102bb565b80634298bdbd116102265780636fcfff45116101df5780636fcfff45146103f957806373d025d614610419578063782d6fe11461042e5780637ac924561461044e5780637ecebe00146104615780638308d7e914610474576102bb565b80634298bdbd14610392578063587cde1e146103a55780635c19a95c146103b85780635c60da1b146103cb5780635ff56315146103d35780636dd77cbd146103e6576102bb565b806320606b701161027857806320606b701461033f57806324f52bbf14610347578063267822471461035c5780632eda5c6c14610364578063358ae036146103775780633d4180f91461037f576102bb565b8063046f7da2146102c05780630af13728146102ca5780630efe6a8b146102f3578063115b512f1461030657806319129e5a146103195780631d504dc61461032c575b600080fd5b6102c8610647565b005b6102dd6102d8366004613de7565b6106d2565b6040516102ea9190614d0d565b60405180910390f35b6102c8610301366004613e9f565b610718565b6102c8610314366004613e9f565b610a0d565b6102c8610327366004613cf4565b610dc1565b6102c861033a366004613fc7565b610df7565b6102dd610f28565b61034f610f3f565b6040516102ea9190614bab565b61034f610f4e565b6102dd610372366004613cf4565b610f5d565b61034f610f6f565b6102dd61038d366004613d30565b610f7e565b6102dd6103a0366004613cf4565b610f9b565b61034f6103b3366004613cf4565b610fad565b6102c86103c6366004613cf4565b610fc8565b61034f610ff5565b6102c86103e1366004613d30565b611004565b6102dd6103f4366004613de7565b6110f8565b61040c610407366004613cf4565b6111ad565b6040516102ea919061508b565b6104216111c5565b6040516102ea9190614cff565b61044161043c366004613db7565b6111ce565b6040516102ea91906150b4565b6102c861045c366004613db7565b6113dd565b6102dd61046f366004613cf4565b611726565b6102c8610482366004613e9f565b611738565b6102c86118de565b6102c861049d366004613db7565b611963565b6104b56104b0366004613db7565b61199e565b6040516102ea959493929190614d7a565b6102c86104d4366004613db7565b6119f3565b6104ec6104e7366004613de7565b611b19565b6040516102ea93929190615070565b6102c8610509366004613d6a565b611b6b565b6102c861051c366004613e9f565b611cfd565b6102dd61052f366004613de7565b611de8565b6102dd610542366004613de7565b61202d565b61034f61206f565b61055761207e565b6040516102ea9190614d6c565b610441610572366004613cf4565b61208d565b61058a610585366004613de7565b612100565b6040516102ea9190614cee565b6104216105a5366004613cf4565b6121ba565b6102c86105b8366004613ed1565b6121cf565b6102dd6105cb366004613cf4565b612373565b6102c86105de366004613fa6565b61238e565b61034f61249a565b6102dd6124a9565b6102dd6124b5565b61060e610609366004613f58565b6124bb565b6040516102ea929190615099565b6102dd6124f0565b61034f6124f8565b6102c861063a366004613e2a565b612507565b6105576127d3565b61067060405180604001604052806008815260200167726573756d65282960c01b8152506127e2565b60135460ff1661069b5760405162461bcd60e51b815260040161069290614e37565b60405180910390fd5b6013805460ff1916905560405133907fd2619572a1464e0df0bb351d834fd47f3350984d7bfdb1ab69cfcb0b8e42141590600090a2565b60006106de8484612884565b506001600160a01b0380841660009081526007602090815260408083208684528252808320938516835292905220600201545b9392505050565b600354600160a01b900460ff166107415760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156107715760405162461bcd60e51b815260040161069290614e27565b61077b8383612884565b6001600160a01b038316600090815260086020526040812080548490811061079f57fe5b600091825260208083206001600160a01b038816845260078252604080852088865283528085203386529092529220600590910290910191506107e285856128bb565b6107ed85853361202d565b1561080a5760405162461bcd60e51b815260040161069290614f37565b80541561087f57600061081d8284612a76565b9050801561087d57610830863383612a8a565b84866001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645846040516108749190614d0d565b60405180910390a45b505b815461089c906001600160a01b031633308663ffffffff612d0316565b80546108ae908463ffffffff612d6416565b81556108ba8183612da6565b600182015560055482546001600160a01b039081169116141561092157336000908152600f6020908152604080832054815160608101909252602180835261092194936001600160a01b039092169261091c9289929061525890830139612dd4565b612e03565b6017546001600160a01b03868116911614801561093f575060185484145b156109a7576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610974903390600401614bb9565b600060405180830381600087803b15801561098e57600080fd5b505af11580156109a2573d6000803e3d6000fd5b505050505b83856001600160a01b0316336001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7866040516109eb9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b179055505050565b600354600160a01b900460ff16610a365760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615610a665760405162461bcd60e51b815260040161069290614e27565b610a708383612884565b60008111610a905760405162461bcd60e51b815260040161069290614f57565b6001600160a01b0383166000908152600760209081526040808320858452825280832033845290915290206002810154610ad0908363ffffffff612d6416565b81541015610af05760405162461bcd60e51b815260040161069290615017565b6001600160a01b0384166000908152600860205260408120805485908110610b1457fe5b600091825260208083206001600160a01b0389168452600a825260408085208986528352808520338652909252908320600590920201925090610b5682612f95565b5090508015610b775760405162461bcd60e51b815260040161069290614f37565b610b8187876128bb565b6000610b8d8585612a76565b9050610b9a883383612a8a565b6004840154600090610bb2904263ffffffff612d6416565b9050610bc086858984613039565b6001600160a01b03891660009081526012602090815260408083208b8452909152902054610bf4908863ffffffff612d6416565b6001600160a01b038a1660009081526012602090815260408083208c8452909152902055610c228686612da6565b600187015560055485546001600160a01b0390811691161415610c8557336000908152600f6020908152604080832054815160608101909252602b808352610c85946001600160a01b0390921693919261091c928d929061520590830139612dd4565b6017546001600160a01b038a81169116148015610ca3575060185488145b15610d0b576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610cd8903390600401614bb9565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b505050505b87896001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464585604051610d4f9190614d0d565b60405180910390a487896001600160a01b0316336001600160a01b03167f88a254a0ef28a0b9e957ff600beae69870f6f924065147f3627c3f814e60ec118a604051610d9b9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b17905550505050505050565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161069290614fa7565b610df48161321d565b50565b806001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3057600080fd5b505afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e689190810190613d12565b6001600160a01b0316336001600160a01b031614610e985760405162461bcd60e51b815260040161069290615027565b806001600160a01b031663c1e803346040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f0b9190810190613fe5565b15610df45760405162461bcd60e51b815260040161069290614fb7565b604051610f3490614b95565b604051809103902081565b6004546001600160a01b031681565b6001546001600160a01b031681565b60066020526000908152604090205481565b6005546001600160a01b031681565b601560209081526000928352604080842090915290825290205481565b60096020526000908152604090205481565b600f602052600090815260409020546001600160a01b031681565b60135460ff1615610feb5760405162461bcd60e51b815260040161069290614e27565b610df433826132a2565b6002546001600160a01b031681565b6000546001600160a01b0316331461102e5760405162461bcd60e51b815260040161069290614fa7565b61103782613331565b61104081613331565b6005546004546001600160a01b03918216911681156110715760405162461bcd60e51b815260040161069290614ef7565b600580546001600160a01b038087166001600160a01b03199283161790925560048054928616929091169190911790556003805460ff60a01b1916600160a01b1790556040517f559f314bb90394a4a9ceb724f365b36a53587d894352c43d12901fd680101456906110ea908490849088908890614c2a565b60405180910390a150505050565b60006111048484612884565b6001600160a01b038085166000908152600a60209081526040808320878452825280832093861683529290522080545b600081118015611164575061116482600183038154811061115157fe5b9060005260206000209060020201613357565b156111a45761119982600183038154811061117b57fe5b6000918252602090912060029091020154849063ffffffff612d6416565b925060001901611134565b50509392505050565b60116020526000908152604090205463ffffffff1681565b60135460ff1681565b60004382106111ef5760405162461bcd60e51b815260040161069290614f07565b6001600160a01b03831660009081526011602052604090205463ffffffff168061121d5760009150506113d7565b6001600160a01b038416600090815260106020908152604080832063ffffffff600019860181168552925290912054168310611299576001600160a01b03841660009081526010602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506113d7565b6001600160a01b038416600090815260106020908152604080832083805290915290205463ffffffff168310156112d45760009150506113d7565b600060001982015b8163ffffffff168163ffffffff16111561139757600282820363ffffffff16048103611306613c85565b506001600160a01b038716600090815260106020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415611372576020015194506113d79350505050565b805163ffffffff1687111561138957819350611390565b6001820392505b50506112dc565b506001600160a01b038516600090815260106020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b600354600160a01b900460ff166114065760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156114365760405162461bcd60e51b815260040161069290614e27565b6114408282612884565b6001600160a01b038216600090815260086020526040812080548390811061146457fe5b600091825260208083206001600160a01b038716808552600783526040808620888752845280862033808852908552818720928752600a85528187208988528552818720908752909352918420600590930201935091806114c5848461336c565b9092509050811515806114d85750600081115b6114f45760405162461bcd60e51b815260040161069290614fc7565b8115806114ff575080155b61151b5760405162461bcd60e51b815260040161069290614de7565b81156116345761152b87876128bb565b6000611571856001015461156564e8d4a510006115598a600301548a6000015461346390919063ffffffff16565b9063ffffffff61349d16565b9063ffffffff6134df16565b6004805460405163135b33cd60e31b81529293506001600160a01b031691639ad99e68916115a5918c913391879101614c02565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505086546115ea925090508463ffffffff6134df16565b808655600387015461160d9164e8d4a5100091611559919063ffffffff61346316565b6001860155855461162e906001600160a01b0316338563ffffffff61352116565b506116b8565b8354611646908263ffffffff6134df16565b84556001600160a01b038716600090815260126020908152604080832089845290915290205461167c908263ffffffff6134df16565b6001600160a01b0380891660009081526012602090815260408083208b845290915290209190915585546116b89116338363ffffffff61352116565b856001600160a01b038816337fe31da05fae6db869f5ea51f4b638aa6884070b6c87f18f63bd2291a12cb2f5186116f5868663ffffffff612d6416565b6040516117029190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b1790555050505050565b600e6020526000908152604090205481565b6117766040518060400160405280601c81526020017f73657428616464726573732c75696e743235362c75696e7432353629000000008152506127e2565b6117808383612884565b61178983613543565b6001600160a01b038316600090815260086020526040812080549091906118029084906117f6908590889081106117bc57fe5b60009182526020808320600160059093020191909101546001600160a01b038b16835260099091526040909120549063ffffffff6134df16565b9063ffffffff612d6416565b9050600081116118245760405162461bcd60e51b815260040161069290615037565b600082858154811061183257fe5b90600052602060002090600502016001015490508383868154811061185357fe5b9060005260206000209060050201600101819055508160096000886001600160a01b03166001600160a01b031681526020019081526020016000208190555084866001600160a01b03167f6ee09c6cb801194690c195c69f465aaf7c80255cbeafaab9600f47ed79de2ca983876040516118ce929190615062565b60405180910390a3505050505050565b611906604051806040016040528060078152602001667061757365282960c81b8152506127e2565b60135460ff16156119295760405162461bcd60e51b815260040161069290614eb7565b6013805460ff1916600117905560405133907fdffada2889ebfab9224c24069d833f3de835d8cf99872d49e7b7ba5fccb7a46f90600090a2565b60135460ff16156119865760405162461bcd60e51b815260040161069290614e27565b6119908282612884565b61199a82826128bb565b5050565b600860205281600052604060002081815481106119b757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b611a146040518060600160405280602881526020016152b1602891396127e2565b60048054604051633d6ac5b360e21b81526001600160a01b039091169163f5ab16cc91611a4391869101614bab565b60206040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a939190810190613f88565b611aaf5760405162461bcd60e51b815260040161069290614f97565b611ab882613543565b6001600160a01b0382166000818152600660205260409081902080549084905590519091907fad96cee0d692f0250b98e085504f399da6733854908215f6203fe3c69366d9f590611b0c9084908690615062565b60405180910390a2505050565b6000806000611b288686612884565b5050506001600160a01b03928316600090815260076020908152604080832094835293815283822092909416815292529020805460018201546002909201549092565b600354600160a01b900460ff16611b945760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615611bc45760405162461bcd60e51b815260040161069290614e27565b611bce8282612884565b6001600160a01b0382166000908152600860205260408120805483908110611bf257fe5b600091825260208083206001600160a01b0380881685526007835260408086208887528452808620918a1686529252922060059091029091019150611c3784846128bb565b611c4284848761202d565b15611c5f5760405162461bcd60e51b815260040161069290614f37565b805415611ce3576000611c728284612a76565b90508015611ce157611c848284612da6565b6001830155611c94858783612a8a565b83856001600160a01b0316876001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464584604051611cd89190614d0d565b60405180910390a45b505b50506003805460ff60a01b1916600160a01b179055505050565b611d1e6040518060600160405280603381526020016152d9603391396127e2565b611d288383612884565b600081118015611d3b57506312cc030081105b611d575760405162461bcd60e51b815260040161069290614fd7565b6001600160a01b0383166000908152600860205260408120805484908110611d7b57fe5b9060005260206000209060050201905060008160040154905082826004018190555083856001600160a01b03167f0bcf80c5060ccf99b7a993c57a94b232fc2c5c04bd74c7c7d174595fee6bc31f8386604051611dd9929190615062565b60405180910390a35050505050565b6000611df48484612884565b6001600160a01b0384166000908152600860205260408120805485908110611e1857fe5b600091825260208083206001600160a01b03808a168086526007845260408087208b885285528087208a8416885285528087206003600590970290940195860154918752601285528087208b885290945283862054855494516370a0823160e01b8152959750929590949093611eef939216906370a0823190611e9f903090600401614bab565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115659190810190613fe5565b6001600160a01b0389166000908152600660205260409020546002860154919250439182118015611f1f57508215155b15611fb5576000611f3d8760020154846134df90919063ffffffff16565b6001600160a01b038c1660009081526009602052604081205460018a01549293509091611f85919061155990611f79868863ffffffff61346316565b9063ffffffff61346316565b9050611fb0611fa3866115598464e8d4a5100063ffffffff61346316565b879063ffffffff612d6416565b955050505b6001600160a01b03808b166000908152600a602090815260408083208d84528252808320938c16835292905290812090611fee82612f95565b91505061201d876001015461156564e8d4a510006115598a611f79878e600001546134df90919063ffffffff16565b9c9b505050505050505050505050565b6001600160a01b038084166000908152600a602090815260408083208684528252808320938516835292905290812061206581612f95565b5095945050505050565b6017546001600160a01b031681565b6047546001600160a01b031690565b6001600160a01b03811660009081526011602052604081205463ffffffff16806120b85760006120f7565b6001600160a01b0383166000908152601060209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9150505b919050565b606061210c8484612884565b6001600160a01b038085166000908152600a602090815260408083208784528252808320938616835292815282822080548451818402810184019095528085529092909184015b828210156121ad5760008481526020908190206040805160608101825260028602909201805483526001908101546001600160801b0380821685870152600160801b90910416918301919091529083529092019101612153565b5050505090509392505050565b60146020526000908152604090205460ff1681565b60135460ff16156121f25760405162461bcd60e51b815260040161069290614e27565b600060405161220090614b95565b604080519182900382208282019091526008825267161594d5985d5b1d60c21b6020909201919091527fddfcc46608a8bd52ebf900f03a24cc97b73a6046cec8c5d0f74a211e376e967a612252613578565b306040516020016122669493929190614d29565b604051602081830303815290604052805190602001209050600060405161228c90614ba0565b6040519081900381206122a7918a908a908a90602001614d1b565b604051602081830303815290604052805190602001209050600082826040516020016122d4929190614b64565b60405160208183030381529060405280519060200120905060006122fa8288888861357c565b6001600160a01b0381166000908152600e60205260409020805460018101909155909150891461233c5760405162461bcd60e51b815260040161069290614e97565b8742111561235c5760405162461bcd60e51b815260040161069290614e77565b612366818b6132a2565b505050505b505050505050565b6001600160a01b031660009081526008602052604090205490565b6000546001600160a01b031633146123b85760405162461bcd60e51b815260040161069290614fa7565b6001600160a01b0383166123de5760405162461bcd60e51b815260040161069290614e87565b6001600160a01b0382166124045760405162461bcd60e51b815260040161069290614f17565b61240e8282612884565b6016546017546018546040516001600160a01b03808816948116937f8def9436d6e31b89ed00948ba91d0cb6936eada5154cb1b45b55683fb9e492379361245d93919092169188918890614c83565b60405180910390a3601680546001600160a01b039485166001600160a01b0319918216179091556017805493909416921691909117909155601855565b6003546001600160a01b031681565b604051610f3490614ba0565b60185481565b601060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6312cc030081565b6000546001600160a01b031681565b6125286040518060600160405280602c8152602001615338602c91396127e2565b61253185613331565b61253a83613331565b6004546001600160a01b03166125625760405162461bcd60e51b815260040161069290614e07565b600084116125825760405162461bcd60e51b815260040161069290614fe7565b61258b85613543565b6001600160a01b0385166000908152600860205260408120805490915b8181101561260657856001600160a01b03168382815481106125c657fe5b60009182526020909120600590910201546001600160a01b031614156125fe5760405162461bcd60e51b815260040161069290614f77565b6001016125a8565b506001600160a01b03851660009081526014602052604090205460ff16156126405760405162461bcd60e51b815260040161069290614ee7565b6001600160a01b038716600090815260096020526040902054612669908763ffffffff612d6416565b6001600160a01b0388811660009081526009602090815260408083209490945560068152838220889055835160a0810185528984168082528183018c81524383880190815260608401868152608085018c81528b5460018082018e558d8a52888a209751600590920290970180546001600160a01b031916918b169190911781559351848701559151600284015551600383015551600491820155908452601490925291849020805460ff1916831790558054935163fb66fb4d60e01b8152939092169263fb66fb4d92612741928c92909101614cb8565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b50505050846001600160a01b03166001838054905003886001600160a01b03167fd7fa4bff1cd2253c0789c3291a786a6f6b1a3b4569a75af683a15d52abb6a0bf8988886040516127c293929190615070565b60405180910390a450505050505050565b6016546001600160a01b031681565b6047546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab906128159033908690600401614bc7565b60206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128659190810190613f88565b90508061199a5760405162461bcd60e51b815260040161069290614e47565b6001600160a01b038216600090815260086020526040902054811061199a5760405162461bcd60e51b815260040161069290614df7565b6001600160a01b03821660009081526008602052604081208054839081106128df57fe5b9060005260206000209060050201905080600201544311612900575061199a565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612930903090600401614bab565b60206040518083038186803b15801561294857600080fd5b505afa15801561295c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129809190810190613fe5565b6001600160a01b03851660009081526012602090815260408083208784529091529020549091506129b890829063ffffffff6134df16565b9050806129cc57504360029091015561199a565b600282015443906000906129e790839063ffffffff6134df16565b6001600160a01b03871660009081526009602090815260408083205460018901546006909352908320549394509192612a30929161155991611f7990879063ffffffff61346316565b9050612a5f612a4e856115598464e8d4a5100063ffffffff61346316565b60038701549063ffffffff612d6416565b600386015550504360029093019290925550505050565b600061071183600101546115658585612da6565b600480546040516370a0823160e01b81526001600160a01b03918216926000928716916370a0823191612abf91869101614bab565b60206040518083038186803b158015612ad757600080fd5b505afa158015612aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0f9190810190613fe5565b6001600160a01b038087166000908152601560209081526040808320938916835292905290812054919250612b4a858363ffffffff612d6416565b9050828111612c28578115612bbd576001600160a01b038088166000818152601560209081526040808320948b1680845294909152808220829055517f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216091612bb491879190615047565b60405180910390a35b60405163135b33cd60e31b81526001600160a01b03851690639ad99e6890612bed908a908a908690600401614c68565b600060405180830381600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b5050505050505050612cfe565b6001600160a01b038088166000818152601560209081526040808320948b168084529490915290819020868503908190559051909291907f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216090612c8e9087908690615062565b60405180910390a360405163135b33cd60e31b81526001600160a01b03861690639ad99e6890612cc6908b908b908990600401614c68565b600060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b5050505050505050505b505050565b604051612d5e9085906323b872dd60e01b90612d2790879087908790602401614c68565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135a6565b50505050565b600061071183836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525061368b565b600061071164e8d4a510006115598460030154611f79876002015488600001546134df90919063ffffffff16565b600081600160601b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b509192915050565b816001600160a01b0316836001600160a01b031614158015612e2e57506000816001600160601b0316115b15612cfe576001600160a01b03831615612ee6576001600160a01b03831660009081526011602052604081205463ffffffff169081612e6e576000612ead565b6001600160a01b0385166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612ed482856040518060600160405280602c815260200161530c602c91396136bb565b9050612ee2868484846136fa565b5050505b6001600160a01b03821615612cfe576001600160a01b03821660009081526011602052604081205463ffffffff169081612f21576000612f60565b6001600160a01b0384166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612f8782856040518060600160405280602b81526020016151da602b91396138af565b905061236b858484846136fa565b805460009081905b801561303357836001820381548110612fb257fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156130155761300e846001830381548110612ff057fe5b6000918252602090912060029091020154839063ffffffff612d6416565b915061302a565b61302784600183038154811061117b57fe5b92505b60001901612f9d565b50915091565b8254604080516060810182526000808252602080830182815260019484018581528587018a5589845291909220925160028602909301928355905191909201805492516001600160801b03908116600160801b029281166001600160801b0319909416939093179092161790555b6000811180156130e25750818460018303815481106130c257fe5b60009182526020909120600160029092020101546001600160801b031611155b15613169578360018203815481106130f657fe5b906000526020600020906002020184828154811061311057fe5b600091825260209091208254600290920201908155600191820180549290910180546001600160801b0319166001600160801b03938416178082559154600160801b9081900484160291909216179055600019016130a7565b6040518060600160405280848152602001613183846138e2565b6001600160801b0316815260200160016001600160801b03168152508482815481106131ab57fe5b60009182526020918290208351600292830290910190815591830151600190920180546040909401516001600160801b03199094166001600160801b03938416178316600160801b939094169290920292909217905585015461320e9084612d64565b85600201819055505050505050565b6001600160a01b0381166132435760405162461bcd60e51b815260040161069290614ec7565b604780546001600160a01b038381166001600160a01b03198316179092556040519116907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0906132969083908590614be7565b60405180910390a15050565b6001600160a01b038083166000908152600f6020526040812054909116906132c98461390b565b6001600160a01b038581166000818152600f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f0cc323ffec3ea49cbcddc0de1480978126d350c6a45dff33ad2f1cda6ae992619190a4612d5e828483612e03565b6001600160a01b038116610df45760405162461bcd60e51b815260040161069290614f27565b60010154426001600160801b03909116111590565b805460009081905b600081118015613391575061339184600183038154811061115157fe5b15613432578360018203815481106133a557fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156133ea576133e3846001830381548110612ff057fe5b91506133ff565b6133fc84600183038154811061117b57fe5b92505b8380548061340957fe5b600082815260208120600019928301600281029091018281556001019190915590915501613374565b50613457613446828463ffffffff612d6416565b60028601549063ffffffff6134df16565b60028501559250929050565b600082613472575060006113d7565b8282028284828161347f57fe5b04146107115760405162461bcd60e51b815260040161069290614f67565b600061071183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a21565b600061071183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a58565b604051612cfe90849063a9059cbb60e01b90612d279086908690602401614cd3565b6001600160a01b038116600090815260086020526040812054905b81811015612cfe5761357083826128bb565b60010161355e565b4690565b600080600061358d87878787613a7c565b9150915061359a81613b5c565b5090505b949350505050565b6135b8826001600160a01b0316613c25565b6135d45760405162461bcd60e51b815260040161069290615007565b60006060836001600160a01b0316836040516135f09190614b58565b6000604051808303816000865af19150503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b5091509150816136545760405162461bcd60e51b815260040161069290614ff7565b805115612d5e578080602001905161366f9190810190613f88565b612d5e5760405162461bcd60e51b815260040161069290614e67565b600083830182858210156136b25760405162461bcd60e51b81526004016106929190614dc6565b50949350505050565b6000836001600160601b0316836001600160601b0316111582906136f25760405162461bcd60e51b81526004016106929190614dc6565b505050900390565b600061371e4360405180606001604052806038815260200161527960389139613c5e565b905060008463ffffffff1611801561376757506001600160a01b038516600090815260106020908152604080832063ffffffff6000198901811685529252909120548282169116145b156137c6576001600160a01b0385166000908152601060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055613865565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152601083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252601190935292909220805460018801909316929091169190911790555b846001600160a01b03167f6adb589fed1e8542fb7a6b10f00a85e02265e77f9ae3ca8ff93b22983e1af9a084846040516138a09291906150c2565b60405180910390a25050505050565b6000838301826001600160601b0380871690831610156136b25760405162461bcd60e51b81526004016106929190614dc6565b6000600160801b82106139075760405162461bcd60e51b815260040161069290614ea7565b5090565b6005546000906001600160a01b03166139365760405162461bcd60e51b815260040161069290614e57565b6005546001600160a01b03166000908152600860205260408120805490915b81811015613a165760055483546001600160a01b039091169084908390811061397a57fe5b60009182526020909120600590910201546001600160a01b03161415613a0e576005546001600160a01b039081166000908152600760209081526040808320858452825280832093891683529290522060028101548154613a03916139e5919063ffffffff6134df16565b60405180606001604052806028815260200161523060289139612dd4565b9450505050506120fb565b600101613955565b506000949350505050565b60008183613a425760405162461bcd60e51b81526004016106929190614dc6565b506000838581613a4e57fe5b0495945050505050565b600081848411156136f25760405162461bcd60e51b81526004016106929190614dc6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613ab35750600090506003613b53565b8460ff16601b14158015613acb57508460ff16601c14155b15613adc5750600090506004613b53565b600060018787878760405160008152602001604052604051613b019493929190614d51565b6020604051602081039080840390855afa158015613b23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b4c57506000915060019050613b53565b9150600090505b94509492505050565b6000816004811115613b6a57fe5b1415613b7557610df4565b6001816004811115613b8357fe5b1415613ba15760405162461bcd60e51b815260040161069290614dd7565b6002816004811115613baf57fe5b1415613bcd5760405162461bcd60e51b815260040161069290614e17565b6003816004811115613bdb57fe5b1415613bf95760405162461bcd60e51b815260040161069290614ed7565b6004816004811115613c0757fe5b1415610df45760405162461bcd60e51b815260040161069290614f47565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061359e575050151592915050565b600081600160201b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b604080518082019091526000808252602082015290565b80356113d781615198565b80516113d781615198565b80516113d7816151ac565b80356113d7816151b5565b80356113d7816151be565b80516113d7816151b5565b80356113d7816151c7565b80356113d7816151d0565b600060208284031215613d0657600080fd5b600061359e8484613c9c565b600060208284031215613d2457600080fd5b600061359e8484613ca7565b60008060408385031215613d4357600080fd5b6000613d4f8585613c9c565b9250506020613d6085828601613c9c565b9150509250929050565b600080600060608486031215613d7f57600080fd5b6000613d8b8686613c9c565b9350506020613d9c86828701613c9c565b9250506040613dad86828701613cbd565b9150509250925092565b60008060408385031215613dca57600080fd5b6000613dd68585613c9c565b9250506020613d6085828601613cbd565b600080600060608486031215613dfc57600080fd5b6000613e088686613c9c565b9350506020613e1986828701613cbd565b9250506040613dad86828701613c9c565b600080600080600060a08688031215613e4257600080fd5b6000613e4e8888613c9c565b9550506020613e5f88828901613cbd565b9450506040613e7088828901613cc8565b9350506060613e8188828901613cbd565b9250506080613e9288828901613cbd565b9150509295509295909350565b600080600060608486031215613eb457600080fd5b6000613ec08686613c9c565b9350506020613d9c86828701613cbd565b60008060008060008060c08789031215613eea57600080fd5b6000613ef68989613c9c565b9650506020613f0789828a01613cbd565b9550506040613f1889828a01613cbd565b9450506060613f2989828a01613ce9565b9350506080613f3a89828a01613cbd565b92505060a0613f4b89828a01613cbd565b9150509295509295509295565b60008060408385031215613f6b57600080fd5b6000613f778585613c9c565b9250506020613d6085828601613cde565b600060208284031215613f9a57600080fd5b600061359e8484613cb2565b600080600060608486031215613fbb57600080fd5b6000613d8b8686613cc8565b600060208284031215613fd957600080fd5b600061359e8484613cc8565b600060208284031215613ff757600080fd5b600061359e8484613cd3565b600061400f8383614af8565b505060600190565b61402081615141565b82525050565b614020816150f0565b600061403a826150e3565b61404481856150e7565b935061404f836150dd565b8060005b8381101561407d5781516140678882614003565b9750614072836150dd565b925050600101614053565b509495945050505050565b614020816150fb565b61402081615100565b6140206140a682615100565b615100565b60006140b6826150e3565b6140c081856120fb565b93506140d0818560208601615162565b9290920192915050565b61402081615103565b6140208161514c565b60006140f7826150e3565b61410181856150e7565b9350614111818560208601615162565b61411a8161518e565b9093019392505050565b60006141316018836150e7565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000815260200192915050565b600061416a6012836150e7565b71696e636f6e73697374656e7420737461746560701b815260200192915050565b60006141986013836150e7565b727661756c743a20706f6f6c206578697374733f60681b815260200192915050565b60006141c7601f836150e7565b7f53746f726520636f6e7472616374206164647265737320697320656d70747900815260200192915050565b6000614200601f836150e7565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800815260200192915050565b6000614239600f836150e7565b6e15985d5b1d081a5cc81c185d5cd959608a1b815260200192915050565b60006142646013836150e7565b7215985d5b1d081a5cc81b9bdd081c185d5cd959606a1b815260200192915050565b6000614293600c836150e7565b6b155b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006142bb6030836150e7565b7f5856535661756c743a3a6765745374616b65416d6f756e743a2078767320616481526f191c995cdcc81a5cc81b9bdd081cd95d60821b602082015260400192915050565b600061430d602a836150e7565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000614359602a836150e7565b7f5856535661756c743a3a64656c656761746542795369673a207369676e6174758152691c9948195e1c1a5c995960b21b602082015260400192915050565b60006143a56022836150e7565b7f7072696d6520746f6b656e2063616e6e6f74206265207a65726f206164647265815261737360f01b602082015260400192915050565b60006143e96026836150e7565b7f5856535661756c743a3a64656c656761746542795369673a20696e76616c6964815265206e6f6e636560d01b602082015260400192915050565b60006144316002836120fb565b61190160f01b815260020192915050565b600061444f6027836150e7565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20318152663238206269747360c81b602082015260400192915050565b60006144986017836150e7565b7f5661756c7420697320616c726561647920706175736564000000000000000000815260200192915050565b60006144d16025836150e7565b7f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164815264647265737360d81b602082015260400192915050565b60006145186022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c815261756560f01b602082015260400192915050565b600061455c601a836150e7565b7f546f6b656e2065786973747320696e206f7468657220706f6f6c000000000000815260200192915050565b60006145956013836150e7565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b60006145c4602b836150e7565b7f5856535661756c743a3a6765745072696f72566f7465733a206e6f742079657481526a0819195d195c9b5a5b995960aa1b602082015260400192915050565b6000614611601d836150e7565b7f7265776172642063616e6e6f74206265207a65726f2061646472657373000000815260200192915050565b600061464a6018836150e7565b7f7a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000815260200192915050565b6000614683601a836150e7565b7f657865637574652070656e64696e67207769746864726177616c000000000000815260200192915050565b60006146bc6022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c815261756560f01b602082015260400192915050565b60006147006043836120fb565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061476b601f836150e7565b7f72657175657374656420616d6f756e742063616e6e6f74206265207a65726f00815260200192915050565b60006147a46021836150e7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006147e76012836150e7565b71141bdbdb08185b1c9958591e48185919195960721b815260200192915050565b6000614815600a836150e7565b691c994b595b9d195c995960b21b815260200192915050565b600061483b6014836150e7565b7324b73b30b634b2103932bbb0b932103a37b5b2b760611b815260200192915050565b600061486b600e836150e7565b6d37b7363c9030b236b4b71031b0b760911b815260200192915050565b60006148956015836150e7565b7418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b815260200192915050565b60006148c66013836150e7565b726e6f7468696e6720746f20776974686472617760681b815260200192915050565b60006148f5601a836150e7565b7f496e76616c6964206e6577206c6f636b696e6720706572696f64000000000000815260200192915050565b600061492e601d836150e7565b7f416c6c6f6320706f696e7473206d757374206e6f74206265207a65726f000000815260200192915050565b60006149676020836150e7565b7f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b60006149a0603a836120fb565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b60006149ff601f836150e7565b7f5361666542455032303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000614a38601b836150e7565b7f72657175657374656420616d6f756e7420697320696e76616c69640000000000815260200192915050565b6000614a716022836150e7565b7f6f6e6c792070726f78792061646d696e2063616e206368616e676520627261698152616e7360f01b602082015260400192915050565b6000614ab5602e836150e7565b7f416c6c6f6320706f696e7473207065722072657761726420746f6b656e206d7581526d7374206e6f74206265207a65726f60901b602082015260400192915050565b80516060830190614b098482614091565b506020820151614b1c6020850182614b2b565b506040820151612d5e60408501825b6140208161510e565b61402081615126565b6140208161512f565b61402081615157565b61402081615135565b600061071182846140ab565b6000614b6f82614424565b9150614b7b828561409a565b602082019150614b8b828461409a565b5060200192915050565b60006113d7826146f3565b60006113d782614993565b602081016113d78284614026565b602081016113d78284614017565b60408101614bd58285614017565b818103602083015261359e81846140ec565b60408101614bf58285614026565b6107116020830184614026565b60608101614c108286614026565b614c1d6020830185614017565b61359e6040830184614091565b60808101614c388287614026565b614c456020830186614026565b614c526040830185614026565b614c5f6060830184614026565b95945050505050565b60608101614c768286614026565b614c1d6020830185614026565b60808101614c918287614026565b614c9e6020830186614026565b614cab6040830185614091565b614c5f6060830184614091565b60408101614cc68285614026565b6107116020830184614088565b60408101614ce18285614026565b6107116020830184614091565b60208082528101610711818461402f565b602081016113d78284614088565b602081016113d78284614091565b60808101614c918287614091565b60808101614d378287614091565b614d446020830186614091565b614c526040830185614091565b60808101614d5f8287614091565b614c9e6020830186614b3d565b602081016113d782846140da565b60a08101614d8882886140da565b614d956020830187614091565b614da26040830186614091565b614daf6060830185614091565b614dbc6080830184614091565b9695505050505050565b6020808252810161071181846140ec565b602080825281016113d781614124565b602080825281016113d78161415d565b602080825281016113d78161418b565b602080825281016113d7816141ba565b602080825281016113d7816141f3565b602080825281016113d78161422c565b602080825281016113d781614257565b602080825281016113d781614286565b602080825281016113d7816142ae565b602080825281016113d781614300565b602080825281016113d78161434c565b602080825281016113d781614398565b602080825281016113d7816143dc565b602080825281016113d781614442565b602080825281016113d78161448b565b602080825281016113d7816144c4565b602080825281016113d78161450b565b602080825281016113d78161454f565b602080825281016113d781614588565b602080825281016113d7816145b7565b602080825281016113d781614604565b602080825281016113d78161463d565b602080825281016113d781614676565b602080825281016113d7816146af565b602080825281016113d78161475e565b602080825281016113d781614797565b602080825281016113d7816147da565b602080825281016113d781614808565b602080825281016113d78161482e565b602080825281016113d78161485e565b602080825281016113d781614888565b602080825281016113d7816148b9565b602080825281016113d7816148e8565b602080825281016113d781614921565b602080825281016113d78161495a565b602080825281016113d7816149f2565b602080825281016113d781614a2b565b602080825281016113d781614a64565b602080825281016113d781614aa8565b604081016150558285614091565b61071160208301846140e3565b60408101614ce18285614091565b6060810161507e8286614091565b614c1d6020830185614091565b602081016113d78284614b34565b604081016150a78285614b34565b6107116020830184614b4f565b602081016113d78284614b4f565b604081016150d08285614b46565b6107116020830184614b46565b60200190565b5190565b90815260200190565b60006113d78261511a565b151590565b90565b60006113d7826150f0565b6001600160801b031690565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b60006113d782615103565b60006113d782615100565b60006113d782615135565b60005b8381101561517d578181015183820152602001615165565b83811115612d5e5750506000910152565b601f01601f191690565b6151a1816150f0565b8114610df457600080fd5b6151a1816150fb565b6151a181615100565b6151a181615103565b6151a181615126565b6151a18161512f56fe5856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77735856535661756c743a3a726571756573745769746864726177616c3a20766f746573206f766572666c6f775856535661756c743a3a6765745374616b65416d6f756e743a20766f746573206f766572666c6f775856535661756c743a3a6465706f7369743a20766f746573206f766572666c6f775856535661756c743a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473736574526577617264416d6f756e74506572426c6f636b28616464726573732c75696e74323536297365745769746864726177616c4c6f636b696e67506572696f6428616464726573732c75696e743235362c75696e74323536295856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777361646428616464726573732c75696e743235362c616464726573732c75696e743235362c75696e7432353629a365627a7a723158206fcd6577817fe07166c8f22ad5e6c4a8771a4690f6356182a14a0bf96f9a45af6c6578706572696d656e74616cf564736f6c63430005100040",
|
|
1570
|
+
"numDeployments": 2,
|
|
1571
|
+
"solcInputHash": "7830d2b3dd486e9651687b362529ec15",
|
|
1572
|
+
"metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Claim\",\"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\":\"DelegateChangedV2\",\"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\":\"DelegateVotesChangedV2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ExecutedWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IPrime\",\"name\":\"oldPrimeToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IPrime\",\"name\":\"newPrimeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldPrimeRewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPrimeRewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPrimePoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPrimePoolId\",\"type\":\"uint256\"}],\"name\":\"NewPrimeToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardPerBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lockPeriod\",\"type\":\"uint256\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldAllocPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAllocPoints\",\"type\":\"uint256\"}],\"name\":\"PoolUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RequestedWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReward\",\"type\":\"uint256\"}],\"name\":\"RewardAmountUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldXvs\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldStore\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newXvs\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newStore\",\"type\":\"address\"}],\"name\":\"StoreUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldOwedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newOwedAmount\",\"type\":\"uint256\"}],\"name\":\"VaultDebtUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"VaultPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"VaultResumed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"WithdrawalLockingPeriodUpdated\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"DELEGATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DOMAIN_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_LOCK_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract XVSVaultProxy\",\"name\":\"xvsVaultProxy\",\"type\":\"address\"}],\"name\":\"_become\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV5\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"contract IBEP20\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_rewardPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockPeriod\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"votes\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"claim\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"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\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"executeWithdrawal\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getEligibleWithdrawalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"withdrawalAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPriorVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getRequestedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardDebt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pendingWithdrawals\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getWithdrawalRequests\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"lockedUntil\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"afterUpgrade\",\"type\":\"uint128\"}],\"internalType\":\"struct XVSVaultStorageV1.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isStakedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pendingAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingRewardTransfers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingWithdrawalsBeforeUpgrade\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"beforeUpgradeWithdrawalAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"pendingXVSVaultImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfos\",\"outputs\":[{\"internalType\":\"contract IBEP20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardPerShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockPeriod\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardToken\",\"type\":\"address\"}],\"name\":\"poolLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primePoolId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primeRewardToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"primeToken\",\"outputs\":[{\"internalType\":\"contract IPrime\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"requestWithdrawal\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardTokenAmountsPerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAccessControlAddress\",\"type\":\"address\"}],\"name\":\"setAccessControl\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract IPrime\",\"name\":\"_primeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_primeRewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_primePoolId\",\"type\":\"uint256\"}],\"name\":\"setPrimeToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_rewardAmount\",\"type\":\"uint256\"}],\"name\":\"setRewardAmountPerBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"setWithdrawalLockingPeriod\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_xvs\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_xvsStore\",\"type\":\"address\"}],\"name\":\"setXvsStore\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totalAllocPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"updatePool\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"vaultPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"xvsAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"xvsStore\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"methods\":{\"add(address,uint256,address,uint256,uint256)\":{\"details\":\"This vault DOES NOT support deflationary tokens \\u2014 it expects that the amount of transferred tokens would equal the actually deposited amount. In practice this means that this vault DOES NOT support USDT and similar tokens (that do not provide these guarantees).\",\"params\":{\"_allocPoint\":\"Number of allocation points assigned to this pool\",\"_lockPeriod\":\"A period between withdrawal request and a moment when it's executable\",\"_rewardPerBlock\":\"Initial reward per block, in terms of _rewardToken\",\"_rewardToken\":\"Reward token address\",\"_token\":\"Staked token\"}},\"claim(address,address,uint256)\":{\"params\":{\"_account\":\"The account for which to claim rewards\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"delegate(address)\":{\"params\":{\"delegatee\":\"The address to delegate votes to\"}},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"delegatee\":\"The address to delegate votes to\",\"expiry\":\"The time at which to expire the signature\",\"nonce\":\"The contract state required to match the signature\",\"r\":\"Half of the ECDSA signature pair\",\"s\":\"Half of the ECDSA signature pair\",\"v\":\"The recovery byte of the signature\"}},\"deposit(address,uint256,uint256)\":{\"params\":{\"_amount\":\"The amount to deposit to vault\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"executeWithdrawal(address,uint256)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"getCurrentVotes(address)\":{\"params\":{\"account\":\"The address to get votes balance\"},\"return\":\"The number of current votes for `account`\"},\"getEligibleWithdrawalAmount(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"withdrawalAmount Amount that the user can withdraw\"},\"getPriorVotes(address,uint256)\":{\"params\":{\"account\":\"The address of the account to check\",\"blockNumber\":\"The block number to get the vote balance at\"},\"return\":\"The balance that user staked\"},\"getRequestedAmount(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"Total amount of requested but not yet executed withdrawals (including both executable and locked ones)\"},\"getUserInfo(address,uint256,address)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\",\"_user\":\"User address\"},\"return\":\"amount Deposited amountrewardDebt Reward debt (technical value used to track past payouts)pendingWithdrawals Requested but not yet executed withdrawals\"},\"getWithdrawalRequests(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The User Address\"},\"return\":\"An array of withdrawal requests\"},\"pendingReward(address,uint256,address)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\",\"_user\":\"User address\"},\"return\":\"Reward the user is eligible for in this pool, in terms of _rewardToken\"},\"pendingWithdrawalsBeforeUpgrade(address,uint256,address)\":{\"params\":{\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\",\"_user\":\"The address of the user\"},\"return\":\"beforeUpgradeWithdrawalAmount Total pending withdrawal amount in requests made before the vault upgrade\"},\"poolLength(address)\":{\"params\":{\"rewardToken\":\"Reward token address\"},\"return\":\"Number of pools that distribute the specified token as a reward\"},\"requestWithdrawal(address,uint256,uint256)\":{\"params\":{\"_amount\":\"The amount to withdraw from the vault\",\"_pid\":\"The Pool Index\",\"_rewardToken\":\"The Reward Token Address\"}},\"set(address,uint256,uint256)\":{\"params\":{\"_allocPoint\":\"Number of allocation points assigned to this pool\",\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}},\"setAccessControl(address)\":{\"details\":\"Admin function to set the access control address\",\"params\":{\"newAccessControlAddress\":\"New address for the access control\"}},\"setPrimeToken(address,address,uint256)\":{\"params\":{\"_primePoolId\":\"pool id for reward\",\"_primeRewardToken\":\"address of reward token\",\"_primeToken\":\"address of the prime token contract\"}},\"setRewardAmountPerBlock(address,uint256)\":{\"params\":{\"_rewardAmount\":\"Number of allocation points assigned to this pool\",\"_rewardToken\":\"Reward token address\"}},\"setWithdrawalLockingPeriod(address,uint256,uint256)\":{\"params\":{\"_newPeriod\":\"New lock period\",\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}},\"updatePool(address,uint256)\":{\"params\":{\"_pid\":\"Pool index\",\"_rewardToken\":\"Reward token address\"}}},\"title\":\"XVS Vault\"},\"userdoc\":{\"methods\":{\"_become(address)\":{\"notice\":\"* Admin Functions **\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"add(address,uint256,address,uint256,uint256)\":{\"notice\":\"Add a new token pool\"},\"claim(address,address,uint256)\":{\"notice\":\"Claim rewards for pool\"},\"delegate(address)\":{\"notice\":\"Delegate votes from `msg.sender` to `delegatee`\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Delegates votes from signatory to `delegatee`\"},\"deposit(address,uint256,uint256)\":{\"notice\":\"Deposit XVSVault for XVS allocation\"},\"executeWithdrawal(address,uint256)\":{\"notice\":\"Execute withdrawal to XVSVault for XVS allocation\"},\"getCurrentVotes(address)\":{\"notice\":\"Gets the current votes balance for `account`\"},\"getEligibleWithdrawalAmount(address,uint256,address)\":{\"notice\":\"Get unlocked withdrawal amount\"},\"getPriorVotes(address,uint256)\":{\"notice\":\"Determine the xvs stake balance for an account\"},\"getRequestedAmount(address,uint256,address)\":{\"notice\":\"Get requested amount\"},\"getUserInfo(address,uint256,address)\":{\"notice\":\"Get user info with reward token address and pid\"},\"getWithdrawalRequests(address,uint256,address)\":{\"notice\":\"Returns the array of withdrawal requests that have not been executed yet\"},\"pause()\":{\"notice\":\"Pauses vault\"},\"pendingReward(address,uint256,address)\":{\"notice\":\"View function to see pending XVSs on frontend\"},\"pendingWithdrawalsBeforeUpgrade(address,uint256,address)\":{\"notice\":\"Gets the total pending withdrawal amount of a user before upgrade\"},\"poolLength(address)\":{\"notice\":\"Returns the number of pools with the specified reward token\"},\"requestWithdrawal(address,uint256,uint256)\":{\"notice\":\"Request withdrawal to XVSVault for XVS allocation\"},\"resume()\":{\"notice\":\"Resume vault\"},\"set(address,uint256,uint256)\":{\"notice\":\"Update the given pool's reward allocation point\"},\"setAccessControl(address)\":{\"notice\":\"Sets the address of the access control of this contract\"},\"setPrimeToken(address,address,uint256)\":{\"notice\":\"Sets the address of the prime token contract\"},\"setRewardAmountPerBlock(address,uint256)\":{\"notice\":\"Update the given reward token's amount per block\"},\"setWithdrawalLockingPeriod(address,uint256,uint256)\":{\"notice\":\"Update the lock period after which a requested withdrawal can be executed\"},\"updatePool(address,uint256)\":{\"notice\":\"Update reward variables of the given pool to be up-to-date\"}},\"notice\":\"The XVS Vault allows XVS holders to lock their XVS to recieve voting rights in Venus governance and are rewarded with XVS.\"}},\"settings\":{\"compilationTarget\":{\"contracts/XVSVault/XVSVault.sol\":\"XVSVault\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV5.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.5.16;\\n\\nimport \\\"./IAccessControlManagerV5.sol\\\";\\n\\n/**\\n * @title AccessControlledV5\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.5.16)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\ncontract AccessControlledV5 {\\n /// @notice Access control manager contract\\n IAccessControlManagerV5 private _accessControlManager;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n\\n /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV5) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV5(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert(\\\"Unauthorized\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4b724928650b944935bc91713782a8cf5bbd9cdb98b3e3fedf31e611c7e6df19\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV5.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.5.16;\\n\\n/**\\n * @title IAccessControlManagerV5\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV5` contract.\\n */\\ninterface IAccessControlManagerV5 {\\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 */\\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 /**\\n * @notice Gives a function call permission to one single account\\n * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE\\n * \\t\\tMay emit a {RoleGranted} event.\\n * @param contractAddress address of contract for which call permissions will be granted\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n */\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n /**\\n * @notice Revokes an account's permission to a particular function call\\n * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE\\n * \\t\\tMay emit a {RoleRevoked} event.\\n * @param contractAddress address of contract for which call permissions will be revoked\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n */\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n /**\\n * @notice Verifies if the given account can call a praticular contract's function\\n * @dev Since the contract is calling itself this function, we can get contracts address with msg.sender\\n * @param account address (eoa or contract) for which call permissions will be checked\\n * @param functionSig signature e.g. \\\"functionName(uint,bool)\\\"\\n * @return false if the user account cannot call the particular contract function\\n *\\n */\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x3563db4c75f7aa0b8a982bab591907dda192438a2368511b62a9c587a3e54226\"},\"contracts/Tokens/Prime/IPrime.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.5.16;\\npragma experimental ABIEncoderV2;\\n\\n/**\\n * @title IPrime\\n * @author Venus\\n * @notice Interface for Prime Token\\n */\\ninterface IPrime {\\n /**\\n * @notice Executed by XVSVault whenever user's XVSVault balance changes\\n * @param user the account address whose balance was updated\\n */\\n function xvsUpdated(address user) external;\\n\\n /**\\n * @notice accrues interest and updates score for an user for a specific market\\n * @param user the account address for which to accrue interest and update score\\n * @param market the market for which to accrue interest and update score\\n */\\n function accrueInterestAndUpdateScore(address user, address market) external;\\n\\n /**\\n * @notice Distributes income from market since last distribution\\n * @param vToken the market for which to distribute the income\\n */\\n function accrueInterest(address vToken) external;\\n\\n /**\\n * @notice Returns if user is a prime holder\\n * @param isPrimeHolder returns if the user is a prime holder\\n */\\n function isUserPrimeHolder(address user) external view returns (bool isPrimeHolder);\\n}\\n\",\"keccak256\":\"0x58861c0c05b8757f1a5d50b107eff479c8680878e6aa51bc93af420caf73f500\"},\"contracts/Utils/Address.sol\":{\"content\":\"pragma solidity ^0.5.5;\\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 // According to EIP-1052, 0x0 is the value returned for not-yet created accounts\\n // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned\\n // for accounts without code, i.e. `keccak256('')`\\n bytes32 codehash;\\n bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n codehash := extcodehash(account)\\n }\\n return (codehash != accountHash && codehash != 0x0);\\n }\\n\\n /**\\n * @dev Converts an `address` into `address payable`. Note that this is\\n * simply a type cast: the actual underlying value is not changed.\\n *\\n * _Available since v2.4.0._\\n */\\n function toPayable(address account) internal pure returns (address payable) {\\n return address(uint160(account));\\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 * _Available since v2.4.0._\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n // solhint-disable-next-line avoid-call-value\\n // solium-disable-next-line security/no-call-value\\n (bool success, ) = recipient.call.value(amount)(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n}\\n\",\"keccak256\":\"0x3c2ef780599a2ae6913282b982633f07e405a4a9c8511590df571e2b773aef9d\"},\"contracts/Utils/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Adapted from OpenZeppelin Contracts v4.3.2 (utils/cryptography/ECDSA.sol)\\n\\n// SPDX-Copyright-Text: OpenZeppelin, 2021\\n// SPDX-Copyright-Text: Venus, 2021\\n\\npragma solidity ^0.5.16;\\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 */\\ncontract 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`. 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, uint8 v, bytes32 r, bytes32 s) 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 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, uint8 v, bytes32 r, bytes32 s) 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\",\"keccak256\":\"0xf27d7ad488b72c627370afa6e9acc520d4834a082363d1dc46b5573ac40a2d0a\"},\"contracts/Utils/IBEP20.sol\":{\"content\":\"pragma solidity ^0.5.0;\\n\\n/**\\n * @dev Interface of the BEP20 standard as defined in the EIP. Does not include\\n * the optional functions; to access them see {BEP20Detailed}.\\n */\\ninterface IBEP20 {\\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(address sender, address recipient, uint256 amount) 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\":\"0x839b08895eb1ad83502d3631e8e9e3a856d2a8c63c46f070d604af7b26c62c07\"},\"contracts/Utils/SafeBEP20.sol\":{\"content\":\"pragma solidity ^0.5.0;\\n\\nimport \\\"./SafeMath.sol\\\";\\nimport \\\"./IBEP20.sol\\\";\\nimport \\\"./Address.sol\\\";\\n\\n/**\\n * @title SafeBEP20\\n * @dev Wrappers around BEP20 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 SafeBEP20 for BEP20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeBEP20 {\\n using SafeMath for uint256;\\n using Address for address;\\n\\n function safeTransfer(IBEP20 token, address to, uint256 value) internal {\\n callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(IBEP20 token, address from, address to, uint256 value) internal {\\n callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n function safeApprove(IBEP20 token, address spender, uint256 value) 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 // solhint-disable-next-line max-line-length\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeBEP20: approve from non-zero to non-zero allowance\\\"\\n );\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(IBEP20 token, address spender, uint256 value) internal {\\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(IBEP20 token, address spender, uint256 value) internal {\\n uint256 newAllowance = token.allowance(address(this), spender).sub(\\n value,\\n \\\"SafeBEP20: decreased allowance below zero\\\"\\n );\\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\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(IBEP20 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.\\n\\n // A Solidity high level call has three parts:\\n // 1. The target address is checked to verify it contains contract code\\n // 2. The call itself is made, and success asserted\\n // 3. The return value is decoded, which in turn checks the size of the returned data.\\n // solhint-disable-next-line max-line-length\\n require(address(token).isContract(), \\\"SafeBEP20: call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = address(token).call(data);\\n require(success, \\\"SafeBEP20: low-level call failed\\\");\\n\\n if (returndata.length > 0) {\\n // Return data is optional\\n // solhint-disable-next-line max-line-length\\n require(abi.decode(returndata, (bool)), \\\"SafeBEP20: BEP20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x540ef6ddc47232a59d3ab0e95537f7a7d1c8a36f8dba315b010e60c6487bd768\"},\"contracts/Utils/SafeCast.sol\":{\"content\":\"pragma solidity ^0.5.16;\\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 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 < 2 ** 128, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(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 < 2 ** 64, \\\"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 < 2 ** 32, \\\"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 < 2 ** 16, \\\"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 < 2 ** 8, \\\"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 >= -2 ** 127 && value < 2 ** 127, \\\"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 >= -2 ** 63 && value < 2 ** 63, \\\"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 >= -2 ** 31 && value < 2 ** 31, \\\"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 >= -2 ** 15 && value < 2 ** 15, \\\"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 >= -2 ** 7 && value < 2 ** 7, \\\"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 require(value < 2 ** 255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0xe6222292bd226980fd73c00eaf3a102c8638777aa3f9c7cd9b0d0fb621da0661\"},\"contracts/Utils/SafeMath.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * 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 */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n return add(a, b, \\\"SafeMath: addition overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, errorMessage);\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n uint256 c = a - b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n return div(a, b, \\\"SafeMath: division by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n // Solidity only automatically asserts when dividing by 0\\n require(b > 0, errorMessage);\\n uint256 c = a / b;\\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * Reverts with custom message when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b != 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0x9431fd772ed4abc038cdfe9ce6c0066897bd1685ad45848748d1952935d5b8ef\"},\"contracts/XVSVault/XVSStore.sol\":{\"content\":\"pragma solidity 0.5.16;\\nimport \\\"../Utils/SafeBEP20.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\n\\n/**\\n * @title XVS Store\\n * @author Venus\\n * @notice XVS Store responsible for distributing XVS rewards\\n */\\ncontract XVSStore {\\n using SafeMath for uint256;\\n using SafeBEP20 for IBEP20;\\n\\n /// @notice The Admin Address\\n address public admin;\\n\\n /// @notice The pending admin address\\n address public pendingAdmin;\\n\\n /// @notice The Owner Address\\n address public owner;\\n\\n /// @notice The reward tokens\\n mapping(address => bool) public rewardTokens;\\n\\n /// @notice Emitted when pendingAdmin is changed\\n event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);\\n\\n /// @notice Event emitted when admin changed\\n event AdminTransferred(address indexed oldAdmin, address indexed newAdmin);\\n\\n /// @notice Event emitted when owner changed\\n event OwnerTransferred(address indexed oldOwner, address indexed newOwner);\\n\\n constructor() public {\\n admin = msg.sender;\\n }\\n\\n modifier onlyAdmin() {\\n require(msg.sender == admin, \\\"only admin can\\\");\\n _;\\n }\\n\\n modifier onlyOwner() {\\n require(msg.sender == owner, \\\"only owner can\\\");\\n _;\\n }\\n\\n /**\\n * @notice Safely transfer rewards. Only active reward tokens can be sent using this function.\\n * Only callable by owner\\n * @dev Safe reward token transfer function, just in case if rounding error causes pool to not have enough tokens.\\n * @param token Reward token to transfer\\n * @param _to Destination address of the reward\\n * @param _amount Amount to transfer\\n */\\n function safeRewardTransfer(address token, address _to, uint256 _amount) external onlyOwner {\\n require(rewardTokens[token] == true, \\\"only reward token can\\\");\\n\\n if (address(token) != address(0)) {\\n uint256 tokenBalance = IBEP20(token).balanceOf(address(this));\\n if (_amount > tokenBalance) {\\n IBEP20(token).safeTransfer(_to, tokenBalance);\\n } else {\\n IBEP20(token).safeTransfer(_to, _amount);\\n }\\n }\\n }\\n\\n /**\\n * @notice Allows the admin to propose a new admin\\n * Only callable admin\\n * @param _admin Propose an account as admin of the XVS store\\n */\\n function setPendingAdmin(address _admin) external onlyAdmin {\\n address oldPendingAdmin = pendingAdmin;\\n pendingAdmin = _admin;\\n emit NewPendingAdmin(oldPendingAdmin, _admin);\\n }\\n\\n /**\\n * @notice Allows an account that is pending as admin to accept the role\\n * nly calllable by the pending admin\\n */\\n function acceptAdmin() external {\\n require(msg.sender == pendingAdmin, \\\"only pending admin\\\");\\n address oldAdmin = admin;\\n address oldPendingAdmin = pendingAdmin;\\n\\n admin = pendingAdmin;\\n pendingAdmin = address(0);\\n\\n emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);\\n emit AdminTransferred(oldAdmin, admin);\\n }\\n\\n /**\\n * @notice Set the contract owner\\n * @param _owner The address of the owner to set\\n * Only callable admin\\n */\\n function setNewOwner(address _owner) external onlyAdmin {\\n require(_owner != address(0), \\\"new owner is the zero address\\\");\\n address oldOwner = owner;\\n owner = _owner;\\n emit OwnerTransferred(oldOwner, _owner);\\n }\\n\\n /**\\n * @notice Set or disable a reward token\\n * @param _tokenAddress The address of a token to set as active or inactive\\n * @param status Set whether a reward token is active or not\\n */\\n function setRewardToken(address _tokenAddress, bool status) external {\\n require(msg.sender == admin || msg.sender == owner, \\\"only admin or owner can\\\");\\n rewardTokens[_tokenAddress] = status;\\n }\\n\\n /**\\n * @notice Security function to allow the owner of the contract to withdraw from the contract\\n * @param _tokenAddress Reward token address to withdraw\\n * @param _amount Amount of token to withdraw\\n */\\n function emergencyRewardWithdraw(address _tokenAddress, uint256 _amount) external onlyOwner {\\n IBEP20(_tokenAddress).safeTransfer(address(msg.sender), _amount);\\n }\\n}\\n\",\"keccak256\":\"0x8082f92b13448bd4fa982c93c763439f10fe016a5f3be6d613dfe3cca68501ef\"},\"contracts/XVSVault/XVSVault.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\n\\npragma solidity 0.5.16;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../Utils/ECDSA.sol\\\";\\nimport \\\"../Utils/SafeBEP20.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\nimport \\\"./XVSVaultStorage.sol\\\";\\nimport \\\"./XVSVaultErrorReporter.sol\\\";\\nimport \\\"../Tokens/Prime/IPrime.sol\\\";\\nimport \\\"../Utils/SafeCast.sol\\\";\\nimport \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV5.sol\\\";\\nimport { XVSStore } from \\\"./XVSStore.sol\\\";\\nimport { XVSVaultProxy } from \\\"./XVSVaultProxy.sol\\\";\\n\\n/**\\n * @title XVS Vault\\n * @author Venus\\n * @notice The XVS Vault allows XVS holders to lock their XVS to recieve voting rights in Venus governance and are rewarded with XVS.\\n */\\ncontract XVSVault is XVSVaultStorage, ECDSA, AccessControlledV5 {\\n using SafeMath for uint256;\\n using SafeCast for uint256;\\n using SafeBEP20 for IBEP20;\\n\\n /// @notice The upper bound for the lock period in a pool, 10 years\\n uint256 public constant MAX_LOCK_PERIOD = 60 * 60 * 24 * 365 * 10;\\n\\n /// @notice Event emitted when deposit\\n event Deposit(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when execute withrawal\\n event ExecutedWithdrawal(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when request withrawal\\n event RequestedWithdrawal(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice An event thats emitted when an account changes its delegate\\n event DelegateChangedV2(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /// @notice An event thats emitted when a delegate account's vote balance changes\\n event DelegateVotesChangedV2(address indexed delegate, uint previousBalance, uint newBalance);\\n\\n /// @notice An event emitted when the reward store address is updated\\n event StoreUpdated(address oldXvs, address oldStore, address newXvs, address newStore);\\n\\n /// @notice An event emitted when the withdrawal locking period is updated for a pool\\n event WithdrawalLockingPeriodUpdated(address indexed rewardToken, uint indexed pid, uint oldPeriod, uint newPeriod);\\n\\n /// @notice An event emitted when the reward amount per block is modified for a pool\\n event RewardAmountUpdated(address indexed rewardToken, uint oldReward, uint newReward);\\n\\n /// @notice An event emitted when a new pool is added\\n event PoolAdded(\\n address indexed rewardToken,\\n uint indexed pid,\\n address indexed token,\\n uint allocPoints,\\n uint rewardPerBlock,\\n uint lockPeriod\\n );\\n\\n /// @notice An event emitted when a pool allocation points are updated\\n event PoolUpdated(address indexed rewardToken, uint indexed pid, uint oldAllocPoints, uint newAllocPoints);\\n\\n /// @notice Event emitted when reward claimed\\n event Claim(address indexed user, address indexed rewardToken, uint256 indexed pid, uint256 amount);\\n\\n /// @notice Event emitted when vault is paused\\n event VaultPaused(address indexed admin);\\n\\n /// @notice Event emitted when vault is resumed after pause\\n event VaultResumed(address indexed admin);\\n\\n /// @notice Event emitted when protocol logs a debt to a user due to insufficient funds for pending reward distribution\\n event VaultDebtUpdated(\\n address indexed rewardToken,\\n address indexed userAddress,\\n uint256 oldOwedAmount,\\n uint256 newOwedAmount\\n );\\n\\n /// @notice Emitted when prime token contract address is changed\\n event NewPrimeToken(\\n IPrime indexed oldPrimeToken,\\n IPrime indexed newPrimeToken,\\n address oldPrimeRewardToken,\\n address newPrimeRewardToken,\\n uint256 oldPrimePoolId,\\n uint256 newPrimePoolId\\n );\\n\\n constructor() public {\\n admin = msg.sender;\\n }\\n\\n modifier onlyAdmin() {\\n require(msg.sender == admin, \\\"only admin can\\\");\\n _;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n */\\n modifier nonReentrant() {\\n require(_notEntered, \\\"re-entered\\\");\\n _notEntered = false;\\n _;\\n _notEntered = true; // get a gas-refund post-Istanbul\\n }\\n\\n /**\\n * @dev Prevents functions to execute when vault is paused.\\n */\\n modifier isActive() {\\n require(!vaultPaused, \\\"Vault is paused\\\");\\n _;\\n }\\n\\n /**\\n * @notice Pauses vault\\n */\\n function pause() external {\\n _checkAccessAllowed(\\\"pause()\\\");\\n require(!vaultPaused, \\\"Vault is already paused\\\");\\n vaultPaused = true;\\n emit VaultPaused(msg.sender);\\n }\\n\\n /**\\n * @notice Resume vault\\n */\\n function resume() external {\\n _checkAccessAllowed(\\\"resume()\\\");\\n require(vaultPaused, \\\"Vault is not paused\\\");\\n vaultPaused = false;\\n emit VaultResumed(msg.sender);\\n }\\n\\n /**\\n * @notice Returns the number of pools with the specified reward token\\n * @param rewardToken Reward token address\\n * @return Number of pools that distribute the specified token as a reward\\n */\\n function poolLength(address rewardToken) external view returns (uint256) {\\n return poolInfos[rewardToken].length;\\n }\\n\\n /**\\n * @notice Add a new token pool\\n * @dev This vault DOES NOT support deflationary tokens \\u2014 it expects that\\n * the amount of transferred tokens would equal the actually deposited\\n * amount. In practice this means that this vault DOES NOT support USDT\\n * and similar tokens (that do not provide these guarantees).\\n * @param _rewardToken Reward token address\\n * @param _allocPoint Number of allocation points assigned to this pool\\n * @param _token Staked token\\n * @param _rewardPerBlock Initial reward per block, in terms of _rewardToken\\n * @param _lockPeriod A period between withdrawal request and a moment when it's executable\\n */\\n function add(\\n address _rewardToken,\\n uint256 _allocPoint,\\n IBEP20 _token,\\n uint256 _rewardPerBlock,\\n uint256 _lockPeriod\\n ) external {\\n _checkAccessAllowed(\\\"add(address,uint256,address,uint256,uint256)\\\");\\n _ensureNonzeroAddress(_rewardToken);\\n _ensureNonzeroAddress(address(_token));\\n require(address(xvsStore) != address(0), \\\"Store contract address is empty\\\");\\n require(_allocPoint > 0, \\\"Alloc points must not be zero\\\");\\n\\n massUpdatePools(_rewardToken);\\n\\n PoolInfo[] storage poolInfo = poolInfos[_rewardToken];\\n\\n uint256 length = poolInfo.length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n require(poolInfo[pid].token != _token, \\\"Pool already added\\\");\\n }\\n\\n // We use balanceOf to get the supply amount, so shouldn't be possible to\\n // configure pools with different reward token but the same staked token\\n require(!isStakedToken[address(_token)], \\\"Token exists in other pool\\\");\\n\\n totalAllocPoints[_rewardToken] = totalAllocPoints[_rewardToken].add(_allocPoint);\\n\\n rewardTokenAmountsPerBlock[_rewardToken] = _rewardPerBlock;\\n\\n poolInfo.push(\\n PoolInfo({\\n token: _token,\\n allocPoint: _allocPoint,\\n lastRewardBlock: block.number,\\n accRewardPerShare: 0,\\n lockPeriod: _lockPeriod\\n })\\n );\\n isStakedToken[address(_token)] = true;\\n\\n XVSStore(xvsStore).setRewardToken(_rewardToken, true);\\n\\n emit PoolAdded(_rewardToken, poolInfo.length - 1, address(_token), _allocPoint, _rewardPerBlock, _lockPeriod);\\n }\\n\\n /**\\n * @notice Update the given pool's reward allocation point\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _allocPoint Number of allocation points assigned to this pool\\n */\\n function set(address _rewardToken, uint256 _pid, uint256 _allocPoint) external {\\n _checkAccessAllowed(\\\"set(address,uint256,uint256)\\\");\\n _ensureValidPool(_rewardToken, _pid);\\n\\n massUpdatePools(_rewardToken);\\n\\n PoolInfo[] storage poolInfo = poolInfos[_rewardToken];\\n uint256 newTotalAllocPoints = totalAllocPoints[_rewardToken].sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n require(newTotalAllocPoints > 0, \\\"Alloc points per reward token must not be zero\\\");\\n\\n uint256 oldAllocPoints = poolInfo[_pid].allocPoint;\\n poolInfo[_pid].allocPoint = _allocPoint;\\n totalAllocPoints[_rewardToken] = newTotalAllocPoints;\\n\\n emit PoolUpdated(_rewardToken, _pid, oldAllocPoints, _allocPoint);\\n }\\n\\n /**\\n * @notice Update the given reward token's amount per block\\n * @param _rewardToken Reward token address\\n * @param _rewardAmount Number of allocation points assigned to this pool\\n */\\n function setRewardAmountPerBlock(address _rewardToken, uint256 _rewardAmount) external {\\n _checkAccessAllowed(\\\"setRewardAmountPerBlock(address,uint256)\\\");\\n require(XVSStore(xvsStore).rewardTokens(_rewardToken), \\\"Invalid reward token\\\");\\n massUpdatePools(_rewardToken);\\n uint256 oldReward = rewardTokenAmountsPerBlock[_rewardToken];\\n rewardTokenAmountsPerBlock[_rewardToken] = _rewardAmount;\\n\\n emit RewardAmountUpdated(_rewardToken, oldReward, _rewardAmount);\\n }\\n\\n /**\\n * @notice Update the lock period after which a requested withdrawal can be executed\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _newPeriod New lock period\\n */\\n function setWithdrawalLockingPeriod(address _rewardToken, uint256 _pid, uint256 _newPeriod) external {\\n _checkAccessAllowed(\\\"setWithdrawalLockingPeriod(address,uint256,uint256)\\\");\\n _ensureValidPool(_rewardToken, _pid);\\n require(_newPeriod > 0 && _newPeriod < MAX_LOCK_PERIOD, \\\"Invalid new locking period\\\");\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n uint256 oldPeriod = pool.lockPeriod;\\n pool.lockPeriod = _newPeriod;\\n\\n emit WithdrawalLockingPeriodUpdated(_rewardToken, _pid, oldPeriod, _newPeriod);\\n }\\n\\n /**\\n * @notice Deposit XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _amount The amount to deposit to vault\\n */\\n function deposit(address _rewardToken, uint256 _pid, uint256 _amount) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n _updatePool(_rewardToken, _pid);\\n require(pendingWithdrawalsBeforeUpgrade(_rewardToken, _pid, msg.sender) == 0, \\\"execute pending withdrawal\\\");\\n\\n if (user.amount > 0) {\\n uint256 pending = _computeReward(user, pool);\\n if (pending > 0) {\\n _transferReward(_rewardToken, msg.sender, pending);\\n emit Claim(msg.sender, _rewardToken, _pid, pending);\\n }\\n }\\n pool.token.safeTransferFrom(msg.sender, address(this), _amount);\\n user.amount = user.amount.add(_amount);\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n // Update Delegate Amount\\n if (address(pool.token) == xvsAddress) {\\n _moveDelegates(address(0), delegates[msg.sender], safe96(_amount, \\\"XVSVault::deposit: votes overflow\\\"));\\n }\\n\\n if (primeRewardToken == _rewardToken && _pid == primePoolId) {\\n primeToken.xvsUpdated(msg.sender);\\n }\\n\\n emit Deposit(msg.sender, _rewardToken, _pid, _amount);\\n }\\n\\n /**\\n * @notice Claim rewards for pool\\n * @param _account The account for which to claim rewards\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n */\\n function claim(address _account, address _rewardToken, uint256 _pid) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][_account];\\n _updatePool(_rewardToken, _pid);\\n require(pendingWithdrawalsBeforeUpgrade(_rewardToken, _pid, _account) == 0, \\\"execute pending withdrawal\\\");\\n\\n if (user.amount > 0) {\\n uint256 pending = _computeReward(user, pool);\\n\\n if (pending > 0) {\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n _transferReward(_rewardToken, _account, pending);\\n emit Claim(_account, _rewardToken, _pid, pending);\\n }\\n }\\n }\\n\\n /**\\n * @notice Pushes withdrawal request to the requests array and updates\\n * the pending withdrawals amount. The requests are always sorted\\n * by unlock time (descending) so that the earliest to execute requests\\n * are always at the end of the array.\\n * @param _user The user struct storage pointer\\n * @param _requests The user's requests array storage pointer\\n * @param _amount The amount being requested\\n */\\n function pushWithdrawalRequest(\\n UserInfo storage _user,\\n WithdrawalRequest[] storage _requests,\\n uint _amount,\\n uint _lockedUntil\\n ) internal {\\n uint i = _requests.length;\\n _requests.push(WithdrawalRequest(0, 0, 1));\\n // Keep it sorted so that the first to get unlocked request is always at the end\\n for (; i > 0 && _requests[i - 1].lockedUntil <= _lockedUntil; --i) {\\n _requests[i] = _requests[i - 1];\\n }\\n _requests[i] = WithdrawalRequest(_amount, _lockedUntil.toUint128(), 1);\\n _user.pendingWithdrawals = _user.pendingWithdrawals.add(_amount);\\n }\\n\\n /**\\n * @notice Pops the requests with unlock time < now from the requests\\n * array and deducts the computed amount from the user's pending\\n * withdrawals counter. Assumes that the requests array is sorted\\n * by unclock time (descending).\\n * @dev This function **removes** the eligible requests from the requests\\n * array. If this function is called, the withdrawal should actually\\n * happen (or the transaction should be reverted).\\n * @param _user The user struct storage pointer\\n * @param _requests The user's requests array storage pointer\\n * @return beforeUpgradeWithdrawalAmount The amount eligible for withdrawal before upgrade (this amount should be\\n * sent to the user, otherwise the state would be inconsistent).\\n * @return afterUpgradeWithdrawalAmount The amount eligible for withdrawal after upgrade (this amount should be\\n * sent to the user, otherwise the state would be inconsistent).\\n */\\n function popEligibleWithdrawalRequests(\\n UserInfo storage _user,\\n WithdrawalRequest[] storage _requests\\n ) internal returns (uint beforeUpgradeWithdrawalAmount, uint afterUpgradeWithdrawalAmount) {\\n // Since the requests are sorted by their unlock time, we can just\\n // pop them from the array and stop at the first not-yet-eligible one\\n for (uint i = _requests.length; i > 0 && isUnlocked(_requests[i - 1]); --i) {\\n if (_requests[i - 1].afterUpgrade == 1) {\\n afterUpgradeWithdrawalAmount = afterUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n } else {\\n beforeUpgradeWithdrawalAmount = beforeUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n }\\n\\n _requests.pop();\\n }\\n _user.pendingWithdrawals = _user.pendingWithdrawals.sub(\\n afterUpgradeWithdrawalAmount.add(beforeUpgradeWithdrawalAmount)\\n );\\n return (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount);\\n }\\n\\n /**\\n * @notice Checks if the request is eligible for withdrawal.\\n * @param _request The request struct storage pointer\\n * @return True if the request is eligible for withdrawal, false otherwise\\n */\\n function isUnlocked(WithdrawalRequest storage _request) private view returns (bool) {\\n return _request.lockedUntil <= block.timestamp;\\n }\\n\\n /**\\n * @notice Execute withdrawal to XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n */\\n function executeWithdrawal(address _rewardToken, uint256 _pid) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][msg.sender];\\n\\n uint256 beforeUpgradeWithdrawalAmount;\\n uint256 afterUpgradeWithdrawalAmount;\\n\\n (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount) = popEligibleWithdrawalRequests(user, requests);\\n require(beforeUpgradeWithdrawalAmount > 0 || afterUpgradeWithdrawalAmount > 0, \\\"nothing to withdraw\\\");\\n\\n // Having both old-style and new-style requests is not allowed and shouldn't be possible\\n require(beforeUpgradeWithdrawalAmount == 0 || afterUpgradeWithdrawalAmount == 0, \\\"inconsistent state\\\");\\n\\n if (beforeUpgradeWithdrawalAmount > 0) {\\n _updatePool(_rewardToken, _pid);\\n uint256 pending = user.amount.mul(pool.accRewardPerShare).div(1e12).sub(user.rewardDebt);\\n XVSStore(xvsStore).safeRewardTransfer(_rewardToken, msg.sender, pending);\\n user.amount = user.amount.sub(beforeUpgradeWithdrawalAmount);\\n user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12);\\n pool.token.safeTransfer(address(msg.sender), beforeUpgradeWithdrawalAmount);\\n } else {\\n user.amount = user.amount.sub(afterUpgradeWithdrawalAmount);\\n totalPendingWithdrawals[_rewardToken][_pid] = totalPendingWithdrawals[_rewardToken][_pid].sub(\\n afterUpgradeWithdrawalAmount\\n );\\n pool.token.safeTransfer(address(msg.sender), afterUpgradeWithdrawalAmount);\\n }\\n\\n emit ExecutedWithdrawal(\\n msg.sender,\\n _rewardToken,\\n _pid,\\n beforeUpgradeWithdrawalAmount.add(afterUpgradeWithdrawalAmount)\\n );\\n }\\n\\n /**\\n * @notice Returns before and after upgrade pending withdrawal amount\\n * @param _requests The user's requests array storage pointer\\n * @return beforeUpgradeWithdrawalAmount The amount eligible for withdrawal before upgrade\\n * @return afterUpgradeWithdrawalAmount The amount eligible for withdrawal after upgrade\\n */\\n function getRequestedWithdrawalAmount(\\n WithdrawalRequest[] storage _requests\\n ) internal view returns (uint beforeUpgradeWithdrawalAmount, uint afterUpgradeWithdrawalAmount) {\\n for (uint i = _requests.length; i > 0; --i) {\\n if (_requests[i - 1].afterUpgrade == 1) {\\n afterUpgradeWithdrawalAmount = afterUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n } else {\\n beforeUpgradeWithdrawalAmount = beforeUpgradeWithdrawalAmount.add(_requests[i - 1].amount);\\n }\\n }\\n return (beforeUpgradeWithdrawalAmount, afterUpgradeWithdrawalAmount);\\n }\\n\\n /**\\n * @notice Request withdrawal to XVSVault for XVS allocation\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _amount The amount to withdraw from the vault\\n */\\n function requestWithdrawal(address _rewardToken, uint256 _pid, uint256 _amount) external nonReentrant isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n require(_amount > 0, \\\"requested amount cannot be zero\\\");\\n UserInfo storage user = userInfos[_rewardToken][_pid][msg.sender];\\n require(user.amount >= user.pendingWithdrawals.add(_amount), \\\"requested amount is invalid\\\");\\n\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][msg.sender];\\n\\n uint beforeUpgradeWithdrawalAmount;\\n\\n (beforeUpgradeWithdrawalAmount, ) = getRequestedWithdrawalAmount(requests);\\n require(beforeUpgradeWithdrawalAmount == 0, \\\"execute pending withdrawal\\\");\\n\\n _updatePool(_rewardToken, _pid);\\n uint256 pending = _computeReward(user, pool);\\n _transferReward(_rewardToken, msg.sender, pending);\\n\\n uint lockedUntil = pool.lockPeriod.add(block.timestamp);\\n\\n pushWithdrawalRequest(user, requests, _amount, lockedUntil);\\n totalPendingWithdrawals[_rewardToken][_pid] = totalPendingWithdrawals[_rewardToken][_pid].add(_amount);\\n user.rewardDebt = _cumulativeReward(user, pool);\\n\\n // Update Delegate Amount\\n if (address(pool.token) == xvsAddress) {\\n _moveDelegates(\\n delegates[msg.sender],\\n address(0),\\n safe96(_amount, \\\"XVSVault::requestWithdrawal: votes overflow\\\")\\n );\\n }\\n\\n if (primeRewardToken == _rewardToken && _pid == primePoolId) {\\n primeToken.xvsUpdated(msg.sender);\\n }\\n\\n emit Claim(msg.sender, _rewardToken, _pid, pending);\\n emit RequestedWithdrawal(msg.sender, _rewardToken, _pid, _amount);\\n }\\n\\n /**\\n * @notice Get unlocked withdrawal amount\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return withdrawalAmount Amount that the user can withdraw\\n */\\n function getEligibleWithdrawalAmount(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (uint withdrawalAmount) {\\n _ensureValidPool(_rewardToken, _pid);\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n // Since the requests are sorted by their unlock time, we can take\\n // the entries from the end of the array and stop at the first\\n // not-yet-eligible one\\n for (uint i = requests.length; i > 0 && isUnlocked(requests[i - 1]); --i) {\\n withdrawalAmount = withdrawalAmount.add(requests[i - 1].amount);\\n }\\n return withdrawalAmount;\\n }\\n\\n /**\\n * @notice Get requested amount\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return Total amount of requested but not yet executed withdrawals (including both executable and locked ones)\\n */\\n function getRequestedAmount(address _rewardToken, uint256 _pid, address _user) external view returns (uint256) {\\n _ensureValidPool(_rewardToken, _pid);\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n return user.pendingWithdrawals;\\n }\\n\\n /**\\n * @notice Returns the array of withdrawal requests that have not been executed yet\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The User Address\\n * @return An array of withdrawal requests\\n */\\n function getWithdrawalRequests(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (WithdrawalRequest[] memory) {\\n _ensureValidPool(_rewardToken, _pid);\\n return withdrawalRequests[_rewardToken][_pid][_user];\\n }\\n\\n /**\\n * @notice View function to see pending XVSs on frontend\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _user User address\\n * @return Reward the user is eligible for in this pool, in terms of _rewardToken\\n */\\n function pendingReward(address _rewardToken, uint256 _pid, address _user) external view returns (uint256) {\\n _ensureValidPool(_rewardToken, _pid);\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n uint256 accRewardPerShare = pool.accRewardPerShare;\\n uint256 supply = pool.token.balanceOf(address(this)).sub(totalPendingWithdrawals[_rewardToken][_pid]);\\n uint256 curBlockNumber = block.number;\\n uint256 rewardTokenPerBlock = rewardTokenAmountsPerBlock[_rewardToken];\\n if (curBlockNumber > pool.lastRewardBlock && supply != 0) {\\n uint256 multiplier = curBlockNumber.sub(pool.lastRewardBlock);\\n uint256 reward = multiplier.mul(rewardTokenPerBlock).mul(pool.allocPoint).div(\\n totalAllocPoints[_rewardToken]\\n );\\n accRewardPerShare = accRewardPerShare.add(reward.mul(1e12).div(supply));\\n }\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n (, uint256 afterUpgradeWithdrawalAmount) = getRequestedWithdrawalAmount(requests);\\n return user.amount.sub(afterUpgradeWithdrawalAmount).mul(accRewardPerShare).div(1e12).sub(user.rewardDebt);\\n }\\n\\n // Update reward variables for all pools. Be careful of gas spending!\\n function massUpdatePools(address _rewardToken) internal {\\n uint256 length = poolInfos[_rewardToken].length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n _updatePool(_rewardToken, pid);\\n }\\n }\\n\\n /**\\n * @notice Update reward variables of the given pool to be up-to-date\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n */\\n function updatePool(address _rewardToken, uint256 _pid) external isActive {\\n _ensureValidPool(_rewardToken, _pid);\\n _updatePool(_rewardToken, _pid);\\n }\\n\\n // Update reward variables of the given pool to be up-to-date.\\n function _updatePool(address _rewardToken, uint256 _pid) internal {\\n PoolInfo storage pool = poolInfos[_rewardToken][_pid];\\n if (block.number <= pool.lastRewardBlock) {\\n return;\\n }\\n uint256 supply = pool.token.balanceOf(address(this));\\n supply = supply.sub(totalPendingWithdrawals[_rewardToken][_pid]);\\n if (supply == 0) {\\n pool.lastRewardBlock = block.number;\\n return;\\n }\\n uint256 curBlockNumber = block.number;\\n uint256 multiplier = curBlockNumber.sub(pool.lastRewardBlock);\\n uint256 reward = multiplier.mul(rewardTokenAmountsPerBlock[_rewardToken]).mul(pool.allocPoint).div(\\n totalAllocPoints[_rewardToken]\\n );\\n pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(supply));\\n pool.lastRewardBlock = block.number;\\n }\\n\\n function _ensureValidPool(address rewardToken, uint256 pid) internal view {\\n require(pid < poolInfos[rewardToken].length, \\\"vault: pool exists?\\\");\\n }\\n\\n /**\\n * @notice Get user info with reward token address and pid\\n * @param _rewardToken Reward token address\\n * @param _pid Pool index\\n * @param _user User address\\n * @return amount Deposited amount\\n * @return rewardDebt Reward debt (technical value used to track past payouts)\\n * @return pendingWithdrawals Requested but not yet executed withdrawals\\n */\\n function getUserInfo(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) external view returns (uint256 amount, uint256 rewardDebt, uint256 pendingWithdrawals) {\\n _ensureValidPool(_rewardToken, _pid);\\n UserInfo storage user = userInfos[_rewardToken][_pid][_user];\\n amount = user.amount;\\n rewardDebt = user.rewardDebt;\\n pendingWithdrawals = user.pendingWithdrawals;\\n }\\n\\n /**\\n * @notice Gets the total pending withdrawal amount of a user before upgrade\\n * @param _rewardToken The Reward Token Address\\n * @param _pid The Pool Index\\n * @param _user The address of the user\\n * @return beforeUpgradeWithdrawalAmount Total pending withdrawal amount in requests made before the vault upgrade\\n */\\n function pendingWithdrawalsBeforeUpgrade(\\n address _rewardToken,\\n uint256 _pid,\\n address _user\\n ) public view returns (uint256 beforeUpgradeWithdrawalAmount) {\\n WithdrawalRequest[] storage requests = withdrawalRequests[_rewardToken][_pid][_user];\\n (beforeUpgradeWithdrawalAmount, ) = getRequestedWithdrawalAmount(requests);\\n return beforeUpgradeWithdrawalAmount;\\n }\\n\\n /**\\n * @notice Get the XVS stake balance of an account (excluding the pending withdrawals)\\n * @param account The address of the account to check\\n * @return The balance that user staked\\n */\\n function getStakeAmount(address account) internal view returns (uint96) {\\n require(xvsAddress != address(0), \\\"XVSVault::getStakeAmount: xvs address is not set\\\");\\n\\n PoolInfo[] storage poolInfo = poolInfos[xvsAddress];\\n\\n uint256 length = poolInfo.length;\\n for (uint256 pid = 0; pid < length; ++pid) {\\n if (address(poolInfo[pid].token) == address(xvsAddress)) {\\n UserInfo storage user = userInfos[xvsAddress][pid][account];\\n return safe96(user.amount.sub(user.pendingWithdrawals), \\\"XVSVault::getStakeAmount: votes overflow\\\");\\n }\\n }\\n return uint96(0);\\n }\\n\\n /**\\n * @notice Delegate votes from `msg.sender` to `delegatee`\\n * @param delegatee The address to delegate votes to\\n */\\n function delegate(address delegatee) external isActive {\\n return _delegate(msg.sender, delegatee);\\n }\\n\\n /**\\n * @notice Delegates votes from signatory to `delegatee`\\n * @param delegatee The address to delegate votes to\\n * @param nonce The contract state required to match the signature\\n * @param expiry The time at which to expire the signature\\n * @param v The recovery byte of the signature\\n * @param r Half of the ECDSA signature pair\\n * @param s Half of the ECDSA signature pair\\n */\\n function delegateBySig(\\n address delegatee,\\n uint nonce,\\n uint expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external isActive {\\n bytes32 domainSeparator = keccak256(\\n abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(\\\"XVSVault\\\")), getChainId(), address(this))\\n );\\n bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));\\n bytes32 digest = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n address signatory = ECDSA.recover(digest, v, r, s);\\n require(nonce == nonces[signatory]++, \\\"XVSVault::delegateBySig: invalid nonce\\\");\\n require(block.timestamp <= expiry, \\\"XVSVault::delegateBySig: signature expired\\\");\\n return _delegate(signatory, delegatee);\\n }\\n\\n /**\\n * @notice Gets the current votes balance for `account`\\n * @param account The address to get votes balance\\n * @return The number of current votes for `account`\\n */\\n function getCurrentVotes(address account) external view returns (uint96) {\\n uint32 nCheckpoints = numCheckpoints[account];\\n return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;\\n }\\n\\n function _delegate(address delegator, address delegatee) internal {\\n address currentDelegate = delegates[delegator];\\n uint96 delegatorBalance = getStakeAmount(delegator);\\n delegates[delegator] = delegatee;\\n\\n emit DelegateChangedV2(delegator, currentDelegate, delegatee);\\n\\n _moveDelegates(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {\\n if (srcRep != dstRep && amount > 0) {\\n if (srcRep != address(0)) {\\n uint32 srcRepNum = numCheckpoints[srcRep];\\n uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;\\n uint96 srcRepNew = sub96(srcRepOld, amount, \\\"XVSVault::_moveVotes: vote amount underflows\\\");\\n _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);\\n }\\n\\n if (dstRep != address(0)) {\\n uint32 dstRepNum = numCheckpoints[dstRep];\\n uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;\\n uint96 dstRepNew = add96(dstRepOld, amount, \\\"XVSVault::_moveVotes: vote amount overflows\\\");\\n _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {\\n uint32 blockNumber = safe32(block.number, \\\"XVSVault::_writeCheckpoint: block number exceeds 32 bits\\\");\\n\\n if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {\\n checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;\\n } else {\\n checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);\\n numCheckpoints[delegatee] = nCheckpoints + 1;\\n }\\n\\n emit DelegateVotesChangedV2(delegatee, oldVotes, newVotes);\\n }\\n\\n function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {\\n require(n < 2 ** 32, errorMessage);\\n return uint32(n);\\n }\\n\\n function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {\\n require(n < 2 ** 96, errorMessage);\\n return uint96(n);\\n }\\n\\n function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {\\n uint96 c = a + b;\\n require(c >= a, errorMessage);\\n return c;\\n }\\n\\n function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n function getChainId() internal pure returns (uint) {\\n uint256 chainId;\\n assembly {\\n chainId := chainid()\\n }\\n return chainId;\\n }\\n\\n /**\\n * @notice Determine the xvs stake balance for an account\\n * @param account The address of the account to check\\n * @param blockNumber The block number to get the vote balance at\\n * @return The balance that user staked\\n */\\n function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {\\n require(blockNumber < block.number, \\\"XVSVault::getPriorVotes: not yet determined\\\");\\n\\n uint32 nCheckpoints = numCheckpoints[account];\\n if (nCheckpoints == 0) {\\n return 0;\\n }\\n\\n // First check most recent balance\\n if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {\\n return checkpoints[account][nCheckpoints - 1].votes;\\n }\\n\\n // Next check implicit zero balance\\n if (checkpoints[account][0].fromBlock > blockNumber) {\\n return 0;\\n }\\n\\n uint32 lower = 0;\\n uint32 upper = nCheckpoints - 1;\\n while (upper > lower) {\\n uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow\\n Checkpoint memory cp = checkpoints[account][center];\\n if (cp.fromBlock == blockNumber) {\\n return cp.votes;\\n } else if (cp.fromBlock < blockNumber) {\\n lower = center;\\n } else {\\n upper = center - 1;\\n }\\n }\\n return checkpoints[account][lower].votes;\\n }\\n\\n /*** Admin Functions ***/\\n\\n function _become(XVSVaultProxy xvsVaultProxy) external {\\n require(msg.sender == xvsVaultProxy.admin(), \\\"only proxy admin can change brains\\\");\\n require(xvsVaultProxy._acceptImplementation() == 0, \\\"change not authorized\\\");\\n }\\n\\n function setXvsStore(address _xvs, address _xvsStore) external onlyAdmin {\\n _ensureNonzeroAddress(_xvs);\\n _ensureNonzeroAddress(_xvsStore);\\n\\n address oldXvsContract = xvsAddress;\\n address oldStore = xvsStore;\\n require(oldXvsContract == address(0), \\\"already initialized\\\");\\n\\n xvsAddress = _xvs;\\n xvsStore = _xvsStore;\\n\\n _notEntered = true;\\n\\n emit StoreUpdated(oldXvsContract, oldStore, _xvs, _xvsStore);\\n }\\n\\n /**\\n * @notice Sets the address of the prime token contract\\n * @param _primeToken address of the prime token contract\\n * @param _primeRewardToken address of reward token\\n * @param _primePoolId pool id for reward\\n */\\n function setPrimeToken(IPrime _primeToken, address _primeRewardToken, uint256 _primePoolId) external onlyAdmin {\\n require(address(_primeToken) != address(0), \\\"prime token cannot be zero address\\\");\\n require(_primeRewardToken != address(0), \\\"reward cannot be zero address\\\");\\n\\n _ensureValidPool(_primeRewardToken, _primePoolId);\\n\\n emit NewPrimeToken(primeToken, _primeToken, primeRewardToken, _primeRewardToken, primePoolId, _primePoolId);\\n\\n primeToken = _primeToken;\\n primeRewardToken = _primeRewardToken;\\n primePoolId = _primePoolId;\\n }\\n\\n /**\\n * @notice Sets the address of the access control of this contract\\n * @dev Admin function to set the access control address\\n * @param newAccessControlAddress New address for the access control\\n */\\n function setAccessControl(address newAccessControlAddress) external onlyAdmin {\\n _setAccessControlManager(newAccessControlAddress);\\n }\\n\\n /**\\n * @dev Reverts if the provided address is a zero address\\n * @param address_ Address to check\\n */\\n function _ensureNonzeroAddress(address address_) internal pure {\\n require(address_ != address(0), \\\"zero address not allowed\\\");\\n }\\n\\n /**\\n * @dev Transfers the reward to the user, taking into account the rewards store\\n * balance and the previous debt. If there are not enough rewards in the store,\\n * transfers the available funds and records the debt amount in pendingRewardTransfers.\\n * @param rewardToken Reward token address\\n * @param userAddress User address\\n * @param amount Reward amount, in reward tokens\\n */\\n function _transferReward(address rewardToken, address userAddress, uint256 amount) internal {\\n address xvsStore_ = xvsStore;\\n uint256 storeBalance = IBEP20(rewardToken).balanceOf(xvsStore_);\\n uint256 debtDueToFailedTransfers = pendingRewardTransfers[rewardToken][userAddress];\\n uint256 fullAmount = amount.add(debtDueToFailedTransfers);\\n\\n if (fullAmount <= storeBalance) {\\n if (debtDueToFailedTransfers != 0) {\\n pendingRewardTransfers[rewardToken][userAddress] = 0;\\n emit VaultDebtUpdated(rewardToken, userAddress, debtDueToFailedTransfers, 0);\\n }\\n XVSStore(xvsStore_).safeRewardTransfer(rewardToken, userAddress, fullAmount);\\n return;\\n }\\n // Overflow isn't possible due to the check above\\n uint256 newOwedAmount = fullAmount - storeBalance;\\n pendingRewardTransfers[rewardToken][userAddress] = newOwedAmount;\\n emit VaultDebtUpdated(rewardToken, userAddress, debtDueToFailedTransfers, newOwedAmount);\\n XVSStore(xvsStore_).safeRewardTransfer(rewardToken, userAddress, storeBalance);\\n }\\n\\n /**\\n * @dev Computes cumulative reward for all user's shares\\n * @param user UserInfo storage struct\\n * @param pool PoolInfo storage struct\\n */\\n function _cumulativeReward(UserInfo storage user, PoolInfo storage pool) internal view returns (uint256) {\\n return user.amount.sub(user.pendingWithdrawals).mul(pool.accRewardPerShare).div(1e12);\\n }\\n\\n /**\\n * @dev Computes the reward for all user's shares\\n * @param user UserInfo storage struct\\n * @param pool PoolInfo storage struct\\n */\\n function _computeReward(UserInfo storage user, PoolInfo storage pool) internal view returns (uint256) {\\n return _cumulativeReward(user, pool).sub(user.rewardDebt);\\n }\\n}\\n\",\"keccak256\":\"0xdd9ab5b2392ef97f571c57b7dea203ade0598bd5609ee9bce7b9f8c01f42805f\"},\"contracts/XVSVault/XVSVaultErrorReporter.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\ncontract XVSVaultErrorReporter {\\n enum Error {\\n NO_ERROR,\\n UNAUTHORIZED\\n }\\n\\n enum FailureInfo {\\n ACCEPT_ADMIN_PENDING_ADMIN_CHECK,\\n ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK,\\n SET_PENDING_ADMIN_OWNER_CHECK,\\n SET_PENDING_IMPLEMENTATION_OWNER_CHECK\\n }\\n\\n /**\\n * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary\\n * contract-specific code that enables us to report opaque error codes from upgradeable contracts.\\n **/\\n event Failure(uint error, uint info, uint detail);\\n\\n /**\\n * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator\\n */\\n function fail(Error err, FailureInfo info) internal returns (uint) {\\n emit Failure(uint(err), uint(info), 0);\\n\\n return uint(err);\\n }\\n\\n /**\\n * @dev use this when reporting an opaque error from an upgradeable collaborator contract\\n */\\n function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {\\n emit Failure(uint(err), uint(info), opaqueError);\\n\\n return uint(err);\\n }\\n}\\n\",\"keccak256\":\"0xa79877a281d024f0d03dbf1842a36a972ee6c1aa36ba93e3d646726d40684a26\"},\"contracts/XVSVault/XVSVaultProxy.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\nimport \\\"./XVSVaultStorage.sol\\\";\\nimport \\\"./XVSVaultErrorReporter.sol\\\";\\n\\n/**\\n * @title XVS Vault Proxy\\n * @author Venus\\n * @notice XVS Vault Proxy contract\\n */\\ncontract XVSVaultProxy is XVSVaultAdminStorage, XVSVaultErrorReporter {\\n /**\\n * @notice Emitted when pendingXVSVaultImplementation is changed\\n */\\n event NewPendingImplementation(address oldPendingImplementation, address newPendingImplementation);\\n\\n /**\\n * @notice Emitted when pendingXVSVaultImplementation is accepted, which means XVS Vault implementation is updated\\n */\\n event NewImplementation(address oldImplementation, address newImplementation);\\n\\n /**\\n * @notice Emitted when pendingAdmin is changed\\n */\\n event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);\\n\\n /**\\n * @notice Emitted when pendingAdmin is accepted, which means admin is updated\\n */\\n event NewAdmin(address oldAdmin, address newAdmin);\\n\\n constructor() public {\\n // Set admin to caller\\n admin = msg.sender;\\n }\\n\\n /*** Admin Functions ***/\\n function _setPendingImplementation(address newPendingImplementation) public returns (uint) {\\n if (msg.sender != admin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_IMPLEMENTATION_OWNER_CHECK);\\n }\\n\\n address oldPendingImplementation = pendingXVSVaultImplementation;\\n\\n pendingXVSVaultImplementation = newPendingImplementation;\\n\\n emit NewPendingImplementation(oldPendingImplementation, pendingXVSVaultImplementation);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Accepts new implementation of XVS Vault. msg.sender must be pendingImplementation\\n * @dev Admin function for new implementation to accept it's role as implementation\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _acceptImplementation() public returns (uint) {\\n // Check caller is pendingImplementation\\n if (msg.sender != pendingXVSVaultImplementation) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK);\\n }\\n\\n // Save current values for inclusion in log\\n address oldImplementation = implementation;\\n address oldPendingImplementation = pendingXVSVaultImplementation;\\n\\n implementation = pendingXVSVaultImplementation;\\n\\n pendingXVSVaultImplementation = address(0);\\n\\n emit NewImplementation(oldImplementation, implementation);\\n emit NewPendingImplementation(oldPendingImplementation, pendingXVSVaultImplementation);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.\\n * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.\\n * @param newPendingAdmin New pending admin.\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _setPendingAdmin(address newPendingAdmin) public returns (uint) {\\n // Check caller = admin\\n if (msg.sender != admin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK);\\n }\\n\\n // Save current value, if any, for inclusion in log\\n address oldPendingAdmin = pendingAdmin;\\n\\n // Store pendingAdmin with value newPendingAdmin\\n pendingAdmin = newPendingAdmin;\\n\\n // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin)\\n emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin\\n * @dev Admin function for pending admin to accept role and update admin\\n * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details)\\n */\\n function _acceptAdmin() public returns (uint) {\\n // Check caller is pendingAdmin\\n if (msg.sender != pendingAdmin) {\\n return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK);\\n }\\n\\n // Save current values for inclusion in log\\n address oldAdmin = admin;\\n address oldPendingAdmin = pendingAdmin;\\n\\n // Store admin with value pendingAdmin\\n admin = pendingAdmin;\\n\\n // Clear the pending value\\n pendingAdmin = address(0);\\n\\n emit NewAdmin(oldAdmin, admin);\\n emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);\\n\\n return uint(Error.NO_ERROR);\\n }\\n\\n /**\\n * @dev Delegates execution to an implementation contract.\\n * It returns to the external caller whatever the implementation returns\\n * or forwards reverts.\\n */\\n function() external payable {\\n // delegate all other functions to current implementation\\n (bool success, ) = implementation.delegatecall(msg.data);\\n\\n assembly {\\n let free_mem_ptr := mload(0x40)\\n returndatacopy(free_mem_ptr, 0, returndatasize)\\n\\n switch success\\n case 0 {\\n revert(free_mem_ptr, returndatasize)\\n }\\n default {\\n return(free_mem_ptr, returndatasize)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb39af917833659fe38f2f76924deda420babed8259b27741dc6cb402ade4d124\"},\"contracts/XVSVault/XVSVaultStorage.sol\":{\"content\":\"pragma solidity ^0.5.16;\\n\\nimport \\\"../Utils/SafeMath.sol\\\";\\nimport \\\"../Utils/IBEP20.sol\\\";\\nimport \\\"../Tokens/Prime/IPrime.sol\\\";\\n\\ncontract XVSVaultAdminStorage {\\n /**\\n * @notice Administrator for this contract\\n */\\n address public admin;\\n\\n /**\\n * @notice Pending administrator for this contract\\n */\\n address public pendingAdmin;\\n\\n /**\\n * @notice Active brains of XVS Vault\\n */\\n address public implementation;\\n\\n /**\\n * @notice Pending brains of XVS Vault\\n */\\n address public pendingXVSVaultImplementation;\\n}\\n\\ncontract XVSVaultStorageV1 is XVSVaultAdminStorage {\\n /// @notice Guard variable for re-entrancy checks\\n bool internal _notEntered;\\n\\n /// @notice The reward token store\\n address public xvsStore;\\n\\n /// @notice The xvs token address\\n address public xvsAddress;\\n\\n // Reward tokens created per block indentified by reward token address.\\n mapping(address => uint256) public rewardTokenAmountsPerBlock;\\n\\n /// @notice Info of each user.\\n struct UserInfo {\\n uint256 amount;\\n uint256 rewardDebt;\\n uint256 pendingWithdrawals;\\n }\\n\\n // Info of each pool.\\n struct PoolInfo {\\n IBEP20 token; // Address of token contract to stake.\\n uint256 allocPoint; // How many allocation points assigned to this pool.\\n uint256 lastRewardBlock; // Last block number that reward tokens distribution occurs.\\n uint256 accRewardPerShare; // Accumulated per share, times 1e12. See below.\\n uint256 lockPeriod; // Min time between withdrawal request and its execution.\\n }\\n\\n // Infomation about a withdrawal request\\n struct WithdrawalRequest {\\n uint256 amount;\\n uint128 lockedUntil;\\n uint128 afterUpgrade;\\n }\\n\\n // Info of each user that stakes tokens.\\n mapping(address => mapping(uint256 => mapping(address => UserInfo))) internal userInfos;\\n\\n // Info of each pool.\\n mapping(address => PoolInfo[]) public poolInfos;\\n\\n // Total allocation points. Must be the sum of all allocation points in all pools.\\n mapping(address => uint256) public totalAllocPoints;\\n\\n // Info of requested but not yet executed withdrawals\\n mapping(address => mapping(uint256 => mapping(address => WithdrawalRequest[]))) internal withdrawalRequests;\\n\\n /// @notice DEPRECATED A record of each accounts delegate (before the voting power fix)\\n mapping(address => address) private __oldDelegatesSlot;\\n\\n /// @notice A checkpoint for marking number of votes from a given block\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint96 votes;\\n }\\n\\n /// @notice DEPRECATED A record of votes checkpoints for each account, by index (before the voting power fix)\\n mapping(address => mapping(uint32 => Checkpoint)) private __oldCheckpointsSlot;\\n\\n /// @notice DEPRECATED The number of checkpoints for each account (before the voting power fix)\\n mapping(address => uint32) private __oldNumCheckpointsSlot;\\n\\n /// @notice A record of states for signing / validating signatures\\n mapping(address => uint) public nonces;\\n\\n /// @notice The EIP-712 typehash for the contract's domain\\n bytes32 public constant DOMAIN_TYPEHASH =\\n keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n\\n /// @notice The EIP-712 typehash for the delegation struct used by the contract\\n bytes32 public constant DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n}\\n\\ncontract XVSVaultStorage is XVSVaultStorageV1 {\\n /// @notice A record of each accounts delegate\\n mapping(address => address) public delegates;\\n\\n /// @notice A record of votes checkpoints for each account, by index\\n mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;\\n\\n /// @notice The number of checkpoints for each account\\n mapping(address => uint32) public numCheckpoints;\\n\\n /// @notice Tracks pending withdrawals for all users for a particular reward token and pool id\\n mapping(address => mapping(uint256 => uint256)) internal totalPendingWithdrawals;\\n\\n /// @notice pause indicator for Vault\\n bool public vaultPaused;\\n\\n /// @notice if the token is added to any of the pools\\n mapping(address => bool) public isStakedToken;\\n\\n /// @notice Amount we owe to users because of failed transfer attempts\\n mapping(address => mapping(address => uint256)) public pendingRewardTransfers;\\n\\n /// @notice Prime token contract address\\n IPrime public primeToken;\\n\\n /// @notice Reward token for which prime token is issued for staking\\n address public primeRewardToken;\\n\\n /// @notice Pool ID for which prime token is issued for staking\\n uint256 public primePoolId;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[46] private __gap;\\n}\\n\",\"keccak256\":\"0x6389c160d86eab54ce1a8a5138c39f38d858381b7d8881d146cd937feab3dac9\"}},\"version\":1}",
|
|
1573
|
+
"bytecode": "0x608060405234801561001057600080fd5b50600080546001600160a01b031916331790556153a6806100326000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638456cb5911610182578063c2102596116100e9578063e7a324dc116100a2578063f55401621161007c578063f55401621461061c578063f851a44014610624578063fba1b1f91461062c578063fe5a451a1461063f576102bb565b8063e7a324dc146105eb578063e8f2be6f146105f3578063f1127ed8146105fb576102bb565b8063c210259614610577578063c3c754a814610597578063c3cda520146105aa578063d7ae45e2146105bd578063dae66bbe146105d0578063de0368b2146105e3576102bb565b80639e2b6c4d1161013b5780639e2b6c4d1461050e578063a09eab7a14610521578063a9d69a6914610534578063add8933714610547578063b4a0bdf31461054f578063b4b5ea5714610564576102bb565b80638456cb59146104875780638ed7333d1461048f57806392e35000146104a257806393c7c4d1146104c657806398e1b31b146104d9578063996cba68146104fb576102bb565b80634298bdbd116102265780636fcfff45116101df5780636fcfff45146103f957806373d025d614610419578063782d6fe11461042e5780637ac924561461044e5780637ecebe00146104615780638308d7e914610474576102bb565b80634298bdbd14610392578063587cde1e146103a55780635c19a95c146103b85780635c60da1b146103cb5780635ff56315146103d35780636dd77cbd146103e6576102bb565b806320606b701161027857806320606b701461033f57806324f52bbf14610347578063267822471461035c5780632eda5c6c14610364578063358ae036146103775780633d4180f91461037f576102bb565b8063046f7da2146102c05780630af13728146102ca5780630efe6a8b146102f3578063115b512f1461030657806319129e5a146103195780631d504dc61461032c575b600080fd5b6102c8610647565b005b6102dd6102d8366004613de7565b6106d2565b6040516102ea9190614d0d565b60405180910390f35b6102c8610301366004613e9f565b610718565b6102c8610314366004613e9f565b610a0d565b6102c8610327366004613cf4565b610dc1565b6102c861033a366004613fc7565b610df7565b6102dd610f28565b61034f610f3f565b6040516102ea9190614bab565b61034f610f4e565b6102dd610372366004613cf4565b610f5d565b61034f610f6f565b6102dd61038d366004613d30565b610f7e565b6102dd6103a0366004613cf4565b610f9b565b61034f6103b3366004613cf4565b610fad565b6102c86103c6366004613cf4565b610fc8565b61034f610ff5565b6102c86103e1366004613d30565b611004565b6102dd6103f4366004613de7565b6110f8565b61040c610407366004613cf4565b6111ad565b6040516102ea919061508b565b6104216111c5565b6040516102ea9190614cff565b61044161043c366004613db7565b6111ce565b6040516102ea91906150b4565b6102c861045c366004613db7565b6113dd565b6102dd61046f366004613cf4565b611726565b6102c8610482366004613e9f565b611738565b6102c86118de565b6102c861049d366004613db7565b611963565b6104b56104b0366004613db7565b61199e565b6040516102ea959493929190614d7a565b6102c86104d4366004613db7565b6119f3565b6104ec6104e7366004613de7565b611b19565b6040516102ea93929190615070565b6102c8610509366004613d6a565b611b6b565b6102c861051c366004613e9f565b611cfd565b6102dd61052f366004613de7565b611de8565b6102dd610542366004613de7565b61202d565b61034f61206f565b61055761207e565b6040516102ea9190614d6c565b610441610572366004613cf4565b61208d565b61058a610585366004613de7565b612100565b6040516102ea9190614cee565b6104216105a5366004613cf4565b6121ba565b6102c86105b8366004613ed1565b6121cf565b6102dd6105cb366004613cf4565b612373565b6102c86105de366004613fa6565b61238e565b61034f61249a565b6102dd6124a9565b6102dd6124b5565b61060e610609366004613f58565b6124bb565b6040516102ea929190615099565b6102dd6124f0565b61034f6124f8565b6102c861063a366004613e2a565b612507565b6105576127d3565b61067060405180604001604052806008815260200167726573756d65282960c01b8152506127e2565b60135460ff1661069b5760405162461bcd60e51b815260040161069290614e37565b60405180910390fd5b6013805460ff1916905560405133907fd2619572a1464e0df0bb351d834fd47f3350984d7bfdb1ab69cfcb0b8e42141590600090a2565b60006106de8484612884565b506001600160a01b0380841660009081526007602090815260408083208684528252808320938516835292905220600201545b9392505050565b600354600160a01b900460ff166107415760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156107715760405162461bcd60e51b815260040161069290614e27565b61077b8383612884565b6001600160a01b038316600090815260086020526040812080548490811061079f57fe5b600091825260208083206001600160a01b038816845260078252604080852088865283528085203386529092529220600590910290910191506107e285856128bb565b6107ed85853361202d565b1561080a5760405162461bcd60e51b815260040161069290614f37565b80541561087f57600061081d8284612a76565b9050801561087d57610830863383612a8a565b84866001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645846040516108749190614d0d565b60405180910390a45b505b815461089c906001600160a01b031633308663ffffffff612d0316565b80546108ae908463ffffffff612d6416565b81556108ba8183612da6565b600182015560055482546001600160a01b039081169116141561092157336000908152600f6020908152604080832054815160608101909252602180835261092194936001600160a01b039092169261091c9289929061525890830139612dd4565b612e03565b6017546001600160a01b03868116911614801561093f575060185484145b156109a7576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610974903390600401614bb9565b600060405180830381600087803b15801561098e57600080fd5b505af11580156109a2573d6000803e3d6000fd5b505050505b83856001600160a01b0316336001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7866040516109eb9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b179055505050565b600354600160a01b900460ff16610a365760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615610a665760405162461bcd60e51b815260040161069290614e27565b610a708383612884565b60008111610a905760405162461bcd60e51b815260040161069290614f57565b6001600160a01b0383166000908152600760209081526040808320858452825280832033845290915290206002810154610ad0908363ffffffff612d6416565b81541015610af05760405162461bcd60e51b815260040161069290615017565b6001600160a01b0384166000908152600860205260408120805485908110610b1457fe5b600091825260208083206001600160a01b0389168452600a825260408085208986528352808520338652909252908320600590920201925090610b5682612f95565b5090508015610b775760405162461bcd60e51b815260040161069290614f37565b610b8187876128bb565b6000610b8d8585612a76565b9050610b9a883383612a8a565b6004840154600090610bb2904263ffffffff612d6416565b9050610bc086858984613039565b6001600160a01b03891660009081526012602090815260408083208b8452909152902054610bf4908863ffffffff612d6416565b6001600160a01b038a1660009081526012602090815260408083208c8452909152902055610c228686612da6565b600187015560055485546001600160a01b0390811691161415610c8557336000908152600f6020908152604080832054815160608101909252602b808352610c85946001600160a01b0390921693919261091c928d929061520590830139612dd4565b6017546001600160a01b038a81169116148015610ca3575060185488145b15610d0b576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610cd8903390600401614bb9565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b505050505b87896001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464585604051610d4f9190614d0d565b60405180910390a487896001600160a01b0316336001600160a01b03167f88a254a0ef28a0b9e957ff600beae69870f6f924065147f3627c3f814e60ec118a604051610d9b9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b17905550505050505050565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161069290614fa7565b610df48161321d565b50565b806001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3057600080fd5b505afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e689190810190613d12565b6001600160a01b0316336001600160a01b031614610e985760405162461bcd60e51b815260040161069290615027565b806001600160a01b031663c1e803346040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f0b9190810190613fe5565b15610df45760405162461bcd60e51b815260040161069290614fb7565b604051610f3490614b95565b604051809103902081565b6004546001600160a01b031681565b6001546001600160a01b031681565b60066020526000908152604090205481565b6005546001600160a01b031681565b601560209081526000928352604080842090915290825290205481565b60096020526000908152604090205481565b600f602052600090815260409020546001600160a01b031681565b60135460ff1615610feb5760405162461bcd60e51b815260040161069290614e27565b610df433826132a2565b6002546001600160a01b031681565b6000546001600160a01b0316331461102e5760405162461bcd60e51b815260040161069290614fa7565b61103782613331565b61104081613331565b6005546004546001600160a01b03918216911681156110715760405162461bcd60e51b815260040161069290614ef7565b600580546001600160a01b038087166001600160a01b03199283161790925560048054928616929091169190911790556003805460ff60a01b1916600160a01b1790556040517f559f314bb90394a4a9ceb724f365b36a53587d894352c43d12901fd680101456906110ea908490849088908890614c2a565b60405180910390a150505050565b60006111048484612884565b6001600160a01b038085166000908152600a60209081526040808320878452825280832093861683529290522080545b600081118015611164575061116482600183038154811061115157fe5b9060005260206000209060020201613357565b156111a45761119982600183038154811061117b57fe5b6000918252602090912060029091020154849063ffffffff612d6416565b925060001901611134565b50509392505050565b60116020526000908152604090205463ffffffff1681565b60135460ff1681565b60004382106111ef5760405162461bcd60e51b815260040161069290614f07565b6001600160a01b03831660009081526011602052604090205463ffffffff168061121d5760009150506113d7565b6001600160a01b038416600090815260106020908152604080832063ffffffff600019860181168552925290912054168310611299576001600160a01b03841660009081526010602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506113d7565b6001600160a01b038416600090815260106020908152604080832083805290915290205463ffffffff168310156112d45760009150506113d7565b600060001982015b8163ffffffff168163ffffffff16111561139757600282820363ffffffff16048103611306613c85565b506001600160a01b038716600090815260106020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415611372576020015194506113d79350505050565b805163ffffffff1687111561138957819350611390565b6001820392505b50506112dc565b506001600160a01b038516600090815260106020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b600354600160a01b900460ff166114065760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156114365760405162461bcd60e51b815260040161069290614e27565b6114408282612884565b6001600160a01b038216600090815260086020526040812080548390811061146457fe5b600091825260208083206001600160a01b038716808552600783526040808620888752845280862033808852908552818720928752600a85528187208988528552818720908752909352918420600590930201935091806114c5848461336c565b9092509050811515806114d85750600081115b6114f45760405162461bcd60e51b815260040161069290614fc7565b8115806114ff575080155b61151b5760405162461bcd60e51b815260040161069290614de7565b81156116345761152b87876128bb565b6000611571856001015461156564e8d4a510006115598a600301548a6000015461346390919063ffffffff16565b9063ffffffff61349d16565b9063ffffffff6134df16565b6004805460405163135b33cd60e31b81529293506001600160a01b031691639ad99e68916115a5918c913391879101614c02565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505086546115ea925090508463ffffffff6134df16565b808655600387015461160d9164e8d4a5100091611559919063ffffffff61346316565b6001860155855461162e906001600160a01b0316338563ffffffff61352116565b506116b8565b8354611646908263ffffffff6134df16565b84556001600160a01b038716600090815260126020908152604080832089845290915290205461167c908263ffffffff6134df16565b6001600160a01b0380891660009081526012602090815260408083208b845290915290209190915585546116b89116338363ffffffff61352116565b856001600160a01b038816337fe31da05fae6db869f5ea51f4b638aa6884070b6c87f18f63bd2291a12cb2f5186116f5868663ffffffff612d6416565b6040516117029190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b1790555050505050565b600e6020526000908152604090205481565b6117766040518060400160405280601c81526020017f73657428616464726573732c75696e743235362c75696e7432353629000000008152506127e2565b6117808383612884565b61178983613543565b6001600160a01b038316600090815260086020526040812080549091906118029084906117f6908590889081106117bc57fe5b60009182526020808320600160059093020191909101546001600160a01b038b16835260099091526040909120549063ffffffff6134df16565b9063ffffffff612d6416565b9050600081116118245760405162461bcd60e51b815260040161069290615037565b600082858154811061183257fe5b90600052602060002090600502016001015490508383868154811061185357fe5b9060005260206000209060050201600101819055508160096000886001600160a01b03166001600160a01b031681526020019081526020016000208190555084866001600160a01b03167f6ee09c6cb801194690c195c69f465aaf7c80255cbeafaab9600f47ed79de2ca983876040516118ce929190615062565b60405180910390a3505050505050565b611906604051806040016040528060078152602001667061757365282960c81b8152506127e2565b60135460ff16156119295760405162461bcd60e51b815260040161069290614eb7565b6013805460ff1916600117905560405133907fdffada2889ebfab9224c24069d833f3de835d8cf99872d49e7b7ba5fccb7a46f90600090a2565b60135460ff16156119865760405162461bcd60e51b815260040161069290614e27565b6119908282612884565b61199a82826128bb565b5050565b600860205281600052604060002081815481106119b757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b611a146040518060600160405280602881526020016152b1602891396127e2565b60048054604051633d6ac5b360e21b81526001600160a01b039091169163f5ab16cc91611a4391869101614bab565b60206040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a939190810190613f88565b611aaf5760405162461bcd60e51b815260040161069290614f97565b611ab882613543565b6001600160a01b0382166000818152600660205260409081902080549084905590519091907fad96cee0d692f0250b98e085504f399da6733854908215f6203fe3c69366d9f590611b0c9084908690615062565b60405180910390a2505050565b6000806000611b288686612884565b5050506001600160a01b03928316600090815260076020908152604080832094835293815283822092909416815292529020805460018201546002909201549092565b600354600160a01b900460ff16611b945760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615611bc45760405162461bcd60e51b815260040161069290614e27565b611bce8282612884565b6001600160a01b0382166000908152600860205260408120805483908110611bf257fe5b600091825260208083206001600160a01b0380881685526007835260408086208887528452808620918a1686529252922060059091029091019150611c3784846128bb565b611c4284848761202d565b15611c5f5760405162461bcd60e51b815260040161069290614f37565b805415611ce3576000611c728284612a76565b90508015611ce157611c848284612da6565b6001830155611c94858783612a8a565b83856001600160a01b0316876001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464584604051611cd89190614d0d565b60405180910390a45b505b50506003805460ff60a01b1916600160a01b179055505050565b611d1e6040518060600160405280603381526020016152d9603391396127e2565b611d288383612884565b600081118015611d3b57506312cc030081105b611d575760405162461bcd60e51b815260040161069290614fd7565b6001600160a01b0383166000908152600860205260408120805484908110611d7b57fe5b9060005260206000209060050201905060008160040154905082826004018190555083856001600160a01b03167f0bcf80c5060ccf99b7a993c57a94b232fc2c5c04bd74c7c7d174595fee6bc31f8386604051611dd9929190615062565b60405180910390a35050505050565b6000611df48484612884565b6001600160a01b0384166000908152600860205260408120805485908110611e1857fe5b600091825260208083206001600160a01b03808a168086526007845260408087208b885285528087208a8416885285528087206003600590970290940195860154918752601285528087208b885290945283862054855494516370a0823160e01b8152959750929590949093611eef939216906370a0823190611e9f903090600401614bab565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115659190810190613fe5565b6001600160a01b0389166000908152600660205260409020546002860154919250439182118015611f1f57508215155b15611fb5576000611f3d8760020154846134df90919063ffffffff16565b6001600160a01b038c1660009081526009602052604081205460018a01549293509091611f85919061155990611f79868863ffffffff61346316565b9063ffffffff61346316565b9050611fb0611fa3866115598464e8d4a5100063ffffffff61346316565b879063ffffffff612d6416565b955050505b6001600160a01b03808b166000908152600a602090815260408083208d84528252808320938c16835292905290812090611fee82612f95565b91505061201d876001015461156564e8d4a510006115598a611f79878e600001546134df90919063ffffffff16565b9c9b505050505050505050505050565b6001600160a01b038084166000908152600a602090815260408083208684528252808320938516835292905290812061206581612f95565b5095945050505050565b6017546001600160a01b031681565b6047546001600160a01b031690565b6001600160a01b03811660009081526011602052604081205463ffffffff16806120b85760006120f7565b6001600160a01b0383166000908152601060209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9150505b919050565b606061210c8484612884565b6001600160a01b038085166000908152600a602090815260408083208784528252808320938616835292815282822080548451818402810184019095528085529092909184015b828210156121ad5760008481526020908190206040805160608101825260028602909201805483526001908101546001600160801b0380821685870152600160801b90910416918301919091529083529092019101612153565b5050505090509392505050565b60146020526000908152604090205460ff1681565b60135460ff16156121f25760405162461bcd60e51b815260040161069290614e27565b600060405161220090614b95565b604080519182900382208282019091526008825267161594d5985d5b1d60c21b6020909201919091527fddfcc46608a8bd52ebf900f03a24cc97b73a6046cec8c5d0f74a211e376e967a612252613578565b306040516020016122669493929190614d29565b604051602081830303815290604052805190602001209050600060405161228c90614ba0565b6040519081900381206122a7918a908a908a90602001614d1b565b604051602081830303815290604052805190602001209050600082826040516020016122d4929190614b64565b60405160208183030381529060405280519060200120905060006122fa8288888861357c565b6001600160a01b0381166000908152600e60205260409020805460018101909155909150891461233c5760405162461bcd60e51b815260040161069290614e97565b8742111561235c5760405162461bcd60e51b815260040161069290614e77565b612366818b6132a2565b505050505b505050505050565b6001600160a01b031660009081526008602052604090205490565b6000546001600160a01b031633146123b85760405162461bcd60e51b815260040161069290614fa7565b6001600160a01b0383166123de5760405162461bcd60e51b815260040161069290614e87565b6001600160a01b0382166124045760405162461bcd60e51b815260040161069290614f17565b61240e8282612884565b6016546017546018546040516001600160a01b03808816948116937f8def9436d6e31b89ed00948ba91d0cb6936eada5154cb1b45b55683fb9e492379361245d93919092169188918890614c83565b60405180910390a3601680546001600160a01b039485166001600160a01b0319918216179091556017805493909416921691909117909155601855565b6003546001600160a01b031681565b604051610f3490614ba0565b60185481565b601060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6312cc030081565b6000546001600160a01b031681565b6125286040518060600160405280602c8152602001615338602c91396127e2565b61253185613331565b61253a83613331565b6004546001600160a01b03166125625760405162461bcd60e51b815260040161069290614e07565b600084116125825760405162461bcd60e51b815260040161069290614fe7565b61258b85613543565b6001600160a01b0385166000908152600860205260408120805490915b8181101561260657856001600160a01b03168382815481106125c657fe5b60009182526020909120600590910201546001600160a01b031614156125fe5760405162461bcd60e51b815260040161069290614f77565b6001016125a8565b506001600160a01b03851660009081526014602052604090205460ff16156126405760405162461bcd60e51b815260040161069290614ee7565b6001600160a01b038716600090815260096020526040902054612669908763ffffffff612d6416565b6001600160a01b0388811660009081526009602090815260408083209490945560068152838220889055835160a0810185528984168082528183018c81524383880190815260608401868152608085018c81528b5460018082018e558d8a52888a209751600590920290970180546001600160a01b031916918b169190911781559351848701559151600284015551600383015551600491820155908452601490925291849020805460ff1916831790558054935163fb66fb4d60e01b8152939092169263fb66fb4d92612741928c92909101614cb8565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b50505050846001600160a01b03166001838054905003886001600160a01b03167fd7fa4bff1cd2253c0789c3291a786a6f6b1a3b4569a75af683a15d52abb6a0bf8988886040516127c293929190615070565b60405180910390a450505050505050565b6016546001600160a01b031681565b6047546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab906128159033908690600401614bc7565b60206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128659190810190613f88565b90508061199a5760405162461bcd60e51b815260040161069290614e47565b6001600160a01b038216600090815260086020526040902054811061199a5760405162461bcd60e51b815260040161069290614df7565b6001600160a01b03821660009081526008602052604081208054839081106128df57fe5b9060005260206000209060050201905080600201544311612900575061199a565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612930903090600401614bab565b60206040518083038186803b15801561294857600080fd5b505afa15801561295c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129809190810190613fe5565b6001600160a01b03851660009081526012602090815260408083208784529091529020549091506129b890829063ffffffff6134df16565b9050806129cc57504360029091015561199a565b600282015443906000906129e790839063ffffffff6134df16565b6001600160a01b03871660009081526009602090815260408083205460018901546006909352908320549394509192612a30929161155991611f7990879063ffffffff61346316565b9050612a5f612a4e856115598464e8d4a5100063ffffffff61346316565b60038701549063ffffffff612d6416565b600386015550504360029093019290925550505050565b600061071183600101546115658585612da6565b600480546040516370a0823160e01b81526001600160a01b03918216926000928716916370a0823191612abf91869101614bab565b60206040518083038186803b158015612ad757600080fd5b505afa158015612aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0f9190810190613fe5565b6001600160a01b038087166000908152601560209081526040808320938916835292905290812054919250612b4a858363ffffffff612d6416565b9050828111612c28578115612bbd576001600160a01b038088166000818152601560209081526040808320948b1680845294909152808220829055517f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216091612bb491879190615047565b60405180910390a35b60405163135b33cd60e31b81526001600160a01b03851690639ad99e6890612bed908a908a908690600401614c68565b600060405180830381600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b5050505050505050612cfe565b6001600160a01b038088166000818152601560209081526040808320948b168084529490915290819020868503908190559051909291907f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216090612c8e9087908690615062565b60405180910390a360405163135b33cd60e31b81526001600160a01b03861690639ad99e6890612cc6908b908b908990600401614c68565b600060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b5050505050505050505b505050565b604051612d5e9085906323b872dd60e01b90612d2790879087908790602401614c68565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135a6565b50505050565b600061071183836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525061368b565b600061071164e8d4a510006115598460030154611f79876002015488600001546134df90919063ffffffff16565b600081600160601b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b509192915050565b816001600160a01b0316836001600160a01b031614158015612e2e57506000816001600160601b0316115b15612cfe576001600160a01b03831615612ee6576001600160a01b03831660009081526011602052604081205463ffffffff169081612e6e576000612ead565b6001600160a01b0385166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612ed482856040518060600160405280602c815260200161530c602c91396136bb565b9050612ee2868484846136fa565b5050505b6001600160a01b03821615612cfe576001600160a01b03821660009081526011602052604081205463ffffffff169081612f21576000612f60565b6001600160a01b0384166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612f8782856040518060600160405280602b81526020016151da602b91396138af565b905061236b858484846136fa565b805460009081905b801561303357836001820381548110612fb257fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156130155761300e846001830381548110612ff057fe5b6000918252602090912060029091020154839063ffffffff612d6416565b915061302a565b61302784600183038154811061117b57fe5b92505b60001901612f9d565b50915091565b8254604080516060810182526000808252602080830182815260019484018581528587018a5589845291909220925160028602909301928355905191909201805492516001600160801b03908116600160801b029281166001600160801b0319909416939093179092161790555b6000811180156130e25750818460018303815481106130c257fe5b60009182526020909120600160029092020101546001600160801b031611155b15613169578360018203815481106130f657fe5b906000526020600020906002020184828154811061311057fe5b600091825260209091208254600290920201908155600191820180549290910180546001600160801b0319166001600160801b03938416178082559154600160801b9081900484160291909216179055600019016130a7565b6040518060600160405280848152602001613183846138e2565b6001600160801b0316815260200160016001600160801b03168152508482815481106131ab57fe5b60009182526020918290208351600292830290910190815591830151600190920180546040909401516001600160801b03199094166001600160801b03938416178316600160801b939094169290920292909217905585015461320e9084612d64565b85600201819055505050505050565b6001600160a01b0381166132435760405162461bcd60e51b815260040161069290614ec7565b604780546001600160a01b038381166001600160a01b03198316179092556040519116907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0906132969083908590614be7565b60405180910390a15050565b6001600160a01b038083166000908152600f6020526040812054909116906132c98461390b565b6001600160a01b038581166000818152600f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f0cc323ffec3ea49cbcddc0de1480978126d350c6a45dff33ad2f1cda6ae992619190a4612d5e828483612e03565b6001600160a01b038116610df45760405162461bcd60e51b815260040161069290614f27565b60010154426001600160801b03909116111590565b805460009081905b600081118015613391575061339184600183038154811061115157fe5b15613432578360018203815481106133a557fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156133ea576133e3846001830381548110612ff057fe5b91506133ff565b6133fc84600183038154811061117b57fe5b92505b8380548061340957fe5b600082815260208120600019928301600281029091018281556001019190915590915501613374565b50613457613446828463ffffffff612d6416565b60028601549063ffffffff6134df16565b60028501559250929050565b600082613472575060006113d7565b8282028284828161347f57fe5b04146107115760405162461bcd60e51b815260040161069290614f67565b600061071183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a21565b600061071183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a58565b604051612cfe90849063a9059cbb60e01b90612d279086908690602401614cd3565b6001600160a01b038116600090815260086020526040812054905b81811015612cfe5761357083826128bb565b60010161355e565b4690565b600080600061358d87878787613a7c565b9150915061359a81613b5c565b5090505b949350505050565b6135b8826001600160a01b0316613c25565b6135d45760405162461bcd60e51b815260040161069290615007565b60006060836001600160a01b0316836040516135f09190614b58565b6000604051808303816000865af19150503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b5091509150816136545760405162461bcd60e51b815260040161069290614ff7565b805115612d5e578080602001905161366f9190810190613f88565b612d5e5760405162461bcd60e51b815260040161069290614e67565b600083830182858210156136b25760405162461bcd60e51b81526004016106929190614dc6565b50949350505050565b6000836001600160601b0316836001600160601b0316111582906136f25760405162461bcd60e51b81526004016106929190614dc6565b505050900390565b600061371e4360405180606001604052806038815260200161527960389139613c5e565b905060008463ffffffff1611801561376757506001600160a01b038516600090815260106020908152604080832063ffffffff6000198901811685529252909120548282169116145b156137c6576001600160a01b0385166000908152601060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055613865565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152601083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252601190935292909220805460018801909316929091169190911790555b846001600160a01b03167f6adb589fed1e8542fb7a6b10f00a85e02265e77f9ae3ca8ff93b22983e1af9a084846040516138a09291906150c2565b60405180910390a25050505050565b6000838301826001600160601b0380871690831610156136b25760405162461bcd60e51b81526004016106929190614dc6565b6000600160801b82106139075760405162461bcd60e51b815260040161069290614ea7565b5090565b6005546000906001600160a01b03166139365760405162461bcd60e51b815260040161069290614e57565b6005546001600160a01b03166000908152600860205260408120805490915b81811015613a165760055483546001600160a01b039091169084908390811061397a57fe5b60009182526020909120600590910201546001600160a01b03161415613a0e576005546001600160a01b039081166000908152600760209081526040808320858452825280832093891683529290522060028101548154613a03916139e5919063ffffffff6134df16565b60405180606001604052806028815260200161523060289139612dd4565b9450505050506120fb565b600101613955565b506000949350505050565b60008183613a425760405162461bcd60e51b81526004016106929190614dc6565b506000838581613a4e57fe5b0495945050505050565b600081848411156136f25760405162461bcd60e51b81526004016106929190614dc6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613ab35750600090506003613b53565b8460ff16601b14158015613acb57508460ff16601c14155b15613adc5750600090506004613b53565b600060018787878760405160008152602001604052604051613b019493929190614d51565b6020604051602081039080840390855afa158015613b23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b4c57506000915060019050613b53565b9150600090505b94509492505050565b6000816004811115613b6a57fe5b1415613b7557610df4565b6001816004811115613b8357fe5b1415613ba15760405162461bcd60e51b815260040161069290614dd7565b6002816004811115613baf57fe5b1415613bcd5760405162461bcd60e51b815260040161069290614e17565b6003816004811115613bdb57fe5b1415613bf95760405162461bcd60e51b815260040161069290614ed7565b6004816004811115613c0757fe5b1415610df45760405162461bcd60e51b815260040161069290614f47565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061359e575050151592915050565b600081600160201b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b604080518082019091526000808252602082015290565b80356113d781615198565b80516113d781615198565b80516113d7816151ac565b80356113d7816151b5565b80356113d7816151be565b80516113d7816151b5565b80356113d7816151c7565b80356113d7816151d0565b600060208284031215613d0657600080fd5b600061359e8484613c9c565b600060208284031215613d2457600080fd5b600061359e8484613ca7565b60008060408385031215613d4357600080fd5b6000613d4f8585613c9c565b9250506020613d6085828601613c9c565b9150509250929050565b600080600060608486031215613d7f57600080fd5b6000613d8b8686613c9c565b9350506020613d9c86828701613c9c565b9250506040613dad86828701613cbd565b9150509250925092565b60008060408385031215613dca57600080fd5b6000613dd68585613c9c565b9250506020613d6085828601613cbd565b600080600060608486031215613dfc57600080fd5b6000613e088686613c9c565b9350506020613e1986828701613cbd565b9250506040613dad86828701613c9c565b600080600080600060a08688031215613e4257600080fd5b6000613e4e8888613c9c565b9550506020613e5f88828901613cbd565b9450506040613e7088828901613cc8565b9350506060613e8188828901613cbd565b9250506080613e9288828901613cbd565b9150509295509295909350565b600080600060608486031215613eb457600080fd5b6000613ec08686613c9c565b9350506020613d9c86828701613cbd565b60008060008060008060c08789031215613eea57600080fd5b6000613ef68989613c9c565b9650506020613f0789828a01613cbd565b9550506040613f1889828a01613cbd565b9450506060613f2989828a01613ce9565b9350506080613f3a89828a01613cbd565b92505060a0613f4b89828a01613cbd565b9150509295509295509295565b60008060408385031215613f6b57600080fd5b6000613f778585613c9c565b9250506020613d6085828601613cde565b600060208284031215613f9a57600080fd5b600061359e8484613cb2565b600080600060608486031215613fbb57600080fd5b6000613d8b8686613cc8565b600060208284031215613fd957600080fd5b600061359e8484613cc8565b600060208284031215613ff757600080fd5b600061359e8484613cd3565b600061400f8383614af8565b505060600190565b61402081615141565b82525050565b614020816150f0565b600061403a826150e3565b61404481856150e7565b935061404f836150dd565b8060005b8381101561407d5781516140678882614003565b9750614072836150dd565b925050600101614053565b509495945050505050565b614020816150fb565b61402081615100565b6140206140a682615100565b615100565b60006140b6826150e3565b6140c081856120fb565b93506140d0818560208601615162565b9290920192915050565b61402081615103565b6140208161514c565b60006140f7826150e3565b61410181856150e7565b9350614111818560208601615162565b61411a8161518e565b9093019392505050565b60006141316018836150e7565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000815260200192915050565b600061416a6012836150e7565b71696e636f6e73697374656e7420737461746560701b815260200192915050565b60006141986013836150e7565b727661756c743a20706f6f6c206578697374733f60681b815260200192915050565b60006141c7601f836150e7565b7f53746f726520636f6e7472616374206164647265737320697320656d70747900815260200192915050565b6000614200601f836150e7565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800815260200192915050565b6000614239600f836150e7565b6e15985d5b1d081a5cc81c185d5cd959608a1b815260200192915050565b60006142646013836150e7565b7215985d5b1d081a5cc81b9bdd081c185d5cd959606a1b815260200192915050565b6000614293600c836150e7565b6b155b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006142bb6030836150e7565b7f5856535661756c743a3a6765745374616b65416d6f756e743a2078767320616481526f191c995cdcc81a5cc81b9bdd081cd95d60821b602082015260400192915050565b600061430d602a836150e7565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000614359602a836150e7565b7f5856535661756c743a3a64656c656761746542795369673a207369676e6174758152691c9948195e1c1a5c995960b21b602082015260400192915050565b60006143a56022836150e7565b7f7072696d6520746f6b656e2063616e6e6f74206265207a65726f206164647265815261737360f01b602082015260400192915050565b60006143e96026836150e7565b7f5856535661756c743a3a64656c656761746542795369673a20696e76616c6964815265206e6f6e636560d01b602082015260400192915050565b60006144316002836120fb565b61190160f01b815260020192915050565b600061444f6027836150e7565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20318152663238206269747360c81b602082015260400192915050565b60006144986017836150e7565b7f5661756c7420697320616c726561647920706175736564000000000000000000815260200192915050565b60006144d16025836150e7565b7f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164815264647265737360d81b602082015260400192915050565b60006145186022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c815261756560f01b602082015260400192915050565b600061455c601a836150e7565b7f546f6b656e2065786973747320696e206f7468657220706f6f6c000000000000815260200192915050565b60006145956013836150e7565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b60006145c4602b836150e7565b7f5856535661756c743a3a6765745072696f72566f7465733a206e6f742079657481526a0819195d195c9b5a5b995960aa1b602082015260400192915050565b6000614611601d836150e7565b7f7265776172642063616e6e6f74206265207a65726f2061646472657373000000815260200192915050565b600061464a6018836150e7565b7f7a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000815260200192915050565b6000614683601a836150e7565b7f657865637574652070656e64696e67207769746864726177616c000000000000815260200192915050565b60006146bc6022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c815261756560f01b602082015260400192915050565b60006147006043836120fb565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061476b601f836150e7565b7f72657175657374656420616d6f756e742063616e6e6f74206265207a65726f00815260200192915050565b60006147a46021836150e7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006147e76012836150e7565b71141bdbdb08185b1c9958591e48185919195960721b815260200192915050565b6000614815600a836150e7565b691c994b595b9d195c995960b21b815260200192915050565b600061483b6014836150e7565b7324b73b30b634b2103932bbb0b932103a37b5b2b760611b815260200192915050565b600061486b600e836150e7565b6d37b7363c9030b236b4b71031b0b760911b815260200192915050565b60006148956015836150e7565b7418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b815260200192915050565b60006148c66013836150e7565b726e6f7468696e6720746f20776974686472617760681b815260200192915050565b60006148f5601a836150e7565b7f496e76616c6964206e6577206c6f636b696e6720706572696f64000000000000815260200192915050565b600061492e601d836150e7565b7f416c6c6f6320706f696e7473206d757374206e6f74206265207a65726f000000815260200192915050565b60006149676020836150e7565b7f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b60006149a0603a836120fb565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b60006149ff601f836150e7565b7f5361666542455032303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000614a38601b836150e7565b7f72657175657374656420616d6f756e7420697320696e76616c69640000000000815260200192915050565b6000614a716022836150e7565b7f6f6e6c792070726f78792061646d696e2063616e206368616e676520627261698152616e7360f01b602082015260400192915050565b6000614ab5602e836150e7565b7f416c6c6f6320706f696e7473207065722072657761726420746f6b656e206d7581526d7374206e6f74206265207a65726f60901b602082015260400192915050565b80516060830190614b098482614091565b506020820151614b1c6020850182614b2b565b506040820151612d5e60408501825b6140208161510e565b61402081615126565b6140208161512f565b61402081615157565b61402081615135565b600061071182846140ab565b6000614b6f82614424565b9150614b7b828561409a565b602082019150614b8b828461409a565b5060200192915050565b60006113d7826146f3565b60006113d782614993565b602081016113d78284614026565b602081016113d78284614017565b60408101614bd58285614017565b818103602083015261359e81846140ec565b60408101614bf58285614026565b6107116020830184614026565b60608101614c108286614026565b614c1d6020830185614017565b61359e6040830184614091565b60808101614c388287614026565b614c456020830186614026565b614c526040830185614026565b614c5f6060830184614026565b95945050505050565b60608101614c768286614026565b614c1d6020830185614026565b60808101614c918287614026565b614c9e6020830186614026565b614cab6040830185614091565b614c5f6060830184614091565b60408101614cc68285614026565b6107116020830184614088565b60408101614ce18285614026565b6107116020830184614091565b60208082528101610711818461402f565b602081016113d78284614088565b602081016113d78284614091565b60808101614c918287614091565b60808101614d378287614091565b614d446020830186614091565b614c526040830185614091565b60808101614d5f8287614091565b614c9e6020830186614b3d565b602081016113d782846140da565b60a08101614d8882886140da565b614d956020830187614091565b614da26040830186614091565b614daf6060830185614091565b614dbc6080830184614091565b9695505050505050565b6020808252810161071181846140ec565b602080825281016113d781614124565b602080825281016113d78161415d565b602080825281016113d78161418b565b602080825281016113d7816141ba565b602080825281016113d7816141f3565b602080825281016113d78161422c565b602080825281016113d781614257565b602080825281016113d781614286565b602080825281016113d7816142ae565b602080825281016113d781614300565b602080825281016113d78161434c565b602080825281016113d781614398565b602080825281016113d7816143dc565b602080825281016113d781614442565b602080825281016113d78161448b565b602080825281016113d7816144c4565b602080825281016113d78161450b565b602080825281016113d78161454f565b602080825281016113d781614588565b602080825281016113d7816145b7565b602080825281016113d781614604565b602080825281016113d78161463d565b602080825281016113d781614676565b602080825281016113d7816146af565b602080825281016113d78161475e565b602080825281016113d781614797565b602080825281016113d7816147da565b602080825281016113d781614808565b602080825281016113d78161482e565b602080825281016113d78161485e565b602080825281016113d781614888565b602080825281016113d7816148b9565b602080825281016113d7816148e8565b602080825281016113d781614921565b602080825281016113d78161495a565b602080825281016113d7816149f2565b602080825281016113d781614a2b565b602080825281016113d781614a64565b602080825281016113d781614aa8565b604081016150558285614091565b61071160208301846140e3565b60408101614ce18285614091565b6060810161507e8286614091565b614c1d6020830185614091565b602081016113d78284614b34565b604081016150a78285614b34565b6107116020830184614b4f565b602081016113d78284614b4f565b604081016150d08285614b46565b6107116020830184614b46565b60200190565b5190565b90815260200190565b60006113d78261511a565b151590565b90565b60006113d7826150f0565b6001600160801b031690565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b60006113d782615103565b60006113d782615100565b60006113d782615135565b60005b8381101561517d578181015183820152602001615165565b83811115612d5e5750506000910152565b601f01601f191690565b6151a1816150f0565b8114610df457600080fd5b6151a1816150fb565b6151a181615100565b6151a181615103565b6151a181615126565b6151a18161512f56fe5856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77735856535661756c743a3a726571756573745769746864726177616c3a20766f746573206f766572666c6f775856535661756c743a3a6765745374616b65416d6f756e743a20766f746573206f766572666c6f775856535661756c743a3a6465706f7369743a20766f746573206f766572666c6f775856535661756c743a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473736574526577617264416d6f756e74506572426c6f636b28616464726573732c75696e74323536297365745769746864726177616c4c6f636b696e67506572696f6428616464726573732c75696e743235362c75696e74323536295856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777361646428616464726573732c75696e743235362c616464726573732c75696e743235362c75696e7432353629a365627a7a723158204aae76b3f393e5f0a24d3edbbfe8ab0898f4b70ec1fe6c813964235a50bc1c736c6578706572696d656e74616cf564736f6c63430005100040",
|
|
1574
|
+
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638456cb5911610182578063c2102596116100e9578063e7a324dc116100a2578063f55401621161007c578063f55401621461061c578063f851a44014610624578063fba1b1f91461062c578063fe5a451a1461063f576102bb565b8063e7a324dc146105eb578063e8f2be6f146105f3578063f1127ed8146105fb576102bb565b8063c210259614610577578063c3c754a814610597578063c3cda520146105aa578063d7ae45e2146105bd578063dae66bbe146105d0578063de0368b2146105e3576102bb565b80639e2b6c4d1161013b5780639e2b6c4d1461050e578063a09eab7a14610521578063a9d69a6914610534578063add8933714610547578063b4a0bdf31461054f578063b4b5ea5714610564576102bb565b80638456cb59146104875780638ed7333d1461048f57806392e35000146104a257806393c7c4d1146104c657806398e1b31b146104d9578063996cba68146104fb576102bb565b80634298bdbd116102265780636fcfff45116101df5780636fcfff45146103f957806373d025d614610419578063782d6fe11461042e5780637ac924561461044e5780637ecebe00146104615780638308d7e914610474576102bb565b80634298bdbd14610392578063587cde1e146103a55780635c19a95c146103b85780635c60da1b146103cb5780635ff56315146103d35780636dd77cbd146103e6576102bb565b806320606b701161027857806320606b701461033f57806324f52bbf14610347578063267822471461035c5780632eda5c6c14610364578063358ae036146103775780633d4180f91461037f576102bb565b8063046f7da2146102c05780630af13728146102ca5780630efe6a8b146102f3578063115b512f1461030657806319129e5a146103195780631d504dc61461032c575b600080fd5b6102c8610647565b005b6102dd6102d8366004613de7565b6106d2565b6040516102ea9190614d0d565b60405180910390f35b6102c8610301366004613e9f565b610718565b6102c8610314366004613e9f565b610a0d565b6102c8610327366004613cf4565b610dc1565b6102c861033a366004613fc7565b610df7565b6102dd610f28565b61034f610f3f565b6040516102ea9190614bab565b61034f610f4e565b6102dd610372366004613cf4565b610f5d565b61034f610f6f565b6102dd61038d366004613d30565b610f7e565b6102dd6103a0366004613cf4565b610f9b565b61034f6103b3366004613cf4565b610fad565b6102c86103c6366004613cf4565b610fc8565b61034f610ff5565b6102c86103e1366004613d30565b611004565b6102dd6103f4366004613de7565b6110f8565b61040c610407366004613cf4565b6111ad565b6040516102ea919061508b565b6104216111c5565b6040516102ea9190614cff565b61044161043c366004613db7565b6111ce565b6040516102ea91906150b4565b6102c861045c366004613db7565b6113dd565b6102dd61046f366004613cf4565b611726565b6102c8610482366004613e9f565b611738565b6102c86118de565b6102c861049d366004613db7565b611963565b6104b56104b0366004613db7565b61199e565b6040516102ea959493929190614d7a565b6102c86104d4366004613db7565b6119f3565b6104ec6104e7366004613de7565b611b19565b6040516102ea93929190615070565b6102c8610509366004613d6a565b611b6b565b6102c861051c366004613e9f565b611cfd565b6102dd61052f366004613de7565b611de8565b6102dd610542366004613de7565b61202d565b61034f61206f565b61055761207e565b6040516102ea9190614d6c565b610441610572366004613cf4565b61208d565b61058a610585366004613de7565b612100565b6040516102ea9190614cee565b6104216105a5366004613cf4565b6121ba565b6102c86105b8366004613ed1565b6121cf565b6102dd6105cb366004613cf4565b612373565b6102c86105de366004613fa6565b61238e565b61034f61249a565b6102dd6124a9565b6102dd6124b5565b61060e610609366004613f58565b6124bb565b6040516102ea929190615099565b6102dd6124f0565b61034f6124f8565b6102c861063a366004613e2a565b612507565b6105576127d3565b61067060405180604001604052806008815260200167726573756d65282960c01b8152506127e2565b60135460ff1661069b5760405162461bcd60e51b815260040161069290614e37565b60405180910390fd5b6013805460ff1916905560405133907fd2619572a1464e0df0bb351d834fd47f3350984d7bfdb1ab69cfcb0b8e42141590600090a2565b60006106de8484612884565b506001600160a01b0380841660009081526007602090815260408083208684528252808320938516835292905220600201545b9392505050565b600354600160a01b900460ff166107415760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156107715760405162461bcd60e51b815260040161069290614e27565b61077b8383612884565b6001600160a01b038316600090815260086020526040812080548490811061079f57fe5b600091825260208083206001600160a01b038816845260078252604080852088865283528085203386529092529220600590910290910191506107e285856128bb565b6107ed85853361202d565b1561080a5760405162461bcd60e51b815260040161069290614f37565b80541561087f57600061081d8284612a76565b9050801561087d57610830863383612a8a565b84866001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645846040516108749190614d0d565b60405180910390a45b505b815461089c906001600160a01b031633308663ffffffff612d0316565b80546108ae908463ffffffff612d6416565b81556108ba8183612da6565b600182015560055482546001600160a01b039081169116141561092157336000908152600f6020908152604080832054815160608101909252602180835261092194936001600160a01b039092169261091c9289929061525890830139612dd4565b612e03565b6017546001600160a01b03868116911614801561093f575060185484145b156109a7576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610974903390600401614bb9565b600060405180830381600087803b15801561098e57600080fd5b505af11580156109a2573d6000803e3d6000fd5b505050505b83856001600160a01b0316336001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7866040516109eb9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b179055505050565b600354600160a01b900460ff16610a365760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615610a665760405162461bcd60e51b815260040161069290614e27565b610a708383612884565b60008111610a905760405162461bcd60e51b815260040161069290614f57565b6001600160a01b0383166000908152600760209081526040808320858452825280832033845290915290206002810154610ad0908363ffffffff612d6416565b81541015610af05760405162461bcd60e51b815260040161069290615017565b6001600160a01b0384166000908152600860205260408120805485908110610b1457fe5b600091825260208083206001600160a01b0389168452600a825260408085208986528352808520338652909252908320600590920201925090610b5682612f95565b5090508015610b775760405162461bcd60e51b815260040161069290614f37565b610b8187876128bb565b6000610b8d8585612a76565b9050610b9a883383612a8a565b6004840154600090610bb2904263ffffffff612d6416565b9050610bc086858984613039565b6001600160a01b03891660009081526012602090815260408083208b8452909152902054610bf4908863ffffffff612d6416565b6001600160a01b038a1660009081526012602090815260408083208c8452909152902055610c228686612da6565b600187015560055485546001600160a01b0390811691161415610c8557336000908152600f6020908152604080832054815160608101909252602b808352610c85946001600160a01b0390921693919261091c928d929061520590830139612dd4565b6017546001600160a01b038a81169116148015610ca3575060185488145b15610d0b576016546040516337f23cd360e01b81526001600160a01b03909116906337f23cd390610cd8903390600401614bb9565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b505050505b87896001600160a01b0316336001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464585604051610d4f9190614d0d565b60405180910390a487896001600160a01b0316336001600160a01b03167f88a254a0ef28a0b9e957ff600beae69870f6f924065147f3627c3f814e60ec118a604051610d9b9190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b17905550505050505050565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161069290614fa7565b610df48161321d565b50565b806001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3057600080fd5b505afa158015610e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e689190810190613d12565b6001600160a01b0316336001600160a01b031614610e985760405162461bcd60e51b815260040161069290615027565b806001600160a01b031663c1e803346040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f0b9190810190613fe5565b15610df45760405162461bcd60e51b815260040161069290614fb7565b604051610f3490614b95565b604051809103902081565b6004546001600160a01b031681565b6001546001600160a01b031681565b60066020526000908152604090205481565b6005546001600160a01b031681565b601560209081526000928352604080842090915290825290205481565b60096020526000908152604090205481565b600f602052600090815260409020546001600160a01b031681565b60135460ff1615610feb5760405162461bcd60e51b815260040161069290614e27565b610df433826132a2565b6002546001600160a01b031681565b6000546001600160a01b0316331461102e5760405162461bcd60e51b815260040161069290614fa7565b61103782613331565b61104081613331565b6005546004546001600160a01b03918216911681156110715760405162461bcd60e51b815260040161069290614ef7565b600580546001600160a01b038087166001600160a01b03199283161790925560048054928616929091169190911790556003805460ff60a01b1916600160a01b1790556040517f559f314bb90394a4a9ceb724f365b36a53587d894352c43d12901fd680101456906110ea908490849088908890614c2a565b60405180910390a150505050565b60006111048484612884565b6001600160a01b038085166000908152600a60209081526040808320878452825280832093861683529290522080545b600081118015611164575061116482600183038154811061115157fe5b9060005260206000209060020201613357565b156111a45761119982600183038154811061117b57fe5b6000918252602090912060029091020154849063ffffffff612d6416565b925060001901611134565b50509392505050565b60116020526000908152604090205463ffffffff1681565b60135460ff1681565b60004382106111ef5760405162461bcd60e51b815260040161069290614f07565b6001600160a01b03831660009081526011602052604090205463ffffffff168061121d5760009150506113d7565b6001600160a01b038416600090815260106020908152604080832063ffffffff600019860181168552925290912054168310611299576001600160a01b03841660009081526010602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506113d7565b6001600160a01b038416600090815260106020908152604080832083805290915290205463ffffffff168310156112d45760009150506113d7565b600060001982015b8163ffffffff168163ffffffff16111561139757600282820363ffffffff16048103611306613c85565b506001600160a01b038716600090815260106020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415611372576020015194506113d79350505050565b805163ffffffff1687111561138957819350611390565b6001820392505b50506112dc565b506001600160a01b038516600090815260106020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b600354600160a01b900460ff166114065760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff16156114365760405162461bcd60e51b815260040161069290614e27565b6114408282612884565b6001600160a01b038216600090815260086020526040812080548390811061146457fe5b600091825260208083206001600160a01b038716808552600783526040808620888752845280862033808852908552818720928752600a85528187208988528552818720908752909352918420600590930201935091806114c5848461336c565b9092509050811515806114d85750600081115b6114f45760405162461bcd60e51b815260040161069290614fc7565b8115806114ff575080155b61151b5760405162461bcd60e51b815260040161069290614de7565b81156116345761152b87876128bb565b6000611571856001015461156564e8d4a510006115598a600301548a6000015461346390919063ffffffff16565b9063ffffffff61349d16565b9063ffffffff6134df16565b6004805460405163135b33cd60e31b81529293506001600160a01b031691639ad99e68916115a5918c913391879101614c02565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505086546115ea925090508463ffffffff6134df16565b808655600387015461160d9164e8d4a5100091611559919063ffffffff61346316565b6001860155855461162e906001600160a01b0316338563ffffffff61352116565b506116b8565b8354611646908263ffffffff6134df16565b84556001600160a01b038716600090815260126020908152604080832089845290915290205461167c908263ffffffff6134df16565b6001600160a01b0380891660009081526012602090815260408083208b845290915290209190915585546116b89116338363ffffffff61352116565b856001600160a01b038816337fe31da05fae6db869f5ea51f4b638aa6884070b6c87f18f63bd2291a12cb2f5186116f5868663ffffffff612d6416565b6040516117029190614d0d565b60405180910390a450506003805460ff60a01b1916600160a01b1790555050505050565b600e6020526000908152604090205481565b6117766040518060400160405280601c81526020017f73657428616464726573732c75696e743235362c75696e7432353629000000008152506127e2565b6117808383612884565b61178983613543565b6001600160a01b038316600090815260086020526040812080549091906118029084906117f6908590889081106117bc57fe5b60009182526020808320600160059093020191909101546001600160a01b038b16835260099091526040909120549063ffffffff6134df16565b9063ffffffff612d6416565b9050600081116118245760405162461bcd60e51b815260040161069290615037565b600082858154811061183257fe5b90600052602060002090600502016001015490508383868154811061185357fe5b9060005260206000209060050201600101819055508160096000886001600160a01b03166001600160a01b031681526020019081526020016000208190555084866001600160a01b03167f6ee09c6cb801194690c195c69f465aaf7c80255cbeafaab9600f47ed79de2ca983876040516118ce929190615062565b60405180910390a3505050505050565b611906604051806040016040528060078152602001667061757365282960c81b8152506127e2565b60135460ff16156119295760405162461bcd60e51b815260040161069290614eb7565b6013805460ff1916600117905560405133907fdffada2889ebfab9224c24069d833f3de835d8cf99872d49e7b7ba5fccb7a46f90600090a2565b60135460ff16156119865760405162461bcd60e51b815260040161069290614e27565b6119908282612884565b61199a82826128bb565b5050565b600860205281600052604060002081815481106119b757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b611a146040518060600160405280602881526020016152b1602891396127e2565b60048054604051633d6ac5b360e21b81526001600160a01b039091169163f5ab16cc91611a4391869101614bab565b60206040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a939190810190613f88565b611aaf5760405162461bcd60e51b815260040161069290614f97565b611ab882613543565b6001600160a01b0382166000818152600660205260409081902080549084905590519091907fad96cee0d692f0250b98e085504f399da6733854908215f6203fe3c69366d9f590611b0c9084908690615062565b60405180910390a2505050565b6000806000611b288686612884565b5050506001600160a01b03928316600090815260076020908152604080832094835293815283822092909416815292529020805460018201546002909201549092565b600354600160a01b900460ff16611b945760405162461bcd60e51b815260040161069290614f87565b6003805460ff60a01b1916905560135460ff1615611bc45760405162461bcd60e51b815260040161069290614e27565b611bce8282612884565b6001600160a01b0382166000908152600860205260408120805483908110611bf257fe5b600091825260208083206001600160a01b0380881685526007835260408086208887528452808620918a1686529252922060059091029091019150611c3784846128bb565b611c4284848761202d565b15611c5f5760405162461bcd60e51b815260040161069290614f37565b805415611ce3576000611c728284612a76565b90508015611ce157611c848284612da6565b6001830155611c94858783612a8a565b83856001600160a01b0316876001600160a01b03167f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e9464584604051611cd89190614d0d565b60405180910390a45b505b50506003805460ff60a01b1916600160a01b179055505050565b611d1e6040518060600160405280603381526020016152d9603391396127e2565b611d288383612884565b600081118015611d3b57506312cc030081105b611d575760405162461bcd60e51b815260040161069290614fd7565b6001600160a01b0383166000908152600860205260408120805484908110611d7b57fe5b9060005260206000209060050201905060008160040154905082826004018190555083856001600160a01b03167f0bcf80c5060ccf99b7a993c57a94b232fc2c5c04bd74c7c7d174595fee6bc31f8386604051611dd9929190615062565b60405180910390a35050505050565b6000611df48484612884565b6001600160a01b0384166000908152600860205260408120805485908110611e1857fe5b600091825260208083206001600160a01b03808a168086526007845260408087208b885285528087208a8416885285528087206003600590970290940195860154918752601285528087208b885290945283862054855494516370a0823160e01b8152959750929590949093611eef939216906370a0823190611e9f903090600401614bab565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115659190810190613fe5565b6001600160a01b0389166000908152600660205260409020546002860154919250439182118015611f1f57508215155b15611fb5576000611f3d8760020154846134df90919063ffffffff16565b6001600160a01b038c1660009081526009602052604081205460018a01549293509091611f85919061155990611f79868863ffffffff61346316565b9063ffffffff61346316565b9050611fb0611fa3866115598464e8d4a5100063ffffffff61346316565b879063ffffffff612d6416565b955050505b6001600160a01b03808b166000908152600a602090815260408083208d84528252808320938c16835292905290812090611fee82612f95565b91505061201d876001015461156564e8d4a510006115598a611f79878e600001546134df90919063ffffffff16565b9c9b505050505050505050505050565b6001600160a01b038084166000908152600a602090815260408083208684528252808320938516835292905290812061206581612f95565b5095945050505050565b6017546001600160a01b031681565b6047546001600160a01b031690565b6001600160a01b03811660009081526011602052604081205463ffffffff16806120b85760006120f7565b6001600160a01b0383166000908152601060209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9150505b919050565b606061210c8484612884565b6001600160a01b038085166000908152600a602090815260408083208784528252808320938616835292815282822080548451818402810184019095528085529092909184015b828210156121ad5760008481526020908190206040805160608101825260028602909201805483526001908101546001600160801b0380821685870152600160801b90910416918301919091529083529092019101612153565b5050505090509392505050565b60146020526000908152604090205460ff1681565b60135460ff16156121f25760405162461bcd60e51b815260040161069290614e27565b600060405161220090614b95565b604080519182900382208282019091526008825267161594d5985d5b1d60c21b6020909201919091527fddfcc46608a8bd52ebf900f03a24cc97b73a6046cec8c5d0f74a211e376e967a612252613578565b306040516020016122669493929190614d29565b604051602081830303815290604052805190602001209050600060405161228c90614ba0565b6040519081900381206122a7918a908a908a90602001614d1b565b604051602081830303815290604052805190602001209050600082826040516020016122d4929190614b64565b60405160208183030381529060405280519060200120905060006122fa8288888861357c565b6001600160a01b0381166000908152600e60205260409020805460018101909155909150891461233c5760405162461bcd60e51b815260040161069290614e97565b8742111561235c5760405162461bcd60e51b815260040161069290614e77565b612366818b6132a2565b505050505b505050505050565b6001600160a01b031660009081526008602052604090205490565b6000546001600160a01b031633146123b85760405162461bcd60e51b815260040161069290614fa7565b6001600160a01b0383166123de5760405162461bcd60e51b815260040161069290614e87565b6001600160a01b0382166124045760405162461bcd60e51b815260040161069290614f17565b61240e8282612884565b6016546017546018546040516001600160a01b03808816948116937f8def9436d6e31b89ed00948ba91d0cb6936eada5154cb1b45b55683fb9e492379361245d93919092169188918890614c83565b60405180910390a3601680546001600160a01b039485166001600160a01b0319918216179091556017805493909416921691909117909155601855565b6003546001600160a01b031681565b604051610f3490614ba0565b60185481565b601060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6312cc030081565b6000546001600160a01b031681565b6125286040518060600160405280602c8152602001615338602c91396127e2565b61253185613331565b61253a83613331565b6004546001600160a01b03166125625760405162461bcd60e51b815260040161069290614e07565b600084116125825760405162461bcd60e51b815260040161069290614fe7565b61258b85613543565b6001600160a01b0385166000908152600860205260408120805490915b8181101561260657856001600160a01b03168382815481106125c657fe5b60009182526020909120600590910201546001600160a01b031614156125fe5760405162461bcd60e51b815260040161069290614f77565b6001016125a8565b506001600160a01b03851660009081526014602052604090205460ff16156126405760405162461bcd60e51b815260040161069290614ee7565b6001600160a01b038716600090815260096020526040902054612669908763ffffffff612d6416565b6001600160a01b0388811660009081526009602090815260408083209490945560068152838220889055835160a0810185528984168082528183018c81524383880190815260608401868152608085018c81528b5460018082018e558d8a52888a209751600590920290970180546001600160a01b031916918b169190911781559351848701559151600284015551600383015551600491820155908452601490925291849020805460ff1916831790558054935163fb66fb4d60e01b8152939092169263fb66fb4d92612741928c92909101614cb8565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b50505050846001600160a01b03166001838054905003886001600160a01b03167fd7fa4bff1cd2253c0789c3291a786a6f6b1a3b4569a75af683a15d52abb6a0bf8988886040516127c293929190615070565b60405180910390a450505050505050565b6016546001600160a01b031681565b6047546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab906128159033908690600401614bc7565b60206040518083038186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128659190810190613f88565b90508061199a5760405162461bcd60e51b815260040161069290614e47565b6001600160a01b038216600090815260086020526040902054811061199a5760405162461bcd60e51b815260040161069290614df7565b6001600160a01b03821660009081526008602052604081208054839081106128df57fe5b9060005260206000209060050201905080600201544311612900575061199a565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612930903090600401614bab565b60206040518083038186803b15801561294857600080fd5b505afa15801561295c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129809190810190613fe5565b6001600160a01b03851660009081526012602090815260408083208784529091529020549091506129b890829063ffffffff6134df16565b9050806129cc57504360029091015561199a565b600282015443906000906129e790839063ffffffff6134df16565b6001600160a01b03871660009081526009602090815260408083205460018901546006909352908320549394509192612a30929161155991611f7990879063ffffffff61346316565b9050612a5f612a4e856115598464e8d4a5100063ffffffff61346316565b60038701549063ffffffff612d6416565b600386015550504360029093019290925550505050565b600061071183600101546115658585612da6565b600480546040516370a0823160e01b81526001600160a01b03918216926000928716916370a0823191612abf91869101614bab565b60206040518083038186803b158015612ad757600080fd5b505afa158015612aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b0f9190810190613fe5565b6001600160a01b038087166000908152601560209081526040808320938916835292905290812054919250612b4a858363ffffffff612d6416565b9050828111612c28578115612bbd576001600160a01b038088166000818152601560209081526040808320948b1680845294909152808220829055517f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216091612bb491879190615047565b60405180910390a35b60405163135b33cd60e31b81526001600160a01b03851690639ad99e6890612bed908a908a908690600401614c68565b600060405180830381600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b5050505050505050612cfe565b6001600160a01b038088166000818152601560209081526040808320948b168084529490915290819020868503908190559051909291907f6bdfd5e51d01475945224d3d37965916fd8df699ef9e8888af4359aa8622216090612c8e9087908690615062565b60405180910390a360405163135b33cd60e31b81526001600160a01b03861690639ad99e6890612cc6908b908b908990600401614c68565b600060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b5050505050505050505b505050565b604051612d5e9085906323b872dd60e01b90612d2790879087908790602401614c68565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135a6565b50505050565b600061071183836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525061368b565b600061071164e8d4a510006115598460030154611f79876002015488600001546134df90919063ffffffff16565b600081600160601b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b509192915050565b816001600160a01b0316836001600160a01b031614158015612e2e57506000816001600160601b0316115b15612cfe576001600160a01b03831615612ee6576001600160a01b03831660009081526011602052604081205463ffffffff169081612e6e576000612ead565b6001600160a01b0385166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612ed482856040518060600160405280602c815260200161530c602c91396136bb565b9050612ee2868484846136fa565b5050505b6001600160a01b03821615612cfe576001600160a01b03821660009081526011602052604081205463ffffffff169081612f21576000612f60565b6001600160a01b0384166000908152601060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000612f8782856040518060600160405280602b81526020016151da602b91396138af565b905061236b858484846136fa565b805460009081905b801561303357836001820381548110612fb257fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156130155761300e846001830381548110612ff057fe5b6000918252602090912060029091020154839063ffffffff612d6416565b915061302a565b61302784600183038154811061117b57fe5b92505b60001901612f9d565b50915091565b8254604080516060810182526000808252602080830182815260019484018581528587018a5589845291909220925160028602909301928355905191909201805492516001600160801b03908116600160801b029281166001600160801b0319909416939093179092161790555b6000811180156130e25750818460018303815481106130c257fe5b60009182526020909120600160029092020101546001600160801b031611155b15613169578360018203815481106130f657fe5b906000526020600020906002020184828154811061311057fe5b600091825260209091208254600290920201908155600191820180549290910180546001600160801b0319166001600160801b03938416178082559154600160801b9081900484160291909216179055600019016130a7565b6040518060600160405280848152602001613183846138e2565b6001600160801b0316815260200160016001600160801b03168152508482815481106131ab57fe5b60009182526020918290208351600292830290910190815591830151600190920180546040909401516001600160801b03199094166001600160801b03938416178316600160801b939094169290920292909217905585015461320e9084612d64565b85600201819055505050505050565b6001600160a01b0381166132435760405162461bcd60e51b815260040161069290614ec7565b604780546001600160a01b038381166001600160a01b03198316179092556040519116907f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0906132969083908590614be7565b60405180910390a15050565b6001600160a01b038083166000908152600f6020526040812054909116906132c98461390b565b6001600160a01b038581166000818152600f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f0cc323ffec3ea49cbcddc0de1480978126d350c6a45dff33ad2f1cda6ae992619190a4612d5e828483612e03565b6001600160a01b038116610df45760405162461bcd60e51b815260040161069290614f27565b60010154426001600160801b03909116111590565b805460009081905b600081118015613391575061339184600183038154811061115157fe5b15613432578360018203815481106133a557fe5b6000918252602090912060016002909202018101546001600160801b03600160801b9091041614156133ea576133e3846001830381548110612ff057fe5b91506133ff565b6133fc84600183038154811061117b57fe5b92505b8380548061340957fe5b600082815260208120600019928301600281029091018281556001019190915590915501613374565b50613457613446828463ffffffff612d6416565b60028601549063ffffffff6134df16565b60028501559250929050565b600082613472575060006113d7565b8282028284828161347f57fe5b04146107115760405162461bcd60e51b815260040161069290614f67565b600061071183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a21565b600061071183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a58565b604051612cfe90849063a9059cbb60e01b90612d279086908690602401614cd3565b6001600160a01b038116600090815260086020526040812054905b81811015612cfe5761357083826128bb565b60010161355e565b4690565b600080600061358d87878787613a7c565b9150915061359a81613b5c565b5090505b949350505050565b6135b8826001600160a01b0316613c25565b6135d45760405162461bcd60e51b815260040161069290615007565b60006060836001600160a01b0316836040516135f09190614b58565b6000604051808303816000865af19150503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b5091509150816136545760405162461bcd60e51b815260040161069290614ff7565b805115612d5e578080602001905161366f9190810190613f88565b612d5e5760405162461bcd60e51b815260040161069290614e67565b600083830182858210156136b25760405162461bcd60e51b81526004016106929190614dc6565b50949350505050565b6000836001600160601b0316836001600160601b0316111582906136f25760405162461bcd60e51b81526004016106929190614dc6565b505050900390565b600061371e4360405180606001604052806038815260200161527960389139613c5e565b905060008463ffffffff1611801561376757506001600160a01b038516600090815260106020908152604080832063ffffffff6000198901811685529252909120548282169116145b156137c6576001600160a01b0385166000908152601060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055613865565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152601083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252601190935292909220805460018801909316929091169190911790555b846001600160a01b03167f6adb589fed1e8542fb7a6b10f00a85e02265e77f9ae3ca8ff93b22983e1af9a084846040516138a09291906150c2565b60405180910390a25050505050565b6000838301826001600160601b0380871690831610156136b25760405162461bcd60e51b81526004016106929190614dc6565b6000600160801b82106139075760405162461bcd60e51b815260040161069290614ea7565b5090565b6005546000906001600160a01b03166139365760405162461bcd60e51b815260040161069290614e57565b6005546001600160a01b03166000908152600860205260408120805490915b81811015613a165760055483546001600160a01b039091169084908390811061397a57fe5b60009182526020909120600590910201546001600160a01b03161415613a0e576005546001600160a01b039081166000908152600760209081526040808320858452825280832093891683529290522060028101548154613a03916139e5919063ffffffff6134df16565b60405180606001604052806028815260200161523060289139612dd4565b9450505050506120fb565b600101613955565b506000949350505050565b60008183613a425760405162461bcd60e51b81526004016106929190614dc6565b506000838581613a4e57fe5b0495945050505050565b600081848411156136f25760405162461bcd60e51b81526004016106929190614dc6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613ab35750600090506003613b53565b8460ff16601b14158015613acb57508460ff16601c14155b15613adc5750600090506004613b53565b600060018787878760405160008152602001604052604051613b019493929190614d51565b6020604051602081039080840390855afa158015613b23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b4c57506000915060019050613b53565b9150600090505b94509492505050565b6000816004811115613b6a57fe5b1415613b7557610df4565b6001816004811115613b8357fe5b1415613ba15760405162461bcd60e51b815260040161069290614dd7565b6002816004811115613baf57fe5b1415613bcd5760405162461bcd60e51b815260040161069290614e17565b6003816004811115613bdb57fe5b1415613bf95760405162461bcd60e51b815260040161069290614ed7565b6004816004811115613c0757fe5b1415610df45760405162461bcd60e51b815260040161069290614f47565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061359e575050151592915050565b600081600160201b8410612dfb5760405162461bcd60e51b81526004016106929190614dc6565b604080518082019091526000808252602082015290565b80356113d781615198565b80516113d781615198565b80516113d7816151ac565b80356113d7816151b5565b80356113d7816151be565b80516113d7816151b5565b80356113d7816151c7565b80356113d7816151d0565b600060208284031215613d0657600080fd5b600061359e8484613c9c565b600060208284031215613d2457600080fd5b600061359e8484613ca7565b60008060408385031215613d4357600080fd5b6000613d4f8585613c9c565b9250506020613d6085828601613c9c565b9150509250929050565b600080600060608486031215613d7f57600080fd5b6000613d8b8686613c9c565b9350506020613d9c86828701613c9c565b9250506040613dad86828701613cbd565b9150509250925092565b60008060408385031215613dca57600080fd5b6000613dd68585613c9c565b9250506020613d6085828601613cbd565b600080600060608486031215613dfc57600080fd5b6000613e088686613c9c565b9350506020613e1986828701613cbd565b9250506040613dad86828701613c9c565b600080600080600060a08688031215613e4257600080fd5b6000613e4e8888613c9c565b9550506020613e5f88828901613cbd565b9450506040613e7088828901613cc8565b9350506060613e8188828901613cbd565b9250506080613e9288828901613cbd565b9150509295509295909350565b600080600060608486031215613eb457600080fd5b6000613ec08686613c9c565b9350506020613d9c86828701613cbd565b60008060008060008060c08789031215613eea57600080fd5b6000613ef68989613c9c565b9650506020613f0789828a01613cbd565b9550506040613f1889828a01613cbd565b9450506060613f2989828a01613ce9565b9350506080613f3a89828a01613cbd565b92505060a0613f4b89828a01613cbd565b9150509295509295509295565b60008060408385031215613f6b57600080fd5b6000613f778585613c9c565b9250506020613d6085828601613cde565b600060208284031215613f9a57600080fd5b600061359e8484613cb2565b600080600060608486031215613fbb57600080fd5b6000613d8b8686613cc8565b600060208284031215613fd957600080fd5b600061359e8484613cc8565b600060208284031215613ff757600080fd5b600061359e8484613cd3565b600061400f8383614af8565b505060600190565b61402081615141565b82525050565b614020816150f0565b600061403a826150e3565b61404481856150e7565b935061404f836150dd565b8060005b8381101561407d5781516140678882614003565b9750614072836150dd565b925050600101614053565b509495945050505050565b614020816150fb565b61402081615100565b6140206140a682615100565b615100565b60006140b6826150e3565b6140c081856120fb565b93506140d0818560208601615162565b9290920192915050565b61402081615103565b6140208161514c565b60006140f7826150e3565b61410181856150e7565b9350614111818560208601615162565b61411a8161518e565b9093019392505050565b60006141316018836150e7565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000815260200192915050565b600061416a6012836150e7565b71696e636f6e73697374656e7420737461746560701b815260200192915050565b60006141986013836150e7565b727661756c743a20706f6f6c206578697374733f60681b815260200192915050565b60006141c7601f836150e7565b7f53746f726520636f6e7472616374206164647265737320697320656d70747900815260200192915050565b6000614200601f836150e7565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800815260200192915050565b6000614239600f836150e7565b6e15985d5b1d081a5cc81c185d5cd959608a1b815260200192915050565b60006142646013836150e7565b7215985d5b1d081a5cc81b9bdd081c185d5cd959606a1b815260200192915050565b6000614293600c836150e7565b6b155b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006142bb6030836150e7565b7f5856535661756c743a3a6765745374616b65416d6f756e743a2078767320616481526f191c995cdcc81a5cc81b9bdd081cd95d60821b602082015260400192915050565b600061430d602a836150e7565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000614359602a836150e7565b7f5856535661756c743a3a64656c656761746542795369673a207369676e6174758152691c9948195e1c1a5c995960b21b602082015260400192915050565b60006143a56022836150e7565b7f7072696d6520746f6b656e2063616e6e6f74206265207a65726f206164647265815261737360f01b602082015260400192915050565b60006143e96026836150e7565b7f5856535661756c743a3a64656c656761746542795369673a20696e76616c6964815265206e6f6e636560d01b602082015260400192915050565b60006144316002836120fb565b61190160f01b815260020192915050565b600061444f6027836150e7565b7f53616665436173743a2076616c756520646f65736e27742066697420696e20318152663238206269747360c81b602082015260400192915050565b60006144986017836150e7565b7f5661756c7420697320616c726561647920706175736564000000000000000000815260200192915050565b60006144d16025836150e7565b7f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164815264647265737360d81b602082015260400192915050565b60006145186022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c815261756560f01b602082015260400192915050565b600061455c601a836150e7565b7f546f6b656e2065786973747320696e206f7468657220706f6f6c000000000000815260200192915050565b60006145956013836150e7565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b60006145c4602b836150e7565b7f5856535661756c743a3a6765745072696f72566f7465733a206e6f742079657481526a0819195d195c9b5a5b995960aa1b602082015260400192915050565b6000614611601d836150e7565b7f7265776172642063616e6e6f74206265207a65726f2061646472657373000000815260200192915050565b600061464a6018836150e7565b7f7a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000815260200192915050565b6000614683601a836150e7565b7f657865637574652070656e64696e67207769746864726177616c000000000000815260200192915050565b60006146bc6022836150e7565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c815261756560f01b602082015260400192915050565b60006147006043836120fb565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061476b601f836150e7565b7f72657175657374656420616d6f756e742063616e6e6f74206265207a65726f00815260200192915050565b60006147a46021836150e7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006147e76012836150e7565b71141bdbdb08185b1c9958591e48185919195960721b815260200192915050565b6000614815600a836150e7565b691c994b595b9d195c995960b21b815260200192915050565b600061483b6014836150e7565b7324b73b30b634b2103932bbb0b932103a37b5b2b760611b815260200192915050565b600061486b600e836150e7565b6d37b7363c9030b236b4b71031b0b760911b815260200192915050565b60006148956015836150e7565b7418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b815260200192915050565b60006148c66013836150e7565b726e6f7468696e6720746f20776974686472617760681b815260200192915050565b60006148f5601a836150e7565b7f496e76616c6964206e6577206c6f636b696e6720706572696f64000000000000815260200192915050565b600061492e601d836150e7565b7f416c6c6f6320706f696e7473206d757374206e6f74206265207a65726f000000815260200192915050565b60006149676020836150e7565b7f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b60006149a0603a836120fb565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b60006149ff601f836150e7565b7f5361666542455032303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000614a38601b836150e7565b7f72657175657374656420616d6f756e7420697320696e76616c69640000000000815260200192915050565b6000614a716022836150e7565b7f6f6e6c792070726f78792061646d696e2063616e206368616e676520627261698152616e7360f01b602082015260400192915050565b6000614ab5602e836150e7565b7f416c6c6f6320706f696e7473207065722072657761726420746f6b656e206d7581526d7374206e6f74206265207a65726f60901b602082015260400192915050565b80516060830190614b098482614091565b506020820151614b1c6020850182614b2b565b506040820151612d5e60408501825b6140208161510e565b61402081615126565b6140208161512f565b61402081615157565b61402081615135565b600061071182846140ab565b6000614b6f82614424565b9150614b7b828561409a565b602082019150614b8b828461409a565b5060200192915050565b60006113d7826146f3565b60006113d782614993565b602081016113d78284614026565b602081016113d78284614017565b60408101614bd58285614017565b818103602083015261359e81846140ec565b60408101614bf58285614026565b6107116020830184614026565b60608101614c108286614026565b614c1d6020830185614017565b61359e6040830184614091565b60808101614c388287614026565b614c456020830186614026565b614c526040830185614026565b614c5f6060830184614026565b95945050505050565b60608101614c768286614026565b614c1d6020830185614026565b60808101614c918287614026565b614c9e6020830186614026565b614cab6040830185614091565b614c5f6060830184614091565b60408101614cc68285614026565b6107116020830184614088565b60408101614ce18285614026565b6107116020830184614091565b60208082528101610711818461402f565b602081016113d78284614088565b602081016113d78284614091565b60808101614c918287614091565b60808101614d378287614091565b614d446020830186614091565b614c526040830185614091565b60808101614d5f8287614091565b614c9e6020830186614b3d565b602081016113d782846140da565b60a08101614d8882886140da565b614d956020830187614091565b614da26040830186614091565b614daf6060830185614091565b614dbc6080830184614091565b9695505050505050565b6020808252810161071181846140ec565b602080825281016113d781614124565b602080825281016113d78161415d565b602080825281016113d78161418b565b602080825281016113d7816141ba565b602080825281016113d7816141f3565b602080825281016113d78161422c565b602080825281016113d781614257565b602080825281016113d781614286565b602080825281016113d7816142ae565b602080825281016113d781614300565b602080825281016113d78161434c565b602080825281016113d781614398565b602080825281016113d7816143dc565b602080825281016113d781614442565b602080825281016113d78161448b565b602080825281016113d7816144c4565b602080825281016113d78161450b565b602080825281016113d78161454f565b602080825281016113d781614588565b602080825281016113d7816145b7565b602080825281016113d781614604565b602080825281016113d78161463d565b602080825281016113d781614676565b602080825281016113d7816146af565b602080825281016113d78161475e565b602080825281016113d781614797565b602080825281016113d7816147da565b602080825281016113d781614808565b602080825281016113d78161482e565b602080825281016113d78161485e565b602080825281016113d781614888565b602080825281016113d7816148b9565b602080825281016113d7816148e8565b602080825281016113d781614921565b602080825281016113d78161495a565b602080825281016113d7816149f2565b602080825281016113d781614a2b565b602080825281016113d781614a64565b602080825281016113d781614aa8565b604081016150558285614091565b61071160208301846140e3565b60408101614ce18285614091565b6060810161507e8286614091565b614c1d6020830185614091565b602081016113d78284614b34565b604081016150a78285614b34565b6107116020830184614b4f565b602081016113d78284614b4f565b604081016150d08285614b46565b6107116020830184614b46565b60200190565b5190565b90815260200190565b60006113d78261511a565b151590565b90565b60006113d7826150f0565b6001600160801b031690565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b6001600160601b031690565b60006113d782615103565b60006113d782615100565b60006113d782615135565b60005b8381101561517d578181015183820152602001615165565b83811115612d5e5750506000910152565b601f01601f191690565b6151a1816150f0565b8114610df457600080fd5b6151a1816150fb565b6151a181615100565b6151a181615103565b6151a181615126565b6151a18161512f56fe5856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77735856535661756c743a3a726571756573745769746864726177616c3a20766f746573206f766572666c6f775856535661756c743a3a6765745374616b65416d6f756e743a20766f746573206f766572666c6f775856535661756c743a3a6465706f7369743a20766f746573206f766572666c6f775856535661756c743a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473736574526577617264416d6f756e74506572426c6f636b28616464726573732c75696e74323536297365745769746864726177616c4c6f636b696e67506572696f6428616464726573732c75696e743235362c75696e74323536295856535661756c743a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777361646428616464726573732c75696e743235362c616464726573732c75696e743235362c75696e7432353629a365627a7a723158204aae76b3f393e5f0a24d3edbbfe8ab0898f4b70ec1fe6c813964235a50bc1c736c6578706572696d656e74616cf564736f6c63430005100040",
|
|
1575
1575
|
"devdoc": {
|
|
1576
1576
|
"author": "Venus",
|
|
1577
1577
|
"methods": {
|
|
@@ -1822,7 +1822,7 @@
|
|
|
1822
1822
|
"storageLayout": {
|
|
1823
1823
|
"storage": [
|
|
1824
1824
|
{
|
|
1825
|
-
"astId":
|
|
1825
|
+
"astId": 33890,
|
|
1826
1826
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1827
1827
|
"label": "admin",
|
|
1828
1828
|
"offset": 0,
|
|
@@ -1830,7 +1830,7 @@
|
|
|
1830
1830
|
"type": "t_address"
|
|
1831
1831
|
},
|
|
1832
1832
|
{
|
|
1833
|
-
"astId":
|
|
1833
|
+
"astId": 33892,
|
|
1834
1834
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1835
1835
|
"label": "pendingAdmin",
|
|
1836
1836
|
"offset": 0,
|
|
@@ -1838,7 +1838,7 @@
|
|
|
1838
1838
|
"type": "t_address"
|
|
1839
1839
|
},
|
|
1840
1840
|
{
|
|
1841
|
-
"astId":
|
|
1841
|
+
"astId": 33894,
|
|
1842
1842
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1843
1843
|
"label": "implementation",
|
|
1844
1844
|
"offset": 0,
|
|
@@ -1846,7 +1846,7 @@
|
|
|
1846
1846
|
"type": "t_address"
|
|
1847
1847
|
},
|
|
1848
1848
|
{
|
|
1849
|
-
"astId":
|
|
1849
|
+
"astId": 33896,
|
|
1850
1850
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1851
1851
|
"label": "pendingXVSVaultImplementation",
|
|
1852
1852
|
"offset": 0,
|
|
@@ -1854,7 +1854,7 @@
|
|
|
1854
1854
|
"type": "t_address"
|
|
1855
1855
|
},
|
|
1856
1856
|
{
|
|
1857
|
-
"astId":
|
|
1857
|
+
"astId": 33901,
|
|
1858
1858
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1859
1859
|
"label": "_notEntered",
|
|
1860
1860
|
"offset": 20,
|
|
@@ -1862,7 +1862,7 @@
|
|
|
1862
1862
|
"type": "t_bool"
|
|
1863
1863
|
},
|
|
1864
1864
|
{
|
|
1865
|
-
"astId":
|
|
1865
|
+
"astId": 33903,
|
|
1866
1866
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1867
1867
|
"label": "xvsStore",
|
|
1868
1868
|
"offset": 0,
|
|
@@ -1870,7 +1870,7 @@
|
|
|
1870
1870
|
"type": "t_address"
|
|
1871
1871
|
},
|
|
1872
1872
|
{
|
|
1873
|
-
"astId":
|
|
1873
|
+
"astId": 33905,
|
|
1874
1874
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1875
1875
|
"label": "xvsAddress",
|
|
1876
1876
|
"offset": 0,
|
|
@@ -1878,7 +1878,7 @@
|
|
|
1878
1878
|
"type": "t_address"
|
|
1879
1879
|
},
|
|
1880
1880
|
{
|
|
1881
|
-
"astId":
|
|
1881
|
+
"astId": 33909,
|
|
1882
1882
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1883
1883
|
"label": "rewardTokenAmountsPerBlock",
|
|
1884
1884
|
"offset": 0,
|
|
@@ -1886,23 +1886,23 @@
|
|
|
1886
1886
|
"type": "t_mapping(t_address,t_uint256)"
|
|
1887
1887
|
},
|
|
1888
1888
|
{
|
|
1889
|
-
"astId":
|
|
1889
|
+
"astId": 33942,
|
|
1890
1890
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1891
1891
|
"label": "userInfos",
|
|
1892
1892
|
"offset": 0,
|
|
1893
1893
|
"slot": "7",
|
|
1894
|
-
"type": "t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)
|
|
1894
|
+
"type": "t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)33916_storage)))"
|
|
1895
1895
|
},
|
|
1896
1896
|
{
|
|
1897
|
-
"astId":
|
|
1897
|
+
"astId": 33947,
|
|
1898
1898
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1899
1899
|
"label": "poolInfos",
|
|
1900
1900
|
"offset": 0,
|
|
1901
1901
|
"slot": "8",
|
|
1902
|
-
"type": "t_mapping(t_address,t_array(t_struct(PoolInfo)
|
|
1902
|
+
"type": "t_mapping(t_address,t_array(t_struct(PoolInfo)33927_storage)dyn_storage)"
|
|
1903
1903
|
},
|
|
1904
1904
|
{
|
|
1905
|
-
"astId":
|
|
1905
|
+
"astId": 33951,
|
|
1906
1906
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1907
1907
|
"label": "totalAllocPoints",
|
|
1908
1908
|
"offset": 0,
|
|
@@ -1910,15 +1910,15 @@
|
|
|
1910
1910
|
"type": "t_mapping(t_address,t_uint256)"
|
|
1911
1911
|
},
|
|
1912
1912
|
{
|
|
1913
|
-
"astId":
|
|
1913
|
+
"astId": 33960,
|
|
1914
1914
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1915
1915
|
"label": "withdrawalRequests",
|
|
1916
1916
|
"offset": 0,
|
|
1917
1917
|
"slot": "10",
|
|
1918
|
-
"type": "t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
1918
|
+
"type": "t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage)))"
|
|
1919
1919
|
},
|
|
1920
1920
|
{
|
|
1921
|
-
"astId":
|
|
1921
|
+
"astId": 33964,
|
|
1922
1922
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1923
1923
|
"label": "__oldDelegatesSlot",
|
|
1924
1924
|
"offset": 0,
|
|
@@ -1926,15 +1926,15 @@
|
|
|
1926
1926
|
"type": "t_mapping(t_address,t_address)"
|
|
1927
1927
|
},
|
|
1928
1928
|
{
|
|
1929
|
-
"astId":
|
|
1929
|
+
"astId": 33975,
|
|
1930
1930
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1931
1931
|
"label": "__oldCheckpointsSlot",
|
|
1932
1932
|
"offset": 0,
|
|
1933
1933
|
"slot": "12",
|
|
1934
|
-
"type": "t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)
|
|
1934
|
+
"type": "t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)33969_storage))"
|
|
1935
1935
|
},
|
|
1936
1936
|
{
|
|
1937
|
-
"astId":
|
|
1937
|
+
"astId": 33979,
|
|
1938
1938
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1939
1939
|
"label": "__oldNumCheckpointsSlot",
|
|
1940
1940
|
"offset": 0,
|
|
@@ -1942,7 +1942,7 @@
|
|
|
1942
1942
|
"type": "t_mapping(t_address,t_uint32)"
|
|
1943
1943
|
},
|
|
1944
1944
|
{
|
|
1945
|
-
"astId":
|
|
1945
|
+
"astId": 33983,
|
|
1946
1946
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1947
1947
|
"label": "nonces",
|
|
1948
1948
|
"offset": 0,
|
|
@@ -1950,7 +1950,7 @@
|
|
|
1950
1950
|
"type": "t_mapping(t_address,t_uint256)"
|
|
1951
1951
|
},
|
|
1952
1952
|
{
|
|
1953
|
-
"astId":
|
|
1953
|
+
"astId": 34000,
|
|
1954
1954
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1955
1955
|
"label": "delegates",
|
|
1956
1956
|
"offset": 0,
|
|
@@ -1958,15 +1958,15 @@
|
|
|
1958
1958
|
"type": "t_mapping(t_address,t_address)"
|
|
1959
1959
|
},
|
|
1960
1960
|
{
|
|
1961
|
-
"astId":
|
|
1961
|
+
"astId": 34006,
|
|
1962
1962
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1963
1963
|
"label": "checkpoints",
|
|
1964
1964
|
"offset": 0,
|
|
1965
1965
|
"slot": "16",
|
|
1966
|
-
"type": "t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)
|
|
1966
|
+
"type": "t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)33969_storage))"
|
|
1967
1967
|
},
|
|
1968
1968
|
{
|
|
1969
|
-
"astId":
|
|
1969
|
+
"astId": 34010,
|
|
1970
1970
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1971
1971
|
"label": "numCheckpoints",
|
|
1972
1972
|
"offset": 0,
|
|
@@ -1974,7 +1974,7 @@
|
|
|
1974
1974
|
"type": "t_mapping(t_address,t_uint32)"
|
|
1975
1975
|
},
|
|
1976
1976
|
{
|
|
1977
|
-
"astId":
|
|
1977
|
+
"astId": 34016,
|
|
1978
1978
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1979
1979
|
"label": "totalPendingWithdrawals",
|
|
1980
1980
|
"offset": 0,
|
|
@@ -1982,7 +1982,7 @@
|
|
|
1982
1982
|
"type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))"
|
|
1983
1983
|
},
|
|
1984
1984
|
{
|
|
1985
|
-
"astId":
|
|
1985
|
+
"astId": 34018,
|
|
1986
1986
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1987
1987
|
"label": "vaultPaused",
|
|
1988
1988
|
"offset": 0,
|
|
@@ -1990,7 +1990,7 @@
|
|
|
1990
1990
|
"type": "t_bool"
|
|
1991
1991
|
},
|
|
1992
1992
|
{
|
|
1993
|
-
"astId":
|
|
1993
|
+
"astId": 34022,
|
|
1994
1994
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
1995
1995
|
"label": "isStakedToken",
|
|
1996
1996
|
"offset": 0,
|
|
@@ -1998,7 +1998,7 @@
|
|
|
1998
1998
|
"type": "t_mapping(t_address,t_bool)"
|
|
1999
1999
|
},
|
|
2000
2000
|
{
|
|
2001
|
-
"astId":
|
|
2001
|
+
"astId": 34028,
|
|
2002
2002
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2003
2003
|
"label": "pendingRewardTransfers",
|
|
2004
2004
|
"offset": 0,
|
|
@@ -2006,15 +2006,15 @@
|
|
|
2006
2006
|
"type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
|
|
2007
2007
|
},
|
|
2008
2008
|
{
|
|
2009
|
-
"astId":
|
|
2009
|
+
"astId": 34030,
|
|
2010
2010
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2011
2011
|
"label": "primeToken",
|
|
2012
2012
|
"offset": 0,
|
|
2013
2013
|
"slot": "22",
|
|
2014
|
-
"type": "t_contract(IPrime)
|
|
2014
|
+
"type": "t_contract(IPrime)12009"
|
|
2015
2015
|
},
|
|
2016
2016
|
{
|
|
2017
|
-
"astId":
|
|
2017
|
+
"astId": 34032,
|
|
2018
2018
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2019
2019
|
"label": "primeRewardToken",
|
|
2020
2020
|
"offset": 0,
|
|
@@ -2022,7 +2022,7 @@
|
|
|
2022
2022
|
"type": "t_address"
|
|
2023
2023
|
},
|
|
2024
2024
|
{
|
|
2025
|
-
"astId":
|
|
2025
|
+
"astId": 34034,
|
|
2026
2026
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2027
2027
|
"label": "primePoolId",
|
|
2028
2028
|
"offset": 0,
|
|
@@ -2030,7 +2030,7 @@
|
|
|
2030
2030
|
"type": "t_uint256"
|
|
2031
2031
|
},
|
|
2032
2032
|
{
|
|
2033
|
-
"astId":
|
|
2033
|
+
"astId": 34038,
|
|
2034
2034
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2035
2035
|
"label": "__gap",
|
|
2036
2036
|
"offset": 0,
|
|
@@ -2060,14 +2060,14 @@
|
|
|
2060
2060
|
"label": "address",
|
|
2061
2061
|
"numberOfBytes": "20"
|
|
2062
2062
|
},
|
|
2063
|
-
"t_array(t_struct(PoolInfo)
|
|
2064
|
-
"base": "t_struct(PoolInfo)
|
|
2063
|
+
"t_array(t_struct(PoolInfo)33927_storage)dyn_storage": {
|
|
2064
|
+
"base": "t_struct(PoolInfo)33927_storage",
|
|
2065
2065
|
"encoding": "dynamic_array",
|
|
2066
2066
|
"label": "struct XVSVaultStorageV1.PoolInfo[]",
|
|
2067
2067
|
"numberOfBytes": "32"
|
|
2068
2068
|
},
|
|
2069
|
-
"t_array(t_struct(WithdrawalRequest)
|
|
2070
|
-
"base": "t_struct(WithdrawalRequest)
|
|
2069
|
+
"t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage": {
|
|
2070
|
+
"base": "t_struct(WithdrawalRequest)33934_storage",
|
|
2071
2071
|
"encoding": "dynamic_array",
|
|
2072
2072
|
"label": "struct XVSVaultStorageV1.WithdrawalRequest[]",
|
|
2073
2073
|
"numberOfBytes": "32"
|
|
@@ -2094,12 +2094,12 @@
|
|
|
2094
2094
|
"label": "contract IAccessControlManagerV5",
|
|
2095
2095
|
"numberOfBytes": "20"
|
|
2096
2096
|
},
|
|
2097
|
-
"t_contract(IBEP20)
|
|
2097
|
+
"t_contract(IBEP20)27212": {
|
|
2098
2098
|
"encoding": "inplace",
|
|
2099
2099
|
"label": "contract IBEP20",
|
|
2100
2100
|
"numberOfBytes": "20"
|
|
2101
2101
|
},
|
|
2102
|
-
"t_contract(IPrime)
|
|
2102
|
+
"t_contract(IPrime)12009": {
|
|
2103
2103
|
"encoding": "inplace",
|
|
2104
2104
|
"label": "contract IPrime",
|
|
2105
2105
|
"numberOfBytes": "20"
|
|
@@ -2111,19 +2111,19 @@
|
|
|
2111
2111
|
"numberOfBytes": "32",
|
|
2112
2112
|
"value": "t_address"
|
|
2113
2113
|
},
|
|
2114
|
-
"t_mapping(t_address,t_array(t_struct(PoolInfo)
|
|
2114
|
+
"t_mapping(t_address,t_array(t_struct(PoolInfo)33927_storage)dyn_storage)": {
|
|
2115
2115
|
"encoding": "mapping",
|
|
2116
2116
|
"key": "t_address",
|
|
2117
2117
|
"label": "mapping(address => struct XVSVaultStorageV1.PoolInfo[])",
|
|
2118
2118
|
"numberOfBytes": "32",
|
|
2119
|
-
"value": "t_array(t_struct(PoolInfo)
|
|
2119
|
+
"value": "t_array(t_struct(PoolInfo)33927_storage)dyn_storage"
|
|
2120
2120
|
},
|
|
2121
|
-
"t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
2121
|
+
"t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage)": {
|
|
2122
2122
|
"encoding": "mapping",
|
|
2123
2123
|
"key": "t_address",
|
|
2124
2124
|
"label": "mapping(address => struct XVSVaultStorageV1.WithdrawalRequest[])",
|
|
2125
2125
|
"numberOfBytes": "32",
|
|
2126
|
-
"value": "t_array(t_struct(WithdrawalRequest)
|
|
2126
|
+
"value": "t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage"
|
|
2127
2127
|
},
|
|
2128
2128
|
"t_mapping(t_address,t_bool)": {
|
|
2129
2129
|
"encoding": "mapping",
|
|
@@ -2139,19 +2139,19 @@
|
|
|
2139
2139
|
"numberOfBytes": "32",
|
|
2140
2140
|
"value": "t_mapping(t_address,t_uint256)"
|
|
2141
2141
|
},
|
|
2142
|
-
"t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
2142
|
+
"t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage)))": {
|
|
2143
2143
|
"encoding": "mapping",
|
|
2144
2144
|
"key": "t_address",
|
|
2145
2145
|
"label": "mapping(address => mapping(uint256 => mapping(address => struct XVSVaultStorageV1.WithdrawalRequest[])))",
|
|
2146
2146
|
"numberOfBytes": "32",
|
|
2147
|
-
"value": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
2147
|
+
"value": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage))"
|
|
2148
2148
|
},
|
|
2149
|
-
"t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)
|
|
2149
|
+
"t_mapping(t_address,t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)33916_storage)))": {
|
|
2150
2150
|
"encoding": "mapping",
|
|
2151
2151
|
"key": "t_address",
|
|
2152
2152
|
"label": "mapping(address => mapping(uint256 => mapping(address => struct XVSVaultStorageV1.UserInfo)))",
|
|
2153
2153
|
"numberOfBytes": "32",
|
|
2154
|
-
"value": "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)
|
|
2154
|
+
"value": "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)33916_storage))"
|
|
2155
2155
|
},
|
|
2156
2156
|
"t_mapping(t_address,t_mapping(t_uint256,t_uint256))": {
|
|
2157
2157
|
"encoding": "mapping",
|
|
@@ -2160,19 +2160,19 @@
|
|
|
2160
2160
|
"numberOfBytes": "32",
|
|
2161
2161
|
"value": "t_mapping(t_uint256,t_uint256)"
|
|
2162
2162
|
},
|
|
2163
|
-
"t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)
|
|
2163
|
+
"t_mapping(t_address,t_mapping(t_uint32,t_struct(Checkpoint)33969_storage))": {
|
|
2164
2164
|
"encoding": "mapping",
|
|
2165
2165
|
"key": "t_address",
|
|
2166
2166
|
"label": "mapping(address => mapping(uint32 => struct XVSVaultStorageV1.Checkpoint))",
|
|
2167
2167
|
"numberOfBytes": "32",
|
|
2168
|
-
"value": "t_mapping(t_uint32,t_struct(Checkpoint)
|
|
2168
|
+
"value": "t_mapping(t_uint32,t_struct(Checkpoint)33969_storage)"
|
|
2169
2169
|
},
|
|
2170
|
-
"t_mapping(t_address,t_struct(UserInfo)
|
|
2170
|
+
"t_mapping(t_address,t_struct(UserInfo)33916_storage)": {
|
|
2171
2171
|
"encoding": "mapping",
|
|
2172
2172
|
"key": "t_address",
|
|
2173
2173
|
"label": "mapping(address => struct XVSVaultStorageV1.UserInfo)",
|
|
2174
2174
|
"numberOfBytes": "32",
|
|
2175
|
-
"value": "t_struct(UserInfo)
|
|
2175
|
+
"value": "t_struct(UserInfo)33916_storage"
|
|
2176
2176
|
},
|
|
2177
2177
|
"t_mapping(t_address,t_uint256)": {
|
|
2178
2178
|
"encoding": "mapping",
|
|
@@ -2188,19 +2188,19 @@
|
|
|
2188
2188
|
"numberOfBytes": "32",
|
|
2189
2189
|
"value": "t_uint32"
|
|
2190
2190
|
},
|
|
2191
|
-
"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
2191
|
+
"t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage))": {
|
|
2192
2192
|
"encoding": "mapping",
|
|
2193
2193
|
"key": "t_uint256",
|
|
2194
2194
|
"label": "mapping(uint256 => mapping(address => struct XVSVaultStorageV1.WithdrawalRequest[]))",
|
|
2195
2195
|
"numberOfBytes": "32",
|
|
2196
|
-
"value": "t_mapping(t_address,t_array(t_struct(WithdrawalRequest)
|
|
2196
|
+
"value": "t_mapping(t_address,t_array(t_struct(WithdrawalRequest)33934_storage)dyn_storage)"
|
|
2197
2197
|
},
|
|
2198
|
-
"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)
|
|
2198
|
+
"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)33916_storage))": {
|
|
2199
2199
|
"encoding": "mapping",
|
|
2200
2200
|
"key": "t_uint256",
|
|
2201
2201
|
"label": "mapping(uint256 => mapping(address => struct XVSVaultStorageV1.UserInfo))",
|
|
2202
2202
|
"numberOfBytes": "32",
|
|
2203
|
-
"value": "t_mapping(t_address,t_struct(UserInfo)
|
|
2203
|
+
"value": "t_mapping(t_address,t_struct(UserInfo)33916_storage)"
|
|
2204
2204
|
},
|
|
2205
2205
|
"t_mapping(t_uint256,t_uint256)": {
|
|
2206
2206
|
"encoding": "mapping",
|
|
@@ -2209,19 +2209,19 @@
|
|
|
2209
2209
|
"numberOfBytes": "32",
|
|
2210
2210
|
"value": "t_uint256"
|
|
2211
2211
|
},
|
|
2212
|
-
"t_mapping(t_uint32,t_struct(Checkpoint)
|
|
2212
|
+
"t_mapping(t_uint32,t_struct(Checkpoint)33969_storage)": {
|
|
2213
2213
|
"encoding": "mapping",
|
|
2214
2214
|
"key": "t_uint32",
|
|
2215
2215
|
"label": "mapping(uint32 => struct XVSVaultStorageV1.Checkpoint)",
|
|
2216
2216
|
"numberOfBytes": "32",
|
|
2217
|
-
"value": "t_struct(Checkpoint)
|
|
2217
|
+
"value": "t_struct(Checkpoint)33969_storage"
|
|
2218
2218
|
},
|
|
2219
|
-
"t_struct(Checkpoint)
|
|
2219
|
+
"t_struct(Checkpoint)33969_storage": {
|
|
2220
2220
|
"encoding": "inplace",
|
|
2221
2221
|
"label": "struct XVSVaultStorageV1.Checkpoint",
|
|
2222
2222
|
"members": [
|
|
2223
2223
|
{
|
|
2224
|
-
"astId":
|
|
2224
|
+
"astId": 33966,
|
|
2225
2225
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2226
2226
|
"label": "fromBlock",
|
|
2227
2227
|
"offset": 0,
|
|
@@ -2229,7 +2229,7 @@
|
|
|
2229
2229
|
"type": "t_uint32"
|
|
2230
2230
|
},
|
|
2231
2231
|
{
|
|
2232
|
-
"astId":
|
|
2232
|
+
"astId": 33968,
|
|
2233
2233
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2234
2234
|
"label": "votes",
|
|
2235
2235
|
"offset": 4,
|
|
@@ -2239,20 +2239,20 @@
|
|
|
2239
2239
|
],
|
|
2240
2240
|
"numberOfBytes": "32"
|
|
2241
2241
|
},
|
|
2242
|
-
"t_struct(PoolInfo)
|
|
2242
|
+
"t_struct(PoolInfo)33927_storage": {
|
|
2243
2243
|
"encoding": "inplace",
|
|
2244
2244
|
"label": "struct XVSVaultStorageV1.PoolInfo",
|
|
2245
2245
|
"members": [
|
|
2246
2246
|
{
|
|
2247
|
-
"astId":
|
|
2247
|
+
"astId": 33918,
|
|
2248
2248
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2249
2249
|
"label": "token",
|
|
2250
2250
|
"offset": 0,
|
|
2251
2251
|
"slot": "0",
|
|
2252
|
-
"type": "t_contract(IBEP20)
|
|
2252
|
+
"type": "t_contract(IBEP20)27212"
|
|
2253
2253
|
},
|
|
2254
2254
|
{
|
|
2255
|
-
"astId":
|
|
2255
|
+
"astId": 33920,
|
|
2256
2256
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2257
2257
|
"label": "allocPoint",
|
|
2258
2258
|
"offset": 0,
|
|
@@ -2260,7 +2260,7 @@
|
|
|
2260
2260
|
"type": "t_uint256"
|
|
2261
2261
|
},
|
|
2262
2262
|
{
|
|
2263
|
-
"astId":
|
|
2263
|
+
"astId": 33922,
|
|
2264
2264
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2265
2265
|
"label": "lastRewardBlock",
|
|
2266
2266
|
"offset": 0,
|
|
@@ -2268,7 +2268,7 @@
|
|
|
2268
2268
|
"type": "t_uint256"
|
|
2269
2269
|
},
|
|
2270
2270
|
{
|
|
2271
|
-
"astId":
|
|
2271
|
+
"astId": 33924,
|
|
2272
2272
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2273
2273
|
"label": "accRewardPerShare",
|
|
2274
2274
|
"offset": 0,
|
|
@@ -2276,7 +2276,7 @@
|
|
|
2276
2276
|
"type": "t_uint256"
|
|
2277
2277
|
},
|
|
2278
2278
|
{
|
|
2279
|
-
"astId":
|
|
2279
|
+
"astId": 33926,
|
|
2280
2280
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2281
2281
|
"label": "lockPeriod",
|
|
2282
2282
|
"offset": 0,
|
|
@@ -2286,12 +2286,12 @@
|
|
|
2286
2286
|
],
|
|
2287
2287
|
"numberOfBytes": "160"
|
|
2288
2288
|
},
|
|
2289
|
-
"t_struct(UserInfo)
|
|
2289
|
+
"t_struct(UserInfo)33916_storage": {
|
|
2290
2290
|
"encoding": "inplace",
|
|
2291
2291
|
"label": "struct XVSVaultStorageV1.UserInfo",
|
|
2292
2292
|
"members": [
|
|
2293
2293
|
{
|
|
2294
|
-
"astId":
|
|
2294
|
+
"astId": 33911,
|
|
2295
2295
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2296
2296
|
"label": "amount",
|
|
2297
2297
|
"offset": 0,
|
|
@@ -2299,7 +2299,7 @@
|
|
|
2299
2299
|
"type": "t_uint256"
|
|
2300
2300
|
},
|
|
2301
2301
|
{
|
|
2302
|
-
"astId":
|
|
2302
|
+
"astId": 33913,
|
|
2303
2303
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2304
2304
|
"label": "rewardDebt",
|
|
2305
2305
|
"offset": 0,
|
|
@@ -2307,7 +2307,7 @@
|
|
|
2307
2307
|
"type": "t_uint256"
|
|
2308
2308
|
},
|
|
2309
2309
|
{
|
|
2310
|
-
"astId":
|
|
2310
|
+
"astId": 33915,
|
|
2311
2311
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2312
2312
|
"label": "pendingWithdrawals",
|
|
2313
2313
|
"offset": 0,
|
|
@@ -2317,12 +2317,12 @@
|
|
|
2317
2317
|
],
|
|
2318
2318
|
"numberOfBytes": "96"
|
|
2319
2319
|
},
|
|
2320
|
-
"t_struct(WithdrawalRequest)
|
|
2320
|
+
"t_struct(WithdrawalRequest)33934_storage": {
|
|
2321
2321
|
"encoding": "inplace",
|
|
2322
2322
|
"label": "struct XVSVaultStorageV1.WithdrawalRequest",
|
|
2323
2323
|
"members": [
|
|
2324
2324
|
{
|
|
2325
|
-
"astId":
|
|
2325
|
+
"astId": 33929,
|
|
2326
2326
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2327
2327
|
"label": "amount",
|
|
2328
2328
|
"offset": 0,
|
|
@@ -2330,7 +2330,7 @@
|
|
|
2330
2330
|
"type": "t_uint256"
|
|
2331
2331
|
},
|
|
2332
2332
|
{
|
|
2333
|
-
"astId":
|
|
2333
|
+
"astId": 33931,
|
|
2334
2334
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2335
2335
|
"label": "lockedUntil",
|
|
2336
2336
|
"offset": 0,
|
|
@@ -2338,7 +2338,7 @@
|
|
|
2338
2338
|
"type": "t_uint128"
|
|
2339
2339
|
},
|
|
2340
2340
|
{
|
|
2341
|
-
"astId":
|
|
2341
|
+
"astId": 33933,
|
|
2342
2342
|
"contract": "contracts/XVSVault/XVSVault.sol:XVSVault",
|
|
2343
2343
|
"label": "afterUpgrade",
|
|
2344
2344
|
"offset": 16,
|