Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PermanentStorage
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.5;
import "./interface/IPermanentStorage.sol";
import "./utils/lib_storage/PSStorage.sol";
contract PermanentStorage is IPermanentStorage {
// Constants do not have storage slot.
bytes32 public constant curveTokenIndexStorageId = 0xf4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc; // keccak256("curveTokenIndex")
bytes32 public constant transactionSeenStorageId = 0x695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0; // keccak256("transactionSeen")
bytes32 public constant relayerValidStorageId = 0x2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61; // keccak256("relayerValid")
// Below are the variables which consume storage slots.
address public operator;
string public version; // Current version of the contract
mapping(bytes32 => mapping(address => bool)) private permission;
// Supported Curve pools
address public constant CURVE_COMPOUND_POOL = 0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56;
address public constant CURVE_USDT_POOL = 0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C;
address public constant CURVE_Y_POOL = 0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51;
address public constant CURVE_3_POOL = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7;
address public constant CURVE_sUSD_POOL = 0xA5407eAE9Ba41422680e2e00537571bcC53efBfD;
address public constant CURVE_BUSD_POOL = 0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27;
// Curve coins
address private constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address private constant cDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
address private constant cUSDC = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
address private constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address private constant TUSD = 0x0000000000085d4780B73119b644AE5ecd22b376;
address private constant Y_POOL_yDAI = 0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01;
address private constant Y_POOL_yUSDC = 0xd6aD7a6750A7593E092a9B218d66C0A814a3436e;
address private constant Y_POOL_yUSDT = 0x83f798e925BcD4017Eb265844FDDAbb448f1707D;
address private constant Y_POOL_yTUSD = 0x73a052500105205d34Daf004eAb301916DA8190f;
address private constant sUSD = 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51;
address private constant BUSD = 0x4Fabb145d64652a948d72533023f6E7A623C7C53;
address private constant BUSD_POOL_yDAI = 0xC2cB1040220768554cf699b0d863A3cd4324ce32;
address private constant BUSD_POOL_yUSDC = 0x26EA744E5B887E5205727f55dFBE8685e3b21951;
address private constant BUSD_POOL_yUSDT = 0xE6354ed5bC4b393a5Aad09f21c46E101e692d447;
address private constant BUSD_POOL_yBUSD = 0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE;
/************************************************************
* Access control and ownership management *
*************************************************************/
modifier onlyOperator() {
require(operator == msg.sender, "PermanentStorage: not the operator");
_;
}
modifier validRole(bool _enabled, address _role) {
if (_enabled) {
require(
(_role == operator) || (_role == ammWrapperAddr()) || (_role == pmmAddr()),
"PermanentStorage: not a valid role"
);
}
_;
}
modifier isPermitted(bytes32 _storageId, address _role) {
require(permission[_storageId][_role], "PermanentStorage: has no permission");
_;
}
function transferOwnership(address _newOperator) external onlyOperator {
require(_newOperator != address(0), "PermanentStorage: operator can not be zero address");
operator = _newOperator;
}
/// @dev Set permission for entity to write certain storage.
function setPermission(bytes32 _storageId, address _role, bool _enabled) external onlyOperator validRole(_enabled, _role) {
permission[_storageId][_role] = _enabled;
}
/************************************************************
* Constructor and init functions *
*************************************************************/
/// @dev Replacing constructor and initialize the contract. This function should only be called once.
function initialize() external {
require(
keccak256(abi.encodePacked(version)) == keccak256(abi.encodePacked("5.0.0")),
"PermanentStorage: not upgrading from 5.0.0 version"
);
version = "5.1.0";
// register Compound pool
// underlying_coins, exchange_underlying
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_COMPOUND_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_COMPOUND_POOL][USDC] = 2;
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_COMPOUND_POOL][cDAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_COMPOUND_POOL][cUSDC] = 2;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_COMPOUND_POOL] = true; // support get_dx or get_dx_underlying for quoting
// register USDT pool
// underlying_coins, exchange_underlying
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][USDC] = 2;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][USDT] = 3;
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][cDAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][cUSDC] = 2;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][USDT] = 3;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_USDT_POOL] = true;
// register Y pool
// underlying_coins, exchange_underlying
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][USDC] = 2;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][USDT] = 3;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][TUSD] = 4;
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yDAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yUSDC] = 2;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yUSDT] = 3;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yTUSD] = 4;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_Y_POOL] = true;
// register 3 pool
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][USDC] = 2;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][USDT] = 3;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_3_POOL] = false; // only support get_dy and get_dy_underlying for exactly the same functionality
// register sUSD pool
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][USDC] = 2;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][USDT] = 3;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][sUSD] = 4;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_sUSD_POOL] = false;
// register BUSD pool
// underlying_coins, exchange_underlying
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][DAI] = 1;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][USDC] = 2;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][USDT] = 3;
AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][BUSD] = 4;
// coins, exchange
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yDAI] = 1;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yUSDC] = 2;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yUSDT] = 3;
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yBUSD] = 4;
AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_BUSD_POOL] = true;
}
/************************************************************
* Getter functions *
*************************************************************/
function hasPermission(bytes32 _storageId, address _role) external view returns (bool) {
return permission[_storageId][_role];
}
function ammWrapperAddr() public view returns (address) {
return PSStorage.getStorage().ammWrapperAddr;
}
function pmmAddr() public view returns (address) {
return PSStorage.getStorage().pmmAddr;
}
function wethAddr() override external view returns (address) {
return PSStorage.getStorage().wethAddr;
}
function getCurvePoolInfo(address _makerAddr, address _takerAssetAddr, address _makerAssetAddr) override external view returns (int128 takerAssetIndex, int128 makerAssetIndex, uint16 swapMethod, bool supportGetDx) {
// underlying_coins
int128 i = AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][_takerAssetAddr];
int128 j = AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][_makerAssetAddr];
supportGetDx = AMMWrapperStorage.getStorage().curveSupportGetDx[_makerAddr];
swapMethod = 0;
if (i != 0 && j != 0) {
// in underlying_coins list
takerAssetIndex = i;
makerAssetIndex = j;
// exchange_underlying
swapMethod = 2;
} else {
// in coins list
int128 iWrapped = AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][_takerAssetAddr];
int128 jWrapped = AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][_makerAssetAddr];
if (iWrapped != 0 && jWrapped != 0) {
takerAssetIndex = iWrapped;
makerAssetIndex = jWrapped;
// exchange
swapMethod = 1;
} else {
revert("PermanentStorage: invalid pair");
}
}
return (takerAssetIndex, makerAssetIndex, swapMethod, supportGetDx);
}
function isTransactionSeen(bytes32 _transactionHash) override external view returns (bool) {
return AMMWrapperStorage.getStorage().transactionSeen[_transactionHash];
}
function isRelayerValid(address _relayer) override external view returns (bool) {
return AMMWrapperStorage.getStorage().relayerValid[_relayer];
}
/************************************************************
* Management functions for Operator *
*************************************************************/
/// @dev Update AMMWrapper contract address.
function upgradeAMMWrapper(address _newAMMWrapper) external onlyOperator {
PSStorage.getStorage().ammWrapperAddr = _newAMMWrapper;
}
/// @dev Update PMM contract address.
function upgradePMM(address _newPMM) external onlyOperator {
PSStorage.getStorage().pmmAddr = _newPMM;
}
/// @dev Update WETH contract address.
function upgradeWETH(address _newWETH) external onlyOperator {
PSStorage.getStorage().wethAddr = _newWETH;
}
/************************************************************
* External functions *
*************************************************************/
function setCurvePoolInfo(address _makerAddr, address[] calldata _underlyingCoins, address[] calldata _coins, bool _supportGetDx) override external isPermitted(curveTokenIndexStorageId, msg.sender) {
int128 underlyingCoinsLength = int128(_underlyingCoins.length);
for (int128 i = 0 ; i < underlyingCoinsLength; i++) {
address assetAddr = _underlyingCoins[uint256(i)];
// underlying coins for original DAI, USDC, TUSD
AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][assetAddr] = i + 1; // Start the index from 1
}
int128 coinsLength = int128(_coins.length);
for (int128 i = 0 ; i < coinsLength; i++) {
address assetAddr = _coins[uint256(i)];
// wrapped coins for cDAI, cUSDC, yDAI, yUSDC, yTUSD, yBUSD
AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][assetAddr] = i + 1; // Start the index from 1
}
AMMWrapperStorage.getStorage().curveSupportGetDx[_makerAddr] = _supportGetDx;
}
function setTransactionSeen(bytes32 _transactionHash) override external isPermitted(transactionSeenStorageId, msg.sender) {
AMMWrapperStorage.getStorage().transactionSeen[_transactionHash] = true;
}
function setRelayersValid(address[] calldata _relayers, bool[] calldata _isValids) override external isPermitted(relayerValidStorageId, msg.sender) {
require(_relayers.length == _isValids.length, "PermanentStorage: inputs length mismatch");
for (uint256 i = 0; i < _relayers.length; i++) {
AMMWrapperStorage.getStorage().relayerValid[_relayers[i]] = _isValids[i];
}
}
}pragma solidity ^0.6.0;
interface IPermanentStorage {
function wethAddr() external view returns (address);
function getCurvePoolInfo(address _makerAddr, address _takerAssetAddr, address _makerAssetAddr) external view returns (int128 takerAssetIndex, int128 makerAssetIndex, uint16 swapMethod, bool supportGetDx);
function setCurvePoolInfo(address _makerAddr, address[] calldata _underlyingCoins, address[] calldata _coins, bool _supportGetDx) external;
function isTransactionSeen(bytes32 _transactionHash) external view returns (bool);
function isRelayerValid(address _relayer) external view returns (bool);
function setTransactionSeen(bytes32 _transactionHash) external;
function setRelayersValid(address[] memory _relayers, bool[] memory _isValids) external;
}pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;
library PSStorage {
bytes32 private constant STORAGE_SLOT = 0x92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba471;
struct Storage {
address ammWrapperAddr;
address pmmAddr;
address wethAddr;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.storage.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly { stor_slot := slot }
}
}
library AMMWrapperStorage {
bytes32 private constant STORAGE_SLOT = 0xd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e;
struct Storage {
mapping(bytes32 => bool) transactionSeen;
// curve pool => underlying token address => underlying token index
mapping(address => mapping(address => int128)) curveTokenIndexes;
mapping(address => bool) relayerValid;
// 5.1.0 appended storage
// curve pool => wrapped token address => wrapped token index
mapping(address => mapping(address => int128)) curveWrappedTokenIndexes;
mapping(address => bool) curveSupportGetDx;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.ammwrapper.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly { stor_slot := slot }
}
}
library PMMStorage {
bytes32 private constant STORAGE_SLOT = 0xf9faf013fe1696003dca3723ade1a1b88f21762ea39d9dfa2c55c5bd9c4ae6e9;
struct Storage {
mapping(bytes32 => address) transactions;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.pmm.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly { stor_slot := slot }
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"CURVE_3_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_BUSD_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_COMPOUND_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_USDT_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_Y_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_sUSD_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ammWrapperAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveTokenIndexStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address","name":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"}],"name":"getCurvePoolInfo","outputs":[{"internalType":"int128","name":"takerAssetIndex","type":"int128"},{"internalType":"int128","name":"makerAssetIndex","type":"int128"},{"internalType":"uint16","name":"swapMethod","type":"uint16"},{"internalType":"bool","name":"supportGetDx","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_storageId","type":"bytes32"},{"internalType":"address","name":"_role","type":"address"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"isRelayerValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_transactionHash","type":"bytes32"}],"name":"isTransactionSeen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pmmAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerValidStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address[]","name":"_underlyingCoins","type":"address[]"},{"internalType":"address[]","name":"_coins","type":"address[]"},{"internalType":"bool","name":"_supportGetDx","type":"bool"}],"name":"setCurvePoolInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_storageId","type":"bytes32"},{"internalType":"address","name":"_role","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_relayers","type":"address[]"},{"internalType":"bool[]","name":"_isValids","type":"bool[]"}],"name":"setRelayersValid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_transactionHash","type":"bytes32"}],"name":"setTransactionSeen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transactionSeenStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAMMWrapper","type":"address"}],"name":"upgradeAMMWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPMM","type":"address"}],"name":"upgradePMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWETH","type":"address"}],"name":"upgradeWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50612557806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637ecb557a116100f9578063cb4f87fd11610097578063e4e266e911610071578063e4e266e9146105ea578063e7cc2c8e146105f2578063ebe4a4c314610618578063f2fde38b14610620576101b9565b8063cb4f87fd146104f1578063d8dd97fb146104f9578063dbd1a14a14610516576101b9565b80638ab4a8cc116100d35780638ab4a8cc146104705780639a69e734146104d95780639dbea840146104e1578063b6f732ae146104e9576101b9565b80637ecb557a1461043a5780638014bd97146104605780638129fc1c14610468576101b9565b806356463d0a11610166578063676ff9cf11610140578063676ff9cf146103ea578063711fe8b614610410578063723ca616146104185780637d5aa5f414610432576101b9565b806356463d0a146103a6578063570ca735146103ae578063599e4c70146103b6576101b9565b806331f42f8e1161019757806331f42f8e1461024857806354f0bc791461026557806354fd4d5014610329576101b9565b8063241291e8146101be57806328545c0d146101e25780632feeea3a14610222575b600080fd5b6101c6610646565b604080516001600160a01b039092168252519081900360200190f35b61020e600480360360408110156101f857600080fd5b50803590602001356001600160a01b031661065e565b604080519115158252519081900360200190f35b61020e6004803603602081101561023857600080fd5b50356001600160a01b0316610689565b61020e6004803603602081101561025e57600080fd5b50356106b8565b6103276004803603604081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b9193909290916020810190356401000000008111156102e857600080fd5b8201836020820111156102fa57600080fd5b8035906020019184602083028401116401000000008311171561031c57600080fd5b5090925090506106d6565b005b61033161081f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c66108ac565b6101c66108c4565b610327600480360360608110156103cc57600080fd5b508035906001600160a01b03602082013516906040013515156108d3565b6103276004803603602081101561040057600080fd5b50356001600160a01b03166109ed565b6101c6610a70565b610420610a88565b60408051918252519081900360200190f35b6101c6610aac565b6103276004803603602081101561045057600080fd5b50356001600160a01b0316610ac8565b6101c6610b48565b610327610b64565b6104a86004803603606081101561048657600080fd5b506001600160a01b038135811691602081013582169160409091013516611ce3565b60408051600f95860b81529390940b602084015261ffff909116828401521515606082015290519081900360800190f35b610420611eab565b6101c6611ecf565b6101c6611ee7565b6101c6611f00565b6103276004803603602081101561050f57600080fd5b5035611f18565b6103276004803603608081101561052c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055757600080fd5b82018360208201111561056957600080fd5b8035906020019184602083028401116401000000008311171561058b57600080fd5b9193909290916020810190356401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b9193509150351515611fd3565b6104206121d7565b6103276004803603602081101561060857600080fd5b50356001600160a01b03166121fb565b6101c661227e565b6103276004803603602081101561063657600080fd5b50356001600160a01b0316612296565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c81565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610693612353565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006106c2612353565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166107665760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8483146107a45760405162461bcd60e51b815260040180806020018281038252602881526020018061242f6028913960400191505060405180910390fd5b60005b85811015610816578484828181106107bb57fe5b9050602002013515156107cc612353565b60020160008989858181106107dd57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016107a7565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b505050505081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6000546001600160a01b031681565b6000546001600160a01b0316331461091c5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b808281156109b6576000546001600160a01b03828116911614806109585750610943611ee7565b6001600160a01b0316816001600160a01b0316145b8061097b5750610966610b48565b6001600160a01b0316816001600160a01b0316145b6109b65760405162461bcd60e51b81526004018080602001828103825260228152602001806124ab6022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b03163314610a365760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610a3f612377565b600201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5181565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610ab6612377565b600201546001600160a01b0316905090565b6000546001600160a01b03163314610b115760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610b1a612377565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b6000610b52612377565b600101546001600160a01b0316905090565b60405160200180807f352e302e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012060016040516020018082805460018160011615610100020316600290048015610c0b5780601f10610be9576101008083540402835291820191610c0b565b820191906000526020600020905b815481529060010190602001808311610bf7575b50509150506040516020818303038152906040528051906020012014610c625760405162461bcd60e51b81526004018080602001828103825260328152602001806124576032913960400191505060405180910390fd5b6040805180820190915260058082527f352e312e300000000000000000000000000000000000000000000000000000006020909201918252610ca69160019161239b565b506001610cb1612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610d24612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155610d95612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610e08612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a566000908152600391909101602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001610e7b612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260049190910160205260409020805460ff19169115159190911790556001610ebb612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610f2e612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556003610fa1612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019182016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611012612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611085612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003918201602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556110f6612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611169612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260049190910160205260409020805460ff191691151591909117905560016111a9612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261121c612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600361128f612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611302612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001918201602090815260408083206e085d4780b73119b644ae5ecd22b376845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561136e612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207316de59092dae5ccf4a1e6439d611fd0653f0bd01845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026113e1612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260039182016020908152604080832073d6ad7a6750a7593e092a9b218d66c0a814a3436e845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611452612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207383f798e925bcd4017eb265844fddabb448f1707d845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560046114c5612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207373a052500105205d34daf004eab301916da8190f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611538612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260049190910160205260409020805460ff19169115159190911790556001611578612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026115eb612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561165c612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556116ce612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260049190910160205260409020805460ff1916911515919091179055600161170e612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611781612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556117f2612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611865612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd6000908152600391909101602090815260408083207357ab1ec28d129707052df4df418d58a2d46d5f51845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556118d7612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260049190910160205260409020805460ff19169115159190911790556001611917612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261198a612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560036119fd612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611a70612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600191820160209081526040808320734fabb145d64652a948d72533023f6e7a623c7c53845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611ae1612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073c2cb1040220768554cf699b0d863a3cd4324ce32845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611b54612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003918201602090815260408083207326ea744e5b887e5205727f55dfbe8685e3b21951845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611bc5612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073e6354ed5bc4b393a5aad09f21c46e101e692d447845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611c38612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600391909101602090815260408083207304bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611cab612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260049190910160205260409020805460ff1916911515919091179055565b6000806000806000611cf3612353565b6001600160a01b03808a16600090815260019290920160209081526040808420928b168452919052812054600f0b9150611d2b612353565b6001600160a01b03808b16600090815260019290920160209081526040808420928b168452919052902054600f0b9050611d63612353565b6001600160a01b038a166000908152600491909101602052604081205490945060ff169250600f82900b15801590611d9f575080600f0b600014155b15611db35781955080945060029350611ea0565b6000611dbd612353565b6001600160a01b03808c16600090815260039290920160209081526040808420928d168452919052812054600f0b9150611df5612353565b6001600160a01b03808d16600090815260039290920160209081526040808420928d168452919052902054600f90810b915082900b15801590611e3c575080600f0b600014155b15611e505781975080965060019550611e9d565b6040805162461bcd60e51b815260206004820152601e60248201527f5065726d616e656e7453746f726167653a20696e76616c696420706169720000604482015290519081900360640190fd5b50505b505093509350935093565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611ef1612377565b546001600160a01b0316905090565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a5681565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16611fa85760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b6001611fb2612353565b60009485526020526040909320805460ff1916931515939093179092555050565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff166120635760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8560005b81600f0b81600f0b12156120f9576000898983600f0b81811061208657fe5b905060200201356001600160a01b03169050816001016120a4612353565b6001600160a01b03808e166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6001600160801b03166001600160801b031990921691909117905501612067565b508460005b81600f0b81600f0b1215612194576000888883600f0b81811061211d57fe5b905060200201356001600160a01b031690508160010161213b612353565b6001600160a01b03808f1660009081526003929092016020908152604080842095909216835293909352919091208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001016120fe565b508461219e612353565b6001600160a01b039b909b1660009081526004909b016020526040909a20805460ff19169a15159a909a17909955505050505050505050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b031633146122445760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b8061224d612377565b600101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2781565b6000546001600160a01b031633146122df5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b6001600160a01b0381166123245760405162461bcd60e51b81526004018080602001828103825260328152602001806124f06032913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123dc57805160ff1916838001178555612409565b82800160010185558215612409579182015b828111156124095782518255916020019190600101906123ee565b50612415929150612419565b5090565b5b80821115612415576000815560010161241a56fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d20352e302e302076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220c5fb24b30a44467caa0ce170211c13d79ff765fb317f95bb991fba827a08110664736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101b95760003560e01c80637ecb557a116100f9578063cb4f87fd11610097578063e4e266e911610071578063e4e266e9146105ea578063e7cc2c8e146105f2578063ebe4a4c314610618578063f2fde38b14610620576101b9565b8063cb4f87fd146104f1578063d8dd97fb146104f9578063dbd1a14a14610516576101b9565b80638ab4a8cc116100d35780638ab4a8cc146104705780639a69e734146104d95780639dbea840146104e1578063b6f732ae146104e9576101b9565b80637ecb557a1461043a5780638014bd97146104605780638129fc1c14610468576101b9565b806356463d0a11610166578063676ff9cf11610140578063676ff9cf146103ea578063711fe8b614610410578063723ca616146104185780637d5aa5f414610432576101b9565b806356463d0a146103a6578063570ca735146103ae578063599e4c70146103b6576101b9565b806331f42f8e1161019757806331f42f8e1461024857806354f0bc791461026557806354fd4d5014610329576101b9565b8063241291e8146101be57806328545c0d146101e25780632feeea3a14610222575b600080fd5b6101c6610646565b604080516001600160a01b039092168252519081900360200190f35b61020e600480360360408110156101f857600080fd5b50803590602001356001600160a01b031661065e565b604080519115158252519081900360200190f35b61020e6004803603602081101561023857600080fd5b50356001600160a01b0316610689565b61020e6004803603602081101561025e57600080fd5b50356106b8565b6103276004803603604081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b9193909290916020810190356401000000008111156102e857600080fd5b8201836020820111156102fa57600080fd5b8035906020019184602083028401116401000000008311171561031c57600080fd5b5090925090506106d6565b005b61033161081f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c66108ac565b6101c66108c4565b610327600480360360608110156103cc57600080fd5b508035906001600160a01b03602082013516906040013515156108d3565b6103276004803603602081101561040057600080fd5b50356001600160a01b03166109ed565b6101c6610a70565b610420610a88565b60408051918252519081900360200190f35b6101c6610aac565b6103276004803603602081101561045057600080fd5b50356001600160a01b0316610ac8565b6101c6610b48565b610327610b64565b6104a86004803603606081101561048657600080fd5b506001600160a01b038135811691602081013582169160409091013516611ce3565b60408051600f95860b81529390940b602084015261ffff909116828401521515606082015290519081900360800190f35b610420611eab565b6101c6611ecf565b6101c6611ee7565b6101c6611f00565b6103276004803603602081101561050f57600080fd5b5035611f18565b6103276004803603608081101561052c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055757600080fd5b82018360208201111561056957600080fd5b8035906020019184602083028401116401000000008311171561058b57600080fd5b9193909290916020810190356401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b9193509150351515611fd3565b6104206121d7565b6103276004803603602081101561060857600080fd5b50356001600160a01b03166121fb565b6101c661227e565b6103276004803603602081101561063657600080fd5b50356001600160a01b0316612296565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c81565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610693612353565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006106c2612353565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166107665760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8483146107a45760405162461bcd60e51b815260040180806020018281038252602881526020018061242f6028913960400191505060405180910390fd5b60005b85811015610816578484828181106107bb57fe5b9050602002013515156107cc612353565b60020160008989858181106107dd57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016107a7565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b505050505081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6000546001600160a01b031681565b6000546001600160a01b0316331461091c5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b808281156109b6576000546001600160a01b03828116911614806109585750610943611ee7565b6001600160a01b0316816001600160a01b0316145b8061097b5750610966610b48565b6001600160a01b0316816001600160a01b0316145b6109b65760405162461bcd60e51b81526004018080602001828103825260228152602001806124ab6022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b03163314610a365760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610a3f612377565b600201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5181565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610ab6612377565b600201546001600160a01b0316905090565b6000546001600160a01b03163314610b115760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610b1a612377565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b6000610b52612377565b600101546001600160a01b0316905090565b60405160200180807f352e302e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012060016040516020018082805460018160011615610100020316600290048015610c0b5780601f10610be9576101008083540402835291820191610c0b565b820191906000526020600020905b815481529060010190602001808311610bf7575b50509150506040516020818303038152906040528051906020012014610c625760405162461bcd60e51b81526004018080602001828103825260328152602001806124576032913960400191505060405180910390fd5b6040805180820190915260058082527f352e312e300000000000000000000000000000000000000000000000000000006020909201918252610ca69160019161239b565b506001610cb1612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610d24612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155610d95612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610e08612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a566000908152600391909101602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001610e7b612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260049190910160205260409020805460ff19169115159190911790556001610ebb612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610f2e612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556003610fa1612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019182016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611012612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611085612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003918201602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556110f6612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611169612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260049190910160205260409020805460ff191691151591909117905560016111a9612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261121c612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600361128f612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611302612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001918201602090815260408083206e085d4780b73119b644ae5ecd22b376845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561136e612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207316de59092dae5ccf4a1e6439d611fd0653f0bd01845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026113e1612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260039182016020908152604080832073d6ad7a6750a7593e092a9b218d66c0a814a3436e845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611452612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207383f798e925bcd4017eb265844fddabb448f1707d845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560046114c5612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207373a052500105205d34daf004eab301916da8190f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611538612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260049190910160205260409020805460ff19169115159190911790556001611578612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026115eb612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561165c612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556116ce612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260049190910160205260409020805460ff1916911515919091179055600161170e612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611781612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556117f2612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611865612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd6000908152600391909101602090815260408083207357ab1ec28d129707052df4df418d58a2d46d5f51845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556118d7612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260049190910160205260409020805460ff19169115159190911790556001611917612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261198a612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560036119fd612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611a70612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600191820160209081526040808320734fabb145d64652a948d72533023f6e7a623c7c53845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611ae1612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073c2cb1040220768554cf699b0d863a3cd4324ce32845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611b54612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003918201602090815260408083207326ea744e5b887e5205727f55dfbe8685e3b21951845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611bc5612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073e6354ed5bc4b393a5aad09f21c46e101e692d447845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611c38612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600391909101602090815260408083207304bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611cab612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260049190910160205260409020805460ff1916911515919091179055565b6000806000806000611cf3612353565b6001600160a01b03808a16600090815260019290920160209081526040808420928b168452919052812054600f0b9150611d2b612353565b6001600160a01b03808b16600090815260019290920160209081526040808420928b168452919052902054600f0b9050611d63612353565b6001600160a01b038a166000908152600491909101602052604081205490945060ff169250600f82900b15801590611d9f575080600f0b600014155b15611db35781955080945060029350611ea0565b6000611dbd612353565b6001600160a01b03808c16600090815260039290920160209081526040808420928d168452919052812054600f0b9150611df5612353565b6001600160a01b03808d16600090815260039290920160209081526040808420928d168452919052902054600f90810b915082900b15801590611e3c575080600f0b600014155b15611e505781975080965060019550611e9d565b6040805162461bcd60e51b815260206004820152601e60248201527f5065726d616e656e7453746f726167653a20696e76616c696420706169720000604482015290519081900360640190fd5b50505b505093509350935093565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611ef1612377565b546001600160a01b0316905090565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a5681565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16611fa85760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b6001611fb2612353565b60009485526020526040909320805460ff1916931515939093179092555050565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff166120635760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8560005b81600f0b81600f0b12156120f9576000898983600f0b81811061208657fe5b905060200201356001600160a01b03169050816001016120a4612353565b6001600160a01b03808e166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6001600160801b03166001600160801b031990921691909117905501612067565b508460005b81600f0b81600f0b1215612194576000888883600f0b81811061211d57fe5b905060200201356001600160a01b031690508160010161213b612353565b6001600160a01b03808f1660009081526003929092016020908152604080842095909216835293909352919091208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001016120fe565b508461219e612353565b6001600160a01b039b909b1660009081526004909b016020526040909a20805460ff19169a15159a909a17909955505050505050505050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b031633146122445760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b8061224d612377565b600101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2781565b6000546001600160a01b031633146122df5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b6001600160a01b0381166123245760405162461bcd60e51b81526004018080602001828103825260328152602001806124f06032913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123dc57805160ff1916838001178555612409565b82800160010185558215612409579182015b828111156124095782518255916020019190600101906123ee565b50612415929150612419565b5090565b5b80821115612415576000815560010161241a56fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d20352e302e302076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220c5fb24b30a44467caa0ce170211c13d79ff765fb317f95bb991fba827a08110664736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.