Source Code
Latest 25 from a total of 63,135 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Handle Rewards | 407237530 | 51 days ago | IN | 0 ETH | 0.00000394 | ||||
| Unstake And Rede... | 407237380 | 51 days ago | IN | 0 ETH | 0.00000409 | ||||
| Handle Rewards | 407184073 | 51 days ago | IN | 0 ETH | 0.00002011 | ||||
| Unstake Bfr | 407183755 | 51 days ago | IN | 0 ETH | 0.00005213 | ||||
| Handle Rewards | 407183626 | 51 days ago | IN | 0 ETH | 0.00002932 | ||||
| Handle Rewards | 407183519 | 51 days ago | IN | 0 ETH | 0.00006656 | ||||
| Unstake And Rede... | 406704135 | 52 days ago | IN | 0 ETH | 0.0000053 | ||||
| Unstake And Rede... | 406358765 | 53 days ago | IN | 0 ETH | 0.00000409 | ||||
| Handle Rewards | 405449447 | 56 days ago | IN | 0 ETH | 0.00000423 | ||||
| Unstake Bfr | 405449108 | 56 days ago | IN | 0 ETH | 0.00000607 | ||||
| Unstake Bfr | 405353509 | 56 days ago | IN | 0 ETH | 0.00000453 | ||||
| Handle Rewards | 405353232 | 56 days ago | IN | 0 ETH | 0.00000512 | ||||
| Handle Rewards | 405338356 | 56 days ago | IN | 0 ETH | 0.00000395 | ||||
| Unstake And Rede... | 405338257 | 56 days ago | IN | 0 ETH | 0.00000409 | ||||
| Handle Rewards | 405167642 | 57 days ago | IN | 0 ETH | 0.00000332 | ||||
| Unstake Bfr | 404409197 | 59 days ago | IN | 0 ETH | 0.00000414 | ||||
| Unstake Es Bfr | 404409090 | 59 days ago | IN | 0 ETH | 0.0000041 | ||||
| Unstake And Rede... | 404013025 | 60 days ago | IN | 0 ETH | 0.00001207 | ||||
| Handle Rewards | 404012755 | 60 days ago | IN | 0 ETH | 0.00002663 | ||||
| Handle Rewards | 403811000 | 61 days ago | IN | 0 ETH | 0.00000395 | ||||
| Unstake Bfr | 403810888 | 61 days ago | IN | 0 ETH | 0.00000564 | ||||
| Handle Rewards | 403198751 | 62 days ago | IN | 0 ETH | 0.00000375 | ||||
| Unstake And Rede... | 403198519 | 62 days ago | IN | 0 ETH | 0.0000045 | ||||
| Unstake Bfr | 402948941 | 63 days ago | IN | 0 ETH | 0.00000523 | ||||
| Handle Rewards | 402948794 | 63 days ago | IN | 0 ETH | 0.00000555 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084571 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72084517 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH | ||||
| 72083288 | 1040 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RewardRouterV2
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
import "SafeMath.sol";
import "SafeERC20.sol";
import "ReentrancyGuard.sol";
import "Address.sol";
import "IRewardTracker.sol";
import "IVester.sol";
import "IMintable.sol";
import "IBlpManager.sol";
import "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 usdc;
address public bfr;
address public esBfr;
address public bnBfr;
address public blp; // BFR Liquidity Provider token
address public stakedBfrTracker;
address public bonusBfrTracker;
address public feeBfrTracker;
address public stakedBlpTracker;
address public feeBlpTracker;
address public blpManager;
address public bfrVester;
address public blpVester;
mapping(address => address) public pendingReceivers;
event StakeBfr(address account, address token, uint256 amount);
event UnstakeBfr(address account, address token, uint256 amount);
event StakeBlp(address account, uint256 amount);
event UnstakeBlp(address account, uint256 amount);
receive() external payable {
revert("Router: Can't receive eth");
}
function initialize(
address _usdc,
address _bfr,
address _esBfr,
address _bnBfr,
address _blp,
address _stakedBfrTracker,
address _bonusBfrTracker,
address _feeBfrTracker,
address _feeBlpTracker,
address _stakedBlpTracker,
address _bfrVester,
address _blpVester
) external onlyGov {
require(!isInitialized, "RewardRouter: already initialized");
isInitialized = true;
usdc = _usdc;
bfr = _bfr;
esBfr = _esBfr;
bnBfr = _bnBfr;
blp = _blp;
stakedBfrTracker = _stakedBfrTracker;
bonusBfrTracker = _bonusBfrTracker;
feeBfrTracker = _feeBfrTracker;
feeBlpTracker = _feeBlpTracker;
stakedBlpTracker = _stakedBlpTracker;
blpManager = _blp;
bfrVester = _bfrVester;
blpVester = _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 batchStakeBfrForAccount(
address[] memory _accounts,
uint256[] memory _amounts
) external nonReentrant onlyGov {
address _bfr = bfr;
for (uint256 i = 0; i < _accounts.length; i++) {
_stakeBfr(msg.sender, _accounts[i], _bfr, _amounts[i]);
}
}
function stakeBfrForAccount(address _account, uint256 _amount)
external
nonReentrant
onlyGov
{
_stakeBfr(msg.sender, _account, bfr, _amount);
}
function stakeBfr(uint256 _amount) external nonReentrant {
_stakeBfr(msg.sender, msg.sender, bfr, _amount);
}
function stakeEsBfr(uint256 _amount) external nonReentrant {
_stakeBfr(msg.sender, msg.sender, esBfr, _amount);
}
function unstakeBfr(uint256 _amount) external nonReentrant {
_unstakeBfr(msg.sender, bfr, _amount, true);
}
function unstakeEsBfr(uint256 _amount) external nonReentrant {
_unstakeBfr(msg.sender, esBfr, _amount, true);
}
function mintAndStakeBlp(uint256 _amount, uint256 _minBlp)
external
nonReentrant
returns (uint256)
{
require(_amount > 0, "RewardRouter: invalid _amount");
address account = msg.sender;
uint256 blpAmount = IBlpManager(blpManager).provideForAccount(
_amount,
_minBlp,
account
);
IRewardTracker(feeBlpTracker).stakeForAccount(
account,
account,
blp,
blpAmount
);
IRewardTracker(stakedBlpTracker).stakeForAccount(
account,
account,
feeBlpTracker,
blpAmount
);
emit StakeBlp(account, blpAmount);
return blpAmount;
}
function unstakeAndRedeemBlp(uint256 _blpAmount)
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).withdrawForAccount(
IBlpManager(blpManager).toTokenX(_blpAmount),
account
);
emit UnstakeBlp(account, _blpAmount);
return amountOut;
}
function claim() external nonReentrant {
address account = msg.sender;
IRewardTracker(feeBfrTracker).claimForAccount(account, account);
IRewardTracker(feeBlpTracker).claimForAccount(account, account);
IRewardTracker(stakedBfrTracker).claimForAccount(account, account);
IRewardTracker(stakedBlpTracker).claimForAccount(account, account);
}
function claimEsBfr() external nonReentrant {
address account = msg.sender;
IRewardTracker(stakedBfrTracker).claimForAccount(account, account);
IRewardTracker(stakedBlpTracker).claimForAccount(account, account);
}
function claimFees() external nonReentrant {
address account = msg.sender;
IRewardTracker(feeBfrTracker).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 _shouldClaimBfr,
bool _shouldStakeBfr,
bool _shouldClaimEsBfr,
bool _shouldStakeEsBfr,
bool _shouldStakeMultiplierPoints,
bool _shouldClaimUsdc
) external nonReentrant {
address account = msg.sender;
uint256 bfrAmount = 0;
if (_shouldClaimBfr) {
uint256 bfrAmount0 = IVester(bfrVester).claimForAccount(
account,
account
);
uint256 bfrAmount1 = IVester(blpVester).claimForAccount(
account,
account
);
bfrAmount = bfrAmount0.add(bfrAmount1);
}
if (_shouldStakeBfr && bfrAmount > 0) {
_stakeBfr(account, account, bfr, bfrAmount);
}
uint256 esBfrAmount = 0;
if (_shouldClaimEsBfr) {
uint256 esBfrAmount0 = IRewardTracker(stakedBfrTracker)
.claimForAccount(account, account);
uint256 esBfrAmount1 = IRewardTracker(stakedBlpTracker)
.claimForAccount(account, account);
esBfrAmount = esBfrAmount0.add(esBfrAmount1);
}
if (_shouldStakeEsBfr && esBfrAmount > 0) {
_stakeBfr(account, account, esBfr, esBfrAmount);
}
if (_shouldStakeMultiplierPoints) {
uint256 bnBfrAmount = IRewardTracker(bonusBfrTracker)
.claimForAccount(account, account);
if (bnBfrAmount > 0) {
IRewardTracker(feeBfrTracker).stakeForAccount(
account,
account,
bnBfr,
bnBfrAmount
);
}
}
if (_shouldClaimUsdc) {
IRewardTracker(feeBfrTracker).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(bfrVester).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(bfrVester).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 stakedBfr = IRewardTracker(stakedBfrTracker).depositBalances(
_sender,
bfr
);
if (stakedBfr > 0) {
_unstakeBfr(_sender, bfr, stakedBfr, false);
_stakeBfr(_sender, receiver, bfr, stakedBfr);
}
uint256 stakedEsBfr = IRewardTracker(stakedBfrTracker).depositBalances(
_sender,
esBfr
);
if (stakedEsBfr > 0) {
_unstakeBfr(_sender, esBfr, stakedEsBfr, false);
_stakeBfr(_sender, receiver, esBfr, stakedEsBfr);
}
uint256 stakedBnBfr = IRewardTracker(feeBfrTracker).depositBalances(
_sender,
bnBfr
);
if (stakedBnBfr > 0) {
IRewardTracker(feeBfrTracker).unstakeForAccount(
_sender,
bnBfr,
stakedBnBfr,
_sender
);
IRewardTracker(feeBfrTracker).stakeForAccount(
_sender,
receiver,
bnBfr,
stakedBnBfr
);
}
uint256 esBfrBalance = IERC20(esBfr).balanceOf(_sender);
if (esBfrBalance > 0) {
IERC20(esBfr).transferFrom(_sender, receiver, esBfrBalance);
}
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(bfrVester).transferStakeValues(_sender, receiver);
IVester(blpVester).transferStakeValues(_sender, receiver);
}
function _validateReceiver(address _receiver) private view {
require(
IRewardTracker(stakedBfrTracker).averageStakedAmounts(_receiver) ==
0,
"RewardRouter: stakedBfrTracker.averageStakedAmounts > 0"
);
require(
IRewardTracker(stakedBfrTracker).cumulativeRewards(_receiver) == 0,
"RewardRouter: stakedBfrTracker.cumulativeRewards > 0"
);
require(
IRewardTracker(bonusBfrTracker).averageStakedAmounts(_receiver) ==
0,
"RewardRouter: bonusBfrTracker.averageStakedAmounts > 0"
);
require(
IRewardTracker(bonusBfrTracker).cumulativeRewards(_receiver) == 0,
"RewardRouter: bonusBfrTracker.cumulativeRewards > 0"
);
require(
IRewardTracker(feeBfrTracker).averageStakedAmounts(_receiver) == 0,
"RewardRouter: feeBfrTracker.averageStakedAmounts > 0"
);
require(
IRewardTracker(feeBfrTracker).cumulativeRewards(_receiver) == 0,
"RewardRouter: feeBfrTracker.cumulativeRewards > 0"
);
require(
IVester(bfrVester).transferredAverageStakedAmounts(_receiver) == 0,
"RewardRouter: bfrVester.transferredAverageStakedAmounts > 0"
);
require(
IVester(bfrVester).transferredCumulativeRewards(_receiver) == 0,
"RewardRouter: bfrVester.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: bfrVester.transferredAverageStakedAmounts > 0"
);
require(
IVester(blpVester).transferredCumulativeRewards(_receiver) == 0,
"RewardRouter: bfrVester.transferredCumulativeRewards > 0"
);
require(
IERC20(bfrVester).balanceOf(_receiver) == 0,
"RewardRouter: bfrVester.balance > 0"
);
require(
IERC20(blpVester).balanceOf(_receiver) == 0,
"RewardRouter: blpVester.balance > 0"
);
}
function _compound(address _account) private {
_compoundBfr(_account);
_compoundBlp(_account);
}
function _compoundBfr(address _account) private {
uint256 esBfrAmount = IRewardTracker(stakedBfrTracker).claimForAccount(
_account,
_account
);
if (esBfrAmount > 0) {
_stakeBfr(_account, _account, esBfr, esBfrAmount);
}
uint256 bnBfrAmount = IRewardTracker(bonusBfrTracker).claimForAccount(
_account,
_account
);
if (bnBfrAmount > 0) {
IRewardTracker(feeBfrTracker).stakeForAccount(
_account,
_account,
bnBfr,
bnBfrAmount
);
}
}
function _compoundBlp(address _account) private {
uint256 esBfrAmount = IRewardTracker(stakedBlpTracker).claimForAccount(
_account,
_account
);
if (esBfrAmount > 0) {
_stakeBfr(_account, _account, esBfr, esBfrAmount);
}
}
function _stakeBfr(
address _fundingAccount,
address _account,
address _token,
uint256 _amount
) private {
require(_amount > 0, "RewardRouter: invalid _amount");
IRewardTracker(stakedBfrTracker).stakeForAccount(
_fundingAccount,
_account,
_token,
_amount
);
IRewardTracker(bonusBfrTracker).stakeForAccount(
_account,
_account,
stakedBfrTracker,
_amount
);
IRewardTracker(feeBfrTracker).stakeForAccount(
_account,
_account,
bonusBfrTracker,
_amount
);
emit StakeBfr(_account, _token, _amount);
}
function _unstakeBfr(
address _account,
address _token,
uint256 _amount,
bool _shouldReduceBnBfr
) private {
require(_amount > 0, "RewardRouter: invalid _amount");
uint256 balance = IRewardTracker(stakedBfrTracker).stakedAmounts(
_account
);
IRewardTracker(feeBfrTracker).unstakeForAccount(
_account,
bonusBfrTracker,
_amount,
_account
);
IRewardTracker(bonusBfrTracker).unstakeForAccount(
_account,
stakedBfrTracker,
_amount,
_account
);
IRewardTracker(stakedBfrTracker).unstakeForAccount(
_account,
_token,
_amount,
_account
);
if (_shouldReduceBnBfr) {
uint256 bnBfrAmount = IRewardTracker(bonusBfrTracker)
.claimForAccount(_account, _account);
if (bnBfrAmount > 0) {
IRewardTracker(feeBfrTracker).stakeForAccount(
_account,
_account,
bnBfr,
bnBfrAmount
);
}
uint256 stakedBnBfr = IRewardTracker(feeBfrTracker).depositBalances(
_account,
bnBfr
);
if (stakedBnBfr > 0) {
uint256 reductionAmount = stakedBnBfr.mul(_amount).div(balance);
IRewardTracker(feeBfrTracker).unstakeForAccount(
_account,
bnBfr,
reductionAmount,
_account
);
IMintable(bnBfr).burn(_account, reductionAmount);
}
}
emit UnstakeBfr(_account, _token, _amount);
}
}// 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
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "IERC20.sol";
import "draft-IERC20Permit.sol";
import "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.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 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.7.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 functionCall(target, data, "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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(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) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason 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 {
// 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 v4.4.1 (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() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// 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: BUSL-1.1
pragma solidity 0.8.4;
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: BUSL-1.1
pragma solidity 0.8.4;
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: BUSL-1.1
pragma solidity 0.8.4;
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: BUSL-1.1
pragma solidity 0.8.4;
interface IBlpManager {
function provideForAccount(
uint256 tokenXAmount,
uint256 minMint,
address account
) external returns (uint256 mint);
function withdrawForAccount(uint256 tokenXAmount, address account)
external
returns (uint256 burn);
function toTokenX(uint256 amount) external view returns (uint256);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
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;
}
}{
"evmVersion": "istanbul",
"optimizer": {
"enabled": true,
"runs": 1
},
"libraries": {
"RewardRouterV2.sol": {}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"StakeBfr","type":"event"},{"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":"UnstakeBfr","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"},{"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":"batchStakeBfrForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bfr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bfrVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"bnBfr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusBfrTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsBfr","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":"esBfr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBfrTracker","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":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimBfr","type":"bool"},{"internalType":"bool","name":"_shouldStakeBfr","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsBfr","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsBfr","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimUsdc","type":"bool"}],"name":"handleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_bfr","type":"address"},{"internalType":"address","name":"_esBfr","type":"address"},{"internalType":"address","name":"_bnBfr","type":"address"},{"internalType":"address","name":"_blp","type":"address"},{"internalType":"address","name":"_stakedBfrTracker","type":"address"},{"internalType":"address","name":"_bonusBfrTracker","type":"address"},{"internalType":"address","name":"_feeBfrTracker","type":"address"},{"internalType":"address","name":"_feeBlpTracker","type":"address"},{"internalType":"address","name":"_stakedBlpTracker","type":"address"},{"internalType":"address","name":"_bfrVester","type":"address"},{"internalType":"address","name":"_blpVester","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minBlp","type":"uint256"}],"name":"mintAndStakeBlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"stakeBfr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeBfrForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsBfr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedBfrTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedBlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blpAmount","type":"uint256"}],"name":"unstakeAndRedeemBlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeBfr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsBfr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","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
608060405234801561001057600080fd5b506001600081905580546001600160a01b03191633179055614493806100376000396000f3fe6080604052600436106101a35760003560e01c806301e33667146101f657806309b4a7da146102185780630b800f481461024e5780631266b1b91461026e57806312d43a511461028e5780631af276a6146102ae5780632a9f4083146102ce5780632be57289146102ee5780632c5c7d241461030e578063303d9c1a1461032e57806332854fea1461034e578063392e53cd1461036e5780633cde986c1461039f5780633e413bee146103bf5780634e71d92d146103df5780634ee65fd2146103f4578063655603a414610414578063718f2430146104345780637fe98d091461045457806384898336146104695780638845cd4514610489578063944c9c54146104a95780639d654f0b146104c9578063a453cc6d146104e9578063c01bf28f14610509578063cfad57a214610529578063d294f09314610549578063e1b9db891461055e578063e4803c4414610594578063ea6c5814146105b4578063ef9aacfd146105d4578063f69e2046146105f4578063fa4e093214610609578063fb43a7f914610637578063ff39d38514610657578063ffffe6201461067757600080fd5b366101f15760405162461bcd60e51b81526020600482015260196024820152780a4deeae8cae4744086c2dc4ee840e4cac6cad2ecca40cae8d603b1b60448201526064015b60405180910390fd5b600080fd5b34801561020257600080fd5b50610216610211366004613e4e565b610697565b005b34801561022457600080fd5b50600e54610238906001600160a01b031681565b60405161024591906140a9565b60405180910390f35b34801561025a57600080fd5b50610216610269366004613d73565b6106da565b34801561027a57600080fd5b50600654610238906001600160a01b031681565b34801561029a57600080fd5b50600154610238906001600160a01b031681565b3480156102ba57600080fd5b506102166102c9366004613eb2565b610852565b3480156102da57600080fd5b506102166102e9366004613d59565b6108fb565b3480156102fa57600080fd5b50600554610238906001600160a01b031681565b34801561031a57600080fd5b50600c54610238906001600160a01b031681565b34801561033a57600080fd5b5061021661034936600461403c565b61095e565b34801561035a57600080fd5b50600b54610238906001600160a01b031681565b34801561037a57600080fd5b5060015461038f90600160a01b900460ff1681565b6040519015158152602001610245565b3480156103ab57600080fd5b50600854610238906001600160a01b031681565b3480156103cb57600080fd5b50600254610238906001600160a01b031681565b3480156103eb57600080fd5b506102166109a0565b34801561040057600080fd5b50600d54610238906001600160a01b031681565b34801561042057600080fd5b5061021661042f366004613d59565b610bdb565b34801561044057600080fd5b5061021661044f366004613fbb565b611507565b34801561046057600080fd5b506102166119fb565b34801561047557600080fd5b5061021661048436600461403c565b611a55565b34801561049557600080fd5b50600754610238906001600160a01b031681565b3480156104b557600080fd5b50600a54610238906001600160a01b031681565b3480156104d557600080fd5b506102166104e4366004613ee4565b611a97565b3480156104f557600080fd5b5061021661050436600461403c565b611b78565b34801561051557600080fd5b5061021661052436600461403c565b611bba565b34801561053557600080fd5b50610216610544366004613d59565b611bfc565b34801561055557600080fd5b50610216611c48565b34801561056a57600080fd5b50610238610579366004613d59565b600f602052600090815260409020546001600160a01b031681565b3480156105a057600080fd5b50600954610238906001600160a01b031681565b3480156105c057600080fd5b50600454610238906001600160a01b031681565b3480156105e057600080fd5b506102166105ef366004613d59565b611d27565b34801561060057600080fd5b50610216611ec6565b34801561061557600080fd5b5061062961062436600461406c565b611efe565b604051908152602001610245565b34801561064357600080fd5b5061062961065236600461403c565b6120f8565b34801561066357600080fd5b50610216610672366004613e89565b612395565b34801561068357600080fd5b50600354610238906001600160a01b031681565b6001546001600160a01b031633146106c15760405162461bcd60e51b81526004016101e890614219565b6106d56001600160a01b0384168383612401565b505050565b6001546001600160a01b031633146107045760405162461bcd60e51b81526004016101e890614219565b600154600160a01b900460ff16156107685760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b60648201526084016101e8565b60018054600160a01b60ff60a01b19909116179055600280546001600160a01b03199081166001600160a01b039e8f16179091556003805482169c8e169c909c17909b55600480548c169a8d169a909a17909955600580548b16988c1698909817909755600680548a16968b169687179055600780548a16958b1695909517909455600880548916938a1693909317909255600980548816918916919091179055600b80548716918816919091179055600a80548616918716919091179055600c805485169091179055600d80548416918516919091179055600e80549092169216919091179055565b600260005414156108755760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b031633146108a45760405162461bcd60e51b81526004016101e890614219565b60005b81518110156108f2576108e08282815181106108d357634e487b7160e01b600052603260045260246000fd5b6020026020010151612457565b806108ea816143e8565b9150506108a7565b50506001600055565b6002600054141561091e5760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b0316331461094d5760405162461bcd60e51b81526004016101e890614219565b61095681612457565b506001600055565b600260005414156109815760405162461bcd60e51b81526004016101e8906142d7565b600260005560035461095690339081906001600160a01b03168461246c565b600260005414156109c35760405162461bcd60e51b81526004016101e8906142d7565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906109fa90849081906004016140bd565b602060405180830381600087803b158015610a1457600080fd5b505af1158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c9190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610a7f90849081906004016140bd565b602060405180830381600087803b158015610a9957600080fd5b505af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190614054565b506007546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b0490849081906004016140bd565b602060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b569190614054565b50600a546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b8990849081906004016140bd565b602060405180830381600087803b158015610ba357600080fd5b505af1158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190614054565b60026000541415610bfe5760405162461bcd60e51b81526004016101e8906142d7565b6002600055600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190610c339084906004016140a9565b60206040518083038186803b158015610c4b57600080fd5b505afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190614054565b15610ca05760405162461bcd60e51b81526004016101e89061419c565b600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190610cd09084906004016140a9565b60206040518083038186803b158015610ce857600080fd5b505afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190614054565b15610d3d5760405162461bcd60e51b81526004016101e89061419c565b6001600160a01b038181166000908152600f60205260409020543391168114610db45760405162461bcd60e51b8152602060048201526024808201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616044820152631b1b195960e21b60648201526084016101e8565b6001600160a01b0382166000908152600f6020526040902080546001600160a01b0319169055610de38161260d565b610dec82612457565b600754600354604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92610e2492889216906004016140bd565b60206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e749190614054565b90508015610eb057600354610e969084906001600160a01b0316836000613358565b600354610eb090849084906001600160a01b03168461246c565b60075460048054604051637aeceb1f60e11b81526000936001600160a01b039081169363f5d9d63e93610ee9938a9390911691016140bd565b60206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190614054565b90508015610f7557600454610f5b9085906001600160a01b0316836000613358565b600454610f7590859085906001600160a01b03168461246c565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92610fad928a9216906004016140bd565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd9190614054565b905080156110df5760095460055460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611040928a929091169086908390600401614125565b600060405180830381600087803b15801561105a57600080fd5b505af115801561106e573d6000803e3d6000fd5b5050600954600554604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c93506110ac928a928a9291169087906004016140d7565b600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050505b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a0823191611111918a91016140a9565b60206040518083038186803b15801561112957600080fd5b505afa15801561113d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111619190614054565b905080156111f057600480546040516323b872dd60e01b81526001600160a01b03909116916323b872dd9161119c918a918a91879101614101565b602060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ee9190613f9f565b505b600b54600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611228928c9216906004016140bd565b60206040518083038186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112789190614054565b9050801561143157600a54600b5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d926112bb928c929091169086908390600401614125565b600060405180830381600087803b1580156112d557600080fd5b505af11580156112e9573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611326928c92169086908390600401614125565b600060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b5050600b54600654604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611392928c928c9291169087906004016140d7565b600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c93506113fe928b92839291169087906004016140d7565b600060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050505b600d54604051630f713c2360e41b81526001600160a01b039091169063f713c23090611463908a908a906004016140bd565b600060405180830381600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b5050600e54604051630f713c2360e41b81526001600160a01b03909116925063f713c23091506114c7908a908a906004016140bd565b600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506001600055505050505050505050565b6002600054141561152a5760405162461bcd60e51b81526004016101e8906142d7565b600260009081553390871561165957600d546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061156c90869081906004016140bd565b602060405180830381600087803b15801561158657600080fd5b505af115801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190614054565b600e546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a906115f690879081906004016140bd565b602060405180830381600087803b15801561161057600080fd5b505af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190614054565b905061165482826137fa565b925050505b8680156116665750600081115b156116855760035461168590839081906001600160a01b03168461246c565b600086156117ad576007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906116c090879081906004016140bd565b602060405180830381600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190614054565b600a546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a9061174a90889081906004016140bd565b602060405180830381600087803b15801561176457600080fd5b505af1158015611778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179c9190614054565b90506117a882826137fa565b925050505b8580156117ba5750600081115b156117d9576004546117d990849081906001600160a01b03168461246c565b84156118da576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061181290879081906004016140bd565b602060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118649190614054565b905080156118d857600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c926118a59289928392169087906004016140d7565b600060405180830381600087803b1580156118bf57600080fd5b505af11580156118d3573d6000803e3d6000fd5b505050505b505b83156119eb576009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a9061191290869081906004016140bd565b602060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119649190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a9061199790869081906004016140bd565b602060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190614054565b505b5050600160005550505050505050565b60026000541415611a1e5760405162461bcd60e51b81526004016101e8906142d7565b60026000556007546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90610b0490849081906004016140bd565b60026000541415611a785760405162461bcd60e51b81526004016101e8906142d7565b600260005560045461095690339081906001600160a01b03168461246c565b60026000541415611aba5760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b03163314611ae95760405162461bcd60e51b81526004016101e890614219565b6003546001600160a01b031660005b8351811015611b6d57611b5b33858381518110611b2557634e487b7160e01b600052603260045260246000fd5b602002602001015184868581518110611b4e57634e487b7160e01b600052603260045260246000fd5b602002602001015161246c565b80611b65816143e8565b915050611af8565b505060016000555050565b60026000541415611b9b5760405162461bcd60e51b81526004016101e8906142d7565b60026000556003546109569033906001600160a01b0316836001613358565b60026000541415611bdd5760405162461bcd60e51b81526004016101e8906142d7565b60026000556004546109569033906001600160a01b0316836001613358565b6001546001600160a01b03163314611c265760405162461bcd60e51b81526004016101e890614219565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415611c6b5760405162461bcd60e51b81526004016101e8906142d7565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90611ca290849081906004016140bd565b602060405180830381600087803b158015611cbc57600080fd5b505af1158015611cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf49190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b8990849081906004016140bd565b60026000541415611d4a5760405162461bcd60e51b81526004016101e8906142d7565b6002600055600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611d7f9033906004016140a9565b60206040518083038186803b158015611d9757600080fd5b505afa158015611dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614054565b15611dec5760405162461bcd60e51b81526004016101e89061419c565b600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1c9033906004016140a9565b60206040518083038186803b158015611e3457600080fd5b505afa158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c9190614054565b15611e895760405162461bcd60e51b81526004016101e89061419c565b611e928161260d565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b60026000541415611ee95760405162461bcd60e51b81526004016101e8906142d7565b6002600055611ef733612457565b6001600055565b600060026000541415611f235760405162461bcd60e51b81526004016101e8906142d7565b600260005582611f455760405162461bcd60e51b81526004016101e8906141e2565b600c546040516326ec2edd60e11b815260048101859052602481018490523360448201819052916000916001600160a01b0390911690634dd85dba90606401602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd69190614054565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c9261201492879283929091169087906004016140d7565b600060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612080928792839291169087906004016140d7565b600060405180830381600087803b15801561209a57600080fd5b505af11580156120ae573d6000803e3d6000fd5b505050507f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de824882826040516120e3929190614150565b60405180910390a16001600055949350505050565b60006002600054141561211d5760405162461bcd60e51b81526004016101e8906142d7565b60026000558161216f5760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e7460448201526064016101e8565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d926121aa928692169088908390600401614125565b600060405180830381600087803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350612215928692169088908390600401614125565b600060405180830381600087803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b5050600c5460405163a6cc9e0160e01b815260048101879052600093506001600160a01b03909116915063e194646b90829063a6cc9e019060240160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190614054565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0385166024820152604401602060405180830381600087803b15801561231657600080fd5b505af115801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190614054565b90507f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be718285604051612381929190614150565b60405180910390a160016000559392505050565b600260005414156123b85760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b031633146123e75760405162461bcd60e51b81526004016101e890614219565b6003546108f290339084906001600160a01b03168461246c565b6106d58363a9059cbb60e01b8484604051602401612420929190614150565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261380d565b612460816138df565b61246981613a83565b50565b6000811161248c5760405162461bcd60e51b81526004016101e8906141e2565b600754604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c906124c29087908790879087906004016140d7565b600060405180830381600087803b1580156124dc57600080fd5b505af11580156124f0573d6000803e3d6000fd5b5050600854600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061252e928892839291169087906004016140d7565b600060405180830381600087803b15801561254857600080fd5b505af115801561255c573d6000803e3d6000fd5b5050600954600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061259a928892839291169087906004016140d7565b600060405180830381600087803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505050507f3d944d4ac97e99148053234454311e7695c96bdc7d586015681622f9ff0cdd408383836040516125ff93929190614101565b60405180910390a150505050565b60075460405163a318021760e01b81526001600160a01b039091169063a31802179061263d9084906004016140a9565b60206040518083038186803b15801561265557600080fd5b505afa158015612669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268d9190614054565b156126fa5760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426672547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b60648201526084016101e8565b600754604051633792def360e01b81526001600160a01b0390911690633792def39061272a9084906004016140a9565b60206040518083038186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a9190614054565b156127e45760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426672547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b60648201526084016101e8565b60085460405163a318021760e01b81526001600160a01b039091169063a3180217906128149084906004016140a9565b60206040518083038186803b15801561282c57600080fd5b505afa158015612840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128649190614054565b156128d05760405162461bcd60e51b815260206004820152603660248201527f526577617264526f757465723a20626f6e7573426672547261636b65722e6176604482015275065726167655374616b6564416d6f756e7473203e20360541b60648201526084016101e8565b600854604051633792def360e01b81526001600160a01b0390911690633792def3906129009084906004016140a9565b60206040518083038186803b15801561291857600080fd5b505afa15801561292c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129509190614054565b156129b95760405162461bcd60e51b815260206004820152603360248201527f526577617264526f757465723a20626f6e7573426672547261636b65722e637560448201527206d756c617469766552657761726473203e203606c1b60648201526084016101e8565b60095460405163a318021760e01b81526001600160a01b039091169063a3180217906129e99084906004016140a9565b60206040518083038186803b158015612a0157600080fd5b505afa158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190614054565b15612aa35760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426672547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b60648201526084016101e8565b600954604051633792def360e01b81526001600160a01b0390911690633792def390612ad39084906004016140a9565b60206040518083038186803b158015612aeb57600080fd5b505afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190614054565b15612b8a5760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426672547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b60648201526084016101e8565b600d54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c90612bba9084906004016140a9565b60206040518083038186803b158015612bd257600080fd5b505afa158015612be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0a9190614054565b15612c275760405162461bcd60e51b81526004016101e890614248565b600d54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a90612c579084906004016140a9565b60206040518083038186803b158015612c6f57600080fd5b505afa158015612c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca79190614054565b15612cc45760405162461bcd60e51b81526004016101e890614291565b600a5460405163a318021760e01b81526001600160a01b039091169063a318021790612cf49084906004016140a9565b60206040518083038186803b158015612d0c57600080fd5b505afa158015612d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d449190614054565b15612db15760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b60648201526084016101e8565b600a54604051633792def360e01b81526001600160a01b0390911690633792def390612de19084906004016140a9565b60206040518083038186803b158015612df957600080fd5b505afa158015612e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e319190614054565b15612e9b5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b60648201526084016101e8565b600b5460405163a318021760e01b81526001600160a01b039091169063a318021790612ecb9084906004016140a9565b60206040518083038186803b158015612ee357600080fd5b505afa158015612ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1b9190614054565b15612f855760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c70547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b60648201526084016101e8565b600b54604051633792def360e01b81526001600160a01b0390911690633792def390612fb59084906004016140a9565b60206040518083038186803b158015612fcd57600080fd5b505afa158015612fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130059190614054565b1561306c5760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c70547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b60648201526084016101e8565b600e54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c9061309c9084906004016140a9565b60206040518083038186803b1580156130b457600080fd5b505afa1580156130c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ec9190614054565b156131095760405162461bcd60e51b81526004016101e890614248565b600e54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a906131399084906004016140a9565b60206040518083038186803b15801561315157600080fd5b505afa158015613165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131899190614054565b156131a65760405162461bcd60e51b81526004016101e890614291565b600d546040516370a0823160e01b81526001600160a01b03909116906370a08231906131d69084906004016140a9565b60206040518083038186803b1580156131ee57600080fd5b505afa158015613202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132269190614054565b1561327f5760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206266725665737465722e62616c616e63652060448201526203e20360ec1b60648201526084016101e8565b600e546040516370a0823160e01b81526001600160a01b03909116906370a08231906132af9084906004016140a9565b60206040518083038186803b1580156132c757600080fd5b505afa1580156132db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ff9190614054565b156124695760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c705665737465722e62616c616e63652060448201526203e20360ec1b60648201526084016101e8565b600082116133785760405162461bcd60e51b81526004016101e8906141e2565b6007546040516310c1c10360e01b81526000916001600160a01b0316906310c1c103906133a99088906004016140a9565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614054565b60095460085460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613436928a9291169088908390600401614125565b600060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505060085460075460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506134a1928a92169088908390600401614125565b600060405180830381600087803b1580156134bb57600080fd5b505af11580156134cf573d6000803e3d6000fd5b505060075460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613509908890889088908390600401614125565b600060405180830381600087803b15801561352357600080fd5b505af1158015613537573d6000803e3d6000fd5b5050505081156137b8576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061357490899081906004016140bd565b602060405180830381600087803b15801561358e57600080fd5b505af11580156135a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c69190614054565b9050801561363a57600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613607928b928392169087906004016140d7565b600060405180830381600087803b15801561362157600080fd5b505af1158015613635573d6000803e3d6000fd5b505050505b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613672928c9216906004016140bd565b60206040518083038186803b15801561368a57600080fd5b505afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190614054565b905080156137b55760006136e0846136da8489613b2e565b90613b3a565b60095460055460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d9261371d928d9291169086908390600401614125565b600060405180830381600087803b15801561373757600080fd5b505af115801561374b573d6000803e3d6000fd5b5050600554604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150613781908b908590600401614150565b600060405180830381600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b50505050505b50505b7f17ded7ab58760cb76c14f426850d1bbfa06b7fdc16fb81ecf447f7d541c95a538585856040516137eb93929190614101565b60405180910390a15050505050565b60006138068284614361565b9392505050565b6000613862826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b469092919063ffffffff16565b8051909150156106d557808060200190518101906138809190613f9f565b6106d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101e8565b6007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061391290859081906004016140bd565b602060405180830381600087803b15801561392c57600080fd5b505af1158015613940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139649190614054565b905080156139865760045461398690839081906001600160a01b03168461246c565b6008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906139b990869081906004016140bd565b602060405180830381600087803b1580156139d357600080fd5b505af11580156139e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0b9190614054565b905080156106d557600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613a4c9288928392169087906004016140d7565b600060405180830381600087803b158015613a6657600080fd5b505af1158015613a7a573d6000803e3d6000fd5b50505050505050565b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613ab690859081906004016140bd565b602060405180830381600087803b158015613ad057600080fd5b505af1158015613ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b089190614054565b90508015613b2a57600454613b2a90839081906001600160a01b03168461246c565b5050565b60006138068284614399565b60006138068284614379565b6060613b558484600085613b5d565b949350505050565b606082471015613bbe5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101e8565b6001600160a01b0385163b613c155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101e8565b600080866001600160a01b03168587604051613c31919061408d565b60006040518083038185875af1925050503d8060008114613c6e576040519150601f19603f3d011682016040523d82523d6000602084013e613c73565b606091505b5091509150613c83828286613c8e565b979650505050505050565b60608315613c9d575081613806565b825115613cad5782518084602001fd5b8160405162461bcd60e51b81526004016101e89190614169565b80356001600160a01b0381168114613cde57600080fd5b919050565b600082601f830112613cf3578081fd5b81356020613d08613d038361433e565b61430e565b80838252828201915082860187848660051b8901011115613d27578586fd5b855b85811015613d4c57613d3a82613cc7565b84529284019290840190600101613d29565b5090979650505050505050565b600060208284031215613d6a578081fd5b61380682613cc7565b6000806000806000806000806000806000806101808d8f031215613d95578788fd5b613d9e8d613cc7565b9b50613dac60208e01613cc7565b9a50613dba60408e01613cc7565b9950613dc860608e01613cc7565b9850613dd660808e01613cc7565b9750613de460a08e01613cc7565b9650613df260c08e01613cc7565b9550613e0060e08e01613cc7565b9450613e0f6101008e01613cc7565b9350613e1e6101208e01613cc7565b9250613e2d6101408e01613cc7565b9150613e3c6101608e01613cc7565b90509295989b509295989b509295989b565b600080600060608486031215613e62578283fd5b613e6b84613cc7565b9250613e7960208501613cc7565b9150604084013590509250925092565b60008060408385031215613e9b578182fd5b613ea483613cc7565b946020939093013593505050565b600060208284031215613ec3578081fd5b81356001600160401b03811115613ed8578182fd5b613b5584828501613ce3565b60008060408385031215613ef6578182fd5b82356001600160401b0380821115613f0c578384fd5b613f1886838701613ce3565b9350602091508185013581811115613f2e578384fd5b85019050601f81018613613f40578283fd5b8035613f4e613d038261433e565b80828252848201915084840189868560051b8701011115613f6d578687fd5b8694505b83851015613f8f578035835260019490940193918501918501613f71565b5080955050505050509250929050565b600060208284031215613fb0578081fd5b81516138068161442f565b60008060008060008060c08789031215613fd3578182fd5b8635613fde8161442f565b95506020870135613fee8161442f565b94506040870135613ffe8161442f565b9350606087013561400e8161442f565b9250608087013561401e8161442f565b915060a087013561402e8161442f565b809150509295509295509295565b60006020828403121561404d578081fd5b5035919050565b600060208284031215614065578081fd5b5051919050565b6000806040838503121561407e578081fd5b50508035926020909101359150565b6000825161409f8184602087016143b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b60208152600082518060208401526141888160408501602087016143b8565b601f01601f19169190910160400192915050565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6020808252603b9082015260008051602061443e83398151915260408201527a0726564417665726167655374616b6564416d6f756e7473203e203602c1b606082015260800190565b602080825260389082015260008051602061443e833981519152604082015277072656443756d756c617469766552657761726473203e20360441b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561433657614336614419565b604052919050565b60006001600160401b0382111561435757614357614419565b5060051b60200190565b6000821982111561437457614374614403565b500190565b60008261439457634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156143b3576143b3614403565b500290565b60005b838110156143d35781810151838201526020016143bb565b838111156143e2576000848401525b50505050565b60006000198214156143fc576143fc614403565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461246957600080fdfe526577617264526f757465723a206266725665737465722e7472616e73666572a264697066735822122084c29eb58aa9134e708b86c13f0f98b0b8a97c1013000d81c7597afa2881019964736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101a35760003560e01c806301e33667146101f657806309b4a7da146102185780630b800f481461024e5780631266b1b91461026e57806312d43a511461028e5780631af276a6146102ae5780632a9f4083146102ce5780632be57289146102ee5780632c5c7d241461030e578063303d9c1a1461032e57806332854fea1461034e578063392e53cd1461036e5780633cde986c1461039f5780633e413bee146103bf5780634e71d92d146103df5780634ee65fd2146103f4578063655603a414610414578063718f2430146104345780637fe98d091461045457806384898336146104695780638845cd4514610489578063944c9c54146104a95780639d654f0b146104c9578063a453cc6d146104e9578063c01bf28f14610509578063cfad57a214610529578063d294f09314610549578063e1b9db891461055e578063e4803c4414610594578063ea6c5814146105b4578063ef9aacfd146105d4578063f69e2046146105f4578063fa4e093214610609578063fb43a7f914610637578063ff39d38514610657578063ffffe6201461067757600080fd5b366101f15760405162461bcd60e51b81526020600482015260196024820152780a4deeae8cae4744086c2dc4ee840e4cac6cad2ecca40cae8d603b1b60448201526064015b60405180910390fd5b600080fd5b34801561020257600080fd5b50610216610211366004613e4e565b610697565b005b34801561022457600080fd5b50600e54610238906001600160a01b031681565b60405161024591906140a9565b60405180910390f35b34801561025a57600080fd5b50610216610269366004613d73565b6106da565b34801561027a57600080fd5b50600654610238906001600160a01b031681565b34801561029a57600080fd5b50600154610238906001600160a01b031681565b3480156102ba57600080fd5b506102166102c9366004613eb2565b610852565b3480156102da57600080fd5b506102166102e9366004613d59565b6108fb565b3480156102fa57600080fd5b50600554610238906001600160a01b031681565b34801561031a57600080fd5b50600c54610238906001600160a01b031681565b34801561033a57600080fd5b5061021661034936600461403c565b61095e565b34801561035a57600080fd5b50600b54610238906001600160a01b031681565b34801561037a57600080fd5b5060015461038f90600160a01b900460ff1681565b6040519015158152602001610245565b3480156103ab57600080fd5b50600854610238906001600160a01b031681565b3480156103cb57600080fd5b50600254610238906001600160a01b031681565b3480156103eb57600080fd5b506102166109a0565b34801561040057600080fd5b50600d54610238906001600160a01b031681565b34801561042057600080fd5b5061021661042f366004613d59565b610bdb565b34801561044057600080fd5b5061021661044f366004613fbb565b611507565b34801561046057600080fd5b506102166119fb565b34801561047557600080fd5b5061021661048436600461403c565b611a55565b34801561049557600080fd5b50600754610238906001600160a01b031681565b3480156104b557600080fd5b50600a54610238906001600160a01b031681565b3480156104d557600080fd5b506102166104e4366004613ee4565b611a97565b3480156104f557600080fd5b5061021661050436600461403c565b611b78565b34801561051557600080fd5b5061021661052436600461403c565b611bba565b34801561053557600080fd5b50610216610544366004613d59565b611bfc565b34801561055557600080fd5b50610216611c48565b34801561056a57600080fd5b50610238610579366004613d59565b600f602052600090815260409020546001600160a01b031681565b3480156105a057600080fd5b50600954610238906001600160a01b031681565b3480156105c057600080fd5b50600454610238906001600160a01b031681565b3480156105e057600080fd5b506102166105ef366004613d59565b611d27565b34801561060057600080fd5b50610216611ec6565b34801561061557600080fd5b5061062961062436600461406c565b611efe565b604051908152602001610245565b34801561064357600080fd5b5061062961065236600461403c565b6120f8565b34801561066357600080fd5b50610216610672366004613e89565b612395565b34801561068357600080fd5b50600354610238906001600160a01b031681565b6001546001600160a01b031633146106c15760405162461bcd60e51b81526004016101e890614219565b6106d56001600160a01b0384168383612401565b505050565b6001546001600160a01b031633146107045760405162461bcd60e51b81526004016101e890614219565b600154600160a01b900460ff16156107685760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b60648201526084016101e8565b60018054600160a01b60ff60a01b19909116179055600280546001600160a01b03199081166001600160a01b039e8f16179091556003805482169c8e169c909c17909b55600480548c169a8d169a909a17909955600580548b16988c1698909817909755600680548a16968b169687179055600780548a16958b1695909517909455600880548916938a1693909317909255600980548816918916919091179055600b80548716918816919091179055600a80548616918716919091179055600c805485169091179055600d80548416918516919091179055600e80549092169216919091179055565b600260005414156108755760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b031633146108a45760405162461bcd60e51b81526004016101e890614219565b60005b81518110156108f2576108e08282815181106108d357634e487b7160e01b600052603260045260246000fd5b6020026020010151612457565b806108ea816143e8565b9150506108a7565b50506001600055565b6002600054141561091e5760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b0316331461094d5760405162461bcd60e51b81526004016101e890614219565b61095681612457565b506001600055565b600260005414156109815760405162461bcd60e51b81526004016101e8906142d7565b600260005560035461095690339081906001600160a01b03168461246c565b600260005414156109c35760405162461bcd60e51b81526004016101e8906142d7565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906109fa90849081906004016140bd565b602060405180830381600087803b158015610a1457600080fd5b505af1158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c9190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610a7f90849081906004016140bd565b602060405180830381600087803b158015610a9957600080fd5b505af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190614054565b506007546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b0490849081906004016140bd565b602060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b569190614054565b50600a546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b8990849081906004016140bd565b602060405180830381600087803b158015610ba357600080fd5b505af1158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190614054565b60026000541415610bfe5760405162461bcd60e51b81526004016101e8906142d7565b6002600055600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190610c339084906004016140a9565b60206040518083038186803b158015610c4b57600080fd5b505afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190614054565b15610ca05760405162461bcd60e51b81526004016101e89061419c565b600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190610cd09084906004016140a9565b60206040518083038186803b158015610ce857600080fd5b505afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190614054565b15610d3d5760405162461bcd60e51b81526004016101e89061419c565b6001600160a01b038181166000908152600f60205260409020543391168114610db45760405162461bcd60e51b8152602060048201526024808201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616044820152631b1b195960e21b60648201526084016101e8565b6001600160a01b0382166000908152600f6020526040902080546001600160a01b0319169055610de38161260d565b610dec82612457565b600754600354604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92610e2492889216906004016140bd565b60206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e749190614054565b90508015610eb057600354610e969084906001600160a01b0316836000613358565b600354610eb090849084906001600160a01b03168461246c565b60075460048054604051637aeceb1f60e11b81526000936001600160a01b039081169363f5d9d63e93610ee9938a9390911691016140bd565b60206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190614054565b90508015610f7557600454610f5b9085906001600160a01b0316836000613358565b600454610f7590859085906001600160a01b03168461246c565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92610fad928a9216906004016140bd565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd9190614054565b905080156110df5760095460055460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611040928a929091169086908390600401614125565b600060405180830381600087803b15801561105a57600080fd5b505af115801561106e573d6000803e3d6000fd5b5050600954600554604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c93506110ac928a928a9291169087906004016140d7565b600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050505b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a0823191611111918a91016140a9565b60206040518083038186803b15801561112957600080fd5b505afa15801561113d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111619190614054565b905080156111f057600480546040516323b872dd60e01b81526001600160a01b03909116916323b872dd9161119c918a918a91879101614101565b602060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ee9190613f9f565b505b600b54600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611228928c9216906004016140bd565b60206040518083038186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112789190614054565b9050801561143157600a54600b5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d926112bb928c929091169086908390600401614125565b600060405180830381600087803b1580156112d557600080fd5b505af11580156112e9573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611326928c92169086908390600401614125565b600060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b5050600b54600654604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611392928c928c9291169087906004016140d7565b600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c93506113fe928b92839291169087906004016140d7565b600060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050505b600d54604051630f713c2360e41b81526001600160a01b039091169063f713c23090611463908a908a906004016140bd565b600060405180830381600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b5050600e54604051630f713c2360e41b81526001600160a01b03909116925063f713c23091506114c7908a908a906004016140bd565b600060405180830381600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50506001600055505050505050505050565b6002600054141561152a5760405162461bcd60e51b81526004016101e8906142d7565b600260009081553390871561165957600d546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061156c90869081906004016140bd565b602060405180830381600087803b15801561158657600080fd5b505af115801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190614054565b600e546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a906115f690879081906004016140bd565b602060405180830381600087803b15801561161057600080fd5b505af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190614054565b905061165482826137fa565b925050505b8680156116665750600081115b156116855760035461168590839081906001600160a01b03168461246c565b600086156117ad576007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906116c090879081906004016140bd565b602060405180830381600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190614054565b600a546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a9061174a90889081906004016140bd565b602060405180830381600087803b15801561176457600080fd5b505af1158015611778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179c9190614054565b90506117a882826137fa565b925050505b8580156117ba5750600081115b156117d9576004546117d990849081906001600160a01b03168461246c565b84156118da576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061181290879081906004016140bd565b602060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118649190614054565b905080156118d857600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c926118a59289928392169087906004016140d7565b600060405180830381600087803b1580156118bf57600080fd5b505af11580156118d3573d6000803e3d6000fd5b505050505b505b83156119eb576009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a9061191290869081906004016140bd565b602060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119649190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a9061199790869081906004016140bd565b602060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190614054565b505b5050600160005550505050505050565b60026000541415611a1e5760405162461bcd60e51b81526004016101e8906142d7565b60026000556007546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90610b0490849081906004016140bd565b60026000541415611a785760405162461bcd60e51b81526004016101e8906142d7565b600260005560045461095690339081906001600160a01b03168461246c565b60026000541415611aba5760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b03163314611ae95760405162461bcd60e51b81526004016101e890614219565b6003546001600160a01b031660005b8351811015611b6d57611b5b33858381518110611b2557634e487b7160e01b600052603260045260246000fd5b602002602001015184868581518110611b4e57634e487b7160e01b600052603260045260246000fd5b602002602001015161246c565b80611b65816143e8565b915050611af8565b505060016000555050565b60026000541415611b9b5760405162461bcd60e51b81526004016101e8906142d7565b60026000556003546109569033906001600160a01b0316836001613358565b60026000541415611bdd5760405162461bcd60e51b81526004016101e8906142d7565b60026000556004546109569033906001600160a01b0316836001613358565b6001546001600160a01b03163314611c265760405162461bcd60e51b81526004016101e890614219565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415611c6b5760405162461bcd60e51b81526004016101e8906142d7565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90611ca290849081906004016140bd565b602060405180830381600087803b158015611cbc57600080fd5b505af1158015611cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf49190614054565b50600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90610b8990849081906004016140bd565b60026000541415611d4a5760405162461bcd60e51b81526004016101e8906142d7565b6002600055600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611d7f9033906004016140a9565b60206040518083038186803b158015611d9757600080fd5b505afa158015611dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614054565b15611dec5760405162461bcd60e51b81526004016101e89061419c565b600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1c9033906004016140a9565b60206040518083038186803b158015611e3457600080fd5b505afa158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c9190614054565b15611e895760405162461bcd60e51b81526004016101e89061419c565b611e928161260d565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b60026000541415611ee95760405162461bcd60e51b81526004016101e8906142d7565b6002600055611ef733612457565b6001600055565b600060026000541415611f235760405162461bcd60e51b81526004016101e8906142d7565b600260005582611f455760405162461bcd60e51b81526004016101e8906141e2565b600c546040516326ec2edd60e11b815260048101859052602481018490523360448201819052916000916001600160a01b0390911690634dd85dba90606401602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd69190614054565b600b54600654604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c9261201492879283929091169087906004016140d7565b600060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b5050600a54600b54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612080928792839291169087906004016140d7565b600060405180830381600087803b15801561209a57600080fd5b505af11580156120ae573d6000803e3d6000fd5b505050507f90c1194d60ebfbbd2b19fa18d0c2cde6818b0eff7fa12541cee327da07de824882826040516120e3929190614150565b60405180910390a16001600055949350505050565b60006002600054141561211d5760405162461bcd60e51b81526004016101e8906142d7565b60026000558161216f5760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f626c70416d6f756e7460448201526064016101e8565b600a54600b5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d926121aa928692169088908390600401614125565b600060405180830381600087803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b5050600b5460065460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350612215928692169088908390600401614125565b600060405180830381600087803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b5050600c5460405163a6cc9e0160e01b815260048101879052600093506001600160a01b03909116915063e194646b90829063a6cc9e019060240160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190614054565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0385166024820152604401602060405180830381600087803b15801561231657600080fd5b505af115801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190614054565b90507f942bfc918bc52e69d204521517af864444b378ff816d20fdb1ab8f85aa54be718285604051612381929190614150565b60405180910390a160016000559392505050565b600260005414156123b85760405162461bcd60e51b81526004016101e8906142d7565b60026000556001546001600160a01b031633146123e75760405162461bcd60e51b81526004016101e890614219565b6003546108f290339084906001600160a01b03168461246c565b6106d58363a9059cbb60e01b8484604051602401612420929190614150565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261380d565b612460816138df565b61246981613a83565b50565b6000811161248c5760405162461bcd60e51b81526004016101e8906141e2565b600754604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c906124c29087908790879087906004016140d7565b600060405180830381600087803b1580156124dc57600080fd5b505af11580156124f0573d6000803e3d6000fd5b5050600854600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061252e928892839291169087906004016140d7565b600060405180830381600087803b15801561254857600080fd5b505af115801561255c573d6000803e3d6000fd5b5050600954600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061259a928892839291169087906004016140d7565b600060405180830381600087803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505050507f3d944d4ac97e99148053234454311e7695c96bdc7d586015681622f9ff0cdd408383836040516125ff93929190614101565b60405180910390a150505050565b60075460405163a318021760e01b81526001600160a01b039091169063a31802179061263d9084906004016140a9565b60206040518083038186803b15801561265557600080fd5b505afa158015612669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268d9190614054565b156126fa5760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426672547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b60648201526084016101e8565b600754604051633792def360e01b81526001600160a01b0390911690633792def39061272a9084906004016140a9565b60206040518083038186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a9190614054565b156127e45760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426672547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b60648201526084016101e8565b60085460405163a318021760e01b81526001600160a01b039091169063a3180217906128149084906004016140a9565b60206040518083038186803b15801561282c57600080fd5b505afa158015612840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128649190614054565b156128d05760405162461bcd60e51b815260206004820152603660248201527f526577617264526f757465723a20626f6e7573426672547261636b65722e6176604482015275065726167655374616b6564416d6f756e7473203e20360541b60648201526084016101e8565b600854604051633792def360e01b81526001600160a01b0390911690633792def3906129009084906004016140a9565b60206040518083038186803b15801561291857600080fd5b505afa15801561292c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129509190614054565b156129b95760405162461bcd60e51b815260206004820152603360248201527f526577617264526f757465723a20626f6e7573426672547261636b65722e637560448201527206d756c617469766552657761726473203e203606c1b60648201526084016101e8565b60095460405163a318021760e01b81526001600160a01b039091169063a3180217906129e99084906004016140a9565b60206040518083038186803b158015612a0157600080fd5b505afa158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190614054565b15612aa35760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426672547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b60648201526084016101e8565b600954604051633792def360e01b81526001600160a01b0390911690633792def390612ad39084906004016140a9565b60206040518083038186803b158015612aeb57600080fd5b505afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190614054565b15612b8a5760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426672547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b60648201526084016101e8565b600d54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c90612bba9084906004016140a9565b60206040518083038186803b158015612bd257600080fd5b505afa158015612be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0a9190614054565b15612c275760405162461bcd60e51b81526004016101e890614248565b600d54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a90612c579084906004016140a9565b60206040518083038186803b158015612c6f57600080fd5b505afa158015612c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca79190614054565b15612cc45760405162461bcd60e51b81526004016101e890614291565b600a5460405163a318021760e01b81526001600160a01b039091169063a318021790612cf49084906004016140a9565b60206040518083038186803b158015612d0c57600080fd5b505afa158015612d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d449190614054565b15612db15760405162461bcd60e51b815260206004820152603760248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e6160448201527607665726167655374616b6564416d6f756e7473203e203604c1b60648201526084016101e8565b600a54604051633792def360e01b81526001600160a01b0390911690633792def390612de19084906004016140a9565b60206040518083038186803b158015612df957600080fd5b505afa158015612e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e319190614054565b15612e9b5760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a207374616b6564426c70547261636b65722e636044820152730756d756c617469766552657761726473203e20360641b60648201526084016101e8565b600b5460405163a318021760e01b81526001600160a01b039091169063a318021790612ecb9084906004016140a9565b60206040518083038186803b158015612ee357600080fd5b505afa158015612ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1b9190614054565b15612f855760405162461bcd60e51b815260206004820152603460248201527f526577617264526f757465723a20666565426c70547261636b65722e6176657260448201527306167655374616b6564416d6f756e7473203e20360641b60648201526084016101e8565b600b54604051633792def360e01b81526001600160a01b0390911690633792def390612fb59084906004016140a9565b60206040518083038186803b158015612fcd57600080fd5b505afa158015612fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130059190614054565b1561306c5760405162461bcd60e51b815260206004820152603160248201527f526577617264526f757465723a20666565426c70547261636b65722e63756d7560448201527006c617469766552657761726473203e203607c1b60648201526084016101e8565b600e54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c9061309c9084906004016140a9565b60206040518083038186803b1580156130b457600080fd5b505afa1580156130c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ec9190614054565b156131095760405162461bcd60e51b81526004016101e890614248565b600e54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a906131399084906004016140a9565b60206040518083038186803b15801561315157600080fd5b505afa158015613165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131899190614054565b156131a65760405162461bcd60e51b81526004016101e890614291565b600d546040516370a0823160e01b81526001600160a01b03909116906370a08231906131d69084906004016140a9565b60206040518083038186803b1580156131ee57600080fd5b505afa158015613202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132269190614054565b1561327f5760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206266725665737465722e62616c616e63652060448201526203e20360ec1b60648201526084016101e8565b600e546040516370a0823160e01b81526001600160a01b03909116906370a08231906132af9084906004016140a9565b60206040518083038186803b1580156132c757600080fd5b505afa1580156132db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ff9190614054565b156124695760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a20626c705665737465722e62616c616e63652060448201526203e20360ec1b60648201526084016101e8565b600082116133785760405162461bcd60e51b81526004016101e8906141e2565b6007546040516310c1c10360e01b81526000916001600160a01b0316906310c1c103906133a99088906004016140a9565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614054565b60095460085460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613436928a9291169088908390600401614125565b600060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505060085460075460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506134a1928a92169088908390600401614125565b600060405180830381600087803b1580156134bb57600080fd5b505af11580156134cf573d6000803e3d6000fd5b505060075460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613509908890889088908390600401614125565b600060405180830381600087803b15801561352357600080fd5b505af1158015613537573d6000803e3d6000fd5b5050505081156137b8576008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061357490899081906004016140bd565b602060405180830381600087803b15801561358e57600080fd5b505af11580156135a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c69190614054565b9050801561363a57600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613607928b928392169087906004016140d7565b600060405180830381600087803b15801561362157600080fd5b505af1158015613635573d6000803e3d6000fd5b505050505b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613672928c9216906004016140bd565b60206040518083038186803b15801561368a57600080fd5b505afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190614054565b905080156137b55760006136e0846136da8489613b2e565b90613b3a565b60095460055460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d9261371d928d9291169086908390600401614125565b600060405180830381600087803b15801561373757600080fd5b505af115801561374b573d6000803e3d6000fd5b5050600554604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150613781908b908590600401614150565b600060405180830381600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b50505050505b50505b7f17ded7ab58760cb76c14f426850d1bbfa06b7fdc16fb81ecf447f7d541c95a538585856040516137eb93929190614101565b60405180910390a15050505050565b60006138068284614361565b9392505050565b6000613862826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b469092919063ffffffff16565b8051909150156106d557808060200190518101906138809190613f9f565b6106d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101e8565b6007546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061391290859081906004016140bd565b602060405180830381600087803b15801561392c57600080fd5b505af1158015613940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139649190614054565b905080156139865760045461398690839081906001600160a01b03168461246c565b6008546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a906139b990869081906004016140bd565b602060405180830381600087803b1580156139d357600080fd5b505af11580156139e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0b9190614054565b905080156106d557600954600554604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613a4c9288928392169087906004016140d7565b600060405180830381600087803b158015613a6657600080fd5b505af1158015613a7a573d6000803e3d6000fd5b50505050505050565b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613ab690859081906004016140bd565b602060405180830381600087803b158015613ad057600080fd5b505af1158015613ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b089190614054565b90508015613b2a57600454613b2a90839081906001600160a01b03168461246c565b5050565b60006138068284614399565b60006138068284614379565b6060613b558484600085613b5d565b949350505050565b606082471015613bbe5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101e8565b6001600160a01b0385163b613c155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101e8565b600080866001600160a01b03168587604051613c31919061408d565b60006040518083038185875af1925050503d8060008114613c6e576040519150601f19603f3d011682016040523d82523d6000602084013e613c73565b606091505b5091509150613c83828286613c8e565b979650505050505050565b60608315613c9d575081613806565b825115613cad5782518084602001fd5b8160405162461bcd60e51b81526004016101e89190614169565b80356001600160a01b0381168114613cde57600080fd5b919050565b600082601f830112613cf3578081fd5b81356020613d08613d038361433e565b61430e565b80838252828201915082860187848660051b8901011115613d27578586fd5b855b85811015613d4c57613d3a82613cc7565b84529284019290840190600101613d29565b5090979650505050505050565b600060208284031215613d6a578081fd5b61380682613cc7565b6000806000806000806000806000806000806101808d8f031215613d95578788fd5b613d9e8d613cc7565b9b50613dac60208e01613cc7565b9a50613dba60408e01613cc7565b9950613dc860608e01613cc7565b9850613dd660808e01613cc7565b9750613de460a08e01613cc7565b9650613df260c08e01613cc7565b9550613e0060e08e01613cc7565b9450613e0f6101008e01613cc7565b9350613e1e6101208e01613cc7565b9250613e2d6101408e01613cc7565b9150613e3c6101608e01613cc7565b90509295989b509295989b509295989b565b600080600060608486031215613e62578283fd5b613e6b84613cc7565b9250613e7960208501613cc7565b9150604084013590509250925092565b60008060408385031215613e9b578182fd5b613ea483613cc7565b946020939093013593505050565b600060208284031215613ec3578081fd5b81356001600160401b03811115613ed8578182fd5b613b5584828501613ce3565b60008060408385031215613ef6578182fd5b82356001600160401b0380821115613f0c578384fd5b613f1886838701613ce3565b9350602091508185013581811115613f2e578384fd5b85019050601f81018613613f40578283fd5b8035613f4e613d038261433e565b80828252848201915084840189868560051b8701011115613f6d578687fd5b8694505b83851015613f8f578035835260019490940193918501918501613f71565b5080955050505050509250929050565b600060208284031215613fb0578081fd5b81516138068161442f565b60008060008060008060c08789031215613fd3578182fd5b8635613fde8161442f565b95506020870135613fee8161442f565b94506040870135613ffe8161442f565b9350606087013561400e8161442f565b9250608087013561401e8161442f565b915060a087013561402e8161442f565b809150509295509295509295565b60006020828403121561404d578081fd5b5035919050565b600060208284031215614065578081fd5b5051919050565b6000806040838503121561407e578081fd5b50508035926020909101359150565b6000825161409f8184602087016143b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b60208152600082518060208401526141888160408501602087016143b8565b601f01601f19169190910160400192915050565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6020808252603b9082015260008051602061443e83398151915260408201527a0726564417665726167655374616b6564416d6f756e7473203e203602c1b606082015260800190565b602080825260389082015260008051602061443e833981519152604082015277072656443756d756c617469766552657761726473203e20360441b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561433657614336614419565b604052919050565b60006001600160401b0382111561435757614357614419565b5060051b60200190565b6000821982111561437457614374614403565b500190565b60008261439457634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156143b3576143b3614403565b500290565b60005b838110156143d35781810151838201526020016143bb565b838111156143e2576000848401525b50505050565b60006000198214156143fc576143fc614403565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461246957600080fdfe526577617264526f757465723a206266725665737465722e7472616e73666572a264697066735822122084c29eb58aa9134e708b86c13f0f98b0b8a97c1013000d81c7597afa2881019964736f6c63430008040033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.