Latest 25 from a total of 82,501 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim_many | 61254008 | 45 mins ago | IN | 0 S | 0.03591665 | ||||
| Claim_many | 61253999 | 45 mins ago | IN | 0 S | 0.13495476 | ||||
| Claim | 61253861 | 49 mins ago | IN | 0 S | 0.03487203 | ||||
| Claim_many | 61250899 | 1 hr ago | IN | 0 S | 0.02073571 | ||||
| Claim_many | 61242573 | 4 hrs ago | IN | 0 S | 0.00743011 | ||||
| Claim_many | 61242425 | 4 hrs ago | IN | 0 S | 0.01034715 | ||||
| Claim_many | 61242392 | 4 hrs ago | IN | 0 S | 0.00793507 | ||||
| Claim_many | 61242356 | 4 hrs ago | IN | 0 S | 0.00793507 | ||||
| Claim_many | 61242315 | 4 hrs ago | IN | 0 S | 0.00793507 | ||||
| Claim | 61241868 | 5 hrs ago | IN | 0 S | 0.03642963 | ||||
| Claim_many | 61241838 | 5 hrs ago | IN | 0 S | 0.03207743 | ||||
| Claim_many | 61241830 | 5 hrs ago | IN | 0 S | 0.12712397 | ||||
| Claim_many | 61241825 | 5 hrs ago | IN | 0 S | 0.12847494 | ||||
| Claim_many | 61241818 | 5 hrs ago | IN | 0 S | 0.12847494 | ||||
| Claim_many | 61240352 | 5 hrs ago | IN | 0 S | 0.07792499 | ||||
| Claim | 61234063 | 8 hrs ago | IN | 0 S | 0.03696561 | ||||
| Claim | 61231330 | 9 hrs ago | IN | 0 S | 0.03174737 | ||||
| Claim_many | 61222449 | 12 hrs ago | IN | 0 S | 0.05496672 | ||||
| Claim | 61216154 | 15 hrs ago | IN | 0 S | 0.03384502 | ||||
| Claim_many | 61213372 | 16 hrs ago | IN | 0 S | 0.03372413 | ||||
| Claim_many | 61213323 | 16 hrs ago | IN | 0 S | 0.03372413 | ||||
| Claim_many | 61213277 | 16 hrs ago | IN | 0 S | 0.03372413 | ||||
| Claim_many | 61213246 | 16 hrs ago | IN | 0 S | 0.03372413 | ||||
| Claim_many | 61213190 | 16 hrs ago | IN | 0 S | 0.03435795 | ||||
| Claim_many | 61208773 | 17 hrs ago | IN | 0 S | 0.05844343 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 61254008 | 45 mins ago | 0 S | |||||
| 61254008 | 45 mins ago | 0 S | |||||
| 61254008 | 45 mins ago | 0 S | |||||
| 61254008 | 45 mins ago | 0 S | |||||
| 61254008 | 45 mins ago | 0 S | |||||
| 61254008 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S | |||||
| 61253999 | 45 mins ago | 0 S |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RewardsDistributor
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.13;
import './libraries/Math.sol';
import {Constants} from "./libraries/Constants.sol";
import './interfaces/IRewardsDistributor.sol';
import './interfaces/IVotingEscrow.sol';
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
/*
@title Curve Fee Distribution modified for ve(3,3) emissions
@author Curve Finance, andrecronje
@license MIT
*/
contract RewardsDistributor is IRewardsDistributor {
using SafeERC20 for IERC20;
event CheckpointToken(
uint time,
uint tokens
);
event Claimed(
uint tokenId,
uint amount,
uint claim_epoch,
uint max_epoch
);
uint public start_time;
uint public time_cursor;
mapping(uint => uint) public time_cursor_of;
mapping(uint => uint) public user_epoch_of;
uint public last_token_time;
uint[1000000000000000] public tokens_per_week;
uint public token_last_balance;
uint[1000000000000000] public ve_supply;
address public owner;
address public voting_escrow;
address public token;
address public depositor;
constructor(address _voting_escrow) {
uint _t = block.timestamp / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
start_time = _t;
last_token_time = _t;
time_cursor = _t;
address _token = IVotingEscrow(_voting_escrow).token();
token = _token;
voting_escrow = _voting_escrow;
depositor = msg.sender; //MinterUpgradeable
owner = msg.sender;
require(IERC20(_token).approve(_voting_escrow, type(uint).max));
}
function timestamp() external view returns (uint) {
return block.timestamp / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
}
function _checkpoint_token() internal {
uint token_balance = IERC20(token).balanceOf(address(this));
uint to_distribute = token_balance - token_last_balance;
token_last_balance = token_balance;
uint t = last_token_time;
uint since_last = block.timestamp - t;
last_token_time = block.timestamp;
uint this_week = t / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
uint next_week = 0;
for (uint i = 0; i < 20; i++) {
next_week = this_week + Constants.EPOCH_LENGTH;
if (block.timestamp < next_week) {
if (since_last == 0 && block.timestamp == t) {
tokens_per_week[this_week] += to_distribute;
} else {
tokens_per_week[this_week] += to_distribute * (block.timestamp - t) / since_last;
}
break;
} else {
if (since_last == 0 && next_week == t) {
tokens_per_week[this_week] += to_distribute;
} else {
tokens_per_week[this_week] += to_distribute * (next_week - t) / since_last;
}
}
t = next_week;
this_week = next_week;
}
emit CheckpointToken(block.timestamp, to_distribute);
}
function checkpoint_token() external {
assert(msg.sender == depositor);
_checkpoint_token();
}
function _find_timestamp_epoch(address ve, uint _timestamp) internal view returns (uint) {
uint _min = 0;
uint _max = IVotingEscrow(ve).epoch();
for (uint i = 0; i < 128; i++) {
if (_min >= _max) break;
uint _mid = (_min + _max + 2) / 2;
IVotingEscrow.Point memory pt = IVotingEscrow(ve).point_history(_mid);
if (pt.ts <= _timestamp) {
_min = _mid;
} else {
_max = _mid - 1;
}
}
return _min;
}
function _find_timestamp_user_epoch(address ve, uint tokenId, uint _timestamp, uint max_user_epoch) internal view returns (uint) {
uint _min = 0;
uint _max = max_user_epoch;
for (uint i = 0; i < 128; i++) {
if (_min >= _max) break;
uint _mid = (_min + _max + 2) / 2;
IVotingEscrow.Point memory pt = IVotingEscrow(ve).user_point_history(tokenId, _mid);
if (pt.ts <= _timestamp) {
_min = _mid;
} else {
_max = _mid -1;
}
}
return _min;
}
function ve_for_at(uint _tokenId, uint _timestamp) external view returns (uint) {
address ve = voting_escrow;
uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
uint epoch = _find_timestamp_user_epoch(ve, _tokenId, _timestamp, max_user_epoch);
IVotingEscrow.Point memory pt = IVotingEscrow(ve).user_point_history(_tokenId, epoch);
return Math.max(uint(int256(pt.bias - pt.slope * (int128(int256(_timestamp - pt.ts))))), 0);
}
function _checkpoint_total_supply() internal {
address ve = voting_escrow;
uint t = time_cursor;
uint rounded_timestamp = block.timestamp / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
IVotingEscrow(ve).checkpoint();
for (uint i = 0; i < 20; i++) {
if (t > rounded_timestamp) {
break;
} else {
uint epoch = _find_timestamp_epoch(ve, t);
IVotingEscrow.Point memory pt = IVotingEscrow(ve).point_history(epoch);
int128 dt = 0;
if (t > pt.ts) {
dt = int128(int256(t - pt.ts));
}
ve_supply[t] = Math.max(uint(int256(pt.bias - pt.slope * dt)), 0);
}
t += Constants.EPOCH_LENGTH;
}
time_cursor = t;
}
function checkpoint_total_supply() external {
_checkpoint_total_supply();
}
function _claim(uint _tokenId, address ve, uint _last_token_time) internal returns (uint) {
uint user_epoch = 0;
uint to_distribute = 0;
uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
uint _start_time = start_time;
if (max_user_epoch == 0) return 0;
uint week_cursor = time_cursor_of[_tokenId];
if (week_cursor == 0) {
user_epoch = _find_timestamp_user_epoch(ve, _tokenId, _start_time, max_user_epoch);
} else {
user_epoch = user_epoch_of[_tokenId];
}
if (user_epoch == 0) user_epoch = 1;
IVotingEscrow.Point memory user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
if (week_cursor == 0) week_cursor = (user_point.ts + Constants.EPOCH_LENGTH - 1) / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
if (week_cursor >= last_token_time) return 0;
if (week_cursor < _start_time) week_cursor = _start_time;
IVotingEscrow.Point memory old_user_point;
for (uint i = 0; i < 50; i++) {
if (week_cursor >= _last_token_time) break;
if (week_cursor >= user_point.ts && user_epoch <= max_user_epoch) {
user_epoch += 1;
old_user_point = user_point;
if (user_epoch > max_user_epoch) {
user_point = IVotingEscrow.Point(0,0,0,0);
} else {
user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
}
} else {
int128 dt = int128(int256(week_cursor - old_user_point.ts));
uint balance_of = (old_user_point.bias - dt * old_user_point.slope) < 0 ? 0 : uint(int256(old_user_point.bias - dt * old_user_point.slope));
if (balance_of == 0 && user_epoch > max_user_epoch) break;
if (balance_of != 0) {
to_distribute += balance_of * tokens_per_week[week_cursor] / ve_supply[week_cursor];
}
week_cursor += Constants.EPOCH_LENGTH;
}
}
user_epoch = Math.min(max_user_epoch, user_epoch - 1);
user_epoch_of[_tokenId] = user_epoch;
time_cursor_of[_tokenId] = week_cursor;
emit Claimed(_tokenId, to_distribute, user_epoch, max_user_epoch);
return to_distribute;
}
function _claimable(uint _tokenId, address ve, uint _last_token_time) internal view returns (uint) {
uint user_epoch = 0;
uint to_distribute = 0;
uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
uint _start_time = start_time;
if (max_user_epoch == 0) return 0;
uint week_cursor = time_cursor_of[_tokenId];
if (week_cursor == 0) {
user_epoch = _find_timestamp_user_epoch(ve, _tokenId, _start_time, max_user_epoch);
} else {
user_epoch = user_epoch_of[_tokenId];
}
if (user_epoch == 0) user_epoch = 1;
IVotingEscrow.Point memory user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
if (week_cursor == 0) week_cursor = (user_point.ts + Constants.EPOCH_LENGTH - 1) / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
if (week_cursor >= last_token_time) return 0;
if (week_cursor < _start_time) week_cursor = _start_time;
IVotingEscrow.Point memory old_user_point;
for (uint i = 0; i < 50; i++) {
if (week_cursor >= _last_token_time) break;
if (week_cursor >= user_point.ts && user_epoch <= max_user_epoch) {
user_epoch += 1;
old_user_point = user_point;
if (user_epoch > max_user_epoch) {
user_point = IVotingEscrow.Point(0,0,0,0);
} else {
user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
}
} else {
int128 dt = int128(int256(week_cursor - old_user_point.ts));
uint balance_of = (old_user_point.bias - dt * old_user_point.slope) < 0 ? 0 : uint(int256(old_user_point.bias - dt * old_user_point.slope));
if (balance_of == 0 && user_epoch > max_user_epoch) break;
if (balance_of != 0) {
to_distribute += balance_of * tokens_per_week[week_cursor] / ve_supply[week_cursor];
}
week_cursor += Constants.EPOCH_LENGTH;
}
}
return to_distribute;
}
function claimable(uint _tokenId) external view returns (uint) {
uint _last_token_time = last_token_time / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
return _claimable(_tokenId, voting_escrow, _last_token_time);
}
function claim(uint _tokenId) external returns (uint) {
if (block.timestamp >= time_cursor) _checkpoint_total_supply();
uint _last_token_time = last_token_time;
_last_token_time = _last_token_time / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
uint amount = _claim(_tokenId, voting_escrow, _last_token_time);
if (amount != 0) {
// if locked.end then send directly
IVotingEscrow.LockedBalance memory _locked = IVotingEscrow(voting_escrow).locked(_tokenId);
if(_locked.end < block.timestamp){
address _nftOwner = IVotingEscrow(voting_escrow).ownerOf(_tokenId);
IERC20(token).safeTransfer(_nftOwner, amount);
} else {
IVotingEscrow(voting_escrow).deposit_for(_tokenId, amount);
}
token_last_balance -= amount;
}
return amount;
}
function claim_many(uint[] memory _tokenIds) external returns (bool) {
if (block.timestamp >= time_cursor) _checkpoint_total_supply();
uint _last_token_time = last_token_time;
_last_token_time = _last_token_time / Constants.EPOCH_LENGTH * Constants.EPOCH_LENGTH;
address _voting_escrow = voting_escrow;
uint total = 0;
for (uint i = 0; i < _tokenIds.length; i++) {
uint _tokenId = _tokenIds[i];
if (_tokenId == 0) break;
uint amount = _claim(_tokenId, _voting_escrow, _last_token_time);
if (amount != 0) {
// if locked.end then send directly
IVotingEscrow.LockedBalance memory _locked = IVotingEscrow(_voting_escrow).locked(_tokenId);
if(_locked.end < block.timestamp){
address _nftOwner = IVotingEscrow(_voting_escrow).ownerOf(_tokenId);
IERC20(token).safeTransfer(_nftOwner, amount);
} else {
IVotingEscrow(_voting_escrow).deposit_for(_tokenId, amount);
}
total += amount;
}
}
if (total != 0) {
token_last_balance -= total;
}
return true;
}
function setDepositor(address _depositor) external {
require(msg.sender == owner);
depositor = _depositor;
}
function setOwner(address _owner) external {
require(msg.sender == owner);
owner = _owner;
}
function withdrawERC20(address _token) external {
require(msg.sender == owner);
require(_token != address(0));
uint256 _balance = IERC20(_token).balanceOf(address(this));
IERC20(_token).safeTransfer(msg.sender, _balance);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IRewardsDistributor {
function checkpoint_token() external;
function voting_escrow() external view returns(address);
function checkpoint_total_supply() external;
function claimable(uint _tokenId) external view returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IVotingEscrow {
struct Point {
int128 bias;
int128 slope; // # -dweight / dt
uint256 ts;
uint256 blk; // block
}
struct LockedBalance {
int128 amount;
uint start;
uint end;
}
function create_lock_for(uint _value, uint _lock_duration, address _to) external returns (uint);
function locked(uint id) external view returns(LockedBalance memory);
function tokenOfOwnerByIndex(address _owner, uint _tokenIndex) external view returns (uint);
function token() external view returns (address);
function team() external returns (address);
function epoch() external view returns (uint);
function point_history(uint loc) external view returns (Point memory);
function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
function user_point_epoch(uint tokenId) external view returns (uint);
function ownerOf(uint) external view returns (address);
function isApprovedOrOwner(address, uint) external view returns (bool);
function transferFrom(address, address, uint) external;
function voted(uint) external view returns (bool);
function attachments(uint) external view returns (uint);
function voting(uint tokenId) external;
function abstain(uint tokenId) external;
function attach(uint tokenId) external;
function detach(uint tokenId) external;
function checkpoint() external;
function deposit_for(uint tokenId, uint value) external;
function balanceOfAtNFT(uint _tokenId, uint _block) external view returns (uint);
function balanceOfNFT(uint _id) external view returns (uint);
function balanceOf(address _owner) external view returns (uint);
function totalSupply() external view returns (uint);
function supply() external view returns (uint);
function decimals() external view returns(uint8);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
library Constants {
uint256 internal constant EPOCH_LENGTH = 7 days;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
library Math {
function max(uint a, uint b) internal pure returns (uint) {
return a >= b ? a : b;
}
function min(uint a, uint b) internal pure returns (uint) {
return a < b ? a : b;
}
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
uint256 x = 0;
for (uint256 y = 1 << 255; y > 0; y >>= 3) {
x <<= 1;
uint256 z = 3 * x * (x + 1) + 1;
if (n / y >= z) {
n -= y * z;
x += 1;
}
}
return x;
}}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_voting_escrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"CheckpointToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claim_epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"max_epoch","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[],"name":"checkpoint_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpoint_total_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claim_many","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"last_token_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"setDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"time_cursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"time_cursor_of","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token_last_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens_per_week","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_epoch_of","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"ve_for_at","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ve_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voting_escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002307380380620023078339810160408190526200003491620001b1565b600062093a80620000468142620001e3565b62000052919062000206565b90508060008190555080600481905550806001819055506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d09190620001b1565b66071afd498d000880546001600160a01b03199081166001600160a01b0384811691821790935566071afd498d000780548316938816938417905566071afd498d0009805433908416811790915566071afd498d000680549093161790915560405163095ea7b360e01b81526004810192909252600019602483015291925063095ea7b3906044016020604051808303816000875af115801562000178573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019e919062000234565b620001a857600080fd5b50505062000258565b600060208284031215620001c457600080fd5b81516001600160a01b0381168114620001dc57600080fd5b9392505050565b6000826200020157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156200022f57634e487b7160e01b600052601160045260246000fd5b500290565b6000602082840312156200024757600080fd5b81518015158114620001dc57600080fd5b61209f80620002686000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d4dafba81161007c578063d4dafba814610297578063dfe05031146102aa578063edf59997146102c3578063f2c098b7146102d6578063f4f3b200146102e9578063fc0c546a146102fc57600080fd5b80638da5cb5b1461022a578063b21ed5021461025b578063b80777ea14610263578063c7c4ff461461026b578063d1d58b251461028457600080fd5b8063379607f51161010a578063379607f5146101ca578063486d25fe146101dd57806368809889146101fd5780637f58e8f814610210578063811a40fe14610219578063834ee4171461022157600080fd5b8063127dcbd31461014757806313af40351461016357806316aea5c0146101785780631f1db0431461019857806322b04bfc146101bb575b600080fd5b61015060015481565b6040519081526020015b60405180910390f35b610176610171366004611baa565b610315565b005b610150610186366004611bc7565b60036020526000908152604090205481565b6101ab6101a6366004611c27565b61035a565b604051901515815260200161015a565b61015066038d7ea4c680055481565b6101506101d8366004611bc7565b6105ac565b6101506101eb366004611bc7565b60026020526000908152604090205481565b61015061020b366004611ccd565b6107b4565b61015060045481565b6101766108f7565b61015060005481565b66071afd498d000654610243906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b610176610921565b610150610929565b66071afd498d000954610243906001600160a01b031681565b610150610292366004611bc7565b610948565b6101506102a5366004611bc7565b610988565b66071afd498d000754610243906001600160a01b031681565b6101506102d1366004611bc7565b6109ab565b6101766102e4366004611baa565b6109c1565b6101766102f7366004611baa565b610a06565b66071afd498d000854610243906001600160a01b031681565b66071afd498d0006546001600160a01b0316331461033257600080fd5b66071afd498d000680546001600160a01b0319166001600160a01b0392909216919091179055565b6000600154421061036d5761036d610abb565b60045462093a8061037e8183611d05565b6103889190611d27565b66071afd498d0007549091506001600160a01b03166000805b855181101561057c5760008682815181106103be576103be611d46565b60200260200101519050806000036103d6575061057c565b60006103e3828688610c5e565b9050801561056757604051635a2d1e0760e11b8152600481018390526000906001600160a01b0387169063b45a3c0e90602401606060405180830381865afa158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611d73565b905042816040015110156104f7576040516331a9108f60e11b8152600481018490526000906001600160a01b03881690636352211e90602401602060405180830381865afa1580156104ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d19190611dd4565b66071afd498d0008549091506104f1906001600160a01b031682856110ae565b50610559565b604051631dd33fc560e31b815260048101849052602481018390526001600160a01b0387169063ee99fe2890604401600060405180830381600087803b15801561054057600080fd5b505af1158015610554573d6000803e3d6000fd5b505050505b6105638286611df1565b9450505b5050808061057490611e09565b9150506103a1565b5080156105a1578066038d7ea4c68005600082825461059b9190611e22565b90915550505b506001949350505050565b600060015442106105bf576105bf610abb565b60045462093a806105d08183611d05565b6105da9190611d27565b66071afd498d0007549091506000906105fe9085906001600160a01b031684610c5e565b905080156107ad5766071afd498d000754604051635a2d1e0760e11b8152600481018690526000916001600160a01b03169063b45a3c0e90602401606060405180830381865afa158015610656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067a9190611d73565b905042816040015110156107225766071afd498d0007546040516331a9108f60e11b8152600481018790526000916001600160a01b031690636352211e90602401602060405180830381865afa1580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fc9190611dd4565b66071afd498d00085490915061071c906001600160a01b031682856110ae565b5061078e565b66071afd498d000754604051631dd33fc560e31b815260048101879052602481018490526001600160a01b039091169063ee99fe2890604401600060405180830381600087803b15801561077557600080fd5b505af1158015610789573d6000803e3d6000fd5b505050505b8166038d7ea4c6800560008282546107a69190611e22565b9091555050505b9392505050565b66071afd498d00075460405163391044d760e21b8152600481018490526000916001600160a01b0316908290829063e441135c90602401602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c9190611e39565b9050600061083c83878785611105565b6040516309bb79ed60e11b815260048101889052602481018290529091506000906001600160a01b03851690631376f3da90604401608060405180830381865afa15801561088e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b29190611e52565b90506108ec8160400151876108c79190611e22565b82602001516108d69190611ec4565b82516108e29190611f62565b600f0b60006111fb565b979650505050505050565b66071afd498d0009546001600160a01b0316331461091757610917611fb2565b61091f611212565b565b61091f610abb565b600062093a806109398142611d05565b6109439190611d27565b905090565b60008062093a808060045461095d9190611d05565b6109679190611d27565b66071afd498d0007549091506107ad9084906001600160a01b03168361146f565b66038d7ea4c680068166038d7ea4c6800081106109a457600080fd5b0154905081565b60058166038d7ea4c6800081106109a457600080fd5b66071afd498d0006546001600160a01b031633146109de57600080fd5b66071afd498d000980546001600160a01b0319166001600160a01b0392909216919091179055565b66071afd498d0006546001600160a01b03163314610a2357600080fd5b6001600160a01b038116610a3657600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611e39565b9050610ab76001600160a01b03831633836110ae565b5050565b66071afd498d0007546001546001600160a01b0390911690600062093a80610ae38142611d05565b610aed9190611d27565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b5050505060005b6014811015610c5657818311610c56576000610b618585611844565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0387169063d1febfb990602401608060405180830381865afa158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190611e52565b905060008160400151861115610bf2576040820151610bef9087611e22565b90505b610c11818360200151610c059190611ec4565b83516108e29190611f62565b66038d7ea4c680068766038d7ea4c680008110610c3057610c30611d46565b0155505050610c4262093a8084611df1565b925080610c4e81611e09565b915050610b45565b505060015550565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190611e39565b60008054919250829003610ceb5760009450505050506107ad565b60008881526002602052604081205490819003610d1557610d0e888a8486611105565b9450610d27565b60008981526003602052604090205494505b84600003610d3457600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da79190611e52565b905081600003610dec5762093a8080600162093a808460400151610dcb9190611df1565b610dd59190611e22565b610ddf9190611d05565b610de99190611d27565b91505b6004548210610e0457600096505050505050506107ad565b82821015610e10578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b603281101561102357898410156110235782604001518410158015610e5a5750858811155b15610f2057610e6a600189611df1565b975082915085881115610ea95760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250611011565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611e52565b9250611011565b6000826040015185610f329190611e22565b9050600080846020015183610f479190611ec4565b8551610f539190611f62565b600f0b12610f7e576020840151610f6a9083611ec4565b8451610f769190611f62565b600f0b610f81565b60005b905080158015610f905750878a115b15610f9c575050611023565b8015610fff5766038d7ea4c680068666038d7ea4c680008110610fc157610fc1611d46565b015460058766038d7ea4c680008110610fdc57610fdc611d46565b0154610fe89083611d27565b610ff29190611d05565b610ffc908a611df1565b98505b61100c62093a8087611df1565b955050505b8061101b81611e09565b915050610e35565b506110388561103360018a611e22565b611999565b60008c8152600360209081526040808320849055600282529182902086905581518e8152908101899052908101829052606081018790529097507fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a150939998505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111009084906119a8565b505050565b60008082815b60808110156111ed57818310156111ed576000600261112a8486611df1565b611135906002611df1565b61113f9190611d05565b6040516309bb79ed60e11b8152600481018a9052602481018290529091506000906001600160a01b038b1690631376f3da90604401608060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190611e52565b9050878160400151116111ca578194506111d8565b6111d5600183611e22565b93505b505080806111e590611e09565b91505061110b565b50909150505b949350505050565b60008183101561120b57816107ad565b5090919050565b66071afd498d0008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112859190611e39565b9050600066038d7ea4c68005548261129d9190611e22565b66038d7ea4c6800583905560045490915060006112ba8242611e22565b426004559050600062093a806112d08185611d05565b6112da9190611d27565b90506000805b601481101561142d576112f662093a8084611df1565b91508142101561137f578315801561130d57508442145b15611347578560058466038d7ea4c68000811061132c5761132c611d46565b01600082825461133c9190611df1565b9091555061142d9050565b836113528642611e22565b61135c9088611d27565b6113669190611d05565b60058466038d7ea4c68000811061132c5761132c611d46565b8315801561138c57508482145b156113c6578560058466038d7ea4c6800081106113ab576113ab611d46565b0160008282546113bb9190611df1565b909155506114149050565b836113d18684611e22565b6113db9088611d27565b6113e59190611d05565b60058466038d7ea4c6800081106113fe576113fe611d46565b01600082825461140e9190611df1565b90915550505b819450819250808061142590611e09565b9150506112e0565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa1580156114bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e19190611e39565b600080549192508290036114fc5760009450505050506107ad565b600088815260026020526040812054908190036115265761151f888a8486611105565b9450611538565b60008981526003602052604090205494505b8460000361154557600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b89190611e52565b9050816000036115fd5762093a8080600162093a8084604001516115dc9190611df1565b6115e69190611e22565b6115f09190611d05565b6115fa9190611d27565b91505b600454821061161557600096505050505050506107ad565b82821015611621578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b60328110156118345789841015611834578260400151841015801561166b5750858811155b156117315761167b600189611df1565b9750829150858811156116ba5760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250611822565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a9190611e52565b9250611822565b60008260400151856117439190611e22565b90506000808460200151836117589190611ec4565b85516117649190611f62565b600f0b1261178f57602084015161177b9083611ec4565b84516117879190611f62565b600f0b611792565b60005b9050801580156117a15750878a115b156117ad575050611834565b80156118105766038d7ea4c680068666038d7ea4c6800081106117d2576117d2611d46565b015460058766038d7ea4c6800081106117ed576117ed611d46565b01546117f99083611d27565b6118039190611d05565b61180d908a611df1565b98505b61181d62093a8087611df1565b955050505b8061182c81611e09565b915050611646565b50949a9950505050505050505050565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af9190611e39565b905060005b608081101561198f578183101561198f57600060026118d38486611df1565b6118de906002611df1565b6118e89190611d05565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0389169063d1febfb990602401608060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190611e52565b90508681604001511161196c5781945061197a565b611977600183611e22565b93505b5050808061198790611e09565b9150506118b4565b5090949350505050565b600081831061120b57816107ad565b60006119fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a7f9092919063ffffffff16565b8051909150156111005780806020019051810190611a1b9190611fc8565b6111005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b60606111f3848460008585600080866001600160a01b03168587604051611aa6919061201a565b60006040518083038185875af1925050503d8060008114611ae3576040519150601f19603f3d011682016040523d82523d6000602084013e611ae8565b606091505b50915091506108ec8783838760608315611b63578251600003611b5c576001600160a01b0385163b611b5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a76565b50816111f3565b6111f38383815115611b785781518083602001fd5b8060405162461bcd60e51b8152600401611a769190612036565b6001600160a01b0381168114611ba757600080fd5b50565b600060208284031215611bbc57600080fd5b81356107ad81611b92565b600060208284031215611bd957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1f57611c1f611be0565b604052919050565b60006020808385031215611c3a57600080fd5b823567ffffffffffffffff80821115611c5257600080fd5b818501915085601f830112611c6657600080fd5b813581811115611c7857611c78611be0565b8060051b9150611c89848301611bf6565b8181529183018401918481019088841115611ca357600080fd5b938501935b83851015611cc157843582529385019390850190611ca8565b98975050505050505050565b60008060408385031215611ce057600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082611d2257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d4157611d41611cef565b500290565b634e487b7160e01b600052603260045260246000fd5b8051600f81900b8114611d6e57600080fd5b919050565b600060608284031215611d8557600080fd5b6040516060810181811067ffffffffffffffff82111715611da857611da8611be0565b604052611db483611d5c565b815260208301516020820152604083015160408201528091505092915050565b600060208284031215611de657600080fd5b81516107ad81611b92565b60008219821115611e0457611e04611cef565b500190565b600060018201611e1b57611e1b611cef565b5060010190565b600082821015611e3457611e34611cef565b500390565b600060208284031215611e4b57600080fd5b5051919050565b600060808284031215611e6457600080fd5b6040516080810181811067ffffffffffffffff82111715611e8757611e87611be0565b604052611e9383611d5c565b8152611ea160208401611d5c565b602082015260408301516040820152606083015160608201528091505092915050565b600081600f0b83600f0b60016001607f1b03600082136000841383830485118282161615611ef457611ef4611cef565b6f7fffffffffffffffffffffffffffffff196000851282811687830587121615611f2057611f20611cef565b60008712925085820587128484161615611f3c57611f3c611cef565b85850587128184161615611f5257611f52611cef565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b031901831281151615611f8d57611f8d611cef565b8160016001607f1b03018313811615611fa857611fa8611cef565b5090039392505050565b634e487b7160e01b600052600160045260246000fd5b600060208284031215611fda57600080fd5b815180151581146107ad57600080fd5b60005b83811015612005578181015183820152602001611fed565b83811115612014576000848401525b50505050565b6000825161202c818460208701611fea565b9190910192915050565b6020815260008251806020840152612055816040850160208701611fea565b601f01601f1916919091016040019291505056fea264697066735822122008e3813a8d460c9d6f82c4d56cdb16bf32de3b12774de236e7c4310ecf1f9dc464736f6c634300080d0033000000000000000000000000aa30f0977620d4d46b3bb3cf0794fe645d576ca3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d4dafba81161007c578063d4dafba814610297578063dfe05031146102aa578063edf59997146102c3578063f2c098b7146102d6578063f4f3b200146102e9578063fc0c546a146102fc57600080fd5b80638da5cb5b1461022a578063b21ed5021461025b578063b80777ea14610263578063c7c4ff461461026b578063d1d58b251461028457600080fd5b8063379607f51161010a578063379607f5146101ca578063486d25fe146101dd57806368809889146101fd5780637f58e8f814610210578063811a40fe14610219578063834ee4171461022157600080fd5b8063127dcbd31461014757806313af40351461016357806316aea5c0146101785780631f1db0431461019857806322b04bfc146101bb575b600080fd5b61015060015481565b6040519081526020015b60405180910390f35b610176610171366004611baa565b610315565b005b610150610186366004611bc7565b60036020526000908152604090205481565b6101ab6101a6366004611c27565b61035a565b604051901515815260200161015a565b61015066038d7ea4c680055481565b6101506101d8366004611bc7565b6105ac565b6101506101eb366004611bc7565b60026020526000908152604090205481565b61015061020b366004611ccd565b6107b4565b61015060045481565b6101766108f7565b61015060005481565b66071afd498d000654610243906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b610176610921565b610150610929565b66071afd498d000954610243906001600160a01b031681565b610150610292366004611bc7565b610948565b6101506102a5366004611bc7565b610988565b66071afd498d000754610243906001600160a01b031681565b6101506102d1366004611bc7565b6109ab565b6101766102e4366004611baa565b6109c1565b6101766102f7366004611baa565b610a06565b66071afd498d000854610243906001600160a01b031681565b66071afd498d0006546001600160a01b0316331461033257600080fd5b66071afd498d000680546001600160a01b0319166001600160a01b0392909216919091179055565b6000600154421061036d5761036d610abb565b60045462093a8061037e8183611d05565b6103889190611d27565b66071afd498d0007549091506001600160a01b03166000805b855181101561057c5760008682815181106103be576103be611d46565b60200260200101519050806000036103d6575061057c565b60006103e3828688610c5e565b9050801561056757604051635a2d1e0760e11b8152600481018390526000906001600160a01b0387169063b45a3c0e90602401606060405180830381865afa158015610433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104579190611d73565b905042816040015110156104f7576040516331a9108f60e11b8152600481018490526000906001600160a01b03881690636352211e90602401602060405180830381865afa1580156104ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d19190611dd4565b66071afd498d0008549091506104f1906001600160a01b031682856110ae565b50610559565b604051631dd33fc560e31b815260048101849052602481018390526001600160a01b0387169063ee99fe2890604401600060405180830381600087803b15801561054057600080fd5b505af1158015610554573d6000803e3d6000fd5b505050505b6105638286611df1565b9450505b5050808061057490611e09565b9150506103a1565b5080156105a1578066038d7ea4c68005600082825461059b9190611e22565b90915550505b506001949350505050565b600060015442106105bf576105bf610abb565b60045462093a806105d08183611d05565b6105da9190611d27565b66071afd498d0007549091506000906105fe9085906001600160a01b031684610c5e565b905080156107ad5766071afd498d000754604051635a2d1e0760e11b8152600481018690526000916001600160a01b03169063b45a3c0e90602401606060405180830381865afa158015610656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067a9190611d73565b905042816040015110156107225766071afd498d0007546040516331a9108f60e11b8152600481018790526000916001600160a01b031690636352211e90602401602060405180830381865afa1580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fc9190611dd4565b66071afd498d00085490915061071c906001600160a01b031682856110ae565b5061078e565b66071afd498d000754604051631dd33fc560e31b815260048101879052602481018490526001600160a01b039091169063ee99fe2890604401600060405180830381600087803b15801561077557600080fd5b505af1158015610789573d6000803e3d6000fd5b505050505b8166038d7ea4c6800560008282546107a69190611e22565b9091555050505b9392505050565b66071afd498d00075460405163391044d760e21b8152600481018490526000916001600160a01b0316908290829063e441135c90602401602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c9190611e39565b9050600061083c83878785611105565b6040516309bb79ed60e11b815260048101889052602481018290529091506000906001600160a01b03851690631376f3da90604401608060405180830381865afa15801561088e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b29190611e52565b90506108ec8160400151876108c79190611e22565b82602001516108d69190611ec4565b82516108e29190611f62565b600f0b60006111fb565b979650505050505050565b66071afd498d0009546001600160a01b0316331461091757610917611fb2565b61091f611212565b565b61091f610abb565b600062093a806109398142611d05565b6109439190611d27565b905090565b60008062093a808060045461095d9190611d05565b6109679190611d27565b66071afd498d0007549091506107ad9084906001600160a01b03168361146f565b66038d7ea4c680068166038d7ea4c6800081106109a457600080fd5b0154905081565b60058166038d7ea4c6800081106109a457600080fd5b66071afd498d0006546001600160a01b031633146109de57600080fd5b66071afd498d000980546001600160a01b0319166001600160a01b0392909216919091179055565b66071afd498d0006546001600160a01b03163314610a2357600080fd5b6001600160a01b038116610a3657600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611e39565b9050610ab76001600160a01b03831633836110ae565b5050565b66071afd498d0007546001546001600160a01b0390911690600062093a80610ae38142611d05565b610aed9190611d27565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b5050505060005b6014811015610c5657818311610c56576000610b618585611844565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0387169063d1febfb990602401608060405180830381865afa158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190611e52565b905060008160400151861115610bf2576040820151610bef9087611e22565b90505b610c11818360200151610c059190611ec4565b83516108e29190611f62565b66038d7ea4c680068766038d7ea4c680008110610c3057610c30611d46565b0155505050610c4262093a8084611df1565b925080610c4e81611e09565b915050610b45565b505060015550565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190611e39565b60008054919250829003610ceb5760009450505050506107ad565b60008881526002602052604081205490819003610d1557610d0e888a8486611105565b9450610d27565b60008981526003602052604090205494505b84600003610d3457600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da79190611e52565b905081600003610dec5762093a8080600162093a808460400151610dcb9190611df1565b610dd59190611e22565b610ddf9190611d05565b610de99190611d27565b91505b6004548210610e0457600096505050505050506107ad565b82821015610e10578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b603281101561102357898410156110235782604001518410158015610e5a5750858811155b15610f2057610e6a600189611df1565b975082915085881115610ea95760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250611011565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611e52565b9250611011565b6000826040015185610f329190611e22565b9050600080846020015183610f479190611ec4565b8551610f539190611f62565b600f0b12610f7e576020840151610f6a9083611ec4565b8451610f769190611f62565b600f0b610f81565b60005b905080158015610f905750878a115b15610f9c575050611023565b8015610fff5766038d7ea4c680068666038d7ea4c680008110610fc157610fc1611d46565b015460058766038d7ea4c680008110610fdc57610fdc611d46565b0154610fe89083611d27565b610ff29190611d05565b610ffc908a611df1565b98505b61100c62093a8087611df1565b955050505b8061101b81611e09565b915050610e35565b506110388561103360018a611e22565b611999565b60008c8152600360209081526040808320849055600282529182902086905581518e8152908101899052908101829052606081018790529097507fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a150939998505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111009084906119a8565b505050565b60008082815b60808110156111ed57818310156111ed576000600261112a8486611df1565b611135906002611df1565b61113f9190611d05565b6040516309bb79ed60e11b8152600481018a9052602481018290529091506000906001600160a01b038b1690631376f3da90604401608060405180830381865afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190611e52565b9050878160400151116111ca578194506111d8565b6111d5600183611e22565b93505b505080806111e590611e09565b91505061110b565b50909150505b949350505050565b60008183101561120b57816107ad565b5090919050565b66071afd498d0008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112859190611e39565b9050600066038d7ea4c68005548261129d9190611e22565b66038d7ea4c6800583905560045490915060006112ba8242611e22565b426004559050600062093a806112d08185611d05565b6112da9190611d27565b90506000805b601481101561142d576112f662093a8084611df1565b91508142101561137f578315801561130d57508442145b15611347578560058466038d7ea4c68000811061132c5761132c611d46565b01600082825461133c9190611df1565b9091555061142d9050565b836113528642611e22565b61135c9088611d27565b6113669190611d05565b60058466038d7ea4c68000811061132c5761132c611d46565b8315801561138c57508482145b156113c6578560058466038d7ea4c6800081106113ab576113ab611d46565b0160008282546113bb9190611df1565b909155506114149050565b836113d18684611e22565b6113db9088611d27565b6113e59190611d05565b60058466038d7ea4c6800081106113fe576113fe611d46565b01600082825461140e9190611df1565b90915550505b819450819250808061142590611e09565b9150506112e0565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa1580156114bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e19190611e39565b600080549192508290036114fc5760009450505050506107ad565b600088815260026020526040812054908190036115265761151f888a8486611105565b9450611538565b60008981526003602052604090205494505b8460000361154557600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b89190611e52565b9050816000036115fd5762093a8080600162093a8084604001516115dc9190611df1565b6115e69190611e22565b6115f09190611d05565b6115fa9190611d27565b91505b600454821061161557600096505050505050506107ad565b82821015611621578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b60328110156118345789841015611834578260400151841015801561166b5750858811155b156117315761167b600189611df1565b9750829150858811156116ba5760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250611822565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a9190611e52565b9250611822565b60008260400151856117439190611e22565b90506000808460200151836117589190611ec4565b85516117649190611f62565b600f0b1261178f57602084015161177b9083611ec4565b84516117879190611f62565b600f0b611792565b60005b9050801580156117a15750878a115b156117ad575050611834565b80156118105766038d7ea4c680068666038d7ea4c6800081106117d2576117d2611d46565b015460058766038d7ea4c6800081106117ed576117ed611d46565b01546117f99083611d27565b6118039190611d05565b61180d908a611df1565b98505b61181d62093a8087611df1565b955050505b8061182c81611e09565b915050611646565b50949a9950505050505050505050565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af9190611e39565b905060005b608081101561198f578183101561198f57600060026118d38486611df1565b6118de906002611df1565b6118e89190611d05565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0389169063d1febfb990602401608060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190611e52565b90508681604001511161196c5781945061197a565b611977600183611e22565b93505b5050808061198790611e09565b9150506118b4565b5090949350505050565b600081831061120b57816107ad565b60006119fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a7f9092919063ffffffff16565b8051909150156111005780806020019051810190611a1b9190611fc8565b6111005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b60606111f3848460008585600080866001600160a01b03168587604051611aa6919061201a565b60006040518083038185875af1925050503d8060008114611ae3576040519150601f19603f3d011682016040523d82523d6000602084013e611ae8565b606091505b50915091506108ec8783838760608315611b63578251600003611b5c576001600160a01b0385163b611b5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a76565b50816111f3565b6111f38383815115611b785781518083602001fd5b8060405162461bcd60e51b8152600401611a769190612036565b6001600160a01b0381168114611ba757600080fd5b50565b600060208284031215611bbc57600080fd5b81356107ad81611b92565b600060208284031215611bd957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1f57611c1f611be0565b604052919050565b60006020808385031215611c3a57600080fd5b823567ffffffffffffffff80821115611c5257600080fd5b818501915085601f830112611c6657600080fd5b813581811115611c7857611c78611be0565b8060051b9150611c89848301611bf6565b8181529183018401918481019088841115611ca357600080fd5b938501935b83851015611cc157843582529385019390850190611ca8565b98975050505050505050565b60008060408385031215611ce057600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082611d2257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d4157611d41611cef565b500290565b634e487b7160e01b600052603260045260246000fd5b8051600f81900b8114611d6e57600080fd5b919050565b600060608284031215611d8557600080fd5b6040516060810181811067ffffffffffffffff82111715611da857611da8611be0565b604052611db483611d5c565b815260208301516020820152604083015160408201528091505092915050565b600060208284031215611de657600080fd5b81516107ad81611b92565b60008219821115611e0457611e04611cef565b500190565b600060018201611e1b57611e1b611cef565b5060010190565b600082821015611e3457611e34611cef565b500390565b600060208284031215611e4b57600080fd5b5051919050565b600060808284031215611e6457600080fd5b6040516080810181811067ffffffffffffffff82111715611e8757611e87611be0565b604052611e9383611d5c565b8152611ea160208401611d5c565b602082015260408301516040820152606083015160608201528091505092915050565b600081600f0b83600f0b60016001607f1b03600082136000841383830485118282161615611ef457611ef4611cef565b6f7fffffffffffffffffffffffffffffff196000851282811687830587121615611f2057611f20611cef565b60008712925085820587128484161615611f3c57611f3c611cef565b85850587128184161615611f5257611f52611cef565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b031901831281151615611f8d57611f8d611cef565b8160016001607f1b03018313811615611fa857611fa8611cef565b5090039392505050565b634e487b7160e01b600052600160045260246000fd5b600060208284031215611fda57600080fd5b815180151581146107ad57600080fd5b60005b83811015612005578181015183820152602001611fed565b83811115612014576000848401525b50505050565b6000825161202c818460208701611fea565b9190910192915050565b6020815260008251806020840152612055816040850160208701611fea565b601f01601f1916919091016040019291505056fea264697066735822122008e3813a8d460c9d6f82c4d56cdb16bf32de3b12774de236e7c4310ecf1f9dc464736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000aa30f0977620d4d46b3bb3cf0794fe645d576ca3
-----Decoded View---------------
Arg [0] : _voting_escrow (address): 0xAA30F0977620D4d46B3Bb3Cf0794Fe645d576CA3
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000aa30f0977620d4d46b3bb3cf0794fe645d576ca3
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$4,921.19
Net Worth in S
Token Allocations
SWPX
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SONIC | 100.00% | $0.004288 | 1,147,571.6966 | $4,921.19 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.