Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multi Chain
Multichain Addresses
5 addresses found via
Latest 25 internal transactions (View All)
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
8947049 | 143 days 4 hrs ago | 0 ETH | ||||
8942787 | 143 days 21 hrs ago | 0 ETH | ||||
8942773 | 143 days 21 hrs ago | 0 ETH | ||||
8790115 | 171 days 4 hrs ago | 0 ETH | ||||
8702984 | 186 days 13 hrs ago | 0 ETH | ||||
8702975 | 186 days 13 hrs ago | 0 ETH | ||||
8186346 | 276 days 7 hrs ago | 0 ETH | ||||
8186346 | 276 days 7 hrs ago | 0 ETH | ||||
8186346 | 276 days 7 hrs ago | 0 ETH | ||||
8170283 | 279 days 2 hrs ago | 0 ETH | ||||
8170283 | 279 days 2 hrs ago | 0 ETH | ||||
8170283 | 279 days 2 hrs ago | 0 ETH | ||||
8169592 | 279 days 5 hrs ago | 0 ETH | ||||
8169592 | 279 days 5 hrs ago | 0 ETH | ||||
8169592 | 279 days 5 hrs ago | 0 ETH | ||||
8169589 | 279 days 5 hrs ago | 0 ETH | ||||
8169589 | 279 days 5 hrs ago | 0 ETH | ||||
8169589 | 279 days 5 hrs ago | 0 ETH | ||||
8169577 | 279 days 5 hrs ago | 0 ETH | ||||
8169577 | 279 days 5 hrs ago | 0 ETH | ||||
8169577 | 279 days 5 hrs ago | 0 ETH | ||||
8164069 | 280 days 3 hrs ago | 0 ETH | ||||
8164069 | 280 days 3 hrs ago | 0 ETH | ||||
8164069 | 280 days 3 hrs ago | 0 ETH | ||||
8146131 | 283 days 3 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
ERC20BondToken
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 100000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.8.15; import {ERC20} from "solmate/tokens/ERC20.sol"; import {CloneERC20} from "./lib/CloneERC20.sol"; /// @title ERC20 Bond Token /// @notice ERC20 Bond Token Contract /// @dev Bond Protocol is a permissionless system to create Olympus-style bond markets /// for any token pair. The markets do not require maintenance and will manage /// bond prices based on activity. Bond issuers create BondMarkets that pay out /// a Payout Token in exchange for deposited Quote Tokens. Users can purchase /// future-dated Payout Tokens with Quote Tokens at the current market price and /// receive Bond Tokens to represent their position while their bond vests. /// Once the Bond Tokens vest, they can redeem it for the Quote Tokens. /// /// @dev The ERC20 Bond Token contract is issued by a Fixed Expiry Teller to /// represent bond positions until they vest. Bond tokens can be redeemed for // the underlying token 1:1 at or after expiry. /// /// @dev This contract uses Clones (https://github.com/wighawag/clones-with-immutable-args) /// to save gas on deployment and is based on VestedERC20 (https://github.com/ZeframLou/vested-erc20) /// /// @author Oighty, Zeus, Potted Meat, indigo contract ERC20BondToken is CloneERC20 { /* ========== ERRORS ========== */ error BondToken_OnlyTeller(); /* ========== IMMUTABLE PARAMETERS ========== */ /// @notice The token to be redeemed when the bond vests /// @return _underlying The address of the underlying token function underlying() external pure returns (ERC20 _underlying) { return ERC20(_getArgAddress(0x41)); } /// @notice Timestamp at which the BondToken can be redeemed for the underlying /// @return _expiry The vest start timestamp function expiry() external pure returns (uint48 _expiry) { return uint48(_getArgUint256(0x55)); } /// @notice Address of the Teller that created the token function teller() public pure returns (address _teller) { return _getArgAddress(0x75); } /* ========== MINT/BURN ========== */ function mint(address to, uint256 amount) external { if (msg.sender != teller()) revert BondToken_OnlyTeller(); _mint(to, amount); } function burn(address from, uint256 amount) external { if (msg.sender != teller()) revert BondToken_OnlyTeller(); _burn(from, amount); } }
// SPDX-License-Identifier: BSD pragma solidity ^0.8.4; /// @title Clone /// @author zefram.eth /// @notice Provides helper functions for reading immutable args from calldata contract Clone { /// @notice Reads an immutable arg with type address /// @param argOffset The offset of the arg in the packed data /// @return arg The arg value function _getArgAddress(uint256 argOffset) internal pure returns (address arg) { uint256 offset = _getImmutableArgsOffset(); assembly { arg := shr(0x60, calldataload(add(offset, argOffset))) } } /// @notice Reads an immutable arg with type uint256 /// @param argOffset The offset of the arg in the packed data /// @return arg The arg value function _getArgUint256(uint256 argOffset) internal pure returns (uint256 arg) { uint256 offset = _getImmutableArgsOffset(); // solhint-disable-next-line no-inline-assembly assembly { arg := calldataload(add(offset, argOffset)) } } /// @notice Reads an immutable arg with type uint64 /// @param argOffset The offset of the arg in the packed data /// @return arg The arg value function _getArgUint64(uint256 argOffset) internal pure returns (uint64 arg) { uint256 offset = _getImmutableArgsOffset(); // solhint-disable-next-line no-inline-assembly assembly { arg := shr(0xc0, calldataload(add(offset, argOffset))) } } /// @notice Reads an immutable arg with type uint8 /// @param argOffset The offset of the arg in the packed data /// @return arg The arg value function _getArgUint8(uint256 argOffset) internal pure returns (uint8 arg) { uint256 offset = _getImmutableArgsOffset(); // solhint-disable-next-line no-inline-assembly assembly { arg := shr(0xf8, calldataload(add(offset, argOffset))) } } /// @return offset The offset of the packed immutable args in calldata function _getImmutableArgsOffset() internal pure returns (uint256 offset) { // solhint-disable-next-line no-inline-assembly assembly { offset := sub( calldatasize(), add(shr(240, calldataload(sub(calldatasize(), 2))), 2) ) } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*/////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*/////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*/////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*/////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*/////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*/////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*/////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {Clone} from "clones/Clone.sol"; /// @notice Modern and gas efficient ERC20 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract CloneERC20 is Clone { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*/////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*/////////////////////////////////////////////////////////////// METADATA //////////////////////////////////////////////////////////////*/ function name() external pure returns (string memory) { return string(abi.encodePacked(_getArgUint256(0))); } function symbol() external pure returns (string memory) { return string(abi.encodePacked(_getArgUint256(0x20))); } function decimals() external pure returns (uint8) { return _getArgUint8(0x40); } /*/////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function increaseAllowance(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] += amount; emit Approval(msg.sender, spender, allowance[msg.sender][spender]); return true; } function decreaseAllowance(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] -= amount; emit Approval(msg.sender, spender, allowance[msg.sender][spender]); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*/////////////////////////////////////////////////////////////// INTERNAL LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } function _getImmutableVariablesOffset() internal pure returns (uint256 offset) { assembly { offset := sub(calldatasize(), add(shr(240, calldataload(sub(calldatasize(), 2))), 2)) } } }
{ "remappings": [ "clones-with-immutable-args/=lib/clones-with-immutable-args/src/", "clones/=lib/clones-with-immutable-args/src/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "hardhat/=node_modules/hardhat/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "solidity-code-metrics/=node_modules/solidity-code-metrics/", "solmate/=lib/solmate/src/", "weird-erc20/=lib/solmate/lib/weird-erc20/src/" ], "optimizer": { "enabled": true, "runs": 100000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
[{"inputs":[],"name":"BondToken_OnlyTeller","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expiry","outputs":[{"internalType":"uint48","name":"_expiry","type":"uint48"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"teller","outputs":[{"internalType":"address","name":"_teller","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"contract ERC20","name":"_underlying","type":"address"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610ad4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80636f307dc311610097578063a457c2d711610066578063a457c2d714610222578063a9059cbb14610235578063dd62ed3e14610248578063e184c9be1461027357600080fd5b80636f307dc3146101df57806370a08231146101e757806395d89b41146102075780639dc29fac1461020f57600080fd5b8063313ce567116100d3578063313ce56714610170578063395093511461018a57806340c10f191461019d57806357edab4e146101b257600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd1461015d575b600080fd5b61010d610292565b60405161011a91906108e9565b60405180910390f35b610136610131366004610985565b6102c4565b604051901515815260200161011a565b61014f60005481565b60405190815260200161011a565b61013661016b3660046109af565b61033d565b610178610481565b60405160ff909116815260200161011a565b610136610198366004610985565b610492565b6101b06101ab366004610985565b61053d565b005b6101ba6105b7565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011a565b6101ba6105c3565b61014f6101f53660046109eb565b60016020526000908152604090205481565b61010d6105cf565b6101b061021d366004610985565b6105db565b610136610230366004610985565b610651565b610136610243366004610985565b610693565b61014f610256366004610a0d565b600260209081526000928352604080842090915290825290205481565b61027b610718565b60405165ffffffffffff909116815260200161011a565b606061029e6000610720565b6040516020016102b091815260200190565b604051602081830303815290604052905090565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061032c9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103d15761039f8382610a6f565b73ffffffffffffffffffffffffffffffffffffffff861660009081526002602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054859290610406908490610a6f565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061046e9087815260200190565b60405180910390a3506001949350505050565b600061048d6040610760565b905090565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120805483919083906104d4908490610a86565b909155505033600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161032c565b6105456105b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f5451629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105b382826107a3565b5050565b600061048d607561081b565b600061048d604161081b565b606061029e6020610720565b6105e36105b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610647576040517f5451629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105b3828261085e565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120805483919083906104d4908490610a6f565b336000908152600160205260408120805483919083906106b4908490610a6f565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061032c9086815260200190565b600061048d60555b6000806107557ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013592915050565b6000806107957ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013560f81c92915050565b806000808282546107b49190610a86565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806108507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013560601c92915050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290610893908490610a6f565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161080f565b600060208083528351808285015260005b81811015610916578581018301518582016040015282016108fa565b81811115610928576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098057600080fd5b919050565b6000806040838503121561099857600080fd5b6109a18361095c565b946020939093013593505050565b6000806000606084860312156109c457600080fd5b6109cd8461095c565b92506109db6020850161095c565b9150604084013590509250925092565b6000602082840312156109fd57600080fd5b610a068261095c565b9392505050565b60008060408385031215610a2057600080fd5b610a298361095c565b9150610a376020840161095c565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610a8157610a81610a40565b500390565b60008219821115610a9957610a99610a40565b50019056fea26469706673582212207056477b95d254084e602829034ff91761b7876d88d1b27c93982a33799874ea64736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80636f307dc311610097578063a457c2d711610066578063a457c2d714610222578063a9059cbb14610235578063dd62ed3e14610248578063e184c9be1461027357600080fd5b80636f307dc3146101df57806370a08231146101e757806395d89b41146102075780639dc29fac1461020f57600080fd5b8063313ce567116100d3578063313ce56714610170578063395093511461018a57806340c10f191461019d57806357edab4e146101b257600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd1461015d575b600080fd5b61010d610292565b60405161011a91906108e9565b60405180910390f35b610136610131366004610985565b6102c4565b604051901515815260200161011a565b61014f60005481565b60405190815260200161011a565b61013661016b3660046109af565b61033d565b610178610481565b60405160ff909116815260200161011a565b610136610198366004610985565b610492565b6101b06101ab366004610985565b61053d565b005b6101ba6105b7565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011a565b6101ba6105c3565b61014f6101f53660046109eb565b60016020526000908152604090205481565b61010d6105cf565b6101b061021d366004610985565b6105db565b610136610230366004610985565b610651565b610136610243366004610985565b610693565b61014f610256366004610a0d565b600260209081526000928352604080842090915290825290205481565b61027b610718565b60405165ffffffffffff909116815260200161011a565b606061029e6000610720565b6040516020016102b091815260200190565b604051602081830303815290604052905090565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061032c9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103d15761039f8382610a6f565b73ffffffffffffffffffffffffffffffffffffffff861660009081526002602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604081208054859290610406908490610a6f565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061046e9087815260200190565b60405180910390a3506001949350505050565b600061048d6040610760565b905090565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120805483919083906104d4908490610a86565b909155505033600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161032c565b6105456105b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f5451629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105b382826107a3565b5050565b600061048d607561081b565b600061048d604161081b565b606061029e6020610720565b6105e36105b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610647576040517f5451629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105b3828261085e565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120805483919083906104d4908490610a6f565b336000908152600160205260408120805483919083906106b4908490610a6f565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061032c9086815260200190565b600061048d60555b6000806107557ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013592915050565b6000806107957ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013560f81c92915050565b806000808282546107b49190610a86565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806108507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe368181013560f01c90030190565b929092013560601c92915050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290610893908490610a6f565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161080f565b600060208083528351808285015260005b81811015610916578581018301518582016040015282016108fa565b81811115610928576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098057600080fd5b919050565b6000806040838503121561099857600080fd5b6109a18361095c565b946020939093013593505050565b6000806000606084860312156109c457600080fd5b6109cd8461095c565b92506109db6020850161095c565b9150604084013590509250925092565b6000602082840312156109fd57600080fd5b610a068261095c565b9392505050565b60008060408385031215610a2057600080fd5b610a298361095c565b9150610a376020840161095c565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610a8157610a81610a40565b500390565b60008219821115610a9957610a99610a40565b50019056fea26469706673582212207056477b95d254084e602829034ff91761b7876d88d1b27c93982a33799874ea64736f6c634300080f0033
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.