Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SyntheticTokenV1
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import {IERC20} from "../token/IERC20.sol"; import {SafeMath} from "../lib/SafeMath.sol"; import {Amount} from "../lib/Amount.sol"; import {SyntheticStorage} from "./SyntheticStorage.sol"; import {Adminable} from "../lib/Adminable.sol"; contract SyntheticTokenV1 is Adminable, SyntheticStorage, IERC20 { using SafeMath for uint256; using Amount for Amount.Principal; /* ========== Events ========== */ event MinterAdded(address _minter, uint256 _limit); event MinterRemoved(address _minter); event MinterLimitUpdated(address _minter, uint256 _limit); event InitCalled(); /* ========== Modifiers ========== */ modifier onlyMinter() { require( _minters[msg.sender] == true, "SyntheticToken: only callable by minter" ); _; } /* ========== Init Function ========== */ /** * @dev Initialise the synthetic token * * @param name The name of the token * @param symbol The symbol of the token * @param version The version number of this token */ function init( string memory name, string memory symbol, string memory version ) public onlyAdmin { _name = name; _symbol = symbol; _version = version; DOMAIN_SEPARATOR = initDomainSeparator(name, version); emit InitCalled(); } /* ========== View Functions ========== */ function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function decimals() external pure returns (uint8) { return 18; } function version() external view returns (string memory) { return _version; } function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf( address account ) public view returns (uint256) { return _balances[account]; } function allowance( address owner, address spender ) public view returns (uint256) { return _allowances[owner][spender]; } function getAllMinters() external view returns (address[] memory) { return _mintersArray; } function isValidMinter( address _minter ) external view returns (bool) { return _minters[_minter]; } function getMinterIssued( address _minter ) external view returns (Amount.Principal memory) { return _minterIssued[_minter]; } function getMinterLimit( address _minter ) external view returns (uint256) { return _minterLimits[_minter]; } /* ========== Admin Functions ========== */ /** * @dev Add a new minter to the synthetic token. * * @param _minter The address of the minter to add * @param _limit The starting limit for how much this synth can mint */ function addMinter( address _minter, uint256 _limit ) external onlyAdmin { require( _minters[_minter] != true, "SyntheticToken: Minter already exists" ); _mintersArray.push(_minter); _minters[_minter] = true; _minterLimits[_minter] = _limit; emit MinterAdded(_minter, _limit); } /** * @dev Remove a minter from the synthetic token * * @param _minter Address to remove the minter */ function removeMinter( address _minter ) external onlyAdmin { require( _minters[_minter] == true, "SyntheticToken: minter does not exist" ); for (uint i = 0; i < _mintersArray.length; i++) { if (address(_mintersArray[i]) == _minter) { delete _mintersArray[i]; _mintersArray[i] = _mintersArray[_mintersArray.length - 1]; _mintersArray.length--; break; } } delete _minters[_minter]; delete _minterLimits[_minter]; emit MinterRemoved(_minter); } /** * @dev Update the limit of the minter * * @param _minter The address of the minter to set * @param _limit The new limit to set for this address */ function updateMinterLimit( address _minter, uint256 _limit ) public onlyAdmin { require( _minters[_minter] == true, "SyntheticToken: minter does not exist" ); _minterLimits[_minter] = _limit; emit MinterLimitUpdated(_minter, _limit); } /* ========== Minter Functions ========== */ /** * @dev Mint synthetic tokens * * @notice Can only be called by a valid minter. * * @param to The destination to mint the synth to * @param value The amount of synths to mint */ function mint( address to, uint256 value ) external onlyMinter { Amount.Principal memory issuedAmount = _minterIssued[msg.sender].add( Amount.Principal({ sign: true, value: value }) ); require( issuedAmount.value <= _minterLimits[msg.sender] || issuedAmount.sign == false, "SyntheticToken: minter limit reached" ); _minterIssued[msg.sender] = issuedAmount; _mint(to, value); } /** * @dev Burn synthetic tokens * * @notice Can only be called by a valid minter. * * @param from The destination to burn the synth from * @param value The amount of the synth to burn */ function burn( address from, uint256 value ) external onlyMinter { _minterIssued[msg.sender] = _minterIssued[msg.sender].sub( Amount.Principal({ sign: true, value: value }) ); _burn(from, value); } /** * @dev Transfer any collateral held to another address * * @param token The address of the token to transfer * @param to The destination to send the collateral to * @param value The amount of the tokens to transfer */ function transferCollateral( address token, address to, uint256 value ) external onlyMinter returns (bool) { return IERC20(token).transfer( to, value ); } /* ========== ERC20 Functions ========== */ function transfer( address recipient, uint256 amount ) public returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function approve( address spender, uint256 amount ) public returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public returns (bool) { _transfer(sender, recipient, amount); _approve( sender, msg.sender, _allowances[sender][msg.sender].sub(amount) ); return true; } /** * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens, * assuming the latter's signed approval. * * IMPORTANT: The same issues Erc20 `approve` has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the Eip712-formatted function arguments. * - The signature must use `owner`'s current nonce. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public { require( deadline == 0 || deadline >= block.timestamp, "SyntheticToken: Permit expired" ); require( spender != address(0), "SyntheticToken: spender cannot be 0x0" ); require( value > 0, "SyntheticToken: approval value must be greater than 0" ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, permitNonces[owner]++, deadline ) ) )); address recoveredAddress = ecrecover( digest, v, r, s ); require( recoveredAddress != address(0) && owner == recoveredAddress, "SyntheticToken: Signature invalid" ); } /* ========== Internal Functions ========== */ function _transfer( address sender, address recipient, uint256 amount ) internal { require( sender != address(0), "SyntheticToken: transfer from the zero address" ); require( recipient != address(0), "SyntheticToken: transfer to the zero address" ); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint( address account, uint256 amount ) internal { require( account != address(0), "SyntheticToken: mint to the zero address" ); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _burn( address account, uint256 amount ) internal { require( account != address(0), "SyntheticToken: burn from the zero address" ); _balances[account] = _balances[account].sub(amount); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal { require( owner != address(0), "SyntheticToken: approve from the zero address" ); require( spender != address(0), "SyntheticToken: approve to the zero address" ); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /* ========== Private Functions ========== */ /** * @dev Initializes EIP712 DOMAIN_SEPARATOR based on the current contract and chain ID. */ function initDomainSeparator( string memory name, string memory version ) private returns (bytes32) { uint256 chainID; /* solium-disable-next-line */ assembly { chainID := chainid() } return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes(version)), chainID, address(this) ) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer( address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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 ); }
pragma solidity ^0.5.16; library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import {SafeMath} from "../lib/SafeMath.sol"; import {Math} from "../lib/Math.sol"; library Amount { using Math for uint256; using SafeMath for uint256; // ============ Constants ============ uint256 constant BASE = 10**18; // A Principal Amount is an amount that's been adjusted by an index struct Principal { bool sign; // true if positive uint256 value; } function zero() internal pure returns (Principal memory) { return Principal({ sign: false, value: 0 }); } function sub( Principal memory a, Principal memory b ) internal pure returns (Principal memory) { return add(a, negative(b)); } function add( Principal memory a, Principal memory b ) internal pure returns (Principal memory) { Principal memory result; if (a.sign == b.sign) { result.sign = a.sign; result.value = SafeMath.add(a.value, b.value); } else { if (a.value >= b.value) { result.sign = a.sign; result.value = SafeMath.sub(a.value, b.value); } else { result.sign = b.sign; result.value = SafeMath.sub(b.value, a.value); } } return result; } function equals( Principal memory a, Principal memory b ) internal pure returns (bool) { if (a.value == b.value) { if (a.value == 0) { return true; } return a.sign == b.sign; } return false; } function negative( Principal memory a ) internal pure returns (Principal memory) { return Principal({ sign: !a.sign, value: a.value }); } function calculateAdjusted( Principal memory a, uint256 index ) internal pure returns (uint256) { return Math.getPartial(a.value, index, BASE); } function calculatePrincipal( uint256 value, uint256 index, bool sign ) internal pure returns (Principal memory) { return Principal({ sign: sign, value: Math.getPartial(value, BASE, index) }); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import {SafeMath} from "./SafeMath.sol"; /** * @title Math * * Library for non-standard Math functions */ library Math { using SafeMath for uint256; // ============ Library Functions ============ /* * Return target * (numerator / denominator). */ function getPartial( uint256 target, uint256 numerator, uint256 denominator ) internal pure returns (uint256) { return target.mul(numerator).div(denominator); } function to128( uint256 number ) internal pure returns (uint128) { uint128 result = uint128(number); require( result == number, "Math: Unsafe cast to uint128" ); return result; } function min( uint256 a, uint256 b ) internal pure returns (uint256) { return a < b ? a : b; } function max( uint256 a, uint256 b ) internal pure returns (uint256) { return a > b ? a : b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import {Amount} from "../lib/Amount.sol"; contract SyntheticStorageV1 { /* solium-disable-next-line */ bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; /** * @dev ERC20 Properties */ string internal _name; string internal _symbol; uint256 internal _totalSupply; string internal _version; mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; /** * @dev Permittable Properties */ bytes32 public DOMAIN_SEPARATOR; mapping (address => uint256) public permitNonces; /** * @dev Minter Properties */ address[] internal _mintersArray; mapping(address => bool) internal _minters; mapping(address => uint256) internal _minterLimits; mapping(address => Amount.Principal) internal _minterIssued; } contract SyntheticStorage is SyntheticStorageV1 { /* solium-disable-line no-empty-blocks */ }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import { Storage } from "./Storage.sol"; /** * @title Adminable * @author dYdX * * @dev EIP-1967 Proxy Admin contract. */ contract Adminable { /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Modifier to check whether the `msg.sender` is the admin. * If it is, it will run the function. Otherwise, it will revert. */ modifier onlyAdmin() { require( msg.sender == getAdmin(), "Adminable: caller is not admin" ); _; } /** * @return The EIP-1967 proxy admin */ function getAdmin() public view returns (address) { return address(uint160(uint256(Storage.load(ADMIN_SLOT)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; library Storage { /** * @dev Performs an SLOAD and returns the data in the slot. */ function load( bytes32 slot ) internal view returns (bytes32) { bytes32 result; /* solium-disable-next-line security/no-inline-assembly */ assembly { result := sload(slot) } return result; } /** * @dev Performs an SSTORE to save the value to the slot. */ function store( bytes32 slot, bytes32 value ) internal { /* solium-disable-next-line security/no-inline-assembly */ assembly { sstore(slot, value) } } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"InitCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"MinterLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_minter","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"getMinterIssued","outputs":[{"components":[{"internalType":"bool","name":"sign","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Amount.Principal","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"getMinterLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isValidMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permitNonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferCollateral","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updateMinterLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506121db806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a9059cbb11610097578063cb70ea6f11610071578063cb70ea6f1461032b578063cd60f59f1461034b578063d505accf1461035e578063dd62ed3e146103715761018e565b8063a9059cbb146102f2578063b67e9df714610305578063ca1f908c146103185761018e565b806370a0823114610289578063761248b41461029c57806383ba6b59146102af57806395d89b41146102c25780639dc29fac146102ca578063a045442c146102dd5761018e565b806330adf81f1161014b57806340c10f191161012557806340c10f191461024657806341e461a01461025957806354fd4d501461026c5780636e9960c3146102745761018e565b806330adf81f14610221578063313ce567146102295780633644e5151461023e5761018e565b806306fdde0314610193578063095ea7b3146101b157806318160ddd146101d1578063191d0ffc146101e657806323b872dd146101f95780633092afd51461020c575b600080fd5b61019b610384565b6040516101a89190611f5e565b60405180910390f35b6101c46101bf3660046116bc565b61041b565b6040516101a89190611e5e565b6101d9610432565b6040516101a89190611e6c565b6101d96101f436600461157b565b610438565b6101c46102073660046115d3565b61044a565b61021f61021a36600461157b565b6104a2565b005b6101d9610670565b610231610694565b6040516101a8919061208d565b6101d9610699565b61021f6102543660046116bc565b61069f565b61021f61026736600461170a565b6107a2565b61019b610851565b61027c6108b2565b6040516101a89190611e24565b6101d961029736600461157b565b6108e2565b61021f6102aa3660046116bc565b6108fd565b6101d96102bd36600461157b565b610a20565b61019b610a3b565b61021f6102d83660046116bc565b610a9b565b6102e5610b52565b6040516101a89190611e4d565b6101c46103003660046116bc565b610bb3565b6101c461031336600461157b565b610bc0565b61021f6103263660046116bc565b610bde565b61033e61033936600461157b565b610ca0565b6040516101a8919061207f565b6101c46103593660046115d3565b610ce0565b61021f61036c366004611620565b610d9c565b6101d961037f366004611599565b610f4f565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b820191906000526020600020905b8154815290600101906020018083116103f357829003601f168201915b505050505090505b90565b6000610428338484610f7a565b5060015b92915050565b60025490565b60076020526000908152604090205481565b600061045784848461102e565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610497918691610492908663ffffffff61112a16565b610f7a565b5060015b9392505050565b6104aa6108b2565b6001600160a01b0316336001600160a01b0316146104e35760405162461bcd60e51b81526004016104da90611fbf565b60405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615156001146105205760405162461bcd60e51b81526004016104da90611fff565b60005b60085481101561060757816001600160a01b03166008828154811061054457fe5b6000918252602090912001546001600160a01b031614156105ff576008818154811061056c57fe5b600091825260209091200180546001600160a01b031916905560088054600019810190811061059757fe5b600091825260209091200154600880546001600160a01b0390921691839081106105bd57fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905560088054906105f9906000198301611428565b50610607565b600101610523565b506001600160a01b0381166000908152600960209081526040808320805460ff19169055600a90915280822091909155517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290610665908390611e24565b60405180910390a150565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601290565b60065481565b3360009081526009602052604090205460ff1615156001146106d35760405162461bcd60e51b81526004016104da9061202f565b6106db61144c565b60408051808201825260018082526020808301869052336000908152600b82528490208451808601909552805460ff16151585529091015490830152610727919063ffffffff61115216565b336000908152600a60209081526040909120549082015191925010158061074d57508051155b6107695760405162461bcd60e51b81526004016104da9061200f565b336000908152600b602090815260409091208251815460ff19169015151781559082015160019091015561079d83836111e4565b505050565b6107aa6108b2565b6001600160a01b0316336001600160a01b0316146107da5760405162461bcd60e51b81526004016104da90611fbf565b82516107ed906000906020860190611463565b508151610801906001906020850190611463565b508051610815906003906020840190611463565b5061082083826112a4565b6006556040517fb23c63f0c6329c76654460081d0e472398de222eb135c8c94c8d259055a7d58890600090a1505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b60006108dd7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103611302565b905090565b6001600160a01b031660009081526004602052604090205490565b6109056108b2565b6001600160a01b0316336001600160a01b0316146109355760405162461bcd60e51b81526004016104da90611fbf565b6001600160a01b03821660009081526009602052604090205460ff161515600114156109735760405162461bcd60e51b81526004016104da90611fcf565b6008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0385169081179091556000908152600960209081526040808320805460ff1916909417909355600a9052819020829055517f96c1d7caf640fe379bdec5a79548e10ba60accd05456f6505c11bc85a3a7b59d90610a149084908490611e32565b60405180910390a15050565b6001600160a01b03166000908152600a602052604090205490565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b3360009081526009602052604090205460ff161515600114610acf5760405162461bcd60e51b81526004016104da9061202f565b60408051808201825260018082526020808301859052336000908152600b82528490208451808601909552805460ff16151585529091015490830152610b1b919063ffffffff61130616565b336000908152600b602090815260409091208251815460ff1916901515178155910151600190910155610b4e8282611320565b5050565b6060600880548060200260200160405190810160405280929190818152602001828054801561041057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b8c575050505050905090565b600061042833848461102e565b6001600160a01b031660009081526009602052604090205460ff1690565b610be66108b2565b6001600160a01b0316336001600160a01b031614610c165760405162461bcd60e51b81526004016104da90611fbf565b6001600160a01b03821660009081526009602052604090205460ff161515600114610c535760405162461bcd60e51b81526004016104da90611fff565b6001600160a01b0382166000908152600a602052604090819020829055517fb42794da95e8b03e4d501f15cb1325391cceb50ad6d6b0dcc76abe4bdaab610c90610a149084908490611e32565b610ca861144c565b506001600160a01b03166000908152600b60209081526040918290208251808401909352805460ff1615158352600101549082015290565b3360009081526009602052604081205460ff161515600114610d145760405162461bcd60e51b81526004016104da9061202f565b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb90610d429086908690600401611e32565b602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9491908101906116ec565b949350505050565b831580610da95750428410155b610dc55760405162461bcd60e51b81526004016104da90611f8f565b6001600160a01b038616610deb5760405162461bcd60e51b81526004016104da90611fef565b60008511610e0b5760405162461bcd60e51b81526004016104da90611f7f565b6006546001600160a01b03881660009081526007602090815260408083208054600181019091559051929392610e6c927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101611e7a565b60405160208183030381529060405280519060200120604051602001610e93929190611de8565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051610ed09493929190611f20565b6020604051602081039080840390855afa158015610ef2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f285750806001600160a01b0316896001600160a01b0316145b610f445760405162461bcd60e51b81526004016104da90611fdf565b505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001600160a01b038316610fa05760405162461bcd60e51b81526004016104da9061205f565b6001600160a01b038216610fc65760405162461bcd60e51b81526004016104da9061203f565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611021908590611e6c565b60405180910390a3505050565b6001600160a01b0383166110545760405162461bcd60e51b81526004016104da9061204f565b6001600160a01b03821661107a5760405162461bcd60e51b81526004016104da9061201f565b6001600160a01b0383166000908152600460205260409020546110a3908263ffffffff61112a16565b6001600160a01b0380851660009081526004602052604080822093909355908416815220546110d8908263ffffffff6113dc16565b6001600160a01b0380841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611021908590611e6c565b60008282111561114c5760405162461bcd60e51b81526004016104da90611faf565b50900390565b61115a61144c565b61116261144c565b8251845115159015151415611195578351151581526020808501519084015161118b91906113dc565b602082015261049b565b82602001518460200151106111be578351151581526020808501519084015161118b919061112a565b825115158152602080840151908501516111d8919061112a565b60208201529392505050565b6001600160a01b03821661120a5760405162461bcd60e51b81526004016104da9061206f565b60025461121d908263ffffffff6113dc16565b6002556001600160a01b038216600090815260046020526040902054611249908263ffffffff6113dc16565b6001600160a01b0383166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611298908590611e6c565b60405180910390a35050565b60405160009046906112b590611e19565b60405180910390208480519060200120848051906020012083306040516020016112e3959493929190611ed4565b6040516020818303038152906040528051906020012091505092915050565b5490565b61130e61144c565b61049b8361131b84611401565b611152565b6001600160a01b0382166113465760405162461bcd60e51b81526004016104da90611f6f565b6001600160a01b03821660009081526004602052604090205461136f908263ffffffff61112a16565b6001600160a01b03831660009081526004602052604090205560025461139b908263ffffffff61112a16565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611298908590611e6c565b60008282018381101561049b5760405162461bcd60e51b81526004016104da90611f9f565b61140961144c565b5060408051808201909152815115815260208083015190820152919050565b81548183558181111561079d5760008381526020902061079d9181019083016114e1565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114a457805160ff19168380011785556114d1565b828001600101855582156114d1579182015b828111156114d15782518255916020019190600101906114b6565b506114dd9291506114e1565b5090565b61041891905b808211156114dd57600081556001016114e7565b803561042c81612166565b805161042c8161217d565b803561042c81612186565b600082601f83011261152d57600080fd5b813561154061153b826120c2565b61209b565b9150808252602083016020830185838301111561155c57600080fd5b611567838284612124565b50505092915050565b803561042c8161218f565b60006020828403121561158d57600080fd5b6000610d9484846114fb565b600080604083850312156115ac57600080fd5b60006115b885856114fb565b92505060206115c9858286016114fb565b9150509250929050565b6000806000606084860312156115e857600080fd5b60006115f486866114fb565b9350506020611605868287016114fb565b925050604061161686828701611511565b9150509250925092565b600080600080600080600060e0888a03121561163b57600080fd5b60006116478a8a6114fb565b97505060206116588a828b016114fb565b96505060406116698a828b01611511565b955050606061167a8a828b01611511565b945050608061168b8a828b01611570565b93505060a061169c8a828b01611511565b92505060c06116ad8a828b01611511565b91505092959891949750929550565b600080604083850312156116cf57600080fd5b60006116db85856114fb565b92505060206115c985828601611511565b6000602082840312156116fe57600080fd5b6000610d948484611506565b60008060006060848603121561171f57600080fd5b833567ffffffffffffffff81111561173657600080fd5b6117428682870161151c565b935050602084013567ffffffffffffffff81111561175f57600080fd5b61176b8682870161151c565b925050604084013567ffffffffffffffff81111561178857600080fd5b6116168682870161151c565b60006117a083836117a8565b505060200190565b6117b181612102565b82525050565b60006117c2826120f0565b6117cc81856120f4565b93506117d7836120ea565b8060005b838110156118055781516117ef8882611794565b97506117fa836120ea565b9250506001016117db565b509495945050505050565b6117b18161210d565b6117b181610418565b6117b161182e82610418565b610418565b600061183e826120f0565b61184881856120f4565b9350611858818560208601612130565b6118618161215c565b9093019392505050565b6000611878602a836120f4565b7f53796e746865746963546f6b656e3a206275726e2066726f6d20746865207a65815269726f206164647265737360b01b602082015260400192915050565b60006118c46035836120f4565b7f53796e746865746963546f6b656e3a20617070726f76616c2076616c7565206d81527407573742062652067726561746572207468616e203605c1b602082015260400192915050565b600061191b601e836120f4565b7f53796e746865746963546f6b656e3a205065726d697420657870697265640000815260200192915050565b60006119546002836120fd565b61190160f01b815260020192915050565b6000611972601b836120f4565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006119ab601e836120f4565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b60006119e4601e836120f4565b7f41646d696e61626c653a2063616c6c6572206973206e6f742061646d696e0000815260200192915050565b6000611a1d6025836120f4565b7f53796e746865746963546f6b656e3a204d696e74657220616c72656164792065815264786973747360d81b602082015260400192915050565b6000611a646021836120f4565b7f53796e746865746963546f6b656e3a205369676e617475726520696e76616c698152601960fa1b602082015260400192915050565b6000611aa76025836120f4565b7f53796e746865746963546f6b656e3a207370656e6465722063616e6e6f742062815264065203078360dc1b602082015260400192915050565b6000611aee6052836120fd565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c6164647265737320602082015271766572696679696e67436f6e74726163742960701b604082015260520192915050565b6000611b686025836120f4565b7f53796e746865746963546f6b656e3a206d696e74657220646f6573206e6f7420815264195e1a5cdd60da1b602082015260400192915050565b6000611baf6024836120f4565b7f53796e746865746963546f6b656e3a206d696e746572206c696d69742072656181526318da195960e21b602082015260400192915050565b6000611bf5602c836120f4565b7f53796e746865746963546f6b656e3a207472616e7366657220746f207468652081526b7a65726f206164647265737360a01b602082015260400192915050565b6000611c436027836120f4565b7f53796e746865746963546f6b656e3a206f6e6c792063616c6c61626c652062798152661036b4b73a32b960c91b602082015260400192915050565b6000611c8c602b836120f4565b7f53796e746865746963546f6b656e3a20617070726f766520746f20746865207a81526a65726f206164647265737360a81b602082015260400192915050565b6000611cd9602e836120f4565b7f53796e746865746963546f6b656e3a207472616e736665722066726f6d20746881526d65207a65726f206164647265737360901b602082015260400192915050565b6000611d29602d836120f4565b7f53796e746865746963546f6b656e3a20617070726f76652066726f6d2074686581526c207a65726f206164647265737360981b602082015260400192915050565b6000611d786028836120f4565b7f53796e746865746963546f6b656e3a206d696e7420746f20746865207a65726f815267206164647265737360c01b602082015260400192915050565b80516040830190611dc68482611810565b506020820151611dd96020850182611819565b50505050565b6117b18161211e565b6000611df382611947565b9150611dff8285611822565b602082019150611e0f8284611822565b5060200192915050565b600061042c82611ae1565b6020810161042c82846117a8565b60408101611e4082856117a8565b61049b6020830184611819565b6020808252810161049b81846117b7565b6020810161042c8284611810565b6020810161042c8284611819565b60c08101611e888289611819565b611e9560208301886117a8565b611ea260408301876117a8565b611eaf6060830186611819565b611ebc6080830185611819565b611ec960a0830184611819565b979650505050505050565b60a08101611ee28288611819565b611eef6020830187611819565b611efc6040830186611819565b611f096060830185611819565b611f1660808301846117a8565b9695505050505050565b60808101611f2e8287611819565b611f3b6020830186611ddf565b611f486040830185611819565b611f556060830184611819565b95945050505050565b6020808252810161049b8184611833565b6020808252810161042c8161186b565b6020808252810161042c816118b7565b6020808252810161042c8161190e565b6020808252810161042c81611965565b6020808252810161042c8161199e565b6020808252810161042c816119d7565b6020808252810161042c81611a10565b6020808252810161042c81611a57565b6020808252810161042c81611a9a565b6020808252810161042c81611b5b565b6020808252810161042c81611ba2565b6020808252810161042c81611be8565b6020808252810161042c81611c36565b6020808252810161042c81611c7f565b6020808252810161042c81611ccc565b6020808252810161042c81611d1c565b6020808252810161042c81611d6b565b6040810161042c8284611db5565b6020810161042c8284611ddf565b60405181810167ffffffffffffffff811182821017156120ba57600080fd5b604052919050565b600067ffffffffffffffff8211156120d957600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061042c82612112565b151590565b6001600160a01b031690565b60ff1690565b82818337506000910152565b60005b8381101561214b578181015183820152602001612133565b83811115611dd95750506000910152565b601f01601f191690565b61216f81612102565b811461217a57600080fd5b50565b61216f8161210d565b61216f81610418565b61216f8161211e56fea365627a7a723158209c378ee5d9e0fce4bbd603a35221211e300a7e0655dd89cd0f323a11a01cad986c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a9059cbb11610097578063cb70ea6f11610071578063cb70ea6f1461032b578063cd60f59f1461034b578063d505accf1461035e578063dd62ed3e146103715761018e565b8063a9059cbb146102f2578063b67e9df714610305578063ca1f908c146103185761018e565b806370a0823114610289578063761248b41461029c57806383ba6b59146102af57806395d89b41146102c25780639dc29fac146102ca578063a045442c146102dd5761018e565b806330adf81f1161014b57806340c10f191161012557806340c10f191461024657806341e461a01461025957806354fd4d501461026c5780636e9960c3146102745761018e565b806330adf81f14610221578063313ce567146102295780633644e5151461023e5761018e565b806306fdde0314610193578063095ea7b3146101b157806318160ddd146101d1578063191d0ffc146101e657806323b872dd146101f95780633092afd51461020c575b600080fd5b61019b610384565b6040516101a89190611f5e565b60405180910390f35b6101c46101bf3660046116bc565b61041b565b6040516101a89190611e5e565b6101d9610432565b6040516101a89190611e6c565b6101d96101f436600461157b565b610438565b6101c46102073660046115d3565b61044a565b61021f61021a36600461157b565b6104a2565b005b6101d9610670565b610231610694565b6040516101a8919061208d565b6101d9610699565b61021f6102543660046116bc565b61069f565b61021f61026736600461170a565b6107a2565b61019b610851565b61027c6108b2565b6040516101a89190611e24565b6101d961029736600461157b565b6108e2565b61021f6102aa3660046116bc565b6108fd565b6101d96102bd36600461157b565b610a20565b61019b610a3b565b61021f6102d83660046116bc565b610a9b565b6102e5610b52565b6040516101a89190611e4d565b6101c46103003660046116bc565b610bb3565b6101c461031336600461157b565b610bc0565b61021f6103263660046116bc565b610bde565b61033e61033936600461157b565b610ca0565b6040516101a8919061207f565b6101c46103593660046115d3565b610ce0565b61021f61036c366004611620565b610d9c565b6101d961037f366004611599565b610f4f565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b820191906000526020600020905b8154815290600101906020018083116103f357829003601f168201915b505050505090505b90565b6000610428338484610f7a565b5060015b92915050565b60025490565b60076020526000908152604090205481565b600061045784848461102e565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610497918691610492908663ffffffff61112a16565b610f7a565b5060015b9392505050565b6104aa6108b2565b6001600160a01b0316336001600160a01b0316146104e35760405162461bcd60e51b81526004016104da90611fbf565b60405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615156001146105205760405162461bcd60e51b81526004016104da90611fff565b60005b60085481101561060757816001600160a01b03166008828154811061054457fe5b6000918252602090912001546001600160a01b031614156105ff576008818154811061056c57fe5b600091825260209091200180546001600160a01b031916905560088054600019810190811061059757fe5b600091825260209091200154600880546001600160a01b0390921691839081106105bd57fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905560088054906105f9906000198301611428565b50610607565b600101610523565b506001600160a01b0381166000908152600960209081526040808320805460ff19169055600a90915280822091909155517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290610665908390611e24565b60405180910390a150565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601290565b60065481565b3360009081526009602052604090205460ff1615156001146106d35760405162461bcd60e51b81526004016104da9061202f565b6106db61144c565b60408051808201825260018082526020808301869052336000908152600b82528490208451808601909552805460ff16151585529091015490830152610727919063ffffffff61115216565b336000908152600a60209081526040909120549082015191925010158061074d57508051155b6107695760405162461bcd60e51b81526004016104da9061200f565b336000908152600b602090815260409091208251815460ff19169015151781559082015160019091015561079d83836111e4565b505050565b6107aa6108b2565b6001600160a01b0316336001600160a01b0316146107da5760405162461bcd60e51b81526004016104da90611fbf565b82516107ed906000906020860190611463565b508151610801906001906020850190611463565b508051610815906003906020840190611463565b5061082083826112a4565b6006556040517fb23c63f0c6329c76654460081d0e472398de222eb135c8c94c8d259055a7d58890600090a1505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b60006108dd7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103611302565b905090565b6001600160a01b031660009081526004602052604090205490565b6109056108b2565b6001600160a01b0316336001600160a01b0316146109355760405162461bcd60e51b81526004016104da90611fbf565b6001600160a01b03821660009081526009602052604090205460ff161515600114156109735760405162461bcd60e51b81526004016104da90611fcf565b6008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0385169081179091556000908152600960209081526040808320805460ff1916909417909355600a9052819020829055517f96c1d7caf640fe379bdec5a79548e10ba60accd05456f6505c11bc85a3a7b59d90610a149084908490611e32565b60405180910390a15050565b6001600160a01b03166000908152600a602052604090205490565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104105780601f106103e557610100808354040283529160200191610410565b3360009081526009602052604090205460ff161515600114610acf5760405162461bcd60e51b81526004016104da9061202f565b60408051808201825260018082526020808301859052336000908152600b82528490208451808601909552805460ff16151585529091015490830152610b1b919063ffffffff61130616565b336000908152600b602090815260409091208251815460ff1916901515178155910151600190910155610b4e8282611320565b5050565b6060600880548060200260200160405190810160405280929190818152602001828054801561041057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b8c575050505050905090565b600061042833848461102e565b6001600160a01b031660009081526009602052604090205460ff1690565b610be66108b2565b6001600160a01b0316336001600160a01b031614610c165760405162461bcd60e51b81526004016104da90611fbf565b6001600160a01b03821660009081526009602052604090205460ff161515600114610c535760405162461bcd60e51b81526004016104da90611fff565b6001600160a01b0382166000908152600a602052604090819020829055517fb42794da95e8b03e4d501f15cb1325391cceb50ad6d6b0dcc76abe4bdaab610c90610a149084908490611e32565b610ca861144c565b506001600160a01b03166000908152600b60209081526040918290208251808401909352805460ff1615158352600101549082015290565b3360009081526009602052604081205460ff161515600114610d145760405162461bcd60e51b81526004016104da9061202f565b60405163a9059cbb60e01b81526001600160a01b0385169063a9059cbb90610d429086908690600401611e32565b602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9491908101906116ec565b949350505050565b831580610da95750428410155b610dc55760405162461bcd60e51b81526004016104da90611f8f565b6001600160a01b038616610deb5760405162461bcd60e51b81526004016104da90611fef565b60008511610e0b5760405162461bcd60e51b81526004016104da90611f7f565b6006546001600160a01b03881660009081526007602090815260408083208054600181019091559051929392610e6c927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101611e7a565b60405160208183030381529060405280519060200120604051602001610e93929190611de8565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051610ed09493929190611f20565b6020604051602081039080840390855afa158015610ef2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f285750806001600160a01b0316896001600160a01b0316145b610f445760405162461bcd60e51b81526004016104da90611fdf565b505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001600160a01b038316610fa05760405162461bcd60e51b81526004016104da9061205f565b6001600160a01b038216610fc65760405162461bcd60e51b81526004016104da9061203f565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611021908590611e6c565b60405180910390a3505050565b6001600160a01b0383166110545760405162461bcd60e51b81526004016104da9061204f565b6001600160a01b03821661107a5760405162461bcd60e51b81526004016104da9061201f565b6001600160a01b0383166000908152600460205260409020546110a3908263ffffffff61112a16565b6001600160a01b0380851660009081526004602052604080822093909355908416815220546110d8908263ffffffff6113dc16565b6001600160a01b0380841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611021908590611e6c565b60008282111561114c5760405162461bcd60e51b81526004016104da90611faf565b50900390565b61115a61144c565b61116261144c565b8251845115159015151415611195578351151581526020808501519084015161118b91906113dc565b602082015261049b565b82602001518460200151106111be578351151581526020808501519084015161118b919061112a565b825115158152602080840151908501516111d8919061112a565b60208201529392505050565b6001600160a01b03821661120a5760405162461bcd60e51b81526004016104da9061206f565b60025461121d908263ffffffff6113dc16565b6002556001600160a01b038216600090815260046020526040902054611249908263ffffffff6113dc16565b6001600160a01b0383166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611298908590611e6c565b60405180910390a35050565b60405160009046906112b590611e19565b60405180910390208480519060200120848051906020012083306040516020016112e3959493929190611ed4565b6040516020818303038152906040528051906020012091505092915050565b5490565b61130e61144c565b61049b8361131b84611401565b611152565b6001600160a01b0382166113465760405162461bcd60e51b81526004016104da90611f6f565b6001600160a01b03821660009081526004602052604090205461136f908263ffffffff61112a16565b6001600160a01b03831660009081526004602052604090205560025461139b908263ffffffff61112a16565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611298908590611e6c565b60008282018381101561049b5760405162461bcd60e51b81526004016104da90611f9f565b61140961144c565b5060408051808201909152815115815260208083015190820152919050565b81548183558181111561079d5760008381526020902061079d9181019083016114e1565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114a457805160ff19168380011785556114d1565b828001600101855582156114d1579182015b828111156114d15782518255916020019190600101906114b6565b506114dd9291506114e1565b5090565b61041891905b808211156114dd57600081556001016114e7565b803561042c81612166565b805161042c8161217d565b803561042c81612186565b600082601f83011261152d57600080fd5b813561154061153b826120c2565b61209b565b9150808252602083016020830185838301111561155c57600080fd5b611567838284612124565b50505092915050565b803561042c8161218f565b60006020828403121561158d57600080fd5b6000610d9484846114fb565b600080604083850312156115ac57600080fd5b60006115b885856114fb565b92505060206115c9858286016114fb565b9150509250929050565b6000806000606084860312156115e857600080fd5b60006115f486866114fb565b9350506020611605868287016114fb565b925050604061161686828701611511565b9150509250925092565b600080600080600080600060e0888a03121561163b57600080fd5b60006116478a8a6114fb565b97505060206116588a828b016114fb565b96505060406116698a828b01611511565b955050606061167a8a828b01611511565b945050608061168b8a828b01611570565b93505060a061169c8a828b01611511565b92505060c06116ad8a828b01611511565b91505092959891949750929550565b600080604083850312156116cf57600080fd5b60006116db85856114fb565b92505060206115c985828601611511565b6000602082840312156116fe57600080fd5b6000610d948484611506565b60008060006060848603121561171f57600080fd5b833567ffffffffffffffff81111561173657600080fd5b6117428682870161151c565b935050602084013567ffffffffffffffff81111561175f57600080fd5b61176b8682870161151c565b925050604084013567ffffffffffffffff81111561178857600080fd5b6116168682870161151c565b60006117a083836117a8565b505060200190565b6117b181612102565b82525050565b60006117c2826120f0565b6117cc81856120f4565b93506117d7836120ea565b8060005b838110156118055781516117ef8882611794565b97506117fa836120ea565b9250506001016117db565b509495945050505050565b6117b18161210d565b6117b181610418565b6117b161182e82610418565b610418565b600061183e826120f0565b61184881856120f4565b9350611858818560208601612130565b6118618161215c565b9093019392505050565b6000611878602a836120f4565b7f53796e746865746963546f6b656e3a206275726e2066726f6d20746865207a65815269726f206164647265737360b01b602082015260400192915050565b60006118c46035836120f4565b7f53796e746865746963546f6b656e3a20617070726f76616c2076616c7565206d81527407573742062652067726561746572207468616e203605c1b602082015260400192915050565b600061191b601e836120f4565b7f53796e746865746963546f6b656e3a205065726d697420657870697265640000815260200192915050565b60006119546002836120fd565b61190160f01b815260020192915050565b6000611972601b836120f4565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006119ab601e836120f4565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b60006119e4601e836120f4565b7f41646d696e61626c653a2063616c6c6572206973206e6f742061646d696e0000815260200192915050565b6000611a1d6025836120f4565b7f53796e746865746963546f6b656e3a204d696e74657220616c72656164792065815264786973747360d81b602082015260400192915050565b6000611a646021836120f4565b7f53796e746865746963546f6b656e3a205369676e617475726520696e76616c698152601960fa1b602082015260400192915050565b6000611aa76025836120f4565b7f53796e746865746963546f6b656e3a207370656e6465722063616e6e6f742062815264065203078360dc1b602082015260400192915050565b6000611aee6052836120fd565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c6164647265737320602082015271766572696679696e67436f6e74726163742960701b604082015260520192915050565b6000611b686025836120f4565b7f53796e746865746963546f6b656e3a206d696e74657220646f6573206e6f7420815264195e1a5cdd60da1b602082015260400192915050565b6000611baf6024836120f4565b7f53796e746865746963546f6b656e3a206d696e746572206c696d69742072656181526318da195960e21b602082015260400192915050565b6000611bf5602c836120f4565b7f53796e746865746963546f6b656e3a207472616e7366657220746f207468652081526b7a65726f206164647265737360a01b602082015260400192915050565b6000611c436027836120f4565b7f53796e746865746963546f6b656e3a206f6e6c792063616c6c61626c652062798152661036b4b73a32b960c91b602082015260400192915050565b6000611c8c602b836120f4565b7f53796e746865746963546f6b656e3a20617070726f766520746f20746865207a81526a65726f206164647265737360a81b602082015260400192915050565b6000611cd9602e836120f4565b7f53796e746865746963546f6b656e3a207472616e736665722066726f6d20746881526d65207a65726f206164647265737360901b602082015260400192915050565b6000611d29602d836120f4565b7f53796e746865746963546f6b656e3a20617070726f76652066726f6d2074686581526c207a65726f206164647265737360981b602082015260400192915050565b6000611d786028836120f4565b7f53796e746865746963546f6b656e3a206d696e7420746f20746865207a65726f815267206164647265737360c01b602082015260400192915050565b80516040830190611dc68482611810565b506020820151611dd96020850182611819565b50505050565b6117b18161211e565b6000611df382611947565b9150611dff8285611822565b602082019150611e0f8284611822565b5060200192915050565b600061042c82611ae1565b6020810161042c82846117a8565b60408101611e4082856117a8565b61049b6020830184611819565b6020808252810161049b81846117b7565b6020810161042c8284611810565b6020810161042c8284611819565b60c08101611e888289611819565b611e9560208301886117a8565b611ea260408301876117a8565b611eaf6060830186611819565b611ebc6080830185611819565b611ec960a0830184611819565b979650505050505050565b60a08101611ee28288611819565b611eef6020830187611819565b611efc6040830186611819565b611f096060830185611819565b611f1660808301846117a8565b9695505050505050565b60808101611f2e8287611819565b611f3b6020830186611ddf565b611f486040830185611819565b611f556060830184611819565b95945050505050565b6020808252810161049b8184611833565b6020808252810161042c8161186b565b6020808252810161042c816118b7565b6020808252810161042c8161190e565b6020808252810161042c81611965565b6020808252810161042c8161199e565b6020808252810161042c816119d7565b6020808252810161042c81611a10565b6020808252810161042c81611a57565b6020808252810161042c81611a9a565b6020808252810161042c81611b5b565b6020808252810161042c81611ba2565b6020808252810161042c81611be8565b6020808252810161042c81611c36565b6020808252810161042c81611c7f565b6020808252810161042c81611ccc565b6020808252810161042c81611d1c565b6020808252810161042c81611d6b565b6040810161042c8284611db5565b6020810161042c8284611ddf565b60405181810167ffffffffffffffff811182821017156120ba57600080fd5b604052919050565b600067ffffffffffffffff8211156120d957600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061042c82612112565b151590565b6001600160a01b031690565b60ff1690565b82818337506000910152565b60005b8381101561214b578181015183820152602001612133565b83811115611dd95750506000910152565b601f01601f191690565b61216f81612102565b811461217a57600080fd5b50565b61216f8161210d565b61216f81610418565b61216f8161211e56fea365627a7a723158209c378ee5d9e0fce4bbd603a35221211e300a7e0655dd89cd0f323a11a01cad986c6578706572696d656e74616cf564736f6c63430005100040
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.