Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC20FriendlyRewardModuleInfo
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/*
ERC20FriendlyRewardModuleInfo
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../interfaces/IRewardModule.sol";
import "./IERC20FriendlyRewardModuleV2.sol";
import "../GysrUtils.sol";
import "./TokenUtilsInfo.sol";
/**
* @title ERC20 friendly reward module info library
*
* @notice this library provides read-only convenience functions to query
* additional information about the ERC20FriendlyRewardModule contract.
*/
library ERC20FriendlyRewardModuleInfo {
using GysrUtils for uint256;
using TokenUtilsInfo for IERC20;
/**
* @notice get all token metadata
* @param module address of reward module
* @return addresses_
* @return names_
* @return symbols_
* @return decimals_
*/
function tokens(
address module
)
external
view
returns (
address[] memory addresses_,
string[] memory names_,
string[] memory symbols_,
uint8[] memory decimals_
)
{
addresses_ = new address[](1);
names_ = new string[](1);
symbols_ = new string[](1);
decimals_ = new uint8[](1);
(addresses_[0], names_[0], symbols_[0], decimals_[0]) = token(module);
}
/**
* @notice convenience function to get token metadata in a single call
* @param module address of reward module
* @return address
* @return name
* @return symbol
* @return decimals
*/
function token(
address module
) public view returns (address, string memory, string memory, uint8) {
IRewardModule m = IRewardModule(module);
IERC20Metadata tkn = IERC20Metadata(m.tokens()[0]);
return (address(tkn), tkn.name(), tkn.symbol(), tkn.decimals());
}
/**
* @notice generic function to get pending reward balances
* @param module address of reward module
* @param account bytes32 account of interest for preview
* @param shares number of shares that would be used
* @return rewards_ estimated reward balances
*/
function rewards(
address module,
bytes32 account,
uint256 shares,
bytes calldata
) public view returns (uint256[] memory rewards_) {
rewards_ = new uint256[](1);
(rewards_[0], , ) = preview(module, account, shares);
}
/**
* @notice preview estimated rewards
* @param module address of reward module
* @param account bytes32 account of interest for preview
* @param shares number of shares that would be unstaked
* @return estimated reward
* @return estimated time multiplier weighted by rewards
* @return estimated gysr multiplier weighted by rewards
*/
function preview(
address module,
bytes32 account,
uint256 shares
) public view returns (uint256, uint256, uint256) {
require(shares > 0, "frmi1");
IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
address user = address(uint160(uint256(account)));
uint256 reward;
uint256 rawSum;
uint256 bonusSum;
uint256 i = m.stakeCount(user);
// redeem first-in-last-out
while (shares > 0) {
require(i > 0, "frmi2");
i -= 1;
(uint256 s, , , , ) = m.stakes(user, i);
// only redeem partial stake if more shares left than needed to burn
s = s <= shares ? s : shares;
uint256 r;
{
r = rewardsPerStakedShare(module);
}
{
(, , , uint256 tally, ) = m.stakes(user, i);
r = ((r - tally) * s) / 1e18;
rawSum += r;
}
{
(, , uint256 bonus, , ) = m.stakes(user, i);
r = (r * bonus) / 1e18;
bonusSum += r;
}
{
(, , , , uint256 time) = m.stakes(user, i);
r = (r * m.timeVestingCoefficient(time)) / 1e18;
}
reward += r;
shares -= s;
}
address tkn = m.tokens()[0];
return (
IERC20(tkn).getAmount(module, m.totalShares(tkn), reward),
reward > 0 ? (reward * 1e18) / bonusSum : 0,
reward > 0 ? (bonusSum * 1e18) / rawSum : 0
);
}
/**
* @notice compute reward shares to be unlocked on the next update
* @param module address of reward module
* @return estimated unlockable rewards
*/
function unlockable(address module) public view returns (uint256) {
IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
address tkn = m.tokens()[0];
if (m.lockedShares(tkn) == 0) {
return 0;
}
uint256 sharesToUnlock = 0;
for (uint256 i = 0; i < m.fundingCount(tkn); i++) {
sharesToUnlock = sharesToUnlock + m.unlockable(tkn, i);
}
return sharesToUnlock;
}
/**
* @notice compute effective unlocked rewards
* @param module address of reward module
* @return estimated current unlocked rewards
*/
function unlocked(address module) public view returns (uint256) {
IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
IERC20 tkn = IERC20(m.tokens()[0]);
uint256 totalShares = m.totalShares(address(tkn));
if (totalShares == 0) {
return 0;
}
uint256 shares = unlockable(module);
uint256 amount = tkn.getAmount(module, totalShares, shares);
return m.totalUnlocked() + amount;
}
/**
* @notice compute effective rewards per staked share
* @param module module contract address
* @return estimated rewards per staked share
*/
function rewardsPerStakedShare(
address module
) public view returns (uint256) {
IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
if (m.totalStakingShares() == 0) {
return m.rewardsPerStakedShare();
}
uint256 rewardsToUnlock = unlockable(module) + m.rewardDust();
return
m.rewardsPerStakedShare() +
(rewardsToUnlock * 1e18) /
m.totalStakingShares();
}
/**
* @notice compute estimated GYSR bonus for stake
* @param module module contract address
* @param shares number of shares that would be staked
* @param gysr number of GYSR tokens that would be applied to stake
* @return estimated GYSR multiplier
*/
function gysrBonus(
address module,
uint256 shares,
uint256 gysr
) public view returns (uint256) {
IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
return
gysr.gysrBonus(
shares,
m.totalRawStakingShares() + shares,
m.usage()
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// 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);
}/*
GysrUtils
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
import "./MathUtils.sol";
/**
* @title GYSR utilities
*
* @notice this library implements utility methods for the GYSR multiplier
* and spending mechanics
*/
library GysrUtils {
using MathUtils for int128;
// constants
uint256 public constant GYSR_PROPORTION = 1e16; // 1%
/**
* @notice compute GYSR bonus as a function of usage ratio, stake amount,
* and GYSR spent
* @param gysr number of GYSR token applied to bonus
* @param amount number of tokens or shares to unstake
* @param total number of tokens or shares in overall pool
* @param ratio usage ratio from 0 to 1
* @return multiplier value
*/
function gysrBonus(
uint256 gysr,
uint256 amount,
uint256 total,
uint256 ratio
) internal pure returns (uint256) {
if (amount == 0) {
return 0;
}
if (total == 0) {
return 0;
}
if (gysr == 0) {
return 1e18;
}
// scale GYSR amount with respect to proportion
uint256 portion = (GYSR_PROPORTION * total) / 1e18;
if (amount > portion) {
gysr = (gysr * portion) / amount;
}
// 1 + gysr / (0.01 + ratio)
uint256 x = 2 ** 64 + (2 ** 64 * gysr) / (1e16 + ratio);
return
1e18 +
(uint256(int256(int128(uint128(x)).logbase10())) * 1e18) /
2 ** 64;
}
}/*
IERC20FriendlyRewardModuleV2
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
/**
* @title Friendly reward module interface
*
* @notice this declares the interface for the v2 friendly reward module
* to provide backwards compatibility in the pool info system
*/
interface IERC20FriendlyRewardModuleV2 {
// -- IRewardModule -------------------------------------------------------
function tokens() external view returns (address[] memory);
function balances() external view returns (uint256[] memory);
function usage() external view returns (uint256);
function factory() external view returns (address);
// -- IERC20FriendlyRewardModuleV2 ----------------------------------------
function totalStakingShares() external view returns (uint256);
function totalRawStakingShares() external view returns (uint256);
function rewardsPerStakedShare() external view returns (uint256);
function rewardDust() external view returns (uint256);
function totalShares(address) external view returns (uint256);
function lockedShares(address) external view returns (uint256);
function fundingCount(address) external view returns (uint256);
function unlockable(address, uint256) external view returns (uint256);
function totalUnlocked() external view returns (uint256);
function stakeCount(address) external view returns (uint256);
function stakes(
address,
uint256
) external view returns (uint256, uint256, uint256, uint256, uint256);
function timeVestingCoefficient(uint256) external view returns (uint256);
}/*
TokenUtilsInfo
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* @title Token utilities info
*
* @notice this library implements utility methods for token handling,
* dynamic balance accounting, and fee processing.
*
* this is a modified version to be used by info libraries.
*/
library TokenUtilsInfo {
uint256 constant INITIAL_SHARES_PER_TOKEN = 1e6;
uint256 constant FLOOR_SHARES_PER_TOKEN = 1e3;
/**
* @notice get token shares from amount
* @param token erc20 token interface
* @param module address of module
* @param total current total shares
* @param amount balance of tokens
*/
function getShares(
IERC20 token,
address module,
uint256 total,
uint256 amount
) internal view returns (uint256) {
if (total == 0) return 0;
uint256 balance = token.balanceOf(module);
if (total < balance * FLOOR_SHARES_PER_TOKEN)
return amount * FLOOR_SHARES_PER_TOKEN;
return (total * amount) / balance;
}
/**
* @notice get token amount from shares
* @param token erc20 token interface
* @param module address of module
* @param total current total shares
* @param shares balance of shares
*/
function getAmount(
IERC20 token,
address module,
uint256 total,
uint256 shares
) internal view returns (uint256) {
if (total == 0) return 0;
uint256 balance = token.balanceOf(module);
if (total < balance * FLOOR_SHARES_PER_TOKEN)
return shares / FLOOR_SHARES_PER_TOKEN;
return (balance * shares) / total;
}
}/*
IEvents
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
/**
* @title GYSR event system
*
* @notice common interface to define GYSR event system
*/
interface IEvents {
// staking
event Staked(
bytes32 indexed account,
address indexed user,
address indexed token,
uint256 amount,
uint256 shares
);
event Unstaked(
bytes32 indexed account,
address indexed user,
address indexed token,
uint256 amount,
uint256 shares
);
event Claimed(
bytes32 indexed account,
address indexed user,
address indexed token,
uint256 amount,
uint256 shares
);
event Updated(bytes32 indexed account, address indexed user);
// rewards
event RewardsDistributed(
address indexed user,
address indexed token,
uint256 amount,
uint256 shares
);
event RewardsFunded(
address indexed token,
uint256 amount,
uint256 shares,
uint256 timestamp
);
event RewardsExpired(
address indexed token,
uint256 amount,
uint256 shares,
uint256 timestamp
);
event RewardsWithdrawn(
address indexed token,
uint256 amount,
uint256 shares,
uint256 timestamp
);
event RewardsUpdated(bytes32 indexed account);
// gysr
event GysrSpent(address indexed user, uint256 amount);
event GysrVested(address indexed user, uint256 amount);
event GysrWithdrawn(uint256 amount);
event Fee(address indexed receiver, address indexed token, uint256 amount);
}/*
IOwnerController
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
/**
* @title Owner controller interface
*
* @notice this defines the interface for any contracts that use the
* owner controller access pattern
*/
interface IOwnerController {
/**
* @dev Returns the address of the current owner.
*/
function owner() external view returns (address);
/**
* @dev Returns the address of the current controller.
*/
function controller() external view returns (address);
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`). This can
* include renouncing ownership by transferring to the zero address.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) external;
/**
* @dev Transfers control of the contract to a new account (`newController`).
* Can only be called by the owner.
*/
function transferControl(address newController) external;
}/*
IRewardModule
https://github.com/gysr-io/core
SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.18;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IEvents.sol";
import "./IOwnerController.sol";
/**
* @title Reward module interface
*
* @notice this contract defines the common interface that any reward module
* must implement to be compatible with the modular Pool architecture.
*/
interface IRewardModule is IOwnerController, IEvents {
/**
* @return array of reward tokens
*/
function tokens() external view returns (address[] memory);
/**
* @return array of reward token balances
*/
function balances() external view returns (uint256[] memory);
/**
* @return GYSR usage ratio for reward module
*/
function usage() external view returns (uint256);
/**
* @return address of module factory
*/
function factory() external view returns (address);
/**
* @notice perform any necessary accounting for new stake
* @param account bytes32 id of staking account
* @param sender address of sender
* @param shares number of new shares minted
* @param data addtional data
* @return amount of gysr spent
* @return amount of gysr vested
*/
function stake(
bytes32 account,
address sender,
uint256 shares,
bytes calldata data
) external returns (uint256, uint256);
/**
* @notice reward user and perform any necessary accounting for unstake
* @param account bytes32 id of staking account
* @param sender address of sender
* @param receiver address of reward receiver
* @param shares number of shares burned
* @param data additional data
* @return amount of gysr spent
* @return amount of gysr vested
*/
function unstake(
bytes32 account,
address sender,
address receiver,
uint256 shares,
bytes calldata data
) external returns (uint256, uint256);
/**
* @notice reward user and perform and necessary accounting for existing stake
* @param account bytes32 id of staking account
* @param sender address of sender
* @param receiver address of reward receiver
* @param shares number of shares being claimed against
* @param data additional data
* @return amount of gysr spent
* @return amount of gysr vested
*/
function claim(
bytes32 account,
address sender,
address receiver,
uint256 shares,
bytes calldata data
) external returns (uint256, uint256);
/**
* @notice method called by anyone to update accounting
* @dev will only be called ad hoc and should not contain essential logic
* @param account bytes32 id of staking account for update
* @param sender address of sender
* @param data additional data
*/
function update(
bytes32 account,
address sender,
bytes calldata data
) external;
/**
* @notice method called by owner to clean up and perform additional accounting
* @dev will only be called ad hoc and should not contain any essential logic
* @param data additional data
*/
function clean(bytes calldata data) external;
}/*
MathUtils
https://github.com/gysr-io/core
SPDX-License-Identifier: BSD-4-Clause
*/
pragma solidity 0.8.18;
/**
* @title Math utilities
*
* @notice this library implements various logarithmic math utilies which support
* other contracts and specifically the GYSR multiplier calculation
*
* @dev h/t https://github.com/abdk-consulting/abdk-libraries-solidity
*/
library MathUtils {
/**
* @notice calculate binary logarithm of x
*
* @param x signed 64.64-bit fixed point number, require x > 0
* @return signed 64.64-bit fixed point number
*/
function logbase2(int128 x) internal pure returns (int128) {
unchecked {
require(x > 0);
int256 msb = 0;
int256 xc = x;
if (xc >= 0x10000000000000000) {
xc >>= 64;
msb += 64;
}
if (xc >= 0x100000000) {
xc >>= 32;
msb += 32;
}
if (xc >= 0x10000) {
xc >>= 16;
msb += 16;
}
if (xc >= 0x100) {
xc >>= 8;
msb += 8;
}
if (xc >= 0x10) {
xc >>= 4;
msb += 4;
}
if (xc >= 0x4) {
xc >>= 2;
msb += 2;
}
if (xc >= 0x2) msb += 1; // No need to shift xc anymore
int256 result = (msb - 64) << 64;
uint256 ux = uint256(int256(x)) << uint256(127 - msb);
for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
ux *= ux;
uint256 b = ux >> 255;
ux >>= 127 + b;
result += bit * int256(b);
}
return int128(result);
}
}
/**
* @notice calculate natural logarithm of x
* @dev magic constant comes from ln(2) * 2^128 -> hex
* @param x signed 64.64-bit fixed point number, require x > 0
* @return signed 64.64-bit fixed point number
*/
function ln(int128 x) internal pure returns (int128) {
unchecked {
require(x > 0);
return
int128(
int256(
(uint256(int256(logbase2(x))) *
0xB17217F7D1CF79ABC9E3B39803F2F6AF) >> 128
)
);
}
}
/**
* @notice calculate logarithm base 10 of x
* @dev magic constant comes from log10(2) * 2^128 -> hex
* @param x signed 64.64-bit fixed point number, require x > 0
* @return signed 64.64-bit fixed point number
*/
function logbase10(int128 x) internal pure returns (int128) {
require(x > 0);
return
int128(
int256(
(uint256(int256(logbase2(x))) *
0x4d104d427de7fce20a6e420e02236748) >> 128
)
);
}
// wrapper functions to allow testing
function testlogbase2(int128 x) public pure returns (int128) {
return logbase2(x);
}
function testlogbase10(int128 x) public pure returns (int128) {
return logbase10(x);
}
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"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":"module","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"gysr","type":"uint256"}],"name":"gysrBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"preview","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"rewards","outputs":[{"internalType":"uint256[]","name":"rewards_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"rewardsPerStakedShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"tokens","outputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"},{"internalType":"string[]","name":"names_","type":"string[]"},{"internalType":"string[]","name":"symbols_","type":"string[]"},{"internalType":"uint8[]","name":"decimals_","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"unlockable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"unlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
611e1561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063979129c511610065578063979129c51461012e578063d1846d0c14610141578063e486033914610154578063e97f80eb1461017757600080fd5b8063325f733f146100975780635651a29c146100bd57806366d98f7d146100eb5780636d46a1db1461010b575b600080fd5b6100aa6100a53660046117cd565b61018a565b6040519081526020015b60405180910390f35b6100d06100cb3660046117ea565b61040e565b604080519384526020840192909252908201526060016100b4565b6100fe6100f936600461181f565b610b1e565b6040516100b491906118b5565b61011e6101193660046117cd565b610b76565b6040516100b49493929190611949565b6100aa61013c3660046117cd565b610d79565b6100aa61014f3660046117cd565b61100f565b6101676101623660046117cd565b61120a565b6040516100b494939291906119f4565b6100aa6101853660046117ea565b611365565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190611ab2565b60000361027c578073ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102759190611ab2565b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631054b6706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed9190611ab2565b6102f685610d79565b6103009190611afa565b90508173ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190611ab2565b61038382670de0b6b3a7640000611b13565b61038d9190611b2a565b8273ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fc9190611ab2565b6104069190611afa565b949350505050565b6000806000808411610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152879187916000918291829182918716906333060d9090602401602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051e9190611ab2565b90505b89156109665760008111610591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d69320000000000000000000000000000000000000000000000000000006044820152606401610478565b61059c600182611b65565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905291925060009188169063584b62a19060440160a060405180830381865afa158015610615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190611b78565b5050505090508a81111561064d578a61064f565b805b9050600061065c8e61018a565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018690529192506000918a169063584b62a19060440160a060405180830381865afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f99190611b78565b509350505050670de0b6b3a76400008382846107159190611b65565b61071f9190611b13565b6107299190611b2a565b91506107358287611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291975060009250908a169063584b62a19060440160a060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190611b78565b505092505050670de0b6b3a764000081836107ef9190611b13565b6107f99190611b2a565b91506108058286611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291965060009250908a169063584b62a19060440160a060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190611b78565b945050505050670de0b6b3a76400008973ffffffffffffffffffffffffffffffffffffffff1663cecc46c8836040518263ffffffff1660e01b81526004016108ee91815260200190565b602060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190611ab2565b6109399084611b13565b6109439190611b2a565b915061095190508187611afa565b955061095d828d611b65565b9b505050610521565b60008673ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109db9190810190611c18565b6000815181106109ed576109ed611cca565b60200260200101519050610ab08d8873ffffffffffffffffffffffffffffffffffffffff1663bf6b874e846040518263ffffffff1660e01b8152600401610a50919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611ab2565b73ffffffffffffffffffffffffffffffffffffffff841691908861146a565b60008611610abf576000610adc565b83610ad287670de0b6b3a7640000611b13565b610adc9190611b2a565b60008711610aeb576000610b08565b85610afe86670de0b6b3a7640000611b13565b610b089190611b2a565b9950995099505050505050505093509350939050565b60408051600180825281830190925260609160208083019080368337019050509050610b4b86868661040e565b90505081600081518110610b6157610b61611cca565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf69190810190611c18565b600081518110610c0857610c08611cca565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c869190810190611cf9565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cf99190810190611cf9565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190611d84565b955095509550955050509193509193565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df49190810190611c18565b600081518110610e0657610e06611cca565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063e336ac4490602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190611ab2565b600003610eb6575060009392505050565b6000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528516906304003d5b90602401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190611ab2565b811015611006576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201839052851690633f265ddb90604401602060405180830381865afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190611ab2565b610ff29083611afa565b915080610ffe81611da7565b915050610eba565b50949350505050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108a9190810190611c18565b60008151811061109c5761109c611cca565b60209081029190910101516040517fbf6b874e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009184169063bf6b874e90602401602060405180830381865afa158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190611ab2565b90508060000361115257506000949350505050565b600061115d86610d79565b9050600061118373ffffffffffffffffffffffffffffffffffffffff851688858561146a565b9050808573ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190611ab2565b6111ff9190611afa565b979650505050505050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081611248575050604080516001808252818301909252919450602082015b6060815260200190600190039081611273575050604080516001808252818301909252919350602080830190803683370190505090506112b285610b76565b876000815181106112c5576112c5611cca565b60200260200101876000815181106112df576112df611cca565b60200260200101876000815181106112f9576112f9611cca565b602002602001018760008151811061131357611313611cca565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b60008084905061146184858373ffffffffffffffffffffffffffffffffffffffff1663221826986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190611ab2565b6113e99190611afa565b8373ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190611ab2565b86929190611558565b95945050505050565b60008260000361147c57506000610406565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600091908716906370a0823190602401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611ab2565b905061151e6103e882611b13565b841015611539576115316103e884611b2a565b915050610406565b836115448483611b13565b61154e9190611b2a565b9695505050505050565b60008360000361156a57506000610406565b8260000361157a57506000610406565b846000036115915750670de0b6b3a7640000610406565b6000670de0b6b3a76400006115ad85662386f26fc10000611b13565b6115b79190611b2a565b9050808511156115d957846115cc8288611b13565b6115d69190611b2a565b95505b60006115ec84662386f26fc10000611afa565b6115ff8868010000000000000000611b13565b6116099190611b2a565b61161c9068010000000000000000611afa565b90506801000000000000000061163482600f0b611665565b61164990600f0b670de0b6b3a7640000611b13565b6116539190611b2a565b6111ff90670de0b6b3a7640000611afa565b60008082600f0b1361167657600080fd5b6080611681836116a6565b61169e90600f0b6f4d104d427de7fce20a6e420e02236748611b13565b901c92915050565b60008082600f0b136116b757600080fd5b6000600f83900b6801000000000000000081126116d6576040918201911d5b64010000000081126116ea576020918201911d5b6201000081126116fc576010918201911d5b610100811261170d576008918201911d5b6010811261171d576004918201911d5b6004811261172d576002918201911d5b6002811261173c576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b600081131561179d5790800260ff81901c8281029390930192607f011c9060011d611777565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146117ca57600080fd5b50565b6000602082840312156117df57600080fd5b8135610275816117a8565b6000806000606084860312156117ff57600080fd5b833561180a816117a8565b95602085013595506040909401359392505050565b60008060008060006080868803121561183757600080fd5b8535611842816117a8565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561186d57600080fd5b818801915088601f83011261188157600080fd5b81358181111561189057600080fd5b8960208285010111156118a257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156118ed578351835292840192918401916001016118d1565b50909695505050505050565b60005b838110156119145781810151838201526020016118fc565b50506000910152565b600081518084526119358160208601602086016118f9565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000611978608083018661191d565b828103604084015261198a818661191d565b91505060ff8316606083015295945050505050565b600081518084526020808501808196508360051b8101915082860160005b858110156119e75782840389526119d584835161191d565b988501989350908401906001016119bd565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015611a4357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a11565b50505083810382850152611a57818861199f565b90508381036040850152611a6b818761199f565b8481036060860152855180825283870192509083019060005b81811015611aa357835160ff1683529284019291840191600101611a84565b50909998505050505050505050565b600060208284031215611ac457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b0d57611b0d611acb565b92915050565b8082028115828204841417611b0d57611b0d611acb565b600082611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b0d57611b0d611acb565b600080600080600060a08688031215611b9057600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1057611c10611bb8565b604052919050565b60006020808385031215611c2b57600080fd5b825167ffffffffffffffff80821115611c4357600080fd5b818501915085601f830112611c5757600080fd5b815181811115611c6957611c69611bb8565b8060051b9150611c7a848301611be7565b8181529183018401918481019088841115611c9457600080fd5b938501935b83851015611cbe5784519250611cae836117a8565b8282529385019390850190611c99565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611d0b57600080fd5b815167ffffffffffffffff80821115611d2357600080fd5b818401915084601f830112611d3757600080fd5b815181811115611d4957611d49611bb8565b611d5c6020601f19601f84011601611be7565b9150808252856020828501011115611d7357600080fd5b6110068160208401602086016118f9565b600060208284031215611d9657600080fd5b815160ff8116811461027557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dd857611dd8611acb565b506001019056fea26469706673582212201a057d6a314487a020ce30b5c4c62020c60a3659afff2ff7e7b0dfd8a2a90ad564736f6c63430008120033
Deployed Bytecode
0x732dfec6172f860b2fbfbf7e70c4487cf51aec5bc930146080604052600436106100925760003560e01c8063979129c511610065578063979129c51461012e578063d1846d0c14610141578063e486033914610154578063e97f80eb1461017757600080fd5b8063325f733f146100975780635651a29c146100bd57806366d98f7d146100eb5780636d46a1db1461010b575b600080fd5b6100aa6100a53660046117cd565b61018a565b6040519081526020015b60405180910390f35b6100d06100cb3660046117ea565b61040e565b604080519384526020840192909252908201526060016100b4565b6100fe6100f936600461181f565b610b1e565b6040516100b491906118b5565b61011e6101193660046117cd565b610b76565b6040516100b49493929190611949565b6100aa61013c3660046117cd565b610d79565b6100aa61014f3660046117cd565b61100f565b6101676101623660046117cd565b61120a565b6040516100b494939291906119f4565b6100aa6101853660046117ea565b611365565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190611ab2565b60000361027c578073ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102759190611ab2565b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631054b6706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed9190611ab2565b6102f685610d79565b6103009190611afa565b90508173ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190611ab2565b61038382670de0b6b3a7640000611b13565b61038d9190611b2a565b8273ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fc9190611ab2565b6104069190611afa565b949350505050565b6000806000808411610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152879187916000918291829182918716906333060d9090602401602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051e9190611ab2565b90505b89156109665760008111610591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d69320000000000000000000000000000000000000000000000000000006044820152606401610478565b61059c600182611b65565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905291925060009188169063584b62a19060440160a060405180830381865afa158015610615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190611b78565b5050505090508a81111561064d578a61064f565b805b9050600061065c8e61018a565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018690529192506000918a169063584b62a19060440160a060405180830381865afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f99190611b78565b509350505050670de0b6b3a76400008382846107159190611b65565b61071f9190611b13565b6107299190611b2a565b91506107358287611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291975060009250908a169063584b62a19060440160a060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190611b78565b505092505050670de0b6b3a764000081836107ef9190611b13565b6107f99190611b2a565b91506108058286611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291965060009250908a169063584b62a19060440160a060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190611b78565b945050505050670de0b6b3a76400008973ffffffffffffffffffffffffffffffffffffffff1663cecc46c8836040518263ffffffff1660e01b81526004016108ee91815260200190565b602060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190611ab2565b6109399084611b13565b6109439190611b2a565b915061095190508187611afa565b955061095d828d611b65565b9b505050610521565b60008673ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109db9190810190611c18565b6000815181106109ed576109ed611cca565b60200260200101519050610ab08d8873ffffffffffffffffffffffffffffffffffffffff1663bf6b874e846040518263ffffffff1660e01b8152600401610a50919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611ab2565b73ffffffffffffffffffffffffffffffffffffffff841691908861146a565b60008611610abf576000610adc565b83610ad287670de0b6b3a7640000611b13565b610adc9190611b2a565b60008711610aeb576000610b08565b85610afe86670de0b6b3a7640000611b13565b610b089190611b2a565b9950995099505050505050505093509350939050565b60408051600180825281830190925260609160208083019080368337019050509050610b4b86868661040e565b90505081600081518110610b6157610b61611cca565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf69190810190611c18565b600081518110610c0857610c08611cca565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c869190810190611cf9565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cf99190810190611cf9565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190611d84565b955095509550955050509193509193565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df49190810190611c18565b600081518110610e0657610e06611cca565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063e336ac4490602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190611ab2565b600003610eb6575060009392505050565b6000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528516906304003d5b90602401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190611ab2565b811015611006576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201839052851690633f265ddb90604401602060405180830381865afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190611ab2565b610ff29083611afa565b915080610ffe81611da7565b915050610eba565b50949350505050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108a9190810190611c18565b60008151811061109c5761109c611cca565b60209081029190910101516040517fbf6b874e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009184169063bf6b874e90602401602060405180830381865afa158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190611ab2565b90508060000361115257506000949350505050565b600061115d86610d79565b9050600061118373ffffffffffffffffffffffffffffffffffffffff851688858561146a565b9050808573ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190611ab2565b6111ff9190611afa565b979650505050505050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081611248575050604080516001808252818301909252919450602082015b6060815260200190600190039081611273575050604080516001808252818301909252919350602080830190803683370190505090506112b285610b76565b876000815181106112c5576112c5611cca565b60200260200101876000815181106112df576112df611cca565b60200260200101876000815181106112f9576112f9611cca565b602002602001018760008151811061131357611313611cca565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b60008084905061146184858373ffffffffffffffffffffffffffffffffffffffff1663221826986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190611ab2565b6113e99190611afa565b8373ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190611ab2565b86929190611558565b95945050505050565b60008260000361147c57506000610406565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600091908716906370a0823190602401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611ab2565b905061151e6103e882611b13565b841015611539576115316103e884611b2a565b915050610406565b836115448483611b13565b61154e9190611b2a565b9695505050505050565b60008360000361156a57506000610406565b8260000361157a57506000610406565b846000036115915750670de0b6b3a7640000610406565b6000670de0b6b3a76400006115ad85662386f26fc10000611b13565b6115b79190611b2a565b9050808511156115d957846115cc8288611b13565b6115d69190611b2a565b95505b60006115ec84662386f26fc10000611afa565b6115ff8868010000000000000000611b13565b6116099190611b2a565b61161c9068010000000000000000611afa565b90506801000000000000000061163482600f0b611665565b61164990600f0b670de0b6b3a7640000611b13565b6116539190611b2a565b6111ff90670de0b6b3a7640000611afa565b60008082600f0b1361167657600080fd5b6080611681836116a6565b61169e90600f0b6f4d104d427de7fce20a6e420e02236748611b13565b901c92915050565b60008082600f0b136116b757600080fd5b6000600f83900b6801000000000000000081126116d6576040918201911d5b64010000000081126116ea576020918201911d5b6201000081126116fc576010918201911d5b610100811261170d576008918201911d5b6010811261171d576004918201911d5b6004811261172d576002918201911d5b6002811261173c576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b600081131561179d5790800260ff81901c8281029390930192607f011c9060011d611777565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146117ca57600080fd5b50565b6000602082840312156117df57600080fd5b8135610275816117a8565b6000806000606084860312156117ff57600080fd5b833561180a816117a8565b95602085013595506040909401359392505050565b60008060008060006080868803121561183757600080fd5b8535611842816117a8565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561186d57600080fd5b818801915088601f83011261188157600080fd5b81358181111561189057600080fd5b8960208285010111156118a257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156118ed578351835292840192918401916001016118d1565b50909695505050505050565b60005b838110156119145781810151838201526020016118fc565b50506000910152565b600081518084526119358160208601602086016118f9565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000611978608083018661191d565b828103604084015261198a818661191d565b91505060ff8316606083015295945050505050565b600081518084526020808501808196508360051b8101915082860160005b858110156119e75782840389526119d584835161191d565b988501989350908401906001016119bd565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015611a4357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a11565b50505083810382850152611a57818861199f565b90508381036040850152611a6b818761199f565b8481036060860152855180825283870192509083019060005b81811015611aa357835160ff1683529284019291840191600101611a84565b50909998505050505050505050565b600060208284031215611ac457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b0d57611b0d611acb565b92915050565b8082028115828204841417611b0d57611b0d611acb565b600082611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b0d57611b0d611acb565b600080600080600060a08688031215611b9057600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1057611c10611bb8565b604052919050565b60006020808385031215611c2b57600080fd5b825167ffffffffffffffff80821115611c4357600080fd5b818501915085601f830112611c5757600080fd5b815181811115611c6957611c69611bb8565b8060051b9150611c7a848301611be7565b8181529183018401918481019088841115611c9457600080fd5b938501935b83851015611cbe5784519250611cae836117a8565b8282529385019390850190611c99565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611d0b57600080fd5b815167ffffffffffffffff80821115611d2357600080fd5b818401915084601f830112611d3757600080fd5b815181811115611d4957611d49611bb8565b611d5c6020601f19601f84011601611be7565b9150808252856020828501011115611d7357600080fd5b6110068160208401602086016118f9565b600060208284031215611d9657600080fd5b815160ff8116811461027557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dd857611dd8611acb565b506001019056fea26469706673582212201a057d6a314487a020ce30b5c4c62020c60a3659afff2ff7e7b0dfd8a2a90ad564736f6c63430008120033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.