Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
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"}]
Contract Creation Code
6060604052341561000f57600080fd5b60405160608061150183398101604052808051919060200180519190602001805160008054600160a060020a03338116600160a060020a0319928316179092556002805496831696821696909617909555600380549282169286169290921790915560068054959091169490931693909317909155505061146c806100956000396000f30060606040526004361061010e5763ffffffff60e060020a60003504166319262d30811461011b5780631f6eb6e71461014e5780632af4c31e1461017d5780633ccfd60b1461019e5780634147e891146101b157806344ab1409146101cc5780635bd693d414610203578063666a342714610222578063710bf3221461024157806379ba509714610260578063892db057146102735780638da5cb5b146102925780639cff53e0146102a5578063a142d608146102b8578063a3e7247a146102d7578063b02c43d0146102f9578063d078246114610343578063d091b5501461034e578063d836fbe814610361578063d8f5e6c914610380578063f5b6123014610396578063fe0f3a13146103a9575b61011860006103ce565b50005b341561012657600080fd5b61013a600160a060020a03600435166104a5565b604051901515815260200160405180910390f35b341561015957600080fd5b61016161066c565b604051600160a060020a03909116815260200160405180910390f35b341561018857600080fd5b61019c600160a060020a036004351661067b565b005b34156101a957600080fd5b61019c61070f565b34156101bc57600080fd5b61019c60043560243515156109c4565b34156101d757600080fd5b6101f1600160a060020a0360043516602435604435610a3e565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1600160a060020a0360043516610bb0565b341561022d57600080fd5b61019c600160a060020a0360043516610bc2565b341561024c57600080fd5b61019c600160a060020a0360043516610c3f565b341561026b57600080fd5b61019c610cb0565b341561027e57600080fd5b61013a600160a060020a0360043516610d30565b341561029d57600080fd5b610161610d4f565b34156102b057600080fd5b6101f1610d5e565b34156102c357600080fd5b61019c600160a060020a0360043516610d65565b34156102e257600080fd5b61013a600160a060020a0360043516602435610f97565b341561030457600080fd5b61030f600435610fc2565b604051938452600160a060020a03909216602084015260408084019190915290151560608301526080909101905180910390f35b6101f16004356103ce565b341561035957600080fd5b610161611006565b341561036c57600080fd5b61019c600160a060020a0360043516611015565b341561038b57600080fd5b61019c60043561106d565b34156103a157600080fd5b6101616110f9565b34156103b457600080fd5b6101f1600160a060020a0360043581169060243516611108565b60008054819033600160a060020a039081169116146103ec57600080fd5b600034116103f957600080fd5b43831061040557600080fd5b600580549061041790600183016113da565b915060058281548110151561042857fe5b9060005260206000209060040201905082600014610446578261044b565b600143035b8155600181018054600160a060020a0319169055346002820181905560009083907fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0309060405190815260200160405180910390a350919050565b600554600160a060020a038216600090815260076020526040812054909182918291829114156104d85760009350610664565b600160a060020a03331660009081526007602052604090205492505b60055483101561065f57600580548490811061050c57fe5b60009182526020909120600490910201600381015490925060ff1615801561053b57506105398584610f97565b155b15610654576006548254600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561059657600080fd5b6102c65a03f115156105a757600080fd5b50505060405180516006548454919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561061557600080fd5b6102c65a03f1151561062657600080fd5b5050506040518051905083600201540281151561063f57fe5b04905060008111156106545760019350610664565b6001909201916104f4565b600093505b505050919050565b600254600160a060020a031681565b6000805433600160a060020a0390811691161461069757600080fd5b600160a060020a03821615156106ac57600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160a060020a03331660009081526007602052604081205460055482908190831061073a57600080fd5b600580548490811061074857fe5b6000918252602090912060016004909202010154600160a060020a03169150620246085a1161077657600080fd5b600554831080156107895750620242205a115b1561096557600580548490811061079c57fe5b60009182526020909120600490910201600381015490915060ff161580156107cb57506107c93384610f97565b155b1561095a576001810154600160a060020a038381169116146108555733600160a060020a03811660009081526007602052604090208490556108149060001985019084876112a6565b151561081f57600080fd5b600160a060020a033316600090815260076020526040902054831461084057fe5b600181015460009450600160a060020a031691505b6006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156108ab57600080fd5b6102c65a03f115156108bc57600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90339060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561092a57600080fd5b6102c65a03f1151561093b57600080fd5b5050506040518051905082600201540281151561095457fe5b04840193505b600190920191610776565b33600160a060020a03811660009081526007602052604090208490556109929060001985019084876112a6565b151561099d57600080fd5b600160a060020a03331660009081526007602052604090205483146109be57fe5b50505050565b60055482106109d257600080fd5b33600160a060020a0316600090815260086020908152604080832085845290915290819020805460ff191683151517905582907fd6149459fde27a6c662cc59dbb1674a711ddb77e342754978130b5b3bd0cba1e90839051901515815260200160405180910390a25050565b60008054819033600160a060020a03908116911614610a5c57600080fd5b60008411610a6957600080fd5b438310610a7557600080fd5b84600160a060020a03166323b872dd33308760006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b505050604051805190501515610b0557600080fd5b6005805490610b1790600183016113da565b9150600582815481101515610b2857fe5b9060005260206000209060040201905082600014610b465782610b4b565b600143035b8155600181018054600160a060020a031916600160a060020a03871690811790915560028201859055827fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0308660405190815260200160405180910390a3509392505050565b60076020526000908152604090205481565b60005433600160a060020a03908116911614610bdd57600080fd5b610dac600160a060020a03821614610bf457600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610c5a57600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60015460009033600160a060020a03908116911614610cce57600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b6005545b90565b600254600090819033600160a060020a0390811691161480610d95575060005433600160a060020a039081169116145b1515610da057600080fd5b600160a060020a03831660009081526004602052604090205460ff1615610dc657600080fd5b600160a060020a0383161515610e5857600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f193505050501515610e0f57600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1610f92565b5081600160a060020a0381166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610eb157600080fd5b6102c65a03f11515610ec257600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610f3157600080fd5b6102c65a03f11515610f4257600080fd5b50505060405180519050507fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a15b505050565b600160a060020a03919091166000908152600860209081526040808320938352929052205460ff1690565b6005805482908110610fd057fe5b60009182526020909120600490910201805460018201546002830154600390930154919350600160a060020a0316919060ff1684565b600154600160a060020a031681565b60025433600160a060020a0390811691161480611040575060005433600160a060020a039081169116145b151561104b57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a0390811691161461108857600080fd5b600554811061109657600080fd5b60016005828154811015156110a757fe5b60009182526020909120600490910201600301805460ff1916911515919091179055807fa3d465f21dc4259cc4c67491949fc38ff4518179cd78b168bff44bc41211500560405160405180910390a250565b600354600160a060020a031681565b600160a060020a0333166000908152600760205260408120548190815b60055482101561129c57600580548390811061113d57fe5b600091825260209091206004909102016001810154909150600160a060020a0387811691161480156111745750600381015460ff16155b801561118757506111858583610f97565b155b15611291576006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156111e257600080fd5b6102c65a03f115156111f357600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561126157600080fd5b6102c65a03f1151561127257600080fd5b5050506040518051905082600201540281151561128b57fe5b04830192505b600190910190611125565b5090949350505050565b60008115156112b7575060016113d2565b600160a060020a038316151561130057600160a060020a03841682156108fc0283604051600060405180830381858888f1935050505015156112fb575060006113d2565b611386565b82600160a060020a031663a9059cbb858460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561135d57600080fd5b6102c65a03f1151561136e57600080fd5b505050604051805190501515611386575060006113d2565b82600160a060020a031684600160a060020a0316867ffeb2000dca3e617cd6f3a8bbb63014bb54a124aac6ccbf73ee7229b4cd01f1208560405190815260200160405180910390a45060015b949350505050565b815481835581811511610f9257600083815260209020610f9291610d629160049182028101918502015b8082111561143c576000808255600182018054600160a060020a0319169055600282015560038101805460ff19169055600401611404565b50905600a165627a7a723058202006f388efc797568aea6630c05326f98da497a9d97d7f9eada22ce6d2bfbca70029000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d0000000000000000000000001dba1131000664b884a1ba238464159892252d3a000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d
Deployed Bytecode
0x60606040526004361061010e5763ffffffff60e060020a60003504166319262d30811461011b5780631f6eb6e71461014e5780632af4c31e1461017d5780633ccfd60b1461019e5780634147e891146101b157806344ab1409146101cc5780635bd693d414610203578063666a342714610222578063710bf3221461024157806379ba509714610260578063892db057146102735780638da5cb5b146102925780639cff53e0146102a5578063a142d608146102b8578063a3e7247a146102d7578063b02c43d0146102f9578063d078246114610343578063d091b5501461034e578063d836fbe814610361578063d8f5e6c914610380578063f5b6123014610396578063fe0f3a13146103a9575b61011860006103ce565b50005b341561012657600080fd5b61013a600160a060020a03600435166104a5565b604051901515815260200160405180910390f35b341561015957600080fd5b61016161066c565b604051600160a060020a03909116815260200160405180910390f35b341561018857600080fd5b61019c600160a060020a036004351661067b565b005b34156101a957600080fd5b61019c61070f565b34156101bc57600080fd5b61019c60043560243515156109c4565b34156101d757600080fd5b6101f1600160a060020a0360043516602435604435610a3e565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1600160a060020a0360043516610bb0565b341561022d57600080fd5b61019c600160a060020a0360043516610bc2565b341561024c57600080fd5b61019c600160a060020a0360043516610c3f565b341561026b57600080fd5b61019c610cb0565b341561027e57600080fd5b61013a600160a060020a0360043516610d30565b341561029d57600080fd5b610161610d4f565b34156102b057600080fd5b6101f1610d5e565b34156102c357600080fd5b61019c600160a060020a0360043516610d65565b34156102e257600080fd5b61013a600160a060020a0360043516602435610f97565b341561030457600080fd5b61030f600435610fc2565b604051938452600160a060020a03909216602084015260408084019190915290151560608301526080909101905180910390f35b6101f16004356103ce565b341561035957600080fd5b610161611006565b341561036c57600080fd5b61019c600160a060020a0360043516611015565b341561038b57600080fd5b61019c60043561106d565b34156103a157600080fd5b6101616110f9565b34156103b457600080fd5b6101f1600160a060020a0360043581169060243516611108565b60008054819033600160a060020a039081169116146103ec57600080fd5b600034116103f957600080fd5b43831061040557600080fd5b600580549061041790600183016113da565b915060058281548110151561042857fe5b9060005260206000209060040201905082600014610446578261044b565b600143035b8155600181018054600160a060020a0319169055346002820181905560009083907fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0309060405190815260200160405180910390a350919050565b600554600160a060020a038216600090815260076020526040812054909182918291829114156104d85760009350610664565b600160a060020a03331660009081526007602052604090205492505b60055483101561065f57600580548490811061050c57fe5b60009182526020909120600490910201600381015490925060ff1615801561053b57506105398584610f97565b155b15610654576006548254600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561059657600080fd5b6102c65a03f115156105a757600080fd5b50505060405180516006548454919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561061557600080fd5b6102c65a03f1151561062657600080fd5b5050506040518051905083600201540281151561063f57fe5b04905060008111156106545760019350610664565b6001909201916104f4565b600093505b505050919050565b600254600160a060020a031681565b6000805433600160a060020a0390811691161461069757600080fd5b600160a060020a03821615156106ac57600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160a060020a03331660009081526007602052604081205460055482908190831061073a57600080fd5b600580548490811061074857fe5b6000918252602090912060016004909202010154600160a060020a03169150620246085a1161077657600080fd5b600554831080156107895750620242205a115b1561096557600580548490811061079c57fe5b60009182526020909120600490910201600381015490915060ff161580156107cb57506107c93384610f97565b155b1561095a576001810154600160a060020a038381169116146108555733600160a060020a03811660009081526007602052604090208490556108149060001985019084876112a6565b151561081f57600080fd5b600160a060020a033316600090815260076020526040902054831461084057fe5b600181015460009450600160a060020a031691505b6006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156108ab57600080fd5b6102c65a03f115156108bc57600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90339060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561092a57600080fd5b6102c65a03f1151561093b57600080fd5b5050506040518051905082600201540281151561095457fe5b04840193505b600190920191610776565b33600160a060020a03811660009081526007602052604090208490556109929060001985019084876112a6565b151561099d57600080fd5b600160a060020a03331660009081526007602052604090205483146109be57fe5b50505050565b60055482106109d257600080fd5b33600160a060020a0316600090815260086020908152604080832085845290915290819020805460ff191683151517905582907fd6149459fde27a6c662cc59dbb1674a711ddb77e342754978130b5b3bd0cba1e90839051901515815260200160405180910390a25050565b60008054819033600160a060020a03908116911614610a5c57600080fd5b60008411610a6957600080fd5b438310610a7557600080fd5b84600160a060020a03166323b872dd33308760006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b505050604051805190501515610b0557600080fd5b6005805490610b1790600183016113da565b9150600582815481101515610b2857fe5b9060005260206000209060040201905082600014610b465782610b4b565b600143035b8155600181018054600160a060020a031916600160a060020a03871690811790915560028201859055827fe6d83b1e0e5126a0574d0154ed77e40181534edcb74f035b158d92ed3d10a0308660405190815260200160405180910390a3509392505050565b60076020526000908152604090205481565b60005433600160a060020a03908116911614610bdd57600080fd5b610dac600160a060020a03821614610bf457600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610c5a57600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60015460009033600160a060020a03908116911614610cce57600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b6005545b90565b600254600090819033600160a060020a0390811691161480610d95575060005433600160a060020a039081169116145b1515610da057600080fd5b600160a060020a03831660009081526004602052604090205460ff1615610dc657600080fd5b600160a060020a0383161515610e5857600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f193505050501515610e0f57600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1610f92565b5081600160a060020a0381166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610eb157600080fd5b6102c65a03f11515610ec257600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610f3157600080fd5b6102c65a03f11515610f4257600080fd5b50505060405180519050507fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a15b505050565b600160a060020a03919091166000908152600860209081526040808320938352929052205460ff1690565b6005805482908110610fd057fe5b60009182526020909120600490910201805460018201546002830154600390930154919350600160a060020a0316919060ff1684565b600154600160a060020a031681565b60025433600160a060020a0390811691161480611040575060005433600160a060020a039081169116145b151561104b57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a0390811691161461108857600080fd5b600554811061109657600080fd5b60016005828154811015156110a757fe5b60009182526020909120600490910201600301805460ff1916911515919091179055807fa3d465f21dc4259cc4c67491949fc38ff4518179cd78b168bff44bc41211500560405160405180910390a250565b600354600160a060020a031681565b600160a060020a0333166000908152600760205260408120548190815b60055482101561129c57600580548390811061113d57fe5b600091825260209091206004909102016001810154909150600160a060020a0387811691161480156111745750600381015460ff16155b801561118757506111858583610f97565b155b15611291576006548154600160a060020a039091169063981b24d09060006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156111e257600080fd5b6102c65a03f115156111f357600080fd5b50505060405180516006548354919250600160a060020a031690634ee2cd7e90889060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561126157600080fd5b6102c65a03f1151561127257600080fd5b5050506040518051905082600201540281151561128b57fe5b04830192505b600190910190611125565b5090949350505050565b60008115156112b7575060016113d2565b600160a060020a038316151561130057600160a060020a03841682156108fc0283604051600060405180830381858888f1935050505015156112fb575060006113d2565b611386565b82600160a060020a031663a9059cbb858460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561135d57600080fd5b6102c65a03f1151561136e57600080fd5b505050604051805190501515611386575060006113d2565b82600160a060020a031684600160a060020a0316867ffeb2000dca3e617cd6f3a8bbb63014bb54a124aac6ccbf73ee7229b4cd01f1208560405190815260200160405180910390a45060015b949350505050565b815481835581811511610f9257600083815260209020610f9291610d629160049182028101918502015b8082111561143c576000808255600182018054600160a060020a0319169055600282015560038101805460ff19169055600401611404565b50905600a165627a7a723058202006f388efc797568aea6630c05326f98da497a9d97d7f9eada22ce6d2bfbca70029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d0000000000000000000000001dba1131000664b884a1ba238464159892252d3a000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x667Dd163f1a0e6Ef3e7bbe8E0676f62146d5662d
Arg [1] : _escapeHatchCaller (address): 0x1DBA1131000664b884A1Ba238464159892252D3a
Arg [2] : _escapeHatchDestination (address): 0x667Dd163f1a0e6Ef3e7bbe8E0676f62146d5662d
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d
Arg [1] : 0000000000000000000000001dba1131000664b884a1ba238464159892252d3a
Arg [2] : 000000000000000000000000667dd163f1a0e6ef3e7bbe8e0676f62146d5662d
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.