More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,345 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Handle Rewards | 64995236 | 50 days ago | IN | 0 POL | 0.07044614 | ||||
Handle Rewards | 64876060 | 53 days ago | IN | 0 POL | 0.05910854 | ||||
Mint And Stake B... | 64876022 | 53 days ago | IN | 1.4959 POL | 0.13067867 | ||||
Handle Rewards | 64626194 | 59 days ago | IN | 0 POL | 0.02455413 | ||||
Handle Rewards | 64626130 | 59 days ago | IN | 0 POL | 0.02466733 | ||||
Stake Es Blu | 64568847 | 61 days ago | IN | 0 POL | 0.01763022 | ||||
Handle Rewards | 64568778 | 61 days ago | IN | 0 POL | 0.005591 | ||||
Unstake Es Blu | 64568741 | 61 days ago | IN | 0 POL | 0.02068015 | ||||
Handle Rewards | 64568656 | 61 days ago | IN | 0 POL | 0.00813997 | ||||
Handle Rewards | 64568606 | 61 days ago | IN | 0 POL | 0.02231037 | ||||
Unstake Es Blu | 64568528 | 61 days ago | IN | 0 POL | 0.02126243 | ||||
Handle Rewards | 64477457 | 63 days ago | IN | 0 POL | 0.05448941 | ||||
Handle Rewards | 64356594 | 66 days ago | IN | 0 POL | 0.03995825 | ||||
Handle Rewards | 64356564 | 66 days ago | IN | 0 POL | 0.02028143 | ||||
Stake Es Blu | 64197588 | 70 days ago | IN | 0 POL | 0.18341748 | ||||
Handle Rewards | 64197458 | 70 days ago | IN | 0 POL | 0.08843438 | ||||
Handle Rewards | 64197444 | 70 days ago | IN | 0 POL | 0.05623506 | ||||
Handle Rewards | 64197401 | 70 days ago | IN | 0 POL | 0.10105638 | ||||
Stake Es Blu | 63615409 | 85 days ago | IN | 0 POL | 0.02040305 | ||||
Unstake Es Blu | 63615121 | 85 days ago | IN | 0 POL | 0.0246182 | ||||
Handle Rewards | 63615079 | 85 days ago | IN | 0 POL | 0.03246375 | ||||
Mint And Stake B... | 63579345 | 86 days ago | IN | 1 POL | 0.04843569 | ||||
Stake Blu | 63579264 | 86 days ago | IN | 0 POL | 0.01777605 | ||||
Stake Es Blu | 63579217 | 86 days ago | IN | 0 POL | 0.01762773 | ||||
Unstake And Rede... | 63579167 | 86 days ago | IN | 0 POL | 0.04495163 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
64876022 | 53 days ago | 1.4959 POL | ||||
63579345 | 86 days ago | 1 POL | ||||
63579167 | 86 days ago | 0.91709898 POL | ||||
63579167 | 86 days ago | 0.91709898 POL | ||||
60941256 | 151 days ago | 0.57180337 POL | ||||
60941256 | 151 days ago | 0.57180337 POL | ||||
60941234 | 151 days ago | 3.432938 POL | ||||
60941234 | 151 days ago | 3.432938 POL | ||||
59541456 | 186 days ago | 4.74590126 POL | ||||
59541456 | 186 days ago | 4.74590126 POL | ||||
59469658 | 188 days ago | 3 POL | ||||
59453554 | 189 days ago | 52.64305015 POL | ||||
59453554 | 189 days ago | 52.64305015 POL | ||||
59453463 | 189 days ago | 224.14579206 POL | ||||
59453463 | 189 days ago | 224.14579206 POL | ||||
59319957 | 192 days ago | 5 POL | ||||
58920954 | 202 days ago | 1 POL | ||||
57659751 | 234 days ago | 61.86149932 POL | ||||
57659751 | 234 days ago | 61.86149932 POL | ||||
57568551 | 236 days ago | 300 POL | ||||
56285889 | 270 days ago | 13.05186011 POL | ||||
56285889 | 270 days ago | 13.05186011 POL | ||||
56113885 | 274 days ago | 4 POL | ||||
56077220 | 275 days ago | 2.91123834 POL | ||||
56006183 | 277 days ago | 3.0696 POL |
Loading...
Loading
Contract Name:
RewardRouterV2
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "./interfaces/IRewardTracker.sol"; import "./interfaces/IVester.sol"; import "../tokens/interfaces/IMintable.sol"; import "../tokens/interfaces/IWETH.sol"; import "../core/interfaces/IBlpManager.sol"; import "../access/Governable.sol"; contract RewardRouterV2 is ReentrancyGuard, Governable { using SafeMath for uint256; using SafeERC20 for IERC20; using Address for address payable; bool public isInitialized; address public weth; address public blu; address public esBlu; address public bnBlu; address public blp; // BLU Liquidity Provider token address public stakedBluTracker; address public bonusBluTracker; address public feeBluTracker; address public stakedBlpTracker; address public feeBlpTracker; address public blpManager; address public bluVester; address public blpVester; mapping (address => address) public pendingReceivers; event StakeBlu(address account, address token, uint256 amount); event UnstakeBlu(address account, address token, uint256 amount); event StakeBlp(address account, uint256 amount); event UnstakeBlp(address account, uint256 amount); receive() external payable { require(msg.sender == weth, "Router: invalid sender"); } struct initParams{ address _weth; address _blu; address _esBlu; address _bnBlu; address _blp; address _stakedBluTracker; address _bonusBluTracker; address _feeBluTracker; address _feeBlpTracker; address _stakedBlpTracker; address _blpManager; address _bluVester; address _blpVester; } function initialize(initParams memory params) external onlyGov { require(!isInitialized, "RewardRouter: already initialized"); isInitialized = true; weth = params._weth; blu = params._blu; esBlu = params._esBlu; bnBlu = params._bnBlu; blp = params._blp; stakedBluTracker = params._stakedBluTracker; bonusBluTracker = params._bonusBluTracker; feeBluTracker = params._feeBluTracker; feeBlpTracker = params._feeBlpTracker; stakedBlpTracker = params._stakedBlpTracker; blpManager = params._blpManager; bluVester = params._bluVester; blpVester = params._blpVester; } // to help users who accidentally send their tokens to this contract function withdrawToken(address _token, address _account, uint256 _amount) external onlyGov { IERC20(_token).safeTransfer(_account, _amount); } function batchStakeBluForAccount(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyGov { address _blu = blu; for (uint256 i = 0; i < _accounts.length; i++) { _stakeBlu(msg.sender, _accounts[i], _blu, _amounts[i]); } } function stakeBluForAccount(address _account, uint256 _amount) external nonReentrant onlyGov { _stakeBlu(msg.sender, _account, blu, _amount); } function stakeBlu(uint256 _amount) external nonReentrant { _stakeBlu(msg.sender, msg.sender, blu, _amount); } function stakeEsBlu(uint256 _amount) external nonReentrant { _stakeBlu(msg.sender, msg.sender, esBlu, _amount); } function unstakeBlu(uint256 _amount) external nonReentrant { _unstakeBlu(msg.sender, blu, _amount, true); } function unstakeEsBlu(uint256 _amount) external nonReentrant { _unstakeBlu(msg.sender, esBlu, _amount, true); } function mintAndStakeBlp(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minBlp) external nonReentrant returns (uint256) { require(_amount > 0, "RewardRouter: invalid _amount"); address account = msg.sender; uint256 blpAmount = IBlpManager(blpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdg, _minBlp); IRewardTracker(feeBlpTracker).stakeForAccount(account, account, blp, blpAmount); IRewardTracker(stakedBlpTracker).stakeForAccount(account, account, feeBlpTracker, blpAmount); emit StakeBlp(account, blpAmount); return blpAmount; } function mintAndStakeBlpETH(uint256 _minUsdg, uint256 _minBlp) external payable nonReentrant returns (uint256) { require(msg.value > 0, "RewardRouter: invalid msg.value"); IWETH(weth).deposit{value: msg.value}(); IERC20(weth).approve(blpManager, msg.value); address account = msg.sender; uint256 blpAmount = IBlpManager(blpManager).addLiquidityForAccount(address(this), account, weth, msg.value, _minUsdg, _minBlp); IRewardTracker(feeBlpTracker).stakeForAccount(account, account, blp, blpAmount); IRewardTracker(stakedBlpTracker).stakeForAccount(account, account, feeBlpTracker, blpAmount); emit StakeBlp(account, blpAmount); return blpAmount; } function unstakeAndRedeemBlp(address _tokenOut, uint256 _blpAmount, uint256 _minOut, address _receiver) external nonReentrant returns (uint256) { require(_blpAmount > 0, "RewardRouter: invalid _blpAmount"); address account = msg.sender; IRewardTracker(stakedBlpTracker).unstakeForAccount(account, feeBlpTracker, _blpAmount, account); IRewardTracker(feeBlpTracker).unstakeForAccount(account, blp, _blpAmount, account); uint256 amountOut = IBlpManager(blpManager).removeLiquidityForAccount(account, _tokenOut, _blpAmount, _minOut, _receiver); emit UnstakeBlp(account, _blpAmount); return amountOut; } function unstakeAndRedeemBlpETH(uint256 _blpAmount, uint256 _minOut, address payable _receiver) external nonReentrant returns (uint256) { require(_blpAmount > 0, "RewardRouter: invalid _blpAmount"); address account = msg.sender; IRewardTracker(stakedBlpTracker).unstakeForAccount(account, feeBlpTracker, _blpAmount, account); IRewardTracker(feeBlpTracker).unstakeForAccount(account, blp, _blpAmount, account); uint256 amountOut = IBlpManager(blpManager).removeLiquidityForAccount(account, weth, _blpAmount, _minOut, address(this)); IWETH(weth).withdraw(amountOut); _receiver.sendValue(amountOut); emit UnstakeBlp(account, _blpAmount); return amountOut; } function claim() external nonReentrant { address account = msg.sender; IRewardTracker(feeBluTracker).claimForAccount(account, account); IRewardTracker(feeBlpTracker).claimForAccount(account, account); IRewardTracker(stakedBluTracker).claimForAccount(account, account); IRewardTracker(stakedBlpTracker).claimForAccount(account, account); } function claimEsBlu() external nonReentrant { address account = msg.sender; IRewardTracker(stakedBluTracker).claimForAccount(account, account); IRewardTracker(stakedBlpTracker).claimForAccount(account, account); } function claimFees() external nonReentrant { address account = msg.sender; IRewardTracker(feeBluTracker).claimForAccount(account, account); IRewardTracker(feeBlpTracker).claimForAccount(account, account); } function compound() external nonReentrant { _compound(msg.sender); } function compoundForAccount(address _account) external nonReentrant onlyGov { _compound(_account); } function handleRewards( bool _shouldClaimBlu, bool _shouldStakeBlu, bool _shouldClaimEsBlu, bool _shouldStakeEsBlu, bool _shouldStakeMultiplierPoints, bool _shouldClaimWeth, bool _shouldConvertWethToEth ) external nonReentrant { address account = msg.sender; uint256 bluAmount = 0; if (_shouldClaimBlu) { uint256 bluAmount0 = IVester(bluVester).claimForAccount(account, account); uint256 bluAmount1 = IVester(blpVester).claimForAccount(account, account); bluAmount = bluAmount0.add(bluAmount1); } if (_shouldStakeBlu && bluAmount > 0) { _stakeBlu(account, account, blu, bluAmount); } uint256 esBluAmount = 0; if (_shouldClaimEsBlu) { uint256 esBluAmount0 = IRewardTracker(stakedBluTracker).claimForAccount(account, account); uint256 esBluAmount1 = IRewardTracker(stakedBlpTracker).claimForAccount(account, account); esBluAmount = esBluAmount0.add(esBluAmount1); } if (_shouldStakeEsBlu && esBluAmount > 0) { _stakeBlu(account, account, esBlu, esBluAmount); } if (_shouldStakeMultiplierPoints) { uint256 bnBluAmount = IRewardTracker(bonusBluTracker).claimForAccount(account, account); if (bnBluAmount > 0) { IRewardTracker(feeBluTracker).stakeForAccount(account, account, bnBlu, bnBluAmount); } } if (_shouldClaimWeth) { if (_shouldConvertWethToEth) { uint256 weth0 = IRewardTracker(feeBluTracker).claimForAccount(account, address(this)); uint256 weth1 = IRewardTracker(feeBlpTracker).claimForAccount(account, address(this)); uint256 wethAmount = weth0.add(weth1); IWETH(weth).withdraw(wethAmount); payable(account).sendValue(wethAmount); } else { IRewardTracker(feeBluTracker).claimForAccount(account, account); IRewardTracker(feeBlpTracker).claimForAccount(account, account); } } } function batchCompoundForAccounts(address[] memory _accounts) external nonReentrant onlyGov { for (uint256 i = 0; i < _accounts.length; i++) { _compound(_accounts[i]); } } function signalTransfer(address _receiver) external nonReentrant { require(IERC20(bluVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens"); require(IERC20(blpVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens"); _validateReceiver(_receiver); pendingReceivers[msg.sender] = _receiver; } function acceptTransfer(address _sender) external nonReentrant { require(IERC20(bluVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens"); require(IERC20(blpVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens"); address receiver = msg.sender; require(pendingReceivers[_sender] == receiver, "RewardRouter: transfer not signalled"); delete pendingReceivers[_sender]; _validateReceiver(receiver); _compound(_sender); uint256 stakedBlu = IRewardTracker(stakedBluTracker).depositBalances(_sender, blu); if (stakedBlu > 0) { _unstakeBlu(_sender, blu, stakedBlu, false); _stakeBlu(_sender, receiver, blu, stakedBlu); } uint256 stakedEsBlu = IRewardTracker(stakedBluTracker).depositBalances(_sender, esBlu); if (stakedEsBlu > 0) { _unstakeBlu(_sender, esBlu, stakedEsBlu, false); _stakeBlu(_sender, receiver, esBlu, stakedEsBlu); } uint256 stakedBnBlu = IRewardTracker(feeBluTracker).depositBalances(_sender, bnBlu); if (stakedBnBlu > 0) { IRewardTracker(feeBluTracker).unstakeForAccount(_sender, bnBlu, stakedBnBlu, _sender); IRewardTracker(feeBluTracker).stakeForAccount(_sender, receiver, bnBlu, stakedBnBlu); } uint256 esBluBalance = IERC20(esBlu).balanceOf(_sender); if (esBluBalance > 0) { IERC20(esBlu).transferFrom(_sender, receiver, esBluBalance); } uint256 blpAmount = IRewardTracker(feeBlpTracker).depositBalances(_sender, blp); if (blpAmount > 0) { IRewardTracker(stakedBlpTracker).unstakeForAccount(_sender, feeBlpTracker, blpAmount, _sender); IRewardTracker(feeBlpTracker).unstakeForAccount(_sender, blp, blpAmount, _sender); IRewardTracker(feeBlpTracker).stakeForAccount(_sender, receiver, blp, blpAmount); IRewardTracker(stakedBlpTracker).stakeForAccount(receiver, receiver, feeBlpTracker, blpAmount); } IVester(bluVester).transferStakeValues(_sender, receiver); IVester(blpVester).transferStakeValues(_sender, receiver); } function _validateReceiver(address _receiver) private view { require(IRewardTracker(stakedBluTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedBluTracker.averageStakedAmounts > 0"); require(IRewardTracker(stakedBluTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedBluTracker.cumulativeRewards > 0"); require(IRewardTracker(bonusBluTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: bonusBluTracker.averageStakedAmounts > 0"); require(IRewardTracker(bonusBluTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: bonusBluTracker.cumulativeRewards > 0"); require(IRewardTracker(feeBluTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeBluTracker.averageStakedAmounts > 0"); require(IRewardTracker(feeBluTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeBluTracker.cumulativeRewards > 0"); require(IVester(bluVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: bluVester.transferredAverageStakedAmounts > 0"); require(IVester(bluVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: bluVester.transferredCumulativeRewards > 0"); require(IRewardTracker(stakedBlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedBlpTracker.averageStakedAmounts > 0"); require(IRewardTracker(stakedBlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedBlpTracker.cumulativeRewards > 0"); require(IRewardTracker(feeBlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeBlpTracker.averageStakedAmounts > 0"); require(IRewardTracker(feeBlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeBlpTracker.cumulativeRewards > 0"); require(IVester(blpVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: bluVester.transferredAverageStakedAmounts > 0"); require(IVester(blpVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: bluVester.transferredCumulativeRewards > 0"); require(IERC20(bluVester).balanceOf(_receiver) == 0, "RewardRouter: bluVester.balance > 0"); require(IERC20(blpVester).balanceOf(_receiver) == 0, "RewardRouter: blpVester.balance > 0"); } function _compound(address _account) private { _compoundBlu(_account); _compoundBlp(_account); } function _compoundBlu(address _account) private { uint256 esBluAmount = IRewardTracker(stakedBluTracker).claimForAccount(_account, _account); if (esBluAmount > 0) { _stakeBlu(_account, _account, esBlu, esBluAmount); } uint256 bnBluAmount = IRewardTracker(bonusBluTracker).claimForAccount(_account, _account); if (bnBluAmount > 0) { IRewardTracker(feeBluTracker).stakeForAccount(_account, _account, bnBlu, bnBluAmount); } } function _compoundBlp(address _account) private { uint256 esBluAmount = IRewardTracker(stakedBlpTracker).claimForAccount(_account, _account); if (esBluAmount > 0) { _stakeBlu(_account, _account, esBlu, esBluAmount); } } function _stakeBlu(address _fundingAccount, address _account, address _token, uint256 _amount) private { require(_amount > 0, "RewardRouter: invalid _amount"); IRewardTracker(stakedBluTracker).stakeForAccount(_fundingAccount, _account, _token, _amount); IRewardTracker(bonusBluTracker).stakeForAccount(_account, _account, stakedBluTracker, _amount); IRewardTracker(feeBluTracker).stakeForAccount(_account, _account, bonusBluTracker, _amount); emit StakeBlu(_account, _token, _amount); } function _unstakeBlu(address _account, address _token, uint256 _amount, bool _shouldReduceBnBlu) private { require(_amount > 0, "RewardRouter: invalid _amount"); uint256 balance = IRewardTracker(stakedBluTracker).stakedAmounts(_account); IRewardTracker(feeBluTracker).unstakeForAccount(_account, bonusBluTracker, _amount, _account); IRewardTracker(bonusBluTracker).unstakeForAccount(_account, stakedBluTracker, _amount, _account); IRewardTracker(stakedBluTracker).unstakeForAccount(_account, _token, _amount, _account); if (_shouldReduceBnBlu) { uint256 bnBluAmount = IRewardTracker(bonusBluTracker).claimForAccount(_account, _account); if (bnBluAmount > 0) { IRewardTracker(feeBluTracker).stakeForAccount(_account, _account, bnBlu, bnBluAmount); } uint256 stakedBnBlu = IRewardTracker(feeBluTracker).depositBalances(_account, bnBlu); if (stakedBnBlu > 0) { uint256 reductionAmount = stakedBnBlu.mul(_amount).div(balance); IRewardTracker(feeBluTracker).unstakeForAccount(_account, bnBlu, reductionAmount, _account); IMintable(bnBlu).burn(_account, reductionAmount); } } emit UnstakeBlu(_account, _token, _amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Governable { address public gov; constructor() { gov = msg.sender; } modifier onlyGov() { require(msg.sender == gov, "Governable: forbidden"); _; } function setGov(address _gov) external onlyGov { gov = _gov; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBlpManager { function usdg() external view returns (address); function cooldownDuration() external returns (uint256); function getAumInUsdg(bool maximise) external view returns (uint256); function lastAddedAt(address _account) external returns (uint256); function addLiquidity(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minBlp) external returns (uint256); function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minBlp) external returns (uint256); function removeLiquidity(address _tokenOut, uint256 _blpAmount, uint256 _minOut, address _receiver) external returns (uint256); function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _blpAmount, uint256 _minOut, address _receiver) external returns (uint256); // function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external; function setCooldownDuration(uint256 _cooldownDuration) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IRewardTracker { function depositBalances(address _account, address _depositToken) external view returns (uint256); function stakedAmounts(address _account) external view returns (uint256); function updateRewards() external; function stake(address _depositToken, uint256 _amount) external; function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external; function unstake(address _depositToken, uint256 _amount) external; function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external; function tokensPerInterval() external view returns (uint256); function claim(address _receiver) external returns (uint256); function claimForAccount(address _account, address _receiver) external returns (uint256); function claimable(address _account) external view returns (uint256); function averageStakedAmounts(address _account) external view returns (uint256); function cumulativeRewards(address _account) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IVester { function rewardTracker() external view returns (address); function claimForAccount(address _account, address _receiver) external returns (uint256); function claimable(address _account) external view returns (uint256); function cumulativeClaimAmounts(address _account) external view returns (uint256); function claimedAmounts(address _account) external view returns (uint256); function pairAmounts(address _account) external view returns (uint256); function getVestedAmount(address _account) external view returns (uint256); function transferredAverageStakedAmounts(address _account) external view returns (uint256); function transferredCumulativeRewards(address _account) external view returns (uint256); function cumulativeRewardDeductions(address _account) external view returns (uint256); function bonusRewards(address _account) external view returns (uint256); function transferStakeValues(address _sender, address _receiver) external; function setTransferredAverageStakedAmounts(address _account, uint256 _amount) external; function setTransferredCumulativeRewards(address _account, uint256 _amount) external; function setCumulativeRewardDeductions(address _account, uint256 _amount) external; function setBonusRewards(address _account, uint256 _amount) external; function getMaxVestableAmount(address _account) external view returns (uint256); function getCombinedAverageStakedAmount(address _account) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMintable { function isMinter(address _account) external returns (bool); function setMinter(address _minter, bool _isActive) external; function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeBlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeBlu","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeBlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeBlu","type":"event"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"acceptTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"batchCompoundForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchStakeBluForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blu","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bluVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnBlu","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusBluTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsBlu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"compoundForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"esBlu","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBluTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimBlu","type":"bool"},{"internalType":"bool","name":"_shouldStakeBlu","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsBlu","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsBlu","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimWeth","type":"bool"},{"internalType":"bool","name":"_shouldConvertWethToEth","type":"bool"}],"name":"handleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_blu","type":"address"},{"internalType":"address","name":"_esBlu","type":"address"},{"internalType":"address","name":"_bnBlu","type":"address"},{"internalType":"address","name":"_blp","type":"address"},{"internalType":"address","name":"_stakedBluTracker","type":"address"},{"internalType":"address","name":"_bonusBluTracker","type":"address"},{"internalType":"address","name":"_feeBluTracker","type":"address"},{"internalType":"address","name":"_feeBlpTracker","type":"address"},{"internalType":"address","name":"_stakedBlpTracker","type":"address"},{"internalType":"address","name":"_blpManager","type":"address"},{"internalType":"address","name":"_bluVester","type":"address"},{"internalType":"address","name":"_blpVester","type":"address"}],"internalType":"struct RewardRouterV2.initParams","name":"params","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minBlp","type":"uint256"}],"name":"mintAndStakeBlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minBlp","type":"uint256"}],"name":"mintAndStakeBlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReceivers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"signalTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeBlu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeBluForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsBlu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedBlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedBluTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_blpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemBlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemBlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeBlu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsBlu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506001600081905580546001600160a01b03191633179055614c7d806100376000396000f3fe6080604052600436106102295760003560e01c8063775a91b611610123578063ca51bb8e116100ab578063ef4500d81161006f578063ef4500d8146106d1578063ef9aacfd146106f1578063effbadd814610711578063f369222014610731578063f69e20461461075157600080fd5b8063ca51bb8e14610626578063cfad57a214610646578063d294f09314610666578063d372a1b91461067b578063e1b9db891461069b57600080fd5b806392a57741116100f257806392a5774114610586578063944c9c54146105a65780639ddc448c146105c65780639ef9f0a7146105e6578063a38a9a6a1461060657600080fd5b8063775a91b61461050657806385a57167146105265780638d54bf5414610546578063909d7d791461056657600080fd5b80632c5c7d24116101b15780634cda6a5e116101755780634cda6a5e146104715780634e71d92d146104915780635d8795fa146104a657806360936bed146104c6578063655603a4146104e657600080fd5b80632c5c7d24146103c057806330b70002146103e057806332854fea14610400578063392e53cd146104205780633fc8cef31461045157600080fd5b80631266b1b9116101f85780631266b1b91461032b57806312d43a511461034b57806318fd37bf1461036b5780631af276a6146103805780632a9f4083146103a057600080fd5b806301e336671461028d578063020209b6146102ad57806309b4a7da146102ea5780630f2cff5f1461030a57600080fd5b36610288576002546001600160a01b031633146102865760405162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b60448201526064015b60405180910390fd5b005b600080fd5b34801561029957600080fd5b506102866102a836600461443b565b610766565b3480156102b957600080fd5b50600d546102cd906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f657600080fd5b50600e546102cd906001600160a01b031681565b61031d610318366004614807565b6107a9565b6040519081526020016102e1565b34801561033757600080fd5b506006546102cd906001600160a01b031681565b34801561035757600080fd5b506001546102cd906001600160a01b031681565b34801561037757600080fd5b50610286610abd565b34801561038c57600080fd5b5061028661039b36600461452d565b610bdc565b3480156103ac57600080fd5b506102866103bb36600461441e565b610c5c565b3480156103cc57600080fd5b50600c546102cd906001600160a01b031681565b3480156103ec57600080fd5b506102866103fb366004614641565b610ca1565b34801561040c57600080fd5b50600b546102cd906001600160a01b031681565b34801561042c57600080fd5b5060015461044190600160a01b900460ff1681565b60405190151581526020016102e1565b34801561045d57600080fd5b506002546102cd906001600160a01b031681565b34801561047d57600080fd5b5061028661048c36600461447c565b611318565b34801561049d57600080fd5b50610286611372565b3480156104b257600080fd5b506005546102cd906001600160a01b031681565b3480156104d257600080fd5b506003546102cd906001600160a01b031681565b3480156104f257600080fd5b5061028661050136600461441e565b6114b6565b34801561051257600080fd5b506102866105213660046147d5565b611dca565b34801561053257600080fd5b5061031d6105413660046144a8565b611dec565b34801561055257600080fd5b506102866105613660046147d5565b612019565b34801561057257600080fd5b50610286610581366004614562565b61203b565b34801561059257600080fd5b506009546102cd906001600160a01b031681565b3480156105b257600080fd5b50600a546102cd906001600160a01b031681565b3480156105d257600080fd5b5061031d6105e1366004614829565b6120e1565b3480156105f257600080fd5b506008546102cd906001600160a01b031681565b34801561061257600080fd5b506004546102cd906001600160a01b031681565b34801561063257600080fd5b506102866106413660046147d5565b61237c565b34801561065257600080fd5b5061028661066136600461441e565b61239e565b34801561067257600080fd5b506102866123ea565b34801561068757600080fd5b5061031d6106963660046144f2565b6124a9565b3480156106a757600080fd5b506102cd6106b636600461441e565b600f602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b506102866106ec3660046146d7565b612680565b3480156106fd57600080fd5b5061028661070c36600461441e565b612839565b34801561071d57600080fd5b506007546102cd906001600160a01b031681565b34801561073d57600080fd5b5061028661074c3660046147d5565b6129a9565b34801561075d57600080fd5b506102866129cb565b6001546001600160a01b031633146107905760405162461bcd60e51b815260040161027d906149d6565b6107a46001600160a01b03841683836129e6565b505050565b60006107b3612a38565b600034116108035760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015260640161027d565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561085357600080fd5b505af1158015610867573d6000803e3d6000fd5b5050600254600c5460405163095ea7b360e01b81526001600160a01b0391821660048201523460248201529116935063095ea7b392506044019050602060405180830381600087803b1580156108bc57600080fd5b505af11580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190614624565b50600c546002546040516317eb2a1560e01b815233926000926001600160a01b03918216926317eb2a159261093992309288929091169034908c908c906004016148c2565b602060405180830381600087803b15801561095357600080fd5b505af1158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b91906147ee565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c926109c99287928392909116908790600401614898565b600060405180830381600087803b1580156109e357600080fd5b505af11580156109f7573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350610a3592879283929116908790600401614898565b600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590527f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de8248935001905060405180910390a1915050610ab76001600055565b92915050565b610ac5612a38565b6007546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90610af7908490819060040161487e565b602060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4991906147ee565b50600a546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b7c908490819060040161487e565b602060405180830381600087803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bce91906147ee565b5050610bda6001600055565b565b610be4612a38565b6001546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161027d906149d6565b60005b8151811015610c4e57610c3c828281518110610c2f57610c2f614bf8565b6020026020010151612a92565b80610c4681614bc7565b915050610c11565b50610c596001600055565b50565b610c64612a38565b6001546001600160a01b03163314610c8e5760405162461bcd60e51b815260040161027d906149d6565b610c9781612a92565b610c596001600055565b610ca9612a38565b3360008815610dd257600d546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610ce5908690819060040161487e565b602060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906147ee565b600e546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610d6f908790819060040161487e565b602060405180830381600087803b158015610d8957600080fd5b505af1158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc191906147ee565b9050610dcd8282612aa4565b925050505b878015610ddf5750600081115b15610dfe57600354610dfe90839081906001600160a01b031684612ab0565b60008715610f26576007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610e39908790819060040161487e565b602060405180830381600087803b158015610e5357600080fd5b505af1158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b91906147ee565b600a546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610ec3908890819060040161487e565b602060405180830381600087803b158015610edd57600080fd5b505af1158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906147ee565b9050610f218282612aa4565b925050505b868015610f335750600081115b15610f5257600454610f5290849081906001600160a01b031684612ab0565b8515611053576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610f8b908790819060040161487e565b602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd91906147ee565b9050801561105157600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c9261101e928992839216908790600401614898565b600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b505050505b505b84156113025783156111f7576009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90611092908790309060040161487e565b602060405180830381600087803b1580156110ac57600080fd5b505af11580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e491906147ee565b600b546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a9061111c908890309060040161487e565b602060405180830381600087803b15801561113657600080fd5b505af115801561114a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116e91906147ee565b9050600061117c8383612aa4565b600254604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111c357600080fd5b505af11580156111d7573d6000803e3d6000fd5b506111ef925050506001600160a01b03871682612c62565b505050611302565b6009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611229908690819060040161487e565b602060405180830381600087803b15801561124357600080fd5b505af1158015611257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127b91906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906112ae908690819060040161487e565b602060405180830381600087803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130091906147ee565b505b50505061130f6001600055565b50505050505050565b611320612a38565b6001546001600160a01b0316331461134a5760405162461bcd60e51b815260040161027d906149d6565b60035461136490339084906001600160a01b031684612ab0565b61136e6001600055565b5050565b61137a612a38565b6009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906113ac908490819060040161487e565b602060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe91906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611431908490819060040161487e565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148391906147ee565b506007546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610af7908490819060040161487e565b6114be612a38565b600d546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561150357600080fd5b505afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b91906147ee565b156115585760405162461bcd60e51b815260040161027d90614959565b600e546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906147ee565b156115f25760405162461bcd60e51b815260040161027d90614959565b6001600160a01b038181166000908152600f602052604090205433911681146116695760405162461bcd60e51b8152602060048201526024808201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616044820152631b1b195960e21b606482015260840161027d565b6001600160a01b0382166000908152600f6020526040902080546001600160a01b031916905561169881612d7b565b6116a182612a92565b600754600354604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e926116d9928892169060040161487e565b60206040518083038186803b1580156116f157600080fd5b505afa158015611705573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172991906147ee565b905080156117655760035461174b9084906001600160a01b0316836000613a96565b60035461176590849084906001600160a01b031684612ab0565b60075460048054604051637aeceb1f60e11b81526000936001600160a01b039081169363f5d9d63e9361179e938a93909116910161487e565b60206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906147ee565b9050801561182a576004546118109085906001600160a01b0316836000613a96565b60045461182a90859085906001600160a01b031684612ab0565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611862928a92169060040161487e565b60206040518083038186803b15801561187a57600080fd5b505afa15801561188e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b291906147ee565b905080156119945760095460055460405163098bf59d60e01b81526001600160a01b039283169263098bf59d926118f5928a9290911690869083906004016148fb565b600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b5050600954600554604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611961928a928a929116908790600401614898565b600060405180830381600087803b15801561197b57600080fd5b505af115801561198f573d6000803e3d6000fd5b505050505b600480546040516370a0823160e01b81526001600160a01b0388811693820193909352600092909116906370a082319060240160206040518083038186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906147ee565b90508015611ab157600480546040516323b872dd60e01b81526001600160a01b03898116938201939093528783166024820152604481018490529116906323b872dd90606401602060405180830381600087803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf9190614624565b505b600b54600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611ae9928c92169060040161487e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906147ee565b90508015611cf257600a54600b5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611b7c928c9290911690869083906004016148fb565b600060405180830381600087803b158015611b9657600080fd5b505af1158015611baa573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611be7928c921690869083906004016148fb565b600060405180830381600087803b158015611c0157600080fd5b505af1158015611c15573d6000803e3d6000fd5b5050600b54600654604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611c53928c928c929116908790600401614898565b600060405180830381600087803b158015611c6d57600080fd5b505af1158015611c81573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611cbf928b9283929116908790600401614898565b600060405180830381600087803b158015611cd957600080fd5b505af1158015611ced573d6000803e3d6000fd5b505050505b600d54604051630f713c2360e41b81526001600160a01b039091169063f713c23090611d24908a908a9060040161487e565b600060405180830381600087803b158015611d3e57600080fd5b505af1158015611d52573d6000803e3d6000fd5b5050600e54604051630f713c2360e41b81526001600160a01b03909116925063f713c2309150611d88908a908a9060040161487e565b600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b50505050505050505050610c596001600055565b611dd2612a38565b600454610c979033906001600160a01b0316836001613a96565b6000611df6612a38565b60008411611e465760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e74604482015260640161027d565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d92611e8192869216908a9083906004016148fb565b600060405180830381600087803b158015611e9b57600080fd5b505af1158015611eaf573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611eec92869216908a9083906004016148fb565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b5050600c546040516371d597ad60e01b81526001600160a01b0385811660048301528a81166024830152604482018a90526064820189905287811660848301526000945090911691506371d597ad9060a401602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbe91906147ee565b604080516001600160a01b0385168152602081018990529192507f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be7191015b60405180910390a19150506120116001600055565b949350505050565b612021612a38565b600454610c9790339081906001600160a01b031684612ab0565b612043612a38565b6001546001600160a01b0316331461206d5760405162461bcd60e51b815260040161027d906149d6565b6003546001600160a01b031660005b83518110156120d5576120c33385838151811061209b5761209b614bf8565b6020026020010151848685815181106120b6576120b6614bf8565b6020026020010151612ab0565b806120cd81614bc7565b91505061207c565b505061136e6001600055565b60006120eb612a38565b6000841161213b5760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e74604482015260640161027d565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d9261217692869216908a9083906004016148fb565b600060405180830381600087803b15801561219057600080fd5b505af11580156121a4573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506121e192869216908a9083906004016148fb565b600060405180830381600087803b1580156121fb57600080fd5b505af115801561220f573d6000803e3d6000fd5b5050600c546002546040516371d597ad60e01b81526001600160a01b0386811660048301529182166024820152604481018a90526064810189905230608482015260009450911691506371d597ad9060a401602060405180830381600087803b15801561227b57600080fd5b505af115801561228f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b391906147ee565b600254604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b50612326925050506001600160a01b03851682612c62565b604080516001600160a01b0384168152602081018890527f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be71910160405180910390a19150506123756001600055565b9392505050565b612384612a38565b600354610c979033906001600160a01b0316836001613a96565b6001546001600160a01b031633146123c85760405162461bcd60e51b815260040161027d906149d6565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6123f2612a38565b6009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90612424908490819060040161487e565b602060405180830381600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247691906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b7c908490819060040161487e565b60006124b3612a38565b600084116124d35760405162461bcd60e51b815260040161027d9061499f565b600c546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061251290859081908c908c908c908c906004016148c2565b602060405180830381600087803b15801561252c57600080fd5b505af1158015612540573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256491906147ee565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c926125a29287928392909116908790600401614898565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061260e92879283929116908790600401614898565b600060405180830381600087803b15801561262857600080fd5b505af115801561263c573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590527f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de82489350019050611ffc565b6001546001600160a01b031633146126aa5760405162461bcd60e51b815260040161027d906149d6565b600154600160a01b900460ff161561270e5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161027d565b60018054600160a01b60ff60a01b199091161790558051600280546001600160a01b03199081166001600160a01b0393841617909155602083015160038054831691841691909117905560408301516004805483169184169190911790556060830151600580548316918416919091179055608083015160068054831691841691909117905560a083015160078054831691841691909117905560c083015160088054831691841691909117905560e0830151600980548316918416919091179055610100830151600b80548316918416919091179055610120830151600a80548316918416919091179055610140830151600c80548316918416919091179055610160830151600d8054831691841691909117905561018090920151600e80549093169116179055565b612841612a38565b600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561288457600080fd5b505afa158015612898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bc91906147ee565b156128d95760405162461bcd60e51b815260040161027d90614959565b600e546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295491906147ee565b156129715760405162461bcd60e51b815260040161027d90614959565b61297a81612d7b565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b0384161790556001905550565b6129b1612a38565b600354610c9790339081906001600160a01b031684612ab0565b6129d3612a38565b6129dc33612a92565b610bda6001600055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107a4908490613f47565b60026000541415612a8b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161027d565b6002600055565b612a9b81614019565b610c59816141b4565b60006123758284614b3e565b60008111612ad05760405162461bcd60e51b815260040161027d9061499f565b600754604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c90612b06908790879087908790600401614898565b600060405180830381600087803b158015612b2057600080fd5b505af1158015612b34573d6000803e3d6000fd5b5050600854600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612b7292889283929116908790600401614898565b600060405180830381600087803b158015612b8c57600080fd5b505af1158015612ba0573d6000803e3d6000fd5b5050600954600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612bde92889283929116908790600401614898565b600060405180830381600087803b158015612bf857600080fd5b505af1158015612c0c573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201529081018490527fe0e05f804ea72fb6d348c08e01a25af8f81607895469572af61837bb3b18eb6b9250606001905060405180910390a150505050565b80471015612cb25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161027d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612cff576040519150601f19603f3d011682016040523d82523d6000602084013e612d04565b606091505b50509050806107a45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161027d565b60075460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b158015612dc057600080fd5b505afa158015612dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df891906147ee565b15612e655760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c75547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b606482015260840161027d565b600754604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee291906147ee565b15612f4c5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c75547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b606482015260840161027d565b60085460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b158015612f9157600080fd5b505afa158015612fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc991906147ee565b156130355760405162461bcd60e51b815260206004820152603660248201527f526577617264526f757465723a20626f6e7573426c75547261636b65722e6176604482015275065726167655374616b6564416d6f756e7473203e20360541b606482015260840161027d565b600854604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561307a57600080fd5b505afa15801561308e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b291906147ee565b1561311b5760405162461bcd60e51b815260206004820152603360248201527f526577617264526f757465723a20626f6e7573426c75547261636b65722e637560448201527206d756c617469766552657761726473203e203606c1b606482015260840161027d565b60095460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561316057600080fd5b505afa158015613174573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319891906147ee565b156132025760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c75547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b606482015260840161027d565b600954604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f91906147ee565b156132e65760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c75547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b606482015260840161027d565b600d54604051631ccdc0d760e21b81526001600160a01b03838116600483015290911690637337035c9060240160206040518083038186803b15801561332b57600080fd5b505afa15801561333f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336391906147ee565b156133805760405162461bcd60e51b815260040161027d90614a05565b600d54604051635b8de71560e11b81526001600160a01b0383811660048301529091169063b71bce2a9060240160206040518083038186803b1580156133c557600080fd5b505afa1580156133d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133fd91906147ee565b1561341a5760405162461bcd60e51b815260040161027d90614a62565b600a5460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349791906147ee565b156135045760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b606482015260840161027d565b600a54604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561354957600080fd5b505afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906147ee565b156135eb5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b606482015260840161027d565b600b5460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366891906147ee565b156136d25760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c70547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b606482015260840161027d565b600b54604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561371757600080fd5b505afa15801561372b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374f91906147ee565b156137b65760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c70547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b606482015260840161027d565b600e54604051631ccdc0d760e21b81526001600160a01b03838116600483015290911690637337035c9060240160206040518083038186803b1580156137fb57600080fd5b505afa15801561380f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383391906147ee565b156138505760405162461bcd60e51b815260040161027d90614a05565b600e54604051635b8de71560e11b81526001600160a01b0383811660048301529091169063b71bce2a9060240160206040518083038186803b15801561389557600080fd5b505afa1580156138a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cd91906147ee565b156138ea5760405162461bcd60e51b815260040161027d90614a62565b600d546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561392f57600080fd5b505afa158015613943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396791906147ee565b156139c05760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c755665737465722e62616c616e63652060448201526203e20360ec1b606482015260840161027d565b600e546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b158015613a0557600080fd5b505afa158015613a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3d91906147ee565b15610c595760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c705665737465722e62616c616e63652060448201526203e20360ec1b606482015260840161027d565b60008211613ab65760405162461bcd60e51b815260040161027d9061499f565b6007546040516310c1c10360e01b81526001600160a01b03868116600483015260009216906310c1c1039060240160206040518083038186803b158015613afc57600080fd5b505afa158015613b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3491906147ee565b60095460085460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613b71928a92911690889083906004016148fb565b600060405180830381600087803b158015613b8b57600080fd5b505af1158015613b9f573d6000803e3d6000fd5b505060085460075460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350613bdc928a921690889083906004016148fb565b600060405180830381600087803b158015613bf657600080fd5b505af1158015613c0a573d6000803e3d6000fd5b505060075460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613c449088908890889083906004016148fb565b600060405180830381600087803b158015613c5e57600080fd5b505af1158015613c72573d6000803e3d6000fd5b505050508115613ef5576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613caf908990819060040161487e565b602060405180830381600087803b158015613cc957600080fd5b505af1158015613cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0191906147ee565b90508015613d7557600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613d42928b92839216908790600401614898565b600060405180830381600087803b158015613d5c57600080fd5b505af1158015613d70573d6000803e3d6000fd5b505050505b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613dad928c92169060040161487e565b60206040518083038186803b158015613dc557600080fd5b505afa158015613dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfd91906147ee565b90508015613ef2576000613e1b84613e15848961425b565b90614267565b60095460055460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613e58928d92911690869083906004016148fb565b600060405180830381600087803b158015613e7257600080fd5b505af1158015613e86573d6000803e3d6000fd5b5050600554604051632770a7eb60e21b81526001600160a01b038c81166004830152602482018690529091169250639dc29fac9150604401600060405180830381600087803b158015613ed857600080fd5b505af1158015613eec573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b038088168252861660208201529081018490527fda986061eed6d1f835ca3af9e443de4eeefd6b8da9eace4dfac850879f50cc959060600160405180910390a15050505050565b6000613f9c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142739092919063ffffffff16565b8051909150156107a45780806020019051810190613fba9190614624565b6107a45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161027d565b6007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061404c908590819060040161487e565b602060405180830381600087803b15801561406657600080fd5b505af115801561407a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409e91906147ee565b905080156140c0576004546140c090839081906001600160a01b031684612ab0565b6008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906140f3908690819060040161487e565b602060405180830381600087803b15801561410d57600080fd5b505af1158015614121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414591906147ee565b905080156107a457600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92614186928892839216908790600401614898565b600060405180830381600087803b1580156141a057600080fd5b505af115801561130f573d6000803e3d6000fd5b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906141e7908590819060040161487e565b602060405180830381600087803b15801561420157600080fd5b505af1158015614215573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423991906147ee565b9050801561136e5760045461136e90839081906001600160a01b031684612ab0565b60006123758284614b78565b60006123758284614b56565b6060612011848460008585600080866001600160a01b0316858760405161429a9190614862565b60006040518083038185875af1925050503d80600081146142d7576040519150601f19603f3d011682016040523d82523d6000602084013e6142dc565b606091505b50915091506142ed878383876142f8565b979650505050505050565b6060831561436457825161435d576001600160a01b0385163b61435d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161027d565b5081612011565b61201183838151156143795781518083602001fd5b8060405162461bcd60e51b815260040161027d9190614926565b803561439e81614c24565b919050565b600082601f8301126143b457600080fd5b813560206143c96143c483614b1a565b614ae9565b80838252828201915082860187848660051b89010111156143e957600080fd5b60005b858110156144115781356143ff81614c24565b845292840192908401906001016143ec565b5090979650505050505050565b60006020828403121561443057600080fd5b813561237581614c24565b60008060006060848603121561445057600080fd5b833561445b81614c24565b9250602084013561446b81614c24565b929592945050506040919091013590565b6000806040838503121561448f57600080fd5b823561449a81614c24565b946020939093013593505050565b600080600080608085870312156144be57600080fd5b84356144c981614c24565b9350602085013592506040850135915060608501356144e781614c24565b939692955090935050565b6000806000806080858703121561450857600080fd5b843561451381614c24565b966020860135965060408601359560600135945092505050565b60006020828403121561453f57600080fd5b813567ffffffffffffffff81111561455657600080fd5b612011848285016143a3565b6000806040838503121561457557600080fd5b823567ffffffffffffffff8082111561458d57600080fd5b614599868387016143a3565b93506020915081850135818111156145b057600080fd5b85019050601f810186136145c357600080fd5b80356145d16143c482614b1a565b80828252848201915084840189868560051b87010111156145f157600080fd5b600094505b838510156146145780358352600194909401939185019185016145f6565b5080955050505050509250929050565b60006020828403121561463657600080fd5b815161237581614c39565b600080600080600080600060e0888a03121561465c57600080fd5b873561466781614c39565b9650602088013561467781614c39565b9550604088013561468781614c39565b9450606088013561469781614c39565b935060808801356146a781614c39565b925060a08801356146b781614c39565b915060c08801356146c781614c39565b8091505092959891949750929550565b60006101a082840312156146ea57600080fd5b6146f2614abf565b6146fb83614393565b815261470960208401614393565b602082015261471a60408401614393565b604082015261472b60608401614393565b606082015261473c60808401614393565b608082015261474d60a08401614393565b60a082015261475e60c08401614393565b60c082015261476f60e08401614393565b60e0820152610100614782818501614393565b90820152610120614794848201614393565b908201526101406147a6848201614393565b908201526101606147b8848201614393565b908201526101806147ca848201614393565b908201529392505050565b6000602082840312156147e757600080fd5b5035919050565b60006020828403121561480057600080fd5b5051919050565b6000806040838503121561481a57600080fd5b50508035926020909101359150565b60008060006060848603121561483e57600080fd5b8335925060208401359150604084013561485781614c24565b809150509250925092565b60008251614874818460208701614b97565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6020815260008251806020840152614945816040850160208701614b97565b601f01601f19169190910160400192915050565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6020808252603b908201527f526577617264526f757465723a20626c755665737465722e7472616e7366657260408201527f726564417665726167655374616b6564416d6f756e7473203e20300000000000606082015260800190565b60208082526038908201527f526577617264526f757465723a20626c755665737465722e7472616e7366657260408201527f72656443756d756c617469766552657761726473203e20300000000000000000606082015260800190565b6040516101a0810167ffffffffffffffff81118282101715614ae357614ae3614c0e565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715614b1257614b12614c0e565b604052919050565b600067ffffffffffffffff821115614b3457614b34614c0e565b5060051b60200190565b60008219821115614b5157614b51614be2565b500190565b600082614b7357634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614b9257614b92614be2565b500290565b60005b83811015614bb2578181015183820152602001614b9a565b83811115614bc1576000848401525b50505050565b6000600019821415614bdb57614bdb614be2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610c5957600080fd5b8015158114610c5957600080fdfea26469706673582212204b456d20db0b10386a83614b6f68787468375b4ef126ab1f7785cd5269b75a3464736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102295760003560e01c8063775a91b611610123578063ca51bb8e116100ab578063ef4500d81161006f578063ef4500d8146106d1578063ef9aacfd146106f1578063effbadd814610711578063f369222014610731578063f69e20461461075157600080fd5b8063ca51bb8e14610626578063cfad57a214610646578063d294f09314610666578063d372a1b91461067b578063e1b9db891461069b57600080fd5b806392a57741116100f257806392a5774114610586578063944c9c54146105a65780639ddc448c146105c65780639ef9f0a7146105e6578063a38a9a6a1461060657600080fd5b8063775a91b61461050657806385a57167146105265780638d54bf5414610546578063909d7d791461056657600080fd5b80632c5c7d24116101b15780634cda6a5e116101755780634cda6a5e146104715780634e71d92d146104915780635d8795fa146104a657806360936bed146104c6578063655603a4146104e657600080fd5b80632c5c7d24146103c057806330b70002146103e057806332854fea14610400578063392e53cd146104205780633fc8cef31461045157600080fd5b80631266b1b9116101f85780631266b1b91461032b57806312d43a511461034b57806318fd37bf1461036b5780631af276a6146103805780632a9f4083146103a057600080fd5b806301e336671461028d578063020209b6146102ad57806309b4a7da146102ea5780630f2cff5f1461030a57600080fd5b36610288576002546001600160a01b031633146102865760405162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b60448201526064015b60405180910390fd5b005b600080fd5b34801561029957600080fd5b506102866102a836600461443b565b610766565b3480156102b957600080fd5b50600d546102cd906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f657600080fd5b50600e546102cd906001600160a01b031681565b61031d610318366004614807565b6107a9565b6040519081526020016102e1565b34801561033757600080fd5b506006546102cd906001600160a01b031681565b34801561035757600080fd5b506001546102cd906001600160a01b031681565b34801561037757600080fd5b50610286610abd565b34801561038c57600080fd5b5061028661039b36600461452d565b610bdc565b3480156103ac57600080fd5b506102866103bb36600461441e565b610c5c565b3480156103cc57600080fd5b50600c546102cd906001600160a01b031681565b3480156103ec57600080fd5b506102866103fb366004614641565b610ca1565b34801561040c57600080fd5b50600b546102cd906001600160a01b031681565b34801561042c57600080fd5b5060015461044190600160a01b900460ff1681565b60405190151581526020016102e1565b34801561045d57600080fd5b506002546102cd906001600160a01b031681565b34801561047d57600080fd5b5061028661048c36600461447c565b611318565b34801561049d57600080fd5b50610286611372565b3480156104b257600080fd5b506005546102cd906001600160a01b031681565b3480156104d257600080fd5b506003546102cd906001600160a01b031681565b3480156104f257600080fd5b5061028661050136600461441e565b6114b6565b34801561051257600080fd5b506102866105213660046147d5565b611dca565b34801561053257600080fd5b5061031d6105413660046144a8565b611dec565b34801561055257600080fd5b506102866105613660046147d5565b612019565b34801561057257600080fd5b50610286610581366004614562565b61203b565b34801561059257600080fd5b506009546102cd906001600160a01b031681565b3480156105b257600080fd5b50600a546102cd906001600160a01b031681565b3480156105d257600080fd5b5061031d6105e1366004614829565b6120e1565b3480156105f257600080fd5b506008546102cd906001600160a01b031681565b34801561061257600080fd5b506004546102cd906001600160a01b031681565b34801561063257600080fd5b506102866106413660046147d5565b61237c565b34801561065257600080fd5b5061028661066136600461441e565b61239e565b34801561067257600080fd5b506102866123ea565b34801561068757600080fd5b5061031d6106963660046144f2565b6124a9565b3480156106a757600080fd5b506102cd6106b636600461441e565b600f602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b506102866106ec3660046146d7565b612680565b3480156106fd57600080fd5b5061028661070c36600461441e565b612839565b34801561071d57600080fd5b506007546102cd906001600160a01b031681565b34801561073d57600080fd5b5061028661074c3660046147d5565b6129a9565b34801561075d57600080fd5b506102866129cb565b6001546001600160a01b031633146107905760405162461bcd60e51b815260040161027d906149d6565b6107a46001600160a01b03841683836129e6565b505050565b60006107b3612a38565b600034116108035760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015260640161027d565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561085357600080fd5b505af1158015610867573d6000803e3d6000fd5b5050600254600c5460405163095ea7b360e01b81526001600160a01b0391821660048201523460248201529116935063095ea7b392506044019050602060405180830381600087803b1580156108bc57600080fd5b505af11580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190614624565b50600c546002546040516317eb2a1560e01b815233926000926001600160a01b03918216926317eb2a159261093992309288929091169034908c908c906004016148c2565b602060405180830381600087803b15801561095357600080fd5b505af1158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b91906147ee565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c926109c99287928392909116908790600401614898565b600060405180830381600087803b1580156109e357600080fd5b505af11580156109f7573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350610a3592879283929116908790600401614898565b600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590527f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de8248935001905060405180910390a1915050610ab76001600055565b92915050565b610ac5612a38565b6007546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90610af7908490819060040161487e565b602060405180830381600087803b158015610b1157600080fd5b505af1158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4991906147ee565b50600a546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b7c908490819060040161487e565b602060405180830381600087803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bce91906147ee565b5050610bda6001600055565b565b610be4612a38565b6001546001600160a01b03163314610c0e5760405162461bcd60e51b815260040161027d906149d6565b60005b8151811015610c4e57610c3c828281518110610c2f57610c2f614bf8565b6020026020010151612a92565b80610c4681614bc7565b915050610c11565b50610c596001600055565b50565b610c64612a38565b6001546001600160a01b03163314610c8e5760405162461bcd60e51b815260040161027d906149d6565b610c9781612a92565b610c596001600055565b610ca9612a38565b3360008815610dd257600d546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610ce5908690819060040161487e565b602060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906147ee565b600e546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610d6f908790819060040161487e565b602060405180830381600087803b158015610d8957600080fd5b505af1158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc191906147ee565b9050610dcd8282612aa4565b925050505b878015610ddf5750600081115b15610dfe57600354610dfe90839081906001600160a01b031684612ab0565b60008715610f26576007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610e39908790819060040161487e565b602060405180830381600087803b158015610e5357600080fd5b505af1158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b91906147ee565b600a546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610ec3908890819060040161487e565b602060405180830381600087803b158015610edd57600080fd5b505af1158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906147ee565b9050610f218282612aa4565b925050505b868015610f335750600081115b15610f5257600454610f5290849081906001600160a01b031684612ab0565b8515611053576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610f8b908790819060040161487e565b602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd91906147ee565b9050801561105157600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c9261101e928992839216908790600401614898565b600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b505050505b505b84156113025783156111f7576009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90611092908790309060040161487e565b602060405180830381600087803b1580156110ac57600080fd5b505af11580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e491906147ee565b600b546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a9061111c908890309060040161487e565b602060405180830381600087803b15801561113657600080fd5b505af115801561114a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116e91906147ee565b9050600061117c8383612aa4565b600254604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111c357600080fd5b505af11580156111d7573d6000803e3d6000fd5b506111ef925050506001600160a01b03871682612c62565b505050611302565b6009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611229908690819060040161487e565b602060405180830381600087803b15801561124357600080fd5b505af1158015611257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127b91906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906112ae908690819060040161487e565b602060405180830381600087803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130091906147ee565b505b50505061130f6001600055565b50505050505050565b611320612a38565b6001546001600160a01b0316331461134a5760405162461bcd60e51b815260040161027d906149d6565b60035461136490339084906001600160a01b031684612ab0565b61136e6001600055565b5050565b61137a612a38565b6009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906113ac908490819060040161487e565b602060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe91906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611431908490819060040161487e565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148391906147ee565b506007546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610af7908490819060040161487e565b6114be612a38565b600d546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561150357600080fd5b505afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b91906147ee565b156115585760405162461bcd60e51b815260040161027d90614959565b600e546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906147ee565b156115f25760405162461bcd60e51b815260040161027d90614959565b6001600160a01b038181166000908152600f602052604090205433911681146116695760405162461bcd60e51b8152602060048201526024808201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616044820152631b1b195960e21b606482015260840161027d565b6001600160a01b0382166000908152600f6020526040902080546001600160a01b031916905561169881612d7b565b6116a182612a92565b600754600354604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e926116d9928892169060040161487e565b60206040518083038186803b1580156116f157600080fd5b505afa158015611705573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172991906147ee565b905080156117655760035461174b9084906001600160a01b0316836000613a96565b60035461176590849084906001600160a01b031684612ab0565b60075460048054604051637aeceb1f60e11b81526000936001600160a01b039081169363f5d9d63e9361179e938a93909116910161487e565b60206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906147ee565b9050801561182a576004546118109085906001600160a01b0316836000613a96565b60045461182a90859085906001600160a01b031684612ab0565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611862928a92169060040161487e565b60206040518083038186803b15801561187a57600080fd5b505afa15801561188e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b291906147ee565b905080156119945760095460055460405163098bf59d60e01b81526001600160a01b039283169263098bf59d926118f5928a9290911690869083906004016148fb565b600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b5050600954600554604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611961928a928a929116908790600401614898565b600060405180830381600087803b15801561197b57600080fd5b505af115801561198f573d6000803e3d6000fd5b505050505b600480546040516370a0823160e01b81526001600160a01b0388811693820193909352600092909116906370a082319060240160206040518083038186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906147ee565b90508015611ab157600480546040516323b872dd60e01b81526001600160a01b03898116938201939093528783166024820152604481018490529116906323b872dd90606401602060405180830381600087803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf9190614624565b505b600b54600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611ae9928c92169060040161487e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906147ee565b90508015611cf257600a54600b5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611b7c928c9290911690869083906004016148fb565b600060405180830381600087803b158015611b9657600080fd5b505af1158015611baa573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611be7928c921690869083906004016148fb565b600060405180830381600087803b158015611c0157600080fd5b505af1158015611c15573d6000803e3d6000fd5b5050600b54600654604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611c53928c928c929116908790600401614898565b600060405180830381600087803b158015611c6d57600080fd5b505af1158015611c81573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611cbf928b9283929116908790600401614898565b600060405180830381600087803b158015611cd957600080fd5b505af1158015611ced573d6000803e3d6000fd5b505050505b600d54604051630f713c2360e41b81526001600160a01b039091169063f713c23090611d24908a908a9060040161487e565b600060405180830381600087803b158015611d3e57600080fd5b505af1158015611d52573d6000803e3d6000fd5b5050600e54604051630f713c2360e41b81526001600160a01b03909116925063f713c2309150611d88908a908a9060040161487e565b600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b50505050505050505050610c596001600055565b611dd2612a38565b600454610c979033906001600160a01b0316836001613a96565b6000611df6612a38565b60008411611e465760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e74604482015260640161027d565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d92611e8192869216908a9083906004016148fb565b600060405180830381600087803b158015611e9b57600080fd5b505af1158015611eaf573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611eec92869216908a9083906004016148fb565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b5050600c546040516371d597ad60e01b81526001600160a01b0385811660048301528a81166024830152604482018a90526064820189905287811660848301526000945090911691506371d597ad9060a401602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbe91906147ee565b604080516001600160a01b0385168152602081018990529192507f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be7191015b60405180910390a19150506120116001600055565b949350505050565b612021612a38565b600454610c9790339081906001600160a01b031684612ab0565b612043612a38565b6001546001600160a01b0316331461206d5760405162461bcd60e51b815260040161027d906149d6565b6003546001600160a01b031660005b83518110156120d5576120c33385838151811061209b5761209b614bf8565b6020026020010151848685815181106120b6576120b6614bf8565b6020026020010151612ab0565b806120cd81614bc7565b91505061207c565b505061136e6001600055565b60006120eb612a38565b6000841161213b5760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e74604482015260640161027d565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d9261217692869216908a9083906004016148fb565b600060405180830381600087803b15801561219057600080fd5b505af11580156121a4573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506121e192869216908a9083906004016148fb565b600060405180830381600087803b1580156121fb57600080fd5b505af115801561220f573d6000803e3d6000fd5b5050600c546002546040516371d597ad60e01b81526001600160a01b0386811660048301529182166024820152604481018a90526064810189905230608482015260009450911691506371d597ad9060a401602060405180830381600087803b15801561227b57600080fd5b505af115801561228f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b391906147ee565b600254604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b50612326925050506001600160a01b03851682612c62565b604080516001600160a01b0384168152602081018890527f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be71910160405180910390a19150506123756001600055565b9392505050565b612384612a38565b600354610c979033906001600160a01b0316836001613a96565b6001546001600160a01b031633146123c85760405162461bcd60e51b815260040161027d906149d6565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6123f2612a38565b6009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90612424908490819060040161487e565b602060405180830381600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247691906147ee565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b7c908490819060040161487e565b60006124b3612a38565b600084116124d35760405162461bcd60e51b815260040161027d9061499f565b600c546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061251290859081908c908c908c908c906004016148c2565b602060405180830381600087803b15801561252c57600080fd5b505af1158015612540573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256491906147ee565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c926125a29287928392909116908790600401614898565b600060405180830381600087803b1580156125bc57600080fd5b505af11580156125d0573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061260e92879283929116908790600401614898565b600060405180830381600087803b15801561262857600080fd5b505af115801561263c573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590527f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de82489350019050611ffc565b6001546001600160a01b031633146126aa5760405162461bcd60e51b815260040161027d906149d6565b600154600160a01b900460ff161561270e5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161027d565b60018054600160a01b60ff60a01b199091161790558051600280546001600160a01b03199081166001600160a01b0393841617909155602083015160038054831691841691909117905560408301516004805483169184169190911790556060830151600580548316918416919091179055608083015160068054831691841691909117905560a083015160078054831691841691909117905560c083015160088054831691841691909117905560e0830151600980548316918416919091179055610100830151600b80548316918416919091179055610120830151600a80548316918416919091179055610140830151600c80548316918416919091179055610160830151600d8054831691841691909117905561018090920151600e80549093169116179055565b612841612a38565b600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561288457600080fd5b505afa158015612898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bc91906147ee565b156128d95760405162461bcd60e51b815260040161027d90614959565b600e546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295491906147ee565b156129715760405162461bcd60e51b815260040161027d90614959565b61297a81612d7b565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b0384161790556001905550565b6129b1612a38565b600354610c9790339081906001600160a01b031684612ab0565b6129d3612a38565b6129dc33612a92565b610bda6001600055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107a4908490613f47565b60026000541415612a8b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161027d565b6002600055565b612a9b81614019565b610c59816141b4565b60006123758284614b3e565b60008111612ad05760405162461bcd60e51b815260040161027d9061499f565b600754604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c90612b06908790879087908790600401614898565b600060405180830381600087803b158015612b2057600080fd5b505af1158015612b34573d6000803e3d6000fd5b5050600854600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612b7292889283929116908790600401614898565b600060405180830381600087803b158015612b8c57600080fd5b505af1158015612ba0573d6000803e3d6000fd5b5050600954600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612bde92889283929116908790600401614898565b600060405180830381600087803b158015612bf857600080fd5b505af1158015612c0c573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201529081018490527fe0e05f804ea72fb6d348c08e01a25af8f81607895469572af61837bb3b18eb6b9250606001905060405180910390a150505050565b80471015612cb25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161027d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612cff576040519150601f19603f3d011682016040523d82523d6000602084013e612d04565b606091505b50509050806107a45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161027d565b60075460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b158015612dc057600080fd5b505afa158015612dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df891906147ee565b15612e655760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c75547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b606482015260840161027d565b600754604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee291906147ee565b15612f4c5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c75547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b606482015260840161027d565b60085460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b158015612f9157600080fd5b505afa158015612fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc991906147ee565b156130355760405162461bcd60e51b815260206004820152603660248201527f526577617264526f757465723a20626f6e7573426c75547261636b65722e6176604482015275065726167655374616b6564416d6f756e7473203e20360541b606482015260840161027d565b600854604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561307a57600080fd5b505afa15801561308e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b291906147ee565b1561311b5760405162461bcd60e51b815260206004820152603360248201527f526577617264526f757465723a20626f6e7573426c75547261636b65722e637560448201527206d756c617469766552657761726473203e203606c1b606482015260840161027d565b60095460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561316057600080fd5b505afa158015613174573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319891906147ee565b156132025760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c75547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b606482015260840161027d565b600954604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f91906147ee565b156132e65760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c75547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b606482015260840161027d565b600d54604051631ccdc0d760e21b81526001600160a01b03838116600483015290911690637337035c9060240160206040518083038186803b15801561332b57600080fd5b505afa15801561333f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336391906147ee565b156133805760405162461bcd60e51b815260040161027d90614a05565b600d54604051635b8de71560e11b81526001600160a01b0383811660048301529091169063b71bce2a9060240160206040518083038186803b1580156133c557600080fd5b505afa1580156133d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133fd91906147ee565b1561341a5760405162461bcd60e51b815260040161027d90614a62565b600a5460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349791906147ee565b156135045760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b606482015260840161027d565b600a54604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561354957600080fd5b505afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906147ee565b156135eb5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b606482015260840161027d565b600b5460405163a318021760e01b81526001600160a01b0383811660048301529091169063a31802179060240160206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366891906147ee565b156136d25760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c70547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b606482015260840161027d565b600b54604051633792def360e01b81526001600160a01b03838116600483015290911690633792def39060240160206040518083038186803b15801561371757600080fd5b505afa15801561372b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374f91906147ee565b156137b65760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c70547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b606482015260840161027d565b600e54604051631ccdc0d760e21b81526001600160a01b03838116600483015290911690637337035c9060240160206040518083038186803b1580156137fb57600080fd5b505afa15801561380f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383391906147ee565b156138505760405162461bcd60e51b815260040161027d90614a05565b600e54604051635b8de71560e11b81526001600160a01b0383811660048301529091169063b71bce2a9060240160206040518083038186803b15801561389557600080fd5b505afa1580156138a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cd91906147ee565b156138ea5760405162461bcd60e51b815260040161027d90614a62565b600d546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b15801561392f57600080fd5b505afa158015613943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396791906147ee565b156139c05760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c755665737465722e62616c616e63652060448201526203e20360ec1b606482015260840161027d565b600e546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a082319060240160206040518083038186803b158015613a0557600080fd5b505afa158015613a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3d91906147ee565b15610c595760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c705665737465722e62616c616e63652060448201526203e20360ec1b606482015260840161027d565b60008211613ab65760405162461bcd60e51b815260040161027d9061499f565b6007546040516310c1c10360e01b81526001600160a01b03868116600483015260009216906310c1c1039060240160206040518083038186803b158015613afc57600080fd5b505afa158015613b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3491906147ee565b60095460085460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613b71928a92911690889083906004016148fb565b600060405180830381600087803b158015613b8b57600080fd5b505af1158015613b9f573d6000803e3d6000fd5b505060085460075460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350613bdc928a921690889083906004016148fb565b600060405180830381600087803b158015613bf657600080fd5b505af1158015613c0a573d6000803e3d6000fd5b505060075460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613c449088908890889083906004016148fb565b600060405180830381600087803b158015613c5e57600080fd5b505af1158015613c72573d6000803e3d6000fd5b505050508115613ef5576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613caf908990819060040161487e565b602060405180830381600087803b158015613cc957600080fd5b505af1158015613cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0191906147ee565b90508015613d7557600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613d42928b92839216908790600401614898565b600060405180830381600087803b158015613d5c57600080fd5b505af1158015613d70573d6000803e3d6000fd5b505050505b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613dad928c92169060040161487e565b60206040518083038186803b158015613dc557600080fd5b505afa158015613dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfd91906147ee565b90508015613ef2576000613e1b84613e15848961425b565b90614267565b60095460055460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613e58928d92911690869083906004016148fb565b600060405180830381600087803b158015613e7257600080fd5b505af1158015613e86573d6000803e3d6000fd5b5050600554604051632770a7eb60e21b81526001600160a01b038c81166004830152602482018690529091169250639dc29fac9150604401600060405180830381600087803b158015613ed857600080fd5b505af1158015613eec573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b038088168252861660208201529081018490527fda986061eed6d1f835ca3af9e443de4eeefd6b8da9eace4dfac850879f50cc959060600160405180910390a15050505050565b6000613f9c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142739092919063ffffffff16565b8051909150156107a45780806020019051810190613fba9190614624565b6107a45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161027d565b6007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061404c908590819060040161487e565b602060405180830381600087803b15801561406657600080fd5b505af115801561407a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409e91906147ee565b905080156140c0576004546140c090839081906001600160a01b031684612ab0565b6008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906140f3908690819060040161487e565b602060405180830381600087803b15801561410d57600080fd5b505af1158015614121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414591906147ee565b905080156107a457600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92614186928892839216908790600401614898565b600060405180830381600087803b1580156141a057600080fd5b505af115801561130f573d6000803e3d6000fd5b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906141e7908590819060040161487e565b602060405180830381600087803b15801561420157600080fd5b505af1158015614215573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423991906147ee565b9050801561136e5760045461136e90839081906001600160a01b031684612ab0565b60006123758284614b78565b60006123758284614b56565b6060612011848460008585600080866001600160a01b0316858760405161429a9190614862565b60006040518083038185875af1925050503d80600081146142d7576040519150601f19603f3d011682016040523d82523d6000602084013e6142dc565b606091505b50915091506142ed878383876142f8565b979650505050505050565b6060831561436457825161435d576001600160a01b0385163b61435d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161027d565b5081612011565b61201183838151156143795781518083602001fd5b8060405162461bcd60e51b815260040161027d9190614926565b803561439e81614c24565b919050565b600082601f8301126143b457600080fd5b813560206143c96143c483614b1a565b614ae9565b80838252828201915082860187848660051b89010111156143e957600080fd5b60005b858110156144115781356143ff81614c24565b845292840192908401906001016143ec565b5090979650505050505050565b60006020828403121561443057600080fd5b813561237581614c24565b60008060006060848603121561445057600080fd5b833561445b81614c24565b9250602084013561446b81614c24565b929592945050506040919091013590565b6000806040838503121561448f57600080fd5b823561449a81614c24565b946020939093013593505050565b600080600080608085870312156144be57600080fd5b84356144c981614c24565b9350602085013592506040850135915060608501356144e781614c24565b939692955090935050565b6000806000806080858703121561450857600080fd5b843561451381614c24565b966020860135965060408601359560600135945092505050565b60006020828403121561453f57600080fd5b813567ffffffffffffffff81111561455657600080fd5b612011848285016143a3565b6000806040838503121561457557600080fd5b823567ffffffffffffffff8082111561458d57600080fd5b614599868387016143a3565b93506020915081850135818111156145b057600080fd5b85019050601f810186136145c357600080fd5b80356145d16143c482614b1a565b80828252848201915084840189868560051b87010111156145f157600080fd5b600094505b838510156146145780358352600194909401939185019185016145f6565b5080955050505050509250929050565b60006020828403121561463657600080fd5b815161237581614c39565b600080600080600080600060e0888a03121561465c57600080fd5b873561466781614c39565b9650602088013561467781614c39565b9550604088013561468781614c39565b9450606088013561469781614c39565b935060808801356146a781614c39565b925060a08801356146b781614c39565b915060c08801356146c781614c39565b8091505092959891949750929550565b60006101a082840312156146ea57600080fd5b6146f2614abf565b6146fb83614393565b815261470960208401614393565b602082015261471a60408401614393565b604082015261472b60608401614393565b606082015261473c60808401614393565b608082015261474d60a08401614393565b60a082015261475e60c08401614393565b60c082015261476f60e08401614393565b60e0820152610100614782818501614393565b90820152610120614794848201614393565b908201526101406147a6848201614393565b908201526101606147b8848201614393565b908201526101806147ca848201614393565b908201529392505050565b6000602082840312156147e757600080fd5b5035919050565b60006020828403121561480057600080fd5b5051919050565b6000806040838503121561481a57600080fd5b50508035926020909101359150565b60008060006060848603121561483e57600080fd5b8335925060208401359150604084013561485781614c24565b809150509250925092565b60008251614874818460208701614b97565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6020815260008251806020840152614945816040850160208701614b97565b601f01601f19169190910160400192915050565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6020808252603b908201527f526577617264526f757465723a20626c755665737465722e7472616e7366657260408201527f726564417665726167655374616b6564416d6f756e7473203e20300000000000606082015260800190565b60208082526038908201527f526577617264526f757465723a20626c755665737465722e7472616e7366657260408201527f72656443756d756c617469766552657761726473203e20300000000000000000606082015260800190565b6040516101a0810167ffffffffffffffff81118282101715614ae357614ae3614c0e565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715614b1257614b12614c0e565b604052919050565b600067ffffffffffffffff821115614b3457614b34614c0e565b5060051b60200190565b60008219821115614b5157614b51614be2565b500190565b600082614b7357634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614b9257614b92614be2565b500290565b60005b83811015614bb2578181015183820152602001614b9a565b83811115614bc1576000848401525b50505050565b6000600019821415614bdb57614bdb614be2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610c5957600080fd5b8015158114610c5957600080fdfea26469706673582212204b456d20db0b10386a83614b6f68787468375b4ef126ab1f7785cd5269b75a3464736f6c63430008070033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.