Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SafuLens
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-03-13
*/
// SPDX-License-Identifier: MIT
// File: contracts/IERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.7.6;
/**
* @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);
function symbol() external view returns (string memory);
}
// File: contracts/IRamsesV2Pool.sol
pragma solidity ^0.7.6;
interface IRamsesV2Pool {
function liquidity() external view returns (uint128);
function boostedLiquidity() external view returns (uint128);
function slot0() external view returns (uint160, int24, uint16, uint16, uint16, uint8, bool);
function token0() external view returns (address);
function token1() external view returns (address);
function fee() external view returns (uint24);
}
// File: contracts/IRamsesGaugeV2.sol
pragma solidity >=0.5.0 <0.9.0;
interface IRamsesGaugeV2 {
/// @notice Emitted when a reward notification is made.
/// @param from The address from which the reward is notified.
/// @param reward The address of the reward token.
/// @param amount The amount of rewards notified.
/// @param period The period for which the rewards are notified.
event NotifyReward(
address indexed from,
address indexed reward,
uint256 amount,
uint256 period
);
/// @notice Emitted when a bribe is made.
/// @param from The address from which the bribe is made.
/// @param reward The address of the reward token.
/// @param amount The amount of tokens bribed.
/// @param period The period for which the bribe is made.
event Bribe(
address indexed from,
address indexed reward,
uint256 amount,
uint256 period
);
/// @notice Emitted when rewards are claimed.
/// @param period The period for which the rewards are claimed.
/// @param _positionHash The identifier of the NFP for which rewards are claimed.
/// @param receiver The address of the receiver of the claimed rewards.
/// @param reward The address of the reward token.
/// @param amount The amount of rewards claimed.
event ClaimRewards(
uint256 period,
bytes32 _positionHash,
address receiver,
address reward,
uint256 amount
);
/// @notice Initializes the contract with the provided gaugeFactory, voter, and pool addresses.
/// @param _gaugeFactory The address of the gaugeFactory to set.
/// @param _voter The address of the voter to set.
/// @param _nfpManager The address of the NFP manager to set.
/// @param _feeCollector The address of the fee collector to set.
/// @param _pool The address of the pool to set.
function initialize(
address _gaugeFactory,
address _voter,
address _nfpManager,
address _feeCollector,
address _pool
) external;
/// @notice Retrieves the value of the firstPeriod variable.
/// @return The value of the firstPeriod variable.
function firstPeriod() external returns (uint256);
/// @notice Retrieves the total supply of a specific token for a given period.
/// @param period The period for which to retrieve the total supply.
/// @param token The address of the token for which to retrieve the total supply.
/// @return The total supply of the specified token for the given period.
function tokenTotalSupplyByPeriod(
uint256 period,
address token
) external view returns (uint256);
/// @notice Retrieves the total boosted seconds for a specific period.
/// @param period The period for which to retrieve the total boosted seconds.
/// @return The total boosted seconds for the specified period.
function periodTotalBoostedSeconds(
uint256 period
) external view returns (uint256);
/// @notice Retrieves the getTokenTotalSupplyByPeriod of the current period.
/// @dev included to support voter's left() check during distribute().
/// @param token The address of the token for which to retrieve the remaining amount.
/// @return The amount of tokens left to distribute in this period.
function left(address token) external view returns (uint256);
/// @notice Retrieves the reward rate for a specific reward address.
/// @dev this method returns the base rate without boost
/// @param token The address of the reward for which to retrieve the reward rate.
/// @return The reward rate for the specified reward address.
function rewardRate(address token) external view returns (uint256);
/// @notice Retrieves the claimed amount for a specific period, position hash, and user address.
/// @param period The period for which to retrieve the claimed amount.
/// @param _positionHash The identifier of the NFP for which to retrieve the claimed amount.
/// @param reward The address of the token for the claimed amount.
/// @return The claimed amount for the specified period, token ID, and user address.
function periodClaimedAmount(
uint256 period,
bytes32 _positionHash,
address reward
) external view returns (uint256);
/// @notice Retrieves the last claimed period for a specific token, token ID combination.
/// @param token The address of the reward token for which to retrieve the last claimed period.
/// @param _positionHash The identifier of the NFP for which to retrieve the last claimed period.
/// @return The last claimed period for the specified token and token ID.
function lastClaimByToken(
address token,
bytes32 _positionHash
) external view returns (uint256);
/// @notice Retrieves the reward address at the specified index in the rewards array.
/// @param index The index of the reward address to retrieve.
/// @return The reward address at the specified index.
function rewards(uint256 index) external view returns (address);
/// @notice Checks if a given address is a valid reward.
/// @param reward The address to check.
/// @return A boolean indicating whether the address is a valid reward.
function isReward(address reward) external view returns (bool);
/// @notice Returns an array of reward token addresses.
/// @return An array of reward token addresses.
function getRewardTokens() external view returns (address[] memory);
/// @notice Returns the hash used to store positions in a mapping
/// @param owner The address of the position owner
/// @param index The index of the position
/// @param tickLower The lower tick boundary of the position
/// @param tickUpper The upper tick boundary of the position
/// @return _hash The hash used to store positions in a mapping
function positionHash(
address owner,
uint256 index,
int24 tickLower,
int24 tickUpper
) external pure returns (bytes32);
/// @notice Retrieves the liquidity and boosted liquidity for a specific NFP.
/// @param tokenId The identifier of the NFP.
/// @return liquidity The liquidity of the position token.
/// @return boostedLiquidity The boosted liquidity of the position token.
/// @return veNftTokenId The attached veNFT
function positionInfo(
uint256 tokenId
)
external
view
returns (
uint128 liquidity,
uint128 boostedLiquidity,
uint256 veNftTokenId
);
/// @notice Returns the amount of rewards earned for an NFP.
/// @param token The address of the token for which to retrieve the earned rewards.
/// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards.
/// @return reward The amount of rewards earned for the specified NFP and tokens.
function earned(
address token,
uint256 tokenId
) external view returns (uint256 reward);
/// @notice Returns the amount of rewards earned during a period for an NFP.
/// @param period The period for which to retrieve the earned rewards.
/// @param token The address of the token for which to retrieve the earned rewards.
/// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards.
/// @return reward The amount of rewards earned for the specified NFP and tokens.
function periodEarned(
uint256 period,
address token,
uint256 tokenId
) external view returns (uint256);
/// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper.
/// @param period The period for which to retrieve the earned rewards.
/// @param token The address of the token for which to retrieve the earned rewards.
/// @param owner The address of the owner for which to retrieve the earned rewards.
/// @param index The index for which to retrieve the earned rewards.
/// @param tickLower The tick lower bound for which to retrieve the earned rewards.
/// @param tickUpper The tick upper bound for which to retrieve the earned rewards.
/// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper.
function periodEarned(
uint256 period,
address token,
address owner,
uint256 index,
int24 tickLower,
int24 tickUpper
) external view returns (uint256);
/// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper.
/// @dev used by getReward() and saves gas by saving states
/// @param period The period for which to retrieve the earned rewards.
/// @param token The address of the token for which to retrieve the earned rewards.
/// @param owner The address of the owner for which to retrieve the earned rewards.
/// @param index The index for which to retrieve the earned rewards.
/// @param tickLower The tick lower bound for which to retrieve the earned rewards.
/// @param tickUpper The tick upper bound for which to retrieve the earned rewards.
/// @param caching Whether to cache the results or not.
/// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper.
function cachePeriodEarned(
uint256 period,
address token,
address owner,
uint256 index,
int24 tickLower,
int24 tickUpper,
bool caching
) external returns (uint256);
/// @notice Notifies the contract about the amount of rewards to be distributed for a specific token.
/// @param token The address of the token for which to notify the reward amount.
/// @param amount The amount of rewards to be distributed.
function notifyRewardAmount(address token, uint256 amount) external;
/// @notice Retrieves the reward amount for a specific period, NFP, and token addresses.
/// @param period The period for which to retrieve the reward amount.
/// @param tokens The addresses of the tokens for which to retrieve the reward amount.
/// @param tokenId The identifier of the specific NFP for which to retrieve the reward amount.
/// @param receiver The address of the receiver of the reward amount.
function getPeriodReward(
uint256 period,
address[] calldata tokens,
uint256 tokenId,
address receiver
) external;
/// @notice Retrieves the rewards for a specific period, set of tokens, owner, index, tickLower, tickUpper, and receiver.
/// @param period The period for which to retrieve the rewards.
/// @param tokens An array of token addresses for which to retrieve the rewards.
/// @param owner The address of the owner for which to retrieve the rewards.
/// @param index The index for which to retrieve the rewards.
/// @param tickLower The tick lower bound for which to retrieve the rewards.
/// @param tickUpper The tick upper bound for which to retrieve the rewards.
/// @param receiver The address of the receiver of the rewards.
function getPeriodReward(
uint256 period,
address[] calldata tokens,
address owner,
uint256 index,
int24 tickLower,
int24 tickUpper,
address receiver
) external;
function getRewardForOwner(
uint256 tokenId,
address[] memory tokens
) external;
}
// File: contracts/IRamsesVoter.sol
pragma solidity ^0.7.6;
interface IRamsesVoter {
function gauges(address) external view returns (address);
function length() external view returns (uint256);
function pools(uint256) external view returns (address);
}
// File: contracts/IRamsesClFactory.sol
pragma solidity ^0.7.6;
interface IRamsesClFactory {
function getPool(address, address, uint24) external view returns (address);
}
// File: contracts/IRamsesNfpManager.sol
pragma solidity ^0.7.6;
interface IRamsesNfpManager {
function balanceOf(address) external view returns (uint256);
function tokenOfOwnerByIndex(address, uint256) external view returns (uint256);
function positions(uint256) external view returns (uint96,address,address,address,uint24,int24,int24,uint128,uint256,uint256,uint128,uint128);
function ownerOf(uint256) external view returns (address);
}
// File: contracts/SafuLensNoBoost.sol
pragma solidity ^0.7.6;
pragma abicoder v2;
struct ClData {
uint256 nft_id;
address token0;
address token1;
string symbol0;
string symbol1;
uint24 fee;
address pool_address;
address gauge_address;
uint256 pool_liquidity;
uint256 pool_boostedliq;
uint256 boostedliq;
int24 tick;
int24 tick_lower;
int24 tick_upper;
uint128 liquidity;
address[] rewardTokens;
uint256[] earnedTokens;
}
contract SafuLens {
IRamsesNfpManager public ramsesNfpManager =
IRamsesNfpManager(0xAA277CB7914b7e5514946Da92cb9De332Ce610EF);
IRamsesClFactory public ramsesClFactory =
IRamsesClFactory(0xAA2cd7477c451E703f3B9Ba5663334914763edF8);
IRamsesVoter public ramsesVoter =
IRamsesVoter(0xAAA2564DEb34763E3d05162ed3f5C2658691f499);
function nftIdsOfOwner(address owner) public view returns (uint256[] memory) {
uint256[] memory nft_ids = new uint256[](
ramsesNfpManager.balanceOf(owner)
);
for (uint256 i = 0; i < nft_ids.length; i++) {
nft_ids[i] = ramsesNfpManager.tokenOfOwnerByIndex(owner, i);
}
return nft_ids;
}
function getClData(uint256 nft_id) public view returns (ClData memory) {
ClData memory clData;
clData.nft_id = nft_id;
(
,
,
clData.token0,
clData.token1,
clData.fee,
clData.tick_lower,
clData.tick_upper,
clData.liquidity,
,
,
,
) = ramsesNfpManager.positions(nft_id);
clData.pool_address = ramsesClFactory.getPool(
clData.token0,
clData.token1,
clData.fee
);
clData.gauge_address = ramsesVoter.gauges(clData.pool_address);
(clData.liquidity, clData.boostedliq, ) = IRamsesGaugeV2(
clData.gauge_address
).positionInfo(nft_id);
clData.symbol0 = IERC20(clData.token0).symbol();
clData.symbol1 = IERC20(clData.token1).symbol();
clData.pool_liquidity = IRamsesV2Pool(clData.pool_address).liquidity();
clData.pool_boostedliq = 0;
(, clData.tick, , , , , ) = IRamsesV2Pool(clData.pool_address).slot0();
clData.rewardTokens = IRamsesGaugeV2(clData.gauge_address).getRewardTokens();
clData.earnedTokens = new uint256[](clData.rewardTokens.length);
for (uint256 i = 0; i < clData.rewardTokens.length; i++) {
clData.earnedTokens[i] = IRamsesGaugeV2(clData.gauge_address).earned(clData.rewardTokens[i], clData.nft_id);
}
return clData;
}
function getClDataBatched(
uint256[] memory nft_ids
) public view returns (ClData[] memory) {
ClData[] memory clData = new ClData[](nft_ids.length);
for (uint256 i = 0; i < nft_ids.length; i++) {
clData[i] = getClData(nft_ids[i]);
}
return clData;
}
function clDataOfOwner(
address owner
) public view returns (ClData[] memory) {
uint256[] memory nft_ids = nftIdsOfOwner(owner);
// Determine the starting index based on the length of the nft_ids array.
uint256 startIndex = nft_ids.length > 200 ? nft_ids.length - 200 : 0;
uint256 length = nft_ids.length - startIndex;
// Create a new array to store the last 200 (or less) NFT IDs.
uint256[] memory lastNftIds = new uint256[](length);
for (uint256 i = 0; i < length; i++) {
lastNftIds[i] = nft_ids[startIndex + i];
}
return getClDataBatched(lastNftIds);
}
function checkNFTsExistence(uint256[] memory nftIds) public view returns (uint256[] memory) {
uint256[] memory existingNFTs = new uint256[](nftIds.length);
uint256 count = 0;
for (uint256 i = 0; i < nftIds.length; i++) {
try ramsesNfpManager.ownerOf(nftIds[i]) {
// If the call doesn't revert, the NFT exists
existingNFTs[count] = nftIds[i];
count++;
} catch {
// If the call reverts, the NFT doesn't exist, do nothing
}
}
// Resize the array to fit the actual number of existing NFTs
uint256[] memory resizedArray = new uint256[](count);
for (uint256 i = 0; i < count; i++) {
resizedArray[i] = existingNFTs[i];
}
return resizedArray;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"checkNFTsExistence","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"clDataOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nft_id","type":"uint256"}],"name":"getClData","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nft_ids","type":"uint256[]"}],"name":"getClDataBatched","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nftIdsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesClFactory","outputs":[{"internalType":"contract IRamsesClFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesNfpManager","outputs":[{"internalType":"contract IRamsesNfpManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesVoter","outputs":[{"internalType":"contract IRamsesVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600080546001600160a01b031990811673aa277cb7914b7e5514946da92cb9de332ce610ef1790915560018054821673aa2cd7477c451e703f3b9ba5663334914763edf81790556002805490911673aaa2564deb34763e3d05162ed3f5c2658691f49917905534801561007657600080fd5b50611502806100866000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638b9b48071161005b5780638b9b4807146100fc5780638e03b42214610111578063c3bc213f14610119578063cdafe32d1461013957610088565b8063435520a11461008d5780634babecad146100b65780636a4417d9146100d657806387ed26df146100e9575b600080fd5b6100a061009b366004610d74565b610141565b6040516100ad9190611413565b60405180910390f35b6100c96100c4366004610e51565b6102bd565b6040516100ad91906113b3565b6100c96100e4366004610d74565b61035d565b6100a06100f7366004610e51565b610426565b6101046105dd565b6040516100ad919061135e565b6101046105ec565b61012c610127366004611042565b6105fb565b6040516100ad9190611426565b610104610c4d565b600080546040516370a0823160e01b8152606092916001600160a01b0316906370a082319061017490869060040161135e565b60206040518083038186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c4919061105a565b67ffffffffffffffff811180156101da57600080fd5b50604051908082528060200260200182016040528015610204578160200160208202803683370190505b50905060005b81518110156102b457600054604051632f745c5960e01b81526001600160a01b0390911690632f745c5990610245908790859060040161139a565b60206040518083038186803b15801561025d57600080fd5b505afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610295919061105a565b8282815181106102a157fe5b602090810291909101015260010161020a565b5090505b919050565b60606000825167ffffffffffffffff811180156102d957600080fd5b5060405190808252806020026020018201604052801561031357816020015b610300610c5c565b8152602001906001900390816102f85790505b50905060005b83518110156102b45761033e84828151811061033157fe5b60200260200101516105fb565b82828151811061034a57fe5b6020908102919091010152600101610319565b6060600061036a83610141565b9050600060c882511161037e576000610384565b60c88251035b825190915081900360008167ffffffffffffffff811180156103a557600080fd5b506040519080825280602002602001820160405280156103cf578160200160208202803683370190505b50905060005b828110156104125784818501815181106103eb57fe5b60200260200101518282815181106103ff57fe5b60209081029190910101526001016103d5565b5061041c816102bd565b9695505050505050565b60606000825167ffffffffffffffff8111801561044257600080fd5b5060405190808252806020026020018201604052801561046c578160200160208202803683370190505b5090506000805b845181101561054f5760005485516001600160a01b0390911690636352211e9087908490811061049f57fe5b60200260200101516040518263ffffffff1660e01b81526004016104c39190611439565b60206040518083038186803b1580156104db57600080fd5b505afa92505050801561050b575060408051601f3d908101601f1916820190925261050891810190610d97565b60015b61051457610547565b5084818151811061052157fe5b602002602001015183838151811061053557fe5b60209081029190910101526001909101905b600101610473565b5060008167ffffffffffffffff8111801561056957600080fd5b50604051908082528060200260200182016040528015610593578160200160208202803683370190505b50905060005b828110156105d4578381815181106105ad57fe5b60200260200101518282815181106105c157fe5b6020908102919091010152600101610599565b50949350505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b610603610c5c565b61060b610c5c565b82815260005460405163133f757160e31b81526001600160a01b03909116906399fbab889061063e908690600401611439565b6101806040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190611072565b505050506001600160801b03166101c0890152600290810b810b6101a089015290810b900b61018087015262ffffff1660a086018190526001600160a01b039182166040808801829052938316602088018190526001549451630b4c774160e11b8152949093169550631698ee82945061070e93909190600401611372565b60206040518083038186803b15801561072657600080fd5b505afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190610d97565b6001600160a01b0390811660c0830181905260025460405163b9a09fd560e01b815292169163b9a09fd5916107959160040161135e565b60206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190610d97565b6001600160a01b031660e08201819052604051634484bd3560e11b81526389097a6a90610816908690600401611439565b60606040518083038186803b15801561082e57600080fd5b505afa158015610842573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108669190610f70565b506001600160801b03908116610140840152166101c08201526020810151604080516395d89b4160e01b815290516001600160a01b03909216916395d89b4191600480820192600092909190829003018186803b1580156108c657600080fd5b505afa1580156108da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109029190810190610ed5565b816060018190525080604001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109839190810190610ed5565b81608001819052508060c001516001600160a01b0316631a6865026040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c857600080fd5b505afa1580156109dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a009190610f56565b6001600160801b0316816101000181815250506000816101200181815250508060c001516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a5c57600080fd5b505afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a949190610fab565b5050505050600290810b900b6101608301525060e08101516040805163c4f59f9b60e01b815290516001600160a01b039092169163c4f59f9b91600480820192600092909190829003018186803b158015610aee57600080fd5b505afa158015610b02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2a9190810190610db3565b6101e082018190525167ffffffffffffffff81118015610b4957600080fd5b50604051908082528060200260200182016040528015610b73578160200160208202803683370190505b5061020082015260005b816101e00151518110156102b4578160e001516001600160a01b0316633e491d47836101e001518381518110610baf57fe5b602002602001015184600001516040518363ffffffff1660e01b8152600401610bd992919061139a565b60206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c29919061105a565b8261020001518281518110610c3a57fe5b6020908102919091010152600101610b7d565b6000546001600160a01b031681565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001600062ffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600060020b8152602001600060020b8152602001600060020b815260200160006001600160801b0316815260200160608152602001606081525090565b80516102b8816114b4565b8051600281900b81146102b857600080fd5b80516001600160801b03811681146102b857600080fd5b805161ffff811681146102b857600080fd5b805162ffffff811681146102b857600080fd5b600060208284031215610d85578081fd5b8135610d90816114b4565b9392505050565b600060208284031215610da8578081fd5b8151610d90816114b4565b60006020808385031215610dc5578182fd5b825167ffffffffffffffff811115610ddb578283fd5b8301601f81018513610deb578283fd5b8051610dfe610df982611466565b611442565b8181528381019083850185840285018601891015610e1a578687fd5b8694505b83851015610e45578051610e31816114b4565b835260019490940193918501918501610e1e565b50979650505050505050565b60006020808385031215610e63578182fd5b823567ffffffffffffffff811115610e79578283fd5b8301601f81018513610e89578283fd5b8035610e97610df982611466565b8181528381019083850185840285018601891015610eb3578687fd5b8694505b83851015610e45578035835260019490940193918501918501610eb7565b600060208284031215610ee6578081fd5b815167ffffffffffffffff80821115610efd578283fd5b818401915084601f830112610f10578283fd5b815181811115610f1c57fe5b610f2f601f8201601f1916602001611442565b9150808252856020828501011115610f45578384fd5b6105d4816020840160208601611484565b600060208284031215610f67578081fd5b610d9082610d38565b600080600060608486031215610f84578182fd5b610f8d84610d38565b9250610f9b60208501610d38565b9150604084015190509250925092565b600080600080600080600060e0888a031215610fc5578283fd5b8751610fd0816114b4565b9650610fde60208901610d26565b9550610fec60408901610d4f565b9450610ffa60608901610d4f565b935061100860808901610d4f565b925060a088015160ff8116811461101d578283fd5b60c08901519092508015158114611032578182fd5b8091505092959891949750929550565b600060208284031215611053578081fd5b5035919050565b60006020828403121561106b578081fd5b5051919050565b6000806000806000806000806000806000806101808d8f031215611094578586fd5b8c516bffffffffffffffffffffffff811681146110af578687fd5b9b506110bd60208e01610d1b565b9a506110cb60408e01610d1b565b99506110d960608e01610d1b565b98506110e760808e01610d61565b97506110f560a08e01610d26565b965061110360c08e01610d26565b955061111160e08e01610d38565b94506101008d015193506101208d015192506111306101408e01610d38565b915061113f6101608e01610d38565b90509295989b509295989b509295989b565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156111965781516001600160a01b031687529582019590820190600101611171565b509495945050505050565b6000815180845260208085019450808401835b83811015611196578151875295820195908201906001016111b4565b60020b9052565b600081518084526111ef816020860160208601611484565b601f01601f19169290920160200192915050565b600061022082518452602083015161121e6020860182611151565b5060408301516112316040860182611151565b506060830151816060860152611249828601826111d7565b9150506080830151848203608086015261126382826111d7565b91505060a083015161127860a0860182611355565b5060c083015161128b60c0860182611151565b5060e083015161129e60e0860182611151565b50610100838101519085015261012080840151908501526101408084015190850152610160808401516112d3828701826111d0565b5050610180808401516112e8828701826111d0565b50506101a0808401516112fd828701826111d0565b50506101c08084015161131282870182611348565b50506101e0808401518583038287015261132c838261115e565b92505050610200808401518583038287015261041c83826111a1565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561140657603f198886030184526113f4858351611203565b945092850192908501906001016113d8565b5092979650505050505050565b600060208252610d9060208301846111a1565b600060208252610d906020830184611203565b90815260200190565b60405181810167ffffffffffffffff8111828210171561145e57fe5b604052919050565b600067ffffffffffffffff82111561147a57fe5b5060209081020190565b60005b8381101561149f578181015183820152602001611487565b838111156114ae576000848401525b50505050565b6001600160a01b03811681146114c957600080fd5b5056fea2646970667358221220a772f0cd617eeac1055a7e13142fe3fb0437c8c9332e40f26e3f032b968324df64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638b9b48071161005b5780638b9b4807146100fc5780638e03b42214610111578063c3bc213f14610119578063cdafe32d1461013957610088565b8063435520a11461008d5780634babecad146100b65780636a4417d9146100d657806387ed26df146100e9575b600080fd5b6100a061009b366004610d74565b610141565b6040516100ad9190611413565b60405180910390f35b6100c96100c4366004610e51565b6102bd565b6040516100ad91906113b3565b6100c96100e4366004610d74565b61035d565b6100a06100f7366004610e51565b610426565b6101046105dd565b6040516100ad919061135e565b6101046105ec565b61012c610127366004611042565b6105fb565b6040516100ad9190611426565b610104610c4d565b600080546040516370a0823160e01b8152606092916001600160a01b0316906370a082319061017490869060040161135e565b60206040518083038186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c4919061105a565b67ffffffffffffffff811180156101da57600080fd5b50604051908082528060200260200182016040528015610204578160200160208202803683370190505b50905060005b81518110156102b457600054604051632f745c5960e01b81526001600160a01b0390911690632f745c5990610245908790859060040161139a565b60206040518083038186803b15801561025d57600080fd5b505afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610295919061105a565b8282815181106102a157fe5b602090810291909101015260010161020a565b5090505b919050565b60606000825167ffffffffffffffff811180156102d957600080fd5b5060405190808252806020026020018201604052801561031357816020015b610300610c5c565b8152602001906001900390816102f85790505b50905060005b83518110156102b45761033e84828151811061033157fe5b60200260200101516105fb565b82828151811061034a57fe5b6020908102919091010152600101610319565b6060600061036a83610141565b9050600060c882511161037e576000610384565b60c88251035b825190915081900360008167ffffffffffffffff811180156103a557600080fd5b506040519080825280602002602001820160405280156103cf578160200160208202803683370190505b50905060005b828110156104125784818501815181106103eb57fe5b60200260200101518282815181106103ff57fe5b60209081029190910101526001016103d5565b5061041c816102bd565b9695505050505050565b60606000825167ffffffffffffffff8111801561044257600080fd5b5060405190808252806020026020018201604052801561046c578160200160208202803683370190505b5090506000805b845181101561054f5760005485516001600160a01b0390911690636352211e9087908490811061049f57fe5b60200260200101516040518263ffffffff1660e01b81526004016104c39190611439565b60206040518083038186803b1580156104db57600080fd5b505afa92505050801561050b575060408051601f3d908101601f1916820190925261050891810190610d97565b60015b61051457610547565b5084818151811061052157fe5b602002602001015183838151811061053557fe5b60209081029190910101526001909101905b600101610473565b5060008167ffffffffffffffff8111801561056957600080fd5b50604051908082528060200260200182016040528015610593578160200160208202803683370190505b50905060005b828110156105d4578381815181106105ad57fe5b60200260200101518282815181106105c157fe5b6020908102919091010152600101610599565b50949350505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b610603610c5c565b61060b610c5c565b82815260005460405163133f757160e31b81526001600160a01b03909116906399fbab889061063e908690600401611439565b6101806040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190611072565b505050506001600160801b03166101c0890152600290810b810b6101a089015290810b900b61018087015262ffffff1660a086018190526001600160a01b039182166040808801829052938316602088018190526001549451630b4c774160e11b8152949093169550631698ee82945061070e93909190600401611372565b60206040518083038186803b15801561072657600080fd5b505afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190610d97565b6001600160a01b0390811660c0830181905260025460405163b9a09fd560e01b815292169163b9a09fd5916107959160040161135e565b60206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190610d97565b6001600160a01b031660e08201819052604051634484bd3560e11b81526389097a6a90610816908690600401611439565b60606040518083038186803b15801561082e57600080fd5b505afa158015610842573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108669190610f70565b506001600160801b03908116610140840152166101c08201526020810151604080516395d89b4160e01b815290516001600160a01b03909216916395d89b4191600480820192600092909190829003018186803b1580156108c657600080fd5b505afa1580156108da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109029190810190610ed5565b816060018190525080604001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109839190810190610ed5565b81608001819052508060c001516001600160a01b0316631a6865026040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c857600080fd5b505afa1580156109dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a009190610f56565b6001600160801b0316816101000181815250506000816101200181815250508060c001516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a5c57600080fd5b505afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a949190610fab565b5050505050600290810b900b6101608301525060e08101516040805163c4f59f9b60e01b815290516001600160a01b039092169163c4f59f9b91600480820192600092909190829003018186803b158015610aee57600080fd5b505afa158015610b02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2a9190810190610db3565b6101e082018190525167ffffffffffffffff81118015610b4957600080fd5b50604051908082528060200260200182016040528015610b73578160200160208202803683370190505b5061020082015260005b816101e00151518110156102b4578160e001516001600160a01b0316633e491d47836101e001518381518110610baf57fe5b602002602001015184600001516040518363ffffffff1660e01b8152600401610bd992919061139a565b60206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c29919061105a565b8261020001518281518110610c3a57fe5b6020908102919091010152600101610b7d565b6000546001600160a01b031681565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001600062ffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600060020b8152602001600060020b8152602001600060020b815260200160006001600160801b0316815260200160608152602001606081525090565b80516102b8816114b4565b8051600281900b81146102b857600080fd5b80516001600160801b03811681146102b857600080fd5b805161ffff811681146102b857600080fd5b805162ffffff811681146102b857600080fd5b600060208284031215610d85578081fd5b8135610d90816114b4565b9392505050565b600060208284031215610da8578081fd5b8151610d90816114b4565b60006020808385031215610dc5578182fd5b825167ffffffffffffffff811115610ddb578283fd5b8301601f81018513610deb578283fd5b8051610dfe610df982611466565b611442565b8181528381019083850185840285018601891015610e1a578687fd5b8694505b83851015610e45578051610e31816114b4565b835260019490940193918501918501610e1e565b50979650505050505050565b60006020808385031215610e63578182fd5b823567ffffffffffffffff811115610e79578283fd5b8301601f81018513610e89578283fd5b8035610e97610df982611466565b8181528381019083850185840285018601891015610eb3578687fd5b8694505b83851015610e45578035835260019490940193918501918501610eb7565b600060208284031215610ee6578081fd5b815167ffffffffffffffff80821115610efd578283fd5b818401915084601f830112610f10578283fd5b815181811115610f1c57fe5b610f2f601f8201601f1916602001611442565b9150808252856020828501011115610f45578384fd5b6105d4816020840160208601611484565b600060208284031215610f67578081fd5b610d9082610d38565b600080600060608486031215610f84578182fd5b610f8d84610d38565b9250610f9b60208501610d38565b9150604084015190509250925092565b600080600080600080600060e0888a031215610fc5578283fd5b8751610fd0816114b4565b9650610fde60208901610d26565b9550610fec60408901610d4f565b9450610ffa60608901610d4f565b935061100860808901610d4f565b925060a088015160ff8116811461101d578283fd5b60c08901519092508015158114611032578182fd5b8091505092959891949750929550565b600060208284031215611053578081fd5b5035919050565b60006020828403121561106b578081fd5b5051919050565b6000806000806000806000806000806000806101808d8f031215611094578586fd5b8c516bffffffffffffffffffffffff811681146110af578687fd5b9b506110bd60208e01610d1b565b9a506110cb60408e01610d1b565b99506110d960608e01610d1b565b98506110e760808e01610d61565b97506110f560a08e01610d26565b965061110360c08e01610d26565b955061111160e08e01610d38565b94506101008d015193506101208d015192506111306101408e01610d38565b915061113f6101608e01610d38565b90509295989b509295989b509295989b565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156111965781516001600160a01b031687529582019590820190600101611171565b509495945050505050565b6000815180845260208085019450808401835b83811015611196578151875295820195908201906001016111b4565b60020b9052565b600081518084526111ef816020860160208601611484565b601f01601f19169290920160200192915050565b600061022082518452602083015161121e6020860182611151565b5060408301516112316040860182611151565b506060830151816060860152611249828601826111d7565b9150506080830151848203608086015261126382826111d7565b91505060a083015161127860a0860182611355565b5060c083015161128b60c0860182611151565b5060e083015161129e60e0860182611151565b50610100838101519085015261012080840151908501526101408084015190850152610160808401516112d3828701826111d0565b5050610180808401516112e8828701826111d0565b50506101a0808401516112fd828701826111d0565b50506101c08084015161131282870182611348565b50506101e0808401518583038287015261132c838261115e565b92505050610200808401518583038287015261041c83826111a1565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561140657603f198886030184526113f4858351611203565b945092850192908501906001016113d8565b5092979650505050505050565b600060208252610d9060208301846111a1565b600060208252610d906020830184611203565b90815260200190565b60405181810167ffffffffffffffff8111828210171561145e57fe5b604052919050565b600067ffffffffffffffff82111561147a57fe5b5060209081020190565b60005b8381101561149f578181015183820152602001611487565b838111156114ae576000848401525b50505050565b6001600160a01b03811681146114c957600080fd5b5056fea2646970667358221220a772f0cd617eeac1055a7e13142fe3fb0437c8c9332e40f26e3f032b968324df64736f6c63430007060033
Deployed Bytecode Sourcemap
16737:4137:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17109:363;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19010:319;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19337:676::-;;;;;;:::i;:::-;;:::i;20021:848::-;;;;;;:::i;:::-;;:::i;17001:99::-;;;:::i;:::-;;;;;;;:::i;16883:111::-;;;:::i;17480:1522::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16762:114::-;;;:::i;17109:363::-;17197:24;17252:16;;:33;;-1:-1:-1;;;17252:33:0;;17168:16;;17197:24;-1:-1:-1;;;;;17252:16:0;;:26;;:33;;17279:5;;17252:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17224:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17224:72:0;;17197:99;;17312:9;17307:131;17331:7;:14;17327:1;:18;17307:131;;;17380:16;;:46;;-1:-1:-1;;;17380:46:0;;-1:-1:-1;;;;;17380:16:0;;;;:36;;:46;;17417:5;;17424:1;;17380:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17367:7;17375:1;17367:10;;;;;;;;;;;;;;;;;:59;17347:3;;17307:131;;;-1:-1:-1;17457:7:0;-1:-1:-1;17109:363:0;;;;:::o;19010:319::-;19099:15;19127:22;19165:7;:14;19152:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;19127:53;;19196:9;19191:105;19215:7;:14;19211:1;:18;19191:105;;;19263:21;19273:7;19281:1;19273:10;;;;;;;;;;;;;;19263:9;:21::i;:::-;19251:6;19258:1;19251:9;;;;;;;;;;;;;;;;;:33;19231:3;;19191:105;;19337:676;19412:15;19440:24;19467:20;19481:5;19467:13;:20::i;:::-;19440:47;;19583:18;19621:3;19604:7;:14;:20;:47;;19650:1;19604:47;;;19644:3;19627:7;:14;:20;19604:47;19679:14;;19583:68;;-1:-1:-1;19679:27:0;;;19662:14;19679:27;19821:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19821:21:0;;19791:51;;19860:9;19855:103;19879:6;19875:1;:10;19855:103;;;19923:7;19944:1;19931:10;:14;19923:23;;;;;;;;;;;;;;19907:10;19918:1;19907:13;;;;;;;;;;;;;;;;;:39;19887:3;;19855:103;;;;19977:28;19994:10;19977:16;:28::i;:::-;19970:35;19337:676;-1:-1:-1;;;;;;19337:676:0:o;20021:848::-;20095:16;20124:29;20170:6;:13;20156:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20156:28:0;;20124:60;;20195:13;20230:9;20225:363;20249:6;:13;20245:1;:17;20225:363;;;20288:16;;20313:9;;-1:-1:-1;;;;;20288:16:0;;;;:24;;20313:6;;20320:1;;20313:9;;;;;;;;;;;;20288:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20288:35:0;;;;;;;;-1:-1:-1;;20288:35:0;;;;;;;;;;;;:::i;:::-;;;20284:293;;;;;;20428:6;20435:1;20428:9;;;;;;;;;;;;;;20406:12;20419:5;20406:19;;;;;;;;;;;;;;;;;:31;20456:7;;;;;20284:293;20264:3;;20225:363;;;;20671:29;20717:5;20703:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20703:20:0;;20671:52;;20739:9;20734:96;20758:5;20754:1;:9;20734:96;;;20803:12;20816:1;20803:15;;;;;;;;;;;;;;20785:12;20798:1;20785:15;;;;;;;;;;;;;;;;;:33;20765:3;;20734:96;;;-1:-1:-1;20849:12:0;20021:848;-1:-1:-1;;;;20021:848:0:o;17001:99::-;;;-1:-1:-1;;;;;17001:99:0;;:::o;16883:111::-;;;-1:-1:-1;;;;;16883:111:0;;:::o;17480:1522::-;17536:13;;:::i;:::-;17562:20;;:::i;:::-;17595:22;;;:13;17896:16;:34;;-1:-1:-1;;;17896:34:0;;-1:-1:-1;;;;;17896:16:0;;;;:26;;:34;;17611:6;;17896:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;17628:302:0;17818:16;;;17628:302;;;;;;;17786:17;;;17628:302;;;;;;17754:17;;;17628:302;;;17729:10;;;17628:302;;;-1:-1:-1;;;;;17628:302:0;;;-1:-1:-1;17701:13:0;;;17628:302;;;;;;-1:-1:-1;17673:13:0;;17628:302;;;17965:15;;:115;;-1:-1:-1;;;17965:115:0;;:15;;;;;-1:-1:-1;17965:23:0;;-1:-1:-1;17965:115:0;;17628:302;;;17965:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17943:137:0;;;:19;;;:137;;;18114:11;;:39;;-1:-1:-1;;;18114:39:0;;:11;;;:18;;:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18091:62:0;:20;;;:62;;;18206:81;;-1:-1:-1;;;18206:81:0;;:73;;:81;;18280:6;;18206:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;18164:123:0;;;18183:17;;;18164:123;;18165:16;;;18164:123;18324:13;;;;18317:30;;;-1:-1:-1;;;18317:30:0;;;;-1:-1:-1;;;;;18317:28:0;;;;;;:30;;;;;-1:-1:-1;;18317:30:0;;;;;;;;:28;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18317:30:0;;;;;;;;;;;;:::i;:::-;18300:6;:14;;:47;;;;18382:6;:13;;;-1:-1:-1;;;;;18375:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18375:30:0;;;;;;;;;;;;:::i;:::-;18358:6;:14;;:47;;;;18454:6;:19;;;-1:-1:-1;;;;;18440:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18416:70:0;:6;:21;;:70;;;;;18522:1;18497:6;:22;;:26;;;;;18576:6;:19;;;-1:-1:-1;;;;;18562:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18534:70:0;;;;;;18537:11;;;18534:70;-1:-1:-1;18654:20:0;;;;18639:54;;;-1:-1:-1;;;18639:54:0;;;;-1:-1:-1;;;;;18639:52:0;;;;;;:54;;;;;;;;;;;;;;;:52;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18639:54:0;;;;;;;;;;;;:::i;:::-;18617:19;;;:76;;;18740:26;18726:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18726:41:0;-1:-1:-1;18704:19:0;;;:63;18783:9;18778:191;18802:6;:19;;;:26;18798:1;:30;18778:191;;;18890:6;:20;;;-1:-1:-1;;;;;18875:43:0;;18919:6;:19;;;18939:1;18919:22;;;;;;;;;;;;;;18943:6;:13;;;18875:82;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18850:6;:19;;;18870:1;18850:22;;;;;;;;;;;;;;;;;:107;18830:3;;18778:191;;16762:114;;;-1:-1:-1;;;;;16762:114:0;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:142:1:-;95:13;;117:33;95:13;117:33;:::i;161:166::-;240:13;;293:1;282:20;;;272:31;;262:2;;317:1;314;307:12;332:194;413:13;;-1:-1:-1;;;;;455:46:1;;445:57;;435:2;;516:1;513;506:12;531:165;611:13;;664:6;653:18;;643:29;;633:2;;686:1;683;676:12;701:167;781:13;;834:8;823:20;;813:31;;803:2;;858:1;855;848:12;873:259;;985:2;973:9;964:7;960:23;956:32;953:2;;;1006:6;998;991:22;953:2;1050:9;1037:23;1069:33;1096:5;1069:33;:::i;:::-;1121:5;943:189;-1:-1:-1;;;943:189:1:o;1137:263::-;;1260:2;1248:9;1239:7;1235:23;1231:32;1228:2;;;1281:6;1273;1266:22;1228:2;1318:9;1312:16;1337:33;1364:5;1337:33;:::i;1405:1020::-;;1531:2;1574;1562:9;1553:7;1549:23;1545:32;1542:2;;;1595:6;1587;1580:22;1542:2;1633:9;1627:16;1666:18;1658:6;1655:30;1652:2;;;1703:6;1695;1688:22;1652:2;1731:22;;1784:4;1776:13;;1772:27;-1:-1:-1;1762:2:1;;1818:6;1810;1803:22;1762:2;1852;1846:9;1875:65;1890:49;1936:2;1890:49;:::i;:::-;1875:65;:::i;:::-;1974:15;;;2005:12;;;;2037:11;;;2075;;;2067:20;;2063:29;;2060:42;-1:-1:-1;2057:2:1;;;2120:6;2112;2105:22;2057:2;2147:6;2138:15;;2162:233;2176:2;2173:1;2170:9;2162:233;;;2240:3;2234:10;2257:33;2284:5;2257:33;:::i;:::-;2303:18;;2194:1;2187:9;;;;;2341:12;;;;2373;;2162:233;;;-1:-1:-1;2414:5:1;1511:914;-1:-1:-1;;;;;;;1511:914:1:o;2430:953::-;;2545:2;2588;2576:9;2567:7;2563:23;2559:32;2556:2;;;2609:6;2601;2594:22;2556:2;2654:9;2641:23;2687:18;2679:6;2676:30;2673:2;;;2724:6;2716;2709:22;2673:2;2752:22;;2805:4;2797:13;;2793:27;-1:-1:-1;2783:2:1;;2839:6;2831;2824:22;2783:2;2880;2867:16;2903:65;2918:49;2964:2;2918:49;:::i;2903:65::-;3002:15;;;3033:12;;;;3065:11;;;3103;;;3095:20;;3091:29;;3088:42;-1:-1:-1;3085:2:1;;;3148:6;3140;3133:22;3085:2;3175:6;3166:15;;3190:163;3204:2;3201:1;3198:9;3190:163;;;3261:17;;3249:30;;3222:1;3215:9;;;;;3299:12;;;;3331;;3190:163;;3388:736;;3521:2;3509:9;3500:7;3496:23;3492:32;3489:2;;;3542:6;3534;3527:22;3489:2;3580:9;3574:16;3609:18;3650:2;3642:6;3639:14;3636:2;;;3671:6;3663;3656:22;3636:2;3714:6;3703:9;3699:22;3689:32;;3759:7;3752:4;3748:2;3744:13;3740:27;3730:2;;3786:6;3778;3771:22;3730:2;3820;3814:9;3842:2;3838;3835:10;3832:2;;;3848:9;3832:2;3881:52;3923:2;3904:13;;-1:-1:-1;;3900:27:1;3929:2;3896:36;3881:52;:::i;:::-;3868:65;;3956:2;3949:5;3942:17;3996:7;3991:2;3986;3982;3978:11;3974:20;3971:33;3968:2;;;4022:6;4014;4007:22;3968:2;4040:54;4091:2;4086;4079:5;4075:14;4070:2;4066;4062:11;4040:54;:::i;4129:220::-;;4252:2;4240:9;4231:7;4227:23;4223:32;4220:2;;;4273:6;4265;4258:22;4220:2;4301:42;4333:9;4301:42;:::i;4354:368::-;;;;4511:2;4499:9;4490:7;4486:23;4482:32;4479:2;;;4532:6;4524;4517:22;4479:2;4560:42;4592:9;4560:42;:::i;:::-;4550:52;;4621:51;4668:2;4657:9;4653:18;4621:51;:::i;:::-;4611:61;;4712:2;4701:9;4697:18;4691:25;4681:35;;4469:253;;;;;:::o;4727:945::-;;;;;;;;4942:3;4930:9;4921:7;4917:23;4913:33;4910:2;;;4964:6;4956;4949:22;4910:2;5001:9;4995:16;5020:33;5047:5;5020:33;:::i;:::-;5072:5;-1:-1:-1;5096:49:1;5141:2;5126:18;;5096:49;:::i;:::-;5086:59;;5164:50;5210:2;5199:9;5195:18;5164:50;:::i;:::-;5154:60;;5233:50;5279:2;5268:9;5264:18;5233:50;:::i;:::-;5223:60;;5302:51;5348:3;5337:9;5333:19;5302:51;:::i;:::-;5292:61;;5398:3;5387:9;5383:19;5377:26;5447:4;5438:7;5434:18;5425:7;5422:31;5412:2;;5472:6;5464;5457:22;5412:2;5552:3;5537:19;;5531:26;5500:7;;-1:-1:-1;5595:15:1;;5588:23;5576:36;;5566:2;;5631:6;5623;5616:22;5566:2;5659:7;5649:17;;;4900:772;;;;;;;;;;:::o;5677:190::-;;5789:2;5777:9;5768:7;5764:23;5760:32;5757:2;;;5810:6;5802;5795:22;5757:2;-1:-1:-1;5838:23:1;;5747:120;-1:-1:-1;5747:120:1:o;5872:194::-;;5995:2;5983:9;5974:7;5970:23;5966:32;5963:2;;;6016:6;6008;6001:22;5963:2;-1:-1:-1;6044:16:1;;5953:113;-1:-1:-1;5953:113:1:o;6071:1224::-;;;;;;;;;;;;;6377:3;6365:9;6356:7;6352:23;6348:33;6345:2;;;6399:6;6391;6384:22;6345:2;6436:9;6430:16;6486:26;6479:5;6475:38;6468:5;6465:49;6455:2;;6533:6;6525;6518:22;6455:2;6561:5;-1:-1:-1;6585:51:1;6632:2;6617:18;;6585:51;:::i;:::-;6575:61;;6655:51;6702:2;6691:9;6687:18;6655:51;:::i;:::-;6645:61;;6725:51;6772:2;6761:9;6757:18;6725:51;:::i;:::-;6715:61;;6795:51;6841:3;6830:9;6826:19;6795:51;:::i;:::-;6785:61;;6865:50;6910:3;6899:9;6895:19;6865:50;:::i;:::-;6855:60;;6934:50;6979:3;6968:9;6964:19;6934:50;:::i;:::-;6924:60;;7003:52;7050:3;7039:9;7035:19;7003:52;:::i;:::-;6993:62;;7095:3;7084:9;7080:19;7074:26;7064:36;;7140:3;7129:9;7125:19;7119:26;7109:36;;7165:52;7212:3;7201:9;7197:19;7165:52;:::i;:::-;7154:63;;7237:52;7284:3;7273:9;7269:19;7237:52;:::i;:::-;7226:63;;6335:960;;;;;;;;;;;;;;:::o;7300:106::-;-1:-1:-1;;;;;7368:31:1;7356:44;;7346:60::o;7411:469::-;;7508:5;7502:12;7535:6;7530:3;7523:19;7561:4;7590:2;7585:3;7581:12;7574:19;;7627:2;7620:5;7616:14;7648:3;7660:195;7674:6;7671:1;7668:13;7660:195;;;7739:13;;-1:-1:-1;;;;;7735:39:1;7723:52;;7795:12;;;;7830:15;;;;7771:1;7689:9;7660:195;;;-1:-1:-1;7871:3:1;;7478:402;-1:-1:-1;;;;;7478:402:1:o;7885:443::-;;7982:5;7976:12;8009:6;8004:3;7997:19;8035:4;8064:2;8059:3;8055:12;8048:19;;8101:2;8094:5;8090:14;8122:3;8134:169;8148:6;8145:1;8142:13;8134:169;;;8209:13;;8197:26;;8243:12;;;;8278:15;;;;8170:1;8163:9;8134:169;;8333:93;8410:1;8399:20;8387:33;;8377:49::o;8431:260::-;;8513:5;8507:12;8540:6;8535:3;8528:19;8556:63;8612:6;8605:4;8600:3;8596:14;8589:4;8582:5;8578:16;8556:63;:::i;:::-;8673:2;8652:15;-1:-1:-1;;8648:29:1;8639:39;;;;8680:4;8635:50;;8483:208;-1:-1:-1;;8483:208:1:o;8696:2201::-;;8776:6;8809:5;8803:12;8798:3;8791:25;8862:4;8855:5;8851:16;8845:23;8877:50;8921:4;8916:3;8912:14;8898:12;8877:50;:::i;:::-;;8975:4;8968:5;8964:16;8958:23;8990:52;9036:4;9031:3;9027:14;9011;8990:52;:::i;:::-;;9090:4;9083:5;9079:16;9073:23;9128:2;9121:4;9116:3;9112:14;9105:26;9152:49;9197:2;9192:3;9188:12;9172:14;9152:49;:::i;:::-;9140:61;;;9249:4;9242:5;9238:16;9232:23;9297:3;9291:4;9287:14;9280:4;9275:3;9271:14;9264:38;9325:41;9361:4;9345:14;9325:41;:::i;:::-;9311:55;;;9414:4;9407:5;9403:16;9397:23;9429:51;9474:4;9469:3;9465:14;9449;9429:51;:::i;:::-;;9528:4;9521:5;9517:16;9511:23;9543:52;9589:4;9584:3;9580:14;9564;9543:52;:::i;:::-;;9643:4;9636:5;9632:16;9626:23;9658:52;9704:4;9699:3;9695:14;9679;9658:52;:::i;:::-;-1:-1:-1;9729:6:1;9771:14;;;9765:21;9751:12;;;9744:43;9806:6;9848:14;;;9842:21;9828:12;;;9821:43;9883:6;9925:14;;;9919:21;9905:12;;;9898:43;9960:6;10003:14;;;9997:21;10027:48;10062:12;;;9997:21;10027:48;:::i;:::-;;;10094:6;10148:2;10141:5;10137:14;10131:21;10161:48;10205:2;10200:3;10196:12;10180:14;10161:48;:::i;:::-;;;10228:6;10282:2;10275:5;10271:14;10265:21;10295:48;10339:2;10334:3;10330:12;10314:14;10295:48;:::i;:::-;;;10362:6;10417:2;10410:5;10406:14;10400:21;10430:51;10477:2;10472:3;10468:12;10451:15;10430:51;:::i;:::-;;;10500:6;10555:2;10548:5;10544:14;10538:21;10601:3;10593:6;10589:16;10584:2;10579:3;10575:12;10568:38;10629:59;10681:6;10664:15;10629:59;:::i;:::-;10615:73;;;;10708:6;10763:3;10756:5;10752:15;10746:22;10811:3;10803:6;10799:16;10793:3;10788;10784:13;10777:39;10832:59;10884:6;10867:15;10832:59;:::i;10902:121::-;-1:-1:-1;;;;;10970:46:1;10958:59;;10948:75::o;11028:94::-;11106:8;11095:20;11083:33;;11073:49::o;11127:203::-;-1:-1:-1;;;;;11291:32:1;;;;11273:51;;11261:2;11246:18;;11228:102::o;11335:388::-;-1:-1:-1;;;;;11591:15:1;;;11573:34;;11643:15;;;;11638:2;11623:18;;11616:43;11707:8;11695:21;;;11690:2;11675:18;;11668:49;11523:2;11508:18;;11490:233::o;11728:274::-;-1:-1:-1;;;;;11920:32:1;;;;11902:51;;11984:2;11969:18;;11962:34;11890:2;11875:18;;11857:145::o;12007:843::-;;12224:2;12264;12253:9;12249:18;12294:2;12283:9;12276:21;12317:6;12352;12346:13;12383:6;12375;12368:22;12421:2;12410:9;12406:18;12399:25;;12484:2;12478;12470:6;12466:15;12455:9;12451:31;12447:40;12433:54;;12522:2;12514:6;12510:15;12543:4;12556:265;12570:6;12567:1;12564:13;12556:265;;;12663:2;12659:7;12647:9;12639:6;12635:22;12631:36;12626:3;12619:49;12691:50;12734:6;12725;12719:13;12691:50;:::i;:::-;12681:60;-1:-1:-1;12799:12:1;;;;12764:15;;;;12592:1;12585:9;12556:265;;;-1:-1:-1;12838:6:1;;12204:646;-1:-1:-1;;;;;;;12204:646:1:o;12855:267::-;;13034:2;13023:9;13016:21;13054:62;13112:2;13101:9;13097:18;13089:6;13054:62;:::i;13820:256::-;;13995:2;13984:9;13977:21;14015:55;14066:2;14055:9;14051:18;14043:6;14015:55;:::i;14081:177::-;14227:25;;;14215:2;14200:18;;14182:76::o;14263:242::-;14333:2;14327:9;14363:17;;;14410:18;14395:34;;14431:22;;;14392:62;14389:2;;;14457:9;14389:2;14484;14477:22;14307:198;;-1:-1:-1;14307:198:1:o;14510:183::-;;14609:18;14601:6;14598:30;14595:2;;;14631:9;14595:2;-1:-1:-1;14682:4:1;14663:17;;;14659:28;;14585:108::o;14698:258::-;14770:1;14780:113;14794:6;14791:1;14788:13;14780:113;;;14870:11;;;14864:18;14851:11;;;14844:39;14816:2;14809:10;14780:113;;;14911:6;14908:1;14905:13;14902:2;;;14946:1;14937:6;14932:3;14928:16;14921:27;14902:2;;14751:205;;;:::o;14961:133::-;-1:-1:-1;;;;;15038:31:1;;15028:42;;15018:2;;15084:1;15081;15074:12;15018:2;15008:86;:::o
Swarm Source
ipfs://a772f0cd617eeac1055a7e13142fe3fb0437c8c9332e40f26e3f032b968324df
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 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.