Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60606040 | 4488977 | 2447 days ago | IN | Contract Creation | 0 ETH | 0.00744125 |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x3Ed154e1...F91674681 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
WithdrawContract
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2017-11-04 */ //File: node_modules/giveth-common-contracts/contracts/ERC20.sol pragma solidity ^0.4.15; /** * @title ERC20 * @dev A standard interface for tokens. * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md */ contract ERC20 { /// @dev Returns the total token supply. function totalSupply() public constant returns (uint256 supply); /// @dev Returns the account balance of another account with address _owner. function balanceOf(address _owner) public constant returns (uint256 balance); /// @dev Transfers _value amount of tokens to address _to function transfer(address _to, uint256 _value) public returns (bool success); /// @dev Transfers _value amount of tokens from address _from to address _to function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); /// @dev Allows _spender to withdraw from your account multiple times, up to the _value amount function approve(address _spender, uint256 _value) public returns (bool success); /// @dev Returns the amount which _spender is still allowed to withdraw from _owner. function allowance(address _owner, address _spender) public constant returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } //File: node_modules/giveth-common-contracts/contracts/Owned.sol pragma solidity ^0.4.15; /// @title Owned /// @author Adrià Massanet <[email protected]> /// @notice The Owned contract has an owner address, and provides basic /// authorization control functions, this simplifies & the implementation of /// "user permissions" contract Owned { address public owner; address public newOwnerCandidate; event OwnershipRequested(address indexed by, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); event OwnershipRemoved(); /// @dev The constructor sets the `msg.sender` as the`owner` of the contract function Owned() { owner = msg.sender; } /// @dev `owner` is the only address that can call a function with this /// modifier modifier onlyOwner() { require (msg.sender == owner); _; } /// @notice `owner` can step down and assign some other address to this role /// @param _newOwner The address of the new owner. function changeOwnership(address _newOwner) onlyOwner { require(_newOwner != 0x0); address oldOwner = owner; owner = _newOwner; newOwnerCandidate = 0x0; OwnershipTransferred(oldOwner, owner); } /// @notice `onlyOwner` Proposes to transfer control of the contract to a /// new owner /// @param _newOwnerCandidate The address being proposed as the new owner function proposeOwnership(address _newOwnerCandidate) onlyOwner { newOwnerCandidate = _newOwnerCandidate; OwnershipRequested(msg.sender, newOwnerCandidate); } /// @notice Can only be called by the `newOwnerCandidate`, accepts the /// transfer of ownership function acceptOwnership() { require(msg.sender == newOwnerCandidate); address oldOwner = owner; owner = newOwnerCandidate; newOwnerCandidate = 0x0; OwnershipTransferred(oldOwner, owner); } /// @notice Decentralizes the contract, this operation cannot be undone /// @param _dac `0xdac` has to be entered for this function to work function removeOwnership(address _dac) onlyOwner { require(_dac == 0xdac); owner = 0x0; newOwnerCandidate = 0x0; OwnershipRemoved(); } } //File: node_modules/giveth-common-contracts/contracts/Escapable.sol /* Copyright 2016, Jordi Baylina Contributor: Adrià Massanet <[email protected]> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ pragma solidity ^0.4.15; /// @dev `Escapable` is a base level contract built off of the `Owned` /// contract that creates an escape hatch function to send its ether to /// `escapeHatchDestination` when called by the `escapeHatchCaller` in the case that /// something unexpected happens contract Escapable is Owned { address public escapeHatchCaller; address public escapeHatchDestination; mapping (address=>bool) private escapeBlacklist; /// @notice The Constructor assigns the `escapeHatchDestination` and the /// `escapeHatchCaller` /// @param _escapeHatchDestination The address of a safe location (usu a /// Multisig) to send the ether held in this contract /// @param _escapeHatchCaller The address of a trusted account or contract to /// call `escapeHatch()` to send the ether in this contract to the /// `escapeHatchDestination` it would be ideal that `escapeHatchCaller` cannot move /// funds out of `escapeHatchDestination` function Escapable(address _escapeHatchCaller, address _escapeHatchDestination) { escapeHatchCaller = _escapeHatchCaller; escapeHatchDestination = _escapeHatchDestination; } modifier onlyEscapeHatchCallerOrOwner { require ((msg.sender == escapeHatchCaller)||(msg.sender == owner)); _; } /// @notice The `blacklistEscapeTokens()` marks a token in a whitelist to be /// escaped. The proupose is to be done at construction time. /// @param _token the be bloacklisted for escape function blacklistEscapeToken(address _token) internal { escapeBlacklist[_token] = true; EscapeHatchBlackistedToken(_token); } function isTokenEscapable(address _token) constant public returns (bool) { return !escapeBlacklist[_token]; } /// @notice The `escapeHatch()` should only be called as a last resort if a /// security issue is uncovered or something unexpected happened /// @param _token to transfer, use 0x0 for ethers function escapeHatch(address _token) public onlyEscapeHatchCallerOrOwner { require(escapeBlacklist[_token]==false); uint256 balance; if (_token == 0x0) { balance = this.balance; escapeHatchDestination.transfer(balance); EscapeHatchCalled(_token, balance); return; } ERC20 token = ERC20(_token); balance = token.balanceOf(this); token.transfer(escapeHatchDestination, balance); EscapeHatchCalled(_token, balance); } /// @notice Changes the address assigned to call `escapeHatch()` /// @param _newEscapeHatchCaller The address of a trusted account or contract to /// call `escapeHatch()` to send the ether in this contract to the /// `escapeHatchDestination` it would be ideal that `escapeHatchCaller` cannot /// move funds out of `escapeHatchDestination` function changeHatchEscapeCaller(address _newEscapeHatchCaller) onlyEscapeHatchCallerOrOwner { escapeHatchCaller = _newEscapeHatchCaller; } event EscapeHatchBlackistedToken(address token); event EscapeHatchCalled(address token, uint amount); } //File: ./contracts/WithdrawContract.sol pragma solidity ^0.4.18; /* Copyright 2017, Jordi Baylina This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /// @dev This declares a few functions from `MiniMeToken` so that the /// `WithdrawContract` can interface with the `MiniMeToken` contract MiniMeToken { function balanceOfAt(address _owner, uint _blockNumber) public constant returns (uint); function totalSupplyAt(uint _blockNumber) public constant returns(uint); } /// @dev This is the main contract, it is intended to distribute deposited funds /// from a TRUSTED `owner` to token holders of a MiniMe style ERC-20 Token; /// only deposits from the `owner` using the functions `newTokenPayment()` & /// `newEtherPayment()` will be distributed, any other funds sent to this /// contract can only be removed via the `escapeHatch()` contract WithdrawContract is Escapable { /// @dev Tracks the deposits made to this contract struct Deposit { uint block; // Determines which token holders are able to collect ERC20 token; // The token address (0x0 if ether) uint amount; // The amount deposited in the smallest unit (wei if ETH) bool canceled; // True if canceled by the `owner` } Deposit[] public deposits; // Array of deposits to this contract MiniMeToken rewardToken; // Token that is used for withdraws mapping (address => uint) public nextDepositToPayout; // Tracks Payouts mapping (address => mapping(uint => bool)) skipDeposits; ///////// // Constructor ///////// /// @notice The Constructor creates the `WithdrawContract` on the blockchain /// the `owner` role is assigned to the address that deploys this contract /// @param _rewardToken The address of the token that is used to determine the /// distribution of the deposits according to the balance held at the /// deposit's specified `block` /// @param _escapeHatchCaller The address of a trusted account or contract /// to call `escapeHatch()` to send the specified token (or ether) held in /// this contract to the `escapeHatchDestination` /// @param _escapeHatchDestination The address of a safe location (usu a /// Multisig) to send the ether and tokens held in this contract when the /// `escapeHatch()` is called function WithdrawContract( MiniMeToken _rewardToken, address _escapeHatchCaller, address _escapeHatchDestination) Escapable(_escapeHatchCaller, _escapeHatchDestination) public { rewardToken = _rewardToken; } /// @dev When ether is sent to this contract `newEtherDeposit()` is called function () payable public { newEtherDeposit(0); } ///////// // Owner Functions ///////// /// @notice Adds an ether deposit to `deposits[]`; only the `owner` can /// deposit into this contract /// @param _block The block height that determines the snapshot of token /// holders that will be able to withdraw their share of this deposit; this /// block must be set in the past, if 0 it defaults to one block before the /// transaction /// @return _idDeposit The id number for the deposit function newEtherDeposit(uint _block) public onlyOwner payable returns (uint _idDeposit) { require(msg.value>0); require(_block < block.number); _idDeposit = deposits.length ++; // Record the deposit Deposit storage d = deposits[_idDeposit]; d.block = _block == 0 ? block.number -1 : _block; d.token = ERC20(0); d.amount = msg.value; NewDeposit(_idDeposit, ERC20(0), msg.value); } /// @notice Adds a token deposit to `deposits[]`; only the `owner` can /// call this function and it will only work if the account sending the /// tokens has called `approve()` so that this contract can call /// `transferFrom()` and take the tokens /// @param _token The address for the ERC20 that is being deposited /// @param _amount The quantity of tokens that is deposited into the /// contract in the smallest unit of tokens (if a token has its decimals /// set to 18 and 1 token is sent, the `_amount` would be 10^18) /// @param _block The block height that determines the snapshot of token /// holders that will be able to withdraw their share of this deposit; this /// block must be set in the past, if 0 it defaults to one block before the /// transaction /// @return _idDeposit The id number for the deposit function newTokenDeposit(ERC20 _token, uint _amount, uint _block) public onlyOwner returns (uint _idDeposit) { require(_amount > 0); require(_block < block.number); // Must `approve()` this contract in a previous transaction require( _token.transferFrom(msg.sender, address(this), _amount) ); _idDeposit = deposits.length ++; // Record the deposit Deposit storage d = deposits[_idDeposit]; d.block = _block == 0 ? block.number -1 : _block; d.token = _token; d.amount = _amount; NewDeposit(_idDeposit, _token, _amount); } /// @notice This function is a failsafe function in case a token is /// deposited that has an issue that could prevent it's withdraw loop break /// (e.g. transfers are disabled), can only be called by the `owner` /// @param _idDeposit The id number for the deposit being canceled function cancelPaymentGlobally(uint _idDeposit) public onlyOwner { require(_idDeposit < deposits.length); deposits[_idDeposit].canceled = true; CancelPaymentGlobally(_idDeposit); } ///////// // Public Functions ///////// /// @notice Sends all the tokens and ether to the token holder by looping /// through all the deposits, determining the appropriate amount by /// dividing the `totalSupply` by the number of tokens the token holder had /// at `deposit.block` for each deposit; this function may have to be /// called multiple times if their are many deposits function withdraw() public { uint acc = 0; // Accumulates the amount of tokens/ether to be sent uint i = nextDepositToPayout[msg.sender]; // Iterates through the deposits require(i<deposits.length); ERC20 currentToken = deposits[i].token; // Sets the `currentToken` to ether require(msg.gas>149000); // Throws if there is no gas to do at least a single transfer. while (( i< deposits.length) && ( msg.gas > 148000)) { Deposit storage d = deposits[i]; // Make sure `deposit[i]` shouldn't be skipped if ((!d.canceled)&&(!isDepositSkiped(msg.sender, i))) { // The current diposti is different of the accumulated until now, // so we return the accumulated tokens until now and resset the // accumulator. if (currentToken != d.token) { nextDepositToPayout[msg.sender] = i; require(doPayment(i-1, msg.sender, currentToken, acc)); assert(nextDepositToPayout[msg.sender] == i); currentToken = d.token; acc =0; } // Accumulate the amount to send for the `currentToken` acc += d.amount * rewardToken.balanceOfAt(msg.sender, d.block) / rewardToken.totalSupplyAt(d.block); } i++; // Next deposit :-D } // Return the accumulated tokens. nextDepositToPayout[msg.sender] = i; require(doPayment(i-1, msg.sender, currentToken, acc)); assert(nextDepositToPayout[msg.sender] == i); } /// @notice This function is a failsafe function in case a token holder /// wants to skip a payment, can only be applied to one deposit at a time /// and only affects the payment for the `msg.sender` calling the function; /// can be undone by calling again with `skip == false` /// @param _idDeposit The id number for the deposit being canceled /// @param _skip True if the caller wants to skip the payment for `idDeposit` function skipPayment(uint _idDeposit, bool _skip) public { require(_idDeposit < deposits.length); skipDeposits[msg.sender][_idDeposit] = _skip; SkipPayment(_idDeposit, _skip); } ///////// // Constant Functions ///////// /// @notice Calculates the amount of a given token (or ether) the holder can /// receive /// @param _token The address of the token being queried, 0x0 = ether /// @param _holder The address being checked /// @return The amount of `token` able to be collected in the smallest /// unit of the `token` (wei for ether) function getPendingReward(ERC20 _token, address _holder) public constant returns(uint) { uint acc =0; for (uint i=nextDepositToPayout[msg.sender]; i<deposits.length; i++) { Deposit storage d = deposits[i]; if ((d.token == _token)&&(!d.canceled) && (!isDepositSkiped(_holder, i))) { acc += d.amount * rewardToken.balanceOfAt(_holder, d.block) / rewardToken.totalSupplyAt(d.block); } } return acc; } /// @notice A check to see if a specific address has anything to collect /// @param _holder The address being checked for available deposits /// @return True if there are payments to be collected function canWithdraw(address _holder) public constant returns (bool) { if (nextDepositToPayout[_holder] == deposits.length) return false; for (uint i=nextDepositToPayout[msg.sender]; i<deposits.length; i++) { Deposit storage d = deposits[i]; if ((!d.canceled) && (!isDepositSkiped(_holder, i))) { uint amount = d.amount * rewardToken.balanceOfAt(_holder, d.block) / rewardToken.totalSupplyAt(d.block); if (amount>0) return true; } } return false; } /// @notice Checks how many deposits have been made /// @return The number of deposits function nDeposits() public constant returns (uint) { return deposits.length; } /// @notice Checks to see if a specific deposit has been skipped /// @param _holder The address being checked for available deposits /// @param _idDeposit The id number for the deposit being canceled /// @return True if the specified deposit has been skipped function isDepositSkiped(address _holder, uint _idDeposit) public constant returns(bool) { return skipDeposits[_holder][_idDeposit]; } ///////// // Internal Functions ///////// /// @notice Transfers `amount` of `token` to `dest`, only used internally, /// and does not throw, will always return `true` or `false` /// @param _token The address for the ERC20 that is being transferred /// @param _dest The destination address of the transfer /// @param _amount The quantity of tokens that is being transferred /// denominated in the smallest unit of tokens (if a token has its decimals /// set to 18 and 1 token is being transferred the `amount` would be 10^18) /// @return True if the payment succeeded function doPayment(uint _idDeposit, address _dest, ERC20 _token, uint _amount) internal returns (bool) { if (_amount == 0) return true; if (address(_token) == 0) { if (!_dest.send(_amount)) return false; // If we can't send, we continue... } else { if (!_token.transfer(_dest, _amount)) return false; } Withdraw(_idDeposit, _dest, _token, _amount); return true; } function getBalance(ERC20 _token, address _holder) internal constant returns (uint) { if (address(_token) == 0) { return _holder.balance; } else { return _token.balanceOf(_holder); } } ///////// // Events ///////// event Withdraw(uint indexed lastIdPayment, address indexed holder, ERC20 indexed tokenContract, uint amount); event NewDeposit(uint indexed idDeposit, ERC20 indexed tokenContract, uint amount); event CancelPaymentGlobally(uint indexed idDeposit); event SkipPayment(uint indexed idDeposit, bool skip); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"canWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"escapeHatchCaller","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_idDeposit","type":"uint256"},{"name":"_skip","type":"bool"}],"name":"skipPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_block","type":"uint256"}],"name":"newTokenDeposit","outputs":[{"name":"_idDeposit","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nextDepositToPayout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dac","type":"address"}],"name":"removeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"proposeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"isTokenEscapable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nDeposits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"escapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"},{"name":"_idDeposit","type":"uint256"}],"name":"isDepositSkiped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"deposits","outputs":[{"name":"block","type":"uint256"},{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"canceled","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_block","type":"uint256"}],"name":"newEtherDeposit","outputs":[{"name":"_idDeposit","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"newOwnerCandidate","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newEscapeHatchCaller","type":"address"}],"name":"changeHatchEscapeCaller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_idDeposit","type":"uint256"}],"name":"cancelPaymentGlobally","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"escapeHatchDestination","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_holder","type":"address"}],"name":"getPendingReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_rewardToken","type":"address"},{"name":"_escapeHatchCaller","type":"address"},{"name":"_escapeHatchDestination","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lastIdPayment","type":"uint256"},{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"tokenContract","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idDeposit","type":"uint256"},{"indexed":true,"name":"tokenContract","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"NewDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idDeposit","type":"uint256"}],"name":"CancelPaymentGlobally","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idDeposit","type":"uint256"},{"indexed":false,"name":"skip","type":"bool"}],"name":"SkipPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"}],"name":"EscapeHatchBlackistedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EscapeHatchCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipRemoved","type":"event"}]
Deployed Bytecode
0x60606040526004361061010e5763ffffffff60e060020a60003504166319262d30811461011b5780631f6eb6e71461014e5780632af4c31e1461017d5780633ccfd60b1461019e5780634147e891146101b157806344ab1409146101cc5780635bd693d414610203578063666a342714610222578063710bf3221461024157806379ba509714610260578063892db057146102735780638da5cb5b146102925780639cff53e0146102a5578063a142d608146102b8578063a3e7247a146102d7578063b02c43d0146102f9578063d078246114610343578063d091b5501461034e578063d836fbe814610361578063d8f5e6c914610380578063f5b6123014610396578063fe0f3a13146103a9575b61011860006103ce565b50005b341561012657600080fd5b61013a600160a060020a03600435166104a5565b604051901515815260200160405180910390f35b341561015957600080fd5b61016161066c565b604051600160a060020a03909116815260200160405180910390f35b341561018857600080fd5b61019c600160a060020a036004351661067b565b005b34156101a957600080fd5b61019c61070f565b34156101bc57600080fd5b61019c60043560243515156109c4565b34156101d757600080fd5b6101f1600160a060020a0360043516602435604435610a3e565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1600160a060020a0360043516610bb0565b341561022d57600080fd5b61019c600160a060020a0360043516610bc2565b341561024c57600080fd5b61019c600160a060020a0360043516610c3f565b341561026b57600080fd5b61019c610cb0565b341561027e57600080fd5b61013a600160a060020a0360043516610d30565b341561029d57600080fd5b610161610d4f565b34156102b057600080fd5b6101f1610d5e565b34156102c357600080fd5b61019c600160a060020a0360043516610d65565b34156102e257600080fd5b61013a600160a060020a0360043516602435610f97565b341561030457600080fd5b61030f600435610fc2565b604051938452600160a060020a03909216602084015260408084019190915290151560608301526080909101905180910390f35b6101f16004356103ce565b341561035957600080fd5b610161611006565b341561036c57600080fd5b61019c600160a060020a0360043516611015565b341561038b57600080fd5b61019c60043561106d565b34156103a157600080fd5b6101616110f9565b34156103b457600080fd5b6101f1600160a060020a0360043581169060243516611108565b60008054819033600160a060020a039081169116146103ec57600080fd5b600034116103f957600080fd5b43831061040557600080fd5b600580549061041790600183016113da565b915060058281548110151561042857fe5b9060005260206000209060040201905082600014610446578261044b565b600143035b8155600181018054600160a060020a0319169055346002820181905560009083907fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0309060405190815260200160405180910390a350919050565b600554600160a060020a038216600090815260076020526040812054909182918291829114156104d85760009350610664565b600160a060020a03331660009081526007602052604090205492505b60055483101561065f57600580548490811061050c57fe5b60009182526020909120600490910201600381015490925060ff1615801561053b57506105398584610f97565b155b15610654576006548254600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561059657600080fd5b6102c65a03f115156105a757600080fd5b50505060405180516006548454919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561061557600080fd5b6102c65a03f1151561062657600080fd5b5050506040518051905083600201540281151561063f57fe5b04905060008111156106545760019350610664565b6001909201916104f4565b600093505b505050919050565b600254600160a060020a031681565b6000805433600160a060020a0390811691161461069757600080fd5b600160a060020a03821615156106ac57600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160a060020a03331660009081526007602052604081205460055482908190831061073a57600080fd5b600580548490811061074857fe5b6000918252602090912060016004909202010154600160a060020a03169150620246085a1161077657600080fd5b600554831080156107895750620242205a115b1561096557600580548490811061079c57fe5b60009182526020909120600490910201600381015490915060ff161580156107cb57506107c93384610f97565b155b1561095a576001810154600160a060020a038381169116146108555733600160a060020a03811660009081526007602052604090208490556108149060001985019084876112a6565b151561081f57600080fd5b600160a060020a033316600090815260076020526040902054831461084057fe5b600181015460009450600160a060020a031691505b6006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156108ab57600080fd5b6102c65a03f115156108bc57600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90339060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561092a57600080fd5b6102c65a03f1151561093b57600080fd5b5050506040518051905082600201540281151561095457fe5b04840193505b600190920191610776565b33600160a060020a03811660009081526007602052604090208490556109929060001985019084876112a6565b151561099d57600080fd5b600160a060020a03331660009081526007602052604090205483146109be57fe5b50505050565b60055482106109d257600080fd5b33600160a060020a0316600090815260086020908152604080832085845290915290819020805460ff191683151517905582907fd6149459fde27a6c662cc59dbb1674a711ddb77e342754978130b5b3bd0cba1e90839051901515815260200160405180910390a25050565b60008054819033600160a060020a03908116911614610a5c57600080fd5b60008411610a6957600080fd5b438310610a7557600080fd5b84600160a060020a03166323b872dd33308760006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b505050604051805190501515610b0557600080fd5b6005805490610b1790600183016113da565b9150600582815481101515610b2857fe5b9060005260206000209060040201905082600014610b465782610b4b565b600143035b8155600181018054600160a060020a031916600160a060020a03871690811790915560028201859055827fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0308660405190815260200160405180910390a3509392505050565b60076020526000908152604090205481565b60005433600160a060020a03908116911614610bdd57600080fd5b610dac600160a060020a03821614610bf457600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610c5a57600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60015460009033600160a060020a03908116911614610cce57600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b6005545b90565b600254600090819033600160a060020a0390811691161480610d95575060005433600160a060020a039081169116145b1515610da057600080fd5b600160a060020a03831660009081526004602052604090205460ff1615610dc657600080fd5b600160a060020a0383161515610e5857600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f193505050501515610e0f57600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1610f92565b5081600160a060020a0381166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610eb157600080fd5b6102c65a03f11515610ec257600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610f3157600080fd5b6102c65a03f11515610f4257600080fd5b50505060405180519050507fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a15b505050565b600160a060020a03919091166000908152600860209081526040808320938352929052205460ff1690565b6005805482908110610fd057fe5b60009182526020909120600490910201805460018201546002830154600390930154919350600160a060020a0316919060ff1684565b600154600160a060020a031681565b60025433600160a060020a0390811691161480611040575060005433600160a060020a039081169116145b151561104b57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a0390811691161461108857600080fd5b600554811061109657600080fd5b60016005828154811015156110a757fe5b60009182526020909120600490910201600301805460ff1916911515919091179055807fa3d465f21dc4259cc4c67491949fc38ff4518179cd78b168bff44bc41211500560405160405180910390a250565b600354600160a060020a031681565b600160a060020a0333166000908152600760205260408120548190815b60055482101561129c57600580548390811061113d57fe5b600091825260209091206004909102016001810154909150600160a060020a0387811691161480156111745750600381015460ff16155b801561118757506111858583610f97565b155b15611291576006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156111e257600080fd5b6102c65a03f115156111f357600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561126157600080fd5b6102c65a03f1151561127257600080fd5b5050506040518051905082600201540281151561128b57fe5b04830192505b600190910190611125565b5090949350505050565b60008115156112b7575060016113d2565b600160a060020a038316151561130057600160a060020a03841682156108fc0283604051600060405180830381858888f1935050505015156112fb575060006113d2565b611386565b82600160a060020a031663a9059cbb858460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561135d57600080fd5b6102c65a03f1151561136e57600080fd5b505050604051805190501515611386575060006113d2565b82600160a060020a031684600160a060020a0316867ffeb2000dca3e617cd6f3a8bbb63014bb54a124aac6ccbf73ee7229b4cd01f1208560405190815260200160405180910390a45060015b949350505050565b815481835581811511610f9257600083815260209020610f9291610d629160049182028101918502015b8082111561143c576000808255600182018054600160a060020a0319169055600282015560038101805460ff19169055600401611404565b50905600a165627a7a723058202006f388efc797568aea6630c05326f98da497a9d97d7f9eada22ce6d2bfbca70029
Swarm Source
bzzr://2006f388efc797568aea6630c05326f98da497a9d97d7f9eada22ce6d2bfbca7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.