More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,575 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Disburse Authori... | 15890820 | 821 days ago | IN | 0 ETH | 0.00180763 | ||||
Check In | 15890817 | 821 days ago | IN | 0 ETH | 0.00076368 | ||||
Authorize Paymen... | 15875554 | 823 days ago | IN | 0 ETH | 0.00276283 | ||||
Disburse Authori... | 15826109 | 830 days ago | IN | 0 ETH | 0.00585652 | ||||
Check In | 15825692 | 830 days ago | IN | 0 ETH | 0.00086729 | ||||
Authorize Paymen... | 15732038 | 843 days ago | IN | 0 ETH | 0.00310447 | ||||
Authorize Paymen... | 15730646 | 844 days ago | IN | 0 ETH | 0.00259886 | ||||
Donate | 15727972 | 844 days ago | IN | 0 ETH | 0.00085009 | ||||
Donate | 15727972 | 844 days ago | IN | 0 ETH | 0.00084988 | ||||
Authorize Paymen... | 15725559 | 844 days ago | IN | 0 ETH | 0.00359855 | ||||
Authorize Paymen... | 15725301 | 844 days ago | IN | 0 ETH | 0.00466538 | ||||
Donate | 15685726 | 850 days ago | IN | 0 ETH | 0.00050977 | ||||
Disburse Authori... | 15620916 | 859 days ago | IN | 0 ETH | 0.0006146 | ||||
Check In | 15620914 | 859 days ago | IN | 0 ETH | 0.00027752 | ||||
Check In | 15583045 | 864 days ago | IN | 0 ETH | 0.00054888 | ||||
Authorize Paymen... | 15576136 | 865 days ago | IN | 0 ETH | 0.00583416 | ||||
Disburse Authori... | 15576136 | 865 days ago | IN | 0 ETH | 0.00880929 | ||||
Check In | 15576133 | 865 days ago | IN | 0 ETH | 0.00105673 | ||||
Authorize Paymen... | 15566640 | 867 days ago | IN | 0 ETH | 0.0008016 | ||||
Authorize Paymen... | 15545770 | 869 days ago | IN | 0 ETH | 0.00099201 | ||||
Check In | 15538035 | 871 days ago | IN | 0 ETH | 0.00042738 | ||||
Authorize Paymen... | 15537796 | 871 days ago | IN | 0 ETH | 0.00430983 | ||||
Authorize Paymen... | 15526072 | 873 days ago | IN | 0 ETH | 0.00455535 | ||||
Authorize Paymen... | 15525908 | 873 days ago | IN | 0 ETH | 0.00132197 | ||||
Disburse Authori... | 15522119 | 873 days ago | IN | 0 ETH | 0.00142753 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16133931 | 787 days ago | 16.5117478 ETH | ||||
15264395 | 914 days ago | 3 ETH | ||||
13889900 | 1132 days ago | 0.178472 ETH | ||||
13591241 | 1179 days ago | 0.596667 ETH | ||||
13584046 | 1180 days ago | 0.093979 ETH | ||||
13577868 | 1181 days ago | 0.459367 ETH | ||||
13561159 | 1184 days ago | 1.136722 ETH | ||||
13456029 | 1200 days ago | 0.849189 ETH | ||||
13431138 | 1204 days ago | 0.284116 ETH | ||||
13431138 | 1204 days ago | 0.3 ETH | ||||
13381009 | 1212 days ago | 0.95 ETH | ||||
13376364 | 1213 days ago | 1.941748 ETH | ||||
13373274 | 1213 days ago | 1.04589 ETH | ||||
13373274 | 1213 days ago | 0.40633 ETH | ||||
13373274 | 1213 days ago | 0.95 ETH | ||||
13366094 | 1214 days ago | 0.461934 ETH | ||||
13366094 | 1214 days ago | 1.39452 ETH | ||||
13322071 | 1221 days ago | 0.320671 ETH | ||||
13306630 | 1224 days ago | 0.858316 ETH | ||||
13264668 | 1230 days ago | 0.554341 ETH | ||||
13239372 | 1234 days ago | 0.628127 ETH | ||||
13218774 | 1237 days ago | 1.405 ETH | ||||
13189340 | 1242 days ago | 2.811253 ETH | ||||
13180101 | 1243 days ago | 0.791 ETH | ||||
13175308 | 1244 days ago | 1.190674 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GivethBridge
Compiler Version
v0.4.21+commit.dfe3193c
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-06-29 */ ///File: giveth-common-contracts/contracts/ERC20.sol pragma solidity ^0.4.19; /** * @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 the account with address _owner function balanceOf(address _owner) public constant returns (uint256 balance); /// @dev Transfers _value number of tokens to address _to function transfer(address _to, uint256 _value) public returns (bool success); /// @dev Transfers _value number 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 the msg.sender's account 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: giveth-common-contracts/contracts/Owned.sol pragma solidity ^0.4.19; /// @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; this contract has three work flows for a change in /// ownership, the first requires the new owner to validate that they have the /// ability to accept ownership, the second allows the ownership to be /// directly transfered without requiring acceptance, and the third allows for /// the ownership to be removed to allow for decentralization 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() public { owner = msg.sender; } /// @dev `owner` is the only address that can call a function with this /// modifier modifier onlyOwner() { require (msg.sender == owner); _; } /// @dev In this 1st option for ownership transfer `proposeOwnership()` must /// be called first by the current `owner` then `acceptOwnership()` must be /// called by the `newOwnerCandidate` /// @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) public onlyOwner { newOwnerCandidate = _newOwnerCandidate; OwnershipRequested(msg.sender, newOwnerCandidate); } /// @notice Can only be called by the `newOwnerCandidate`, accepts the /// transfer of ownership function acceptOwnership() public { require(msg.sender == newOwnerCandidate); address oldOwner = owner; owner = newOwnerCandidate; newOwnerCandidate = 0x0; OwnershipTransferred(oldOwner, owner); } /// @dev In this 2nd option for ownership transfer `changeOwnership()` can /// be called and it will immediately assign ownership to the `newOwner` /// @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) public onlyOwner { require(_newOwner != 0x0); address oldOwner = owner; owner = _newOwner; newOwnerCandidate = 0x0; OwnershipTransferred(oldOwner, owner); } /// @dev In this 3rd option for ownership transfer `removeOwnership()` can /// be called and it will immediately assign ownership to the 0x0 address; /// it requires a 0xdece be input as a parameter to prevent accidental use /// @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) public onlyOwner { require(_dac == 0xdac); owner = 0x0; newOwnerCandidate = 0x0; OwnershipRemoved(); } } ///File: giveth-common-contracts/contracts/Escapable.sol pragma solidity ^0.4.19; /* 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/>. */ /// @dev `Escapable` is a base level contract built off of the `Owned` /// contract; it creates an escape hatch function that can be called in an /// emergency that will allow designated addresses to send any ether or tokens /// held in the contract to an `escapeHatchDestination` as long as they were /// not blacklisted contract Escapable is Owned { address public escapeHatchCaller; address public escapeHatchDestination; mapping (address=>bool) private escapeBlacklist; // Token contract addresses /// @notice The Constructor assigns the `escapeHatchDestination` and the /// `escapeHatchCaller` /// @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` /// @param _escapeHatchDestination The address of a safe location (usu a /// Multisig) to send the ether held in this contract; if a neutral address /// is required, the WHG Multisig is an option: /// 0x8Ff920020c8AD673661c8117f2855C384758C572 function Escapable(address _escapeHatchCaller, address _escapeHatchDestination) public { escapeHatchCaller = _escapeHatchCaller; escapeHatchDestination = _escapeHatchDestination; } /// @dev The addresses preassigned as `escapeHatchCaller` or `owner` /// are the only addresses that can call a function with this modifier modifier onlyEscapeHatchCallerOrOwner { require ((msg.sender == escapeHatchCaller)||(msg.sender == owner)); _; } /// @notice Creates the blacklist of tokens that are not able to be taken /// out of the contract; can only be done at the deployment, and the logic /// to add to the blacklist will be in the constructor of a child contract /// @param _token the token contract address that is to be blacklisted function blacklistEscapeToken(address _token) internal { escapeBlacklist[_token] = true; EscapeHatchBlackistedToken(_token); } /// @notice Checks to see if `_token` is in the blacklist of tokens /// @param _token the token address being queried /// @return False if `_token` is in the blacklist and can't be taken out of /// the contract via the `escapeHatch()` function isTokenEscapable(address _token) view 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 ether function escapeHatch(address _token) public onlyEscapeHatchCallerOrOwner { require(escapeBlacklist[_token]==false); uint256 balance; /// @dev Logic for ether if (_token == 0x0) { balance = this.balance; escapeHatchDestination.transfer(balance); EscapeHatchCalled(_token, balance); return; } /// @dev Logic for tokens ERC20 token = ERC20(_token); balance = token.balanceOf(this); require(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 value in this contract to /// the `escapeHatchDestination`; it would be ideal that `escapeHatchCaller` /// cannot move funds out of `escapeHatchDestination` function changeHatchEscapeCaller(address _newEscapeHatchCaller) public onlyEscapeHatchCallerOrOwner { escapeHatchCaller = _newEscapeHatchCaller; } event EscapeHatchBlackistedToken(address token); event EscapeHatchCalled(address token, uint amount); } ///File: ./contracts/lib/Pausable.sol pragma solidity ^0.4.21; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Owned { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() onlyOwner whenNotPaused public { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() onlyOwner whenPaused public { paused = false; emit Unpause(); } } ///File: ./contracts/lib/Vault.sol pragma solidity ^0.4.21; /* Copyright 2018, Jordi Baylina, RJ Ewing 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/>. */ /// @title Vault Contract /// @author Jordi Baylina, RJ Ewing /// @notice This contract holds funds for Campaigns and automates payments. For /// this iteration the funds will come straight from the Giveth Multisig as a /// safety precaution, but once fully tested and optimized this contract will /// be a safe place to store funds equipped with optional variable time delays /// to allow for an optional escape hatch /// @dev `Vault` is a higher level contract built off of the `Escapable` /// contract that holds funds for Campaigns and automates payments. contract Vault is Escapable, Pausable { /// @dev `Payment` is a public structure that describes the details of /// each payment making it easy to track the movement of funds /// transparently struct Payment { string name; // What is the purpose of this payment bytes32 reference; // Reference of the payment. address spender; // Who is sending the funds uint earliestPayTime; // The earliest a payment can be made (Unix Time) bool canceled; // If True then the payment has been canceled bool paid; // If True then the payment has been paid address recipient; // Who is receiving the funds address token; // Token this payment represents uint amount; // The amount of wei sent in the payment uint securityGuardDelay; // The seconds `securityGuard` can delay payment } Payment[] public authorizedPayments; address public securityGuard; uint public absoluteMinTimeLock; uint public timeLock; uint public maxSecurityGuardDelay; bool public allowDisbursePaymentWhenPaused; /// @dev The white list of approved addresses allowed to set up && receive /// payments from this vault mapping (address => bool) public allowedSpenders; // @dev Events to make the payment movements easy to find on the blockchain event PaymentAuthorized(uint indexed idPayment, address indexed recipient, uint amount, address token, bytes32 reference); event PaymentExecuted(uint indexed idPayment, address indexed recipient, uint amount, address token); event PaymentCanceled(uint indexed idPayment); event SpenderAuthorization(address indexed spender, bool authorized); /// @dev The address assigned the role of `securityGuard` is the only /// addresses that can call a function with this modifier modifier onlySecurityGuard { require(msg.sender == securityGuard); _; } /// By default, we dis-allow payment disburements if the contract is paused. /// However, to facilitate a migration of the bridge, we can allow /// disbursements when paused if explicitly set modifier disbursementsAllowed { require(!paused || allowDisbursePaymentWhenPaused); _; } /// @notice The Constructor creates the Vault on the blockchain /// @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 if `escapeHatchCaller` cannot move /// funds out of `escapeHatchDestination` /// @param _escapeHatchDestination The address of a safe location (usu a /// Multisig) to send the ether held in this contract in an emergency /// @param _absoluteMinTimeLock The minimum number of seconds `timelock` can /// be set to, if set to 0 the `owner` can remove the `timeLock` completely /// @param _timeLock Initial number of seconds that payments are delayed /// after they are authorized (a security precaution) /// @param _securityGuard Address that will be able to delay the payments /// beyond the initial timelock requirements; can be set to 0x0 to remove /// the `securityGuard` functionality /// @param _maxSecurityGuardDelay The maximum number of seconds in total /// that `securityGuard` can delay a payment so that the owner can cancel /// the payment if needed function Vault( address _escapeHatchCaller, address _escapeHatchDestination, uint _absoluteMinTimeLock, uint _timeLock, address _securityGuard, uint _maxSecurityGuardDelay ) Escapable(_escapeHatchCaller, _escapeHatchDestination) public { absoluteMinTimeLock = _absoluteMinTimeLock; timeLock = _timeLock; securityGuard = _securityGuard; maxSecurityGuardDelay = _maxSecurityGuardDelay; } ///////// // Helper functions ///////// /// @notice States the total number of authorized payments in this contract /// @return The number of payments ever authorized even if they were canceled function numberOfAuthorizedPayments() public view returns (uint) { return authorizedPayments.length; } //////// // Spender Interface //////// /// @notice only `allowedSpenders[]` Creates a new `Payment` /// @param _name Brief description of the payment that is authorized /// @param _reference External reference of the payment /// @param _recipient Destination of the payment /// @param _amount Amount to be paid in wei /// @param _paymentDelay Number of seconds the payment is to be delayed, if /// this value is below `timeLock` then the `timeLock` determines the delay /// @return The Payment ID number for the new authorized payment function authorizePayment( string _name, bytes32 _reference, address _recipient, address _token, uint _amount, uint _paymentDelay ) whenNotPaused external returns(uint) { // Fail if you arent on the `allowedSpenders` white list require(allowedSpenders[msg.sender]); uint idPayment = authorizedPayments.length; // Unique Payment ID authorizedPayments.length++; // The following lines fill out the payment struct Payment storage p = authorizedPayments[idPayment]; p.spender = msg.sender; // Overflow protection require(_paymentDelay <= 10**18); // Determines the earliest the recipient can receive payment (Unix time) p.earliestPayTime = _paymentDelay >= timeLock ? _getTime() + _paymentDelay : _getTime() + timeLock; p.recipient = _recipient; p.amount = _amount; p.name = _name; p.reference = _reference; p.token = _token; emit PaymentAuthorized(idPayment, p.recipient, p.amount, p.token, p.reference); return idPayment; } /// Anyone can call this function to disburse the payment to /// the recipient after `earliestPayTime` has passed /// @param _idPayment The payment ID to be executed function disburseAuthorizedPayment(uint _idPayment) disbursementsAllowed public { // Check that the `_idPayment` has been added to the payments struct require(_idPayment < authorizedPayments.length); Payment storage p = authorizedPayments[_idPayment]; // Checking for reasons not to execute the payment require(allowedSpenders[p.spender]); require(_getTime() >= p.earliestPayTime); require(!p.canceled); require(!p.paid); p.paid = true; // Set the payment to being paid // Make the payment if (p.token == 0) { p.recipient.transfer(p.amount); } else { require(ERC20(p.token).transfer(p.recipient, p.amount)); } emit PaymentExecuted(_idPayment, p.recipient, p.amount, p.token); } /// convience function to disburse multiple payments in a single tx function disburseAuthorizedPayments(uint[] _idPayments) public { for (uint i = 0; i < _idPayments.length; i++) { uint _idPayment = _idPayments[i]; disburseAuthorizedPayment(_idPayment); } } ///////// // SecurityGuard Interface ///////// /// @notice `onlySecurityGuard` Delays a payment for a set number of seconds /// @param _idPayment ID of the payment to be delayed /// @param _delay The number of seconds to delay the payment function delayPayment(uint _idPayment, uint _delay) onlySecurityGuard external { require(_idPayment < authorizedPayments.length); // Overflow test require(_delay <= 10**18); Payment storage p = authorizedPayments[_idPayment]; require(p.securityGuardDelay + _delay <= maxSecurityGuardDelay); require(!p.paid); require(!p.canceled); p.securityGuardDelay += _delay; p.earliestPayTime += _delay; } //////// // Owner Interface /////// /// @notice `onlyOwner` Cancel a payment all together /// @param _idPayment ID of the payment to be canceled. function cancelPayment(uint _idPayment) onlyOwner external { require(_idPayment < authorizedPayments.length); Payment storage p = authorizedPayments[_idPayment]; require(!p.canceled); require(!p.paid); p.canceled = true; emit PaymentCanceled(_idPayment); } /// @notice `onlyOwner` Adds a spender to the `allowedSpenders[]` white list /// @param _spender The address of the contract being authorized/unauthorized /// @param _authorize `true` if authorizing and `false` if unauthorizing function authorizeSpender(address _spender, bool _authorize) onlyOwner external { allowedSpenders[_spender] = _authorize; emit SpenderAuthorization(_spender, _authorize); } /// @notice `onlyOwner` Sets the address of `securityGuard` /// @param _newSecurityGuard Address of the new security guard function setSecurityGuard(address _newSecurityGuard) onlyOwner external { securityGuard = _newSecurityGuard; } /// @notice `onlyOwner` Changes `timeLock`; the new `timeLock` cannot be /// lower than `absoluteMinTimeLock` /// @param _newTimeLock Sets the new minimum default `timeLock` in seconds; /// pending payments maintain their `earliestPayTime` function setTimelock(uint _newTimeLock) onlyOwner external { require(_newTimeLock >= absoluteMinTimeLock); timeLock = _newTimeLock; } /// @notice `onlyOwner` Changes the maximum number of seconds /// `securityGuard` can delay a payment /// @param _maxSecurityGuardDelay The new maximum delay in seconds that /// `securityGuard` can delay the payment's execution in total function setMaxSecurityGuardDelay(uint _maxSecurityGuardDelay) onlyOwner external { maxSecurityGuardDelay = _maxSecurityGuardDelay; } /// @dev called by the owner to pause the contract. Triggers a stopped state /// and resets allowDisbursePaymentWhenPaused to false function pause() onlyOwner whenNotPaused public { allowDisbursePaymentWhenPaused = false; super.pause(); } /// Owner can allow payment disbursement when the contract is paused. This is so the /// bridge can be upgraded without having to migrate any existing authorizedPayments /// @dev only callable whenPaused b/c pausing the contract will reset `allowDisbursePaymentWhenPaused` to false /// @param allowed `true` if allowing payments to be disbursed when paused, otherwise 'false' function setAllowDisbursePaymentWhenPaused(bool allowed) onlyOwner whenPaused public { allowDisbursePaymentWhenPaused = allowed; } // for overidding during testing function _getTime() internal view returns (uint) { return now; } } ///File: ./contracts/lib/FailClosedVault.sol pragma solidity ^0.4.21; /* Copyright 2018, RJ Ewing 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 `FailClosedVault` is a version of the vault that requires * the securityGuard to "see" each payment before it can be collected */ contract FailClosedVault is Vault { uint public securityGuardLastCheckin; /** * @param _absoluteMinTimeLock For this version of the vault, it is recommended * that this value is > 24hrs. If not, it will require the securityGuard to checkIn * multiple times a day. Also consider that `securityGuardLastCheckin >= payment.earliestPayTime - timelock + 30mins);` * is the condition to allow payments to be payed. The additional 30 mins is to reduce (not eliminate) * the risk of front-running */ function FailClosedVault( address _escapeHatchCaller, address _escapeHatchDestination, uint _absoluteMinTimeLock, uint _timeLock, address _securityGuard, uint _maxSecurityGuardDelay ) Vault( _escapeHatchCaller, _escapeHatchDestination, _absoluteMinTimeLock, _timeLock, _securityGuard, _maxSecurityGuardDelay ) public { } ///////////////////// // Spender Interface ///////////////////// /** * Disburse an authorizedPayment to the recipient if all checks pass. * * @param _idPayment The payment ID to be disbursed */ function disburseAuthorizedPayment(uint _idPayment) disbursementsAllowed public { // Check that the `_idPayment` has been added to the payments struct require(_idPayment < authorizedPayments.length); Payment storage p = authorizedPayments[_idPayment]; // The current minimum delay for a payment is `timeLock`. Thus the following ensuress // that the `securityGuard` has checked in after the payment was created // @notice earliestPayTime is updated when a payment is delayed. Which may require // another checkIn before the payment can be collected. // @notice We add 30 mins to this to reduce (not eliminate) the risk of front-running require(securityGuardLastCheckin >= p.earliestPayTime - timeLock + 30 minutes); super.disburseAuthorizedPayment(_idPayment); } /////////////////////////// // SecurityGuard Interface /////////////////////////// /** * @notice `onlySecurityGuard` can checkin. If they fail to checkin, * payments will not be allowed to be disbursed, unless the payment has * an `earliestPayTime` <= `securityGuardLastCheckin`. * @notice To reduce the risk of a front-running attack on payments, it * is important that this is called with a resonable gasPrice set for the * current network congestion. If this tx is not mined, within 30 mins * of being sent, it is possible that a payment can be authorized w/o the * securityGuard's knowledge */ function checkIn() onlySecurityGuard external { securityGuardLastCheckin = _getTime(); } } ///File: ./contracts/GivethBridge.sol pragma solidity ^0.4.21; /* Copyright 2017, RJ Ewing <[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/>. */ /** * @notice It is not recommened to call this function outside of the giveth dapp (giveth.io) * this function is bridged to a side chain. If for some reason the sidechain tx fails, the donation * will end up in the givers control inside LiquidPledging contract. If you do not use the dapp, there * will be no way of notifying the sender/giver that the giver has to take action (withdraw/donate) in * the dapp */ contract GivethBridge is FailClosedVault { mapping(address => bool) tokenWhitelist; event Donate(uint64 giverId, uint64 receiverId, address token, uint amount); event DonateAndCreateGiver(address giver, uint64 receiverId, address token, uint amount); event EscapeFundsCalled(address token, uint amount); //== constructor /** * @param _escapeHatchCaller The address of a trusted account or contract to * call `escapeHatch()` to send the ether in this contract to the * `escapeHatchDestination` in the case on an emergency. it would be ideal * if `escapeHatchCaller` cannot move funds out of `escapeHatchDestination` * @param _escapeHatchDestination The address of a safe location (usually a * Multisig) to send the ether held in this contract in the case of an emergency * @param _absoluteMinTimeLock The minimum number of seconds `timelock` can * be set to, if set to 0 the `owner` can remove the `timeLock` completely * @param _timeLock Minimum number of seconds that payments are delayed * after they are authorized (a security precaution) * @param _securityGuard Address that will be able to delay the payments * beyond the initial timelock requirements; can be set to 0x0 to remove * the `securityGuard` functionality * @param _maxSecurityGuardDelay The maximum number of seconds in total * that `securityGuard` can delay a payment so that the owner can cancel * the payment if needed */ function GivethBridge( address _escapeHatchCaller, address _escapeHatchDestination, uint _absoluteMinTimeLock, uint _timeLock, address _securityGuard, uint _maxSecurityGuardDelay ) FailClosedVault( _escapeHatchCaller, _escapeHatchDestination, _absoluteMinTimeLock, _timeLock, _securityGuard, _maxSecurityGuardDelay ) public { tokenWhitelist[0] = true; // enable eth transfers } //== public methods /** * @notice It is not recommened to call this function outside of the giveth dapp (giveth.io) * this function is bridged to a side chain. If for some reason the sidechain tx fails, the donation * will end up in the givers control inside LiquidPledging contract. If you do not use the dapp, there * will be no way of notifying the sender/giver that the giver has to take action (withdraw/donate) in * the dapp * * @param giver The address to create a 'giver' pledge admin for in the liquidPledging contract * @param receiverId The adminId of the liquidPledging pledge admin receiving the donation */ function donateAndCreateGiver(address giver, uint64 receiverId) payable external { donateAndCreateGiver(giver, receiverId, 0, 0); } /** * @notice It is not recommened to call this function outside of the giveth dapp (giveth.io) * this function is bridged to a side chain. If for some reason the sidechain tx fails, the donation * will end up in the givers control inside LiquidPledging contract. If you do not use the dapp, there * will be no way of notifying the sender/giver that the giver has to take action (withdraw/donate) in * the dapp * * @param giver The address to create a 'giver' pledge admin for in the liquidPledging contract * @param receiverId The adminId of the liquidPledging pledge admin receiving the donation * @param token The token to donate. If donating ETH, then 0x0. Note: the token must be whitelisted * @param _amount The amount of the token to donate. If donating ETH, then 0x0 as the msg.value will be used instead. */ function donateAndCreateGiver(address giver, uint64 receiverId, address token, uint _amount) whenNotPaused payable public { require(giver != 0); require(receiverId != 0); uint amount = _receiveDonation(token, _amount); emit DonateAndCreateGiver(giver, receiverId, token, amount); } /** * @notice It is not recommened to call this function outside of the giveth dapp (giveth.io) * this function is bridged to a side chain. If for some reason the sidechain tx fails, the donation * will end up in the givers control inside LiquidPledging contract. If you do not use the dapp, there * will be no way of notifying the sender/giver that the giver has to take action (withdraw/donate) in * the dapp * * @param giverId The adminId of the liquidPledging pledge admin who is donating * @param receiverId The adminId of the liquidPledging pledge admin receiving the donation */ function donate(uint64 giverId, uint64 receiverId) payable external { donate(giverId, receiverId, 0, 0); } /** * @notice It is not recommened to call this function outside of the giveth dapp (giveth.io) * this function is bridged to a side chain. If for some reason the sidechain tx fails, the donation * will end up in the givers control inside LiquidPledging contract. If you do not use the dapp, there * will be no way of notifying the sender/giver that the giver has to take action (withdraw/donate) in * the dapp * * @param giverId The adminId of the liquidPledging pledge admin who is donating * @param receiverId The adminId of the liquidPledging pledge admin receiving the donation * @param token The token to donate. If donating ETH, then 0x0. Note: the token must be whitelisted * @param _amount The amount of the token to donate. If donating ETH, then 0x0 as the msg.value will be used instead. */ function donate(uint64 giverId, uint64 receiverId, address token, uint _amount) whenNotPaused payable public { require(giverId != 0); require(receiverId != 0); uint amount = _receiveDonation(token, _amount); emit Donate(giverId, receiverId, token, amount); } /** * The `owner` can call this function to add/remove a token from the whitelist * * @param token The address of the token to update * @param accepted Wether or not to accept this token for donations */ function whitelistToken(address token, bool accepted) whenNotPaused onlyOwner external { tokenWhitelist[token] = accepted; } /** * Transfer tokens/eth to the escapeHatchDestination. * Used as a safety mechanism to prevent the bridge from holding too much value * * before being thoroughly battle-tested. * @param _token the token to transfer. 0x0 for ETH * @param _amount the amount to transfer */ function escapeFunds(address _token, uint _amount) external onlyEscapeHatchCallerOrOwner { // @dev Logic for ether if (_token == 0) { escapeHatchDestination.transfer(_amount); // @dev Logic for tokens } else { ERC20 token = ERC20(_token); require(token.transfer(escapeHatchDestination, _amount)); } emit EscapeFundsCalled(_token, _amount); } /** * Allow the escapeHatchDestination to deposit eth into this contract w/o calling donate method */ function depositEscapedFunds() external payable { require(msg.sender == escapeHatchDestination); } //== internal methods /** * @dev used to actually receive the donation. Will transfer the token to to this contract */ function _receiveDonation(address token, uint _amount) internal returns(uint amount) { require(tokenWhitelist[token]); amount = _amount; // eth donation if (token == 0) { amount = msg.value; } require(amount > 0); if (token != 0) { require(ERC20(token).transferFrom(msg.sender, this, amount)); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"maxSecurityGuardDelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"accepted","type":"bool"}],"name":"whitelistToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"checkIn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"giver","type":"address"},{"name":"receiverId","type":"uint64"},{"name":"token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"donateAndCreateGiver","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"escapeFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newTimeLock","type":"uint256"}],"name":"setTimelock","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"securityGuardLastCheckin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"giverId","type":"uint64"},{"name":"receiverId","type":"uint64"},{"name":"token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"donate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_idPayment","type":"uint256"}],"name":"disburseAuthorizedPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"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":"allowed","type":"bool"}],"name":"setAllowDisbursePaymentWhenPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numberOfAuthorizedPayments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"proposeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_authorize","type":"bool"}],"name":"authorizeSpender","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_idPayment","type":"uint256"}],"name":"cancelPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_idPayment","type":"uint256"},{"name":"_delay","type":"uint256"}],"name":"delayPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowDisbursePaymentWhenPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_idPayments","type":"uint256[]"}],"name":"disburseAuthorizedPayments","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":false,"inputs":[{"name":"giver","type":"address"},{"name":"receiverId","type":"uint64"}],"name":"donateAndCreateGiver","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"authorizedPayments","outputs":[{"name":"name","type":"string"},{"name":"reference","type":"bytes32"},{"name":"spender","type":"address"},{"name":"earliestPayTime","type":"uint256"},{"name":"canceled","type":"bool"},{"name":"paid","type":"bool"},{"name":"recipient","type":"address"},{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"securityGuardDelay","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":"securityGuard","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newSecurityGuard","type":"address"}],"name":"setSecurityGuard","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"depositEscapedFunds","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"giverId","type":"uint64"},{"name":"receiverId","type":"uint64"}],"name":"donate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"timeLock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[{"name":"","type":"address"}],"name":"allowedSpenders","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxSecurityGuardDelay","type":"uint256"}],"name":"setMaxSecurityGuardDelay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"absoluteMinTimeLock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_reference","type":"bytes32"},{"name":"_recipient","type":"address"},{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_paymentDelay","type":"uint256"}],"name":"authorizePayment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"escapeHatchDestination","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_escapeHatchCaller","type":"address"},{"name":"_escapeHatchDestination","type":"address"},{"name":"_absoluteMinTimeLock","type":"uint256"},{"name":"_timeLock","type":"uint256"},{"name":"_securityGuard","type":"address"},{"name":"_maxSecurityGuardDelay","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"giverId","type":"uint64"},{"indexed":false,"name":"receiverId","type":"uint64"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"giver","type":"address"},{"indexed":false,"name":"receiverId","type":"uint64"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DonateAndCreateGiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EscapeFundsCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idPayment","type":"uint256"},{"indexed":true,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"reference","type":"bytes32"}],"name":"PaymentAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idPayment","type":"uint256"},{"indexed":true,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"token","type":"address"}],"name":"PaymentExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idPayment","type":"uint256"}],"name":"PaymentCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"authorized","type":"bool"}],"name":"SpenderAuthorization","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","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
60606040526005805460ff19169055341561001957600080fd5b60405160c080611cc283398101604052808051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a03338116600160a060020a0319928316178355600280549b82169b83169b909b17909a5560038054998b1699821699909917909855600896909655600994909455505060078054959091169490931693909317909155600a919091558052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805460ff19166001179055611bca806100f86000396000f3006060604052600436106101df5763ffffffff60e060020a6000350416630b2e742381146101e45780630ffb1d8b14610209578063183ff0851461022f5780631870c10f146102425780631b28591c1461026d5780631e891c0a1461028f5780631f6eb6e7146102a55780632af4c31e146102d45780633f487b8b146102f35780633f4ba83a146103065780634c4316c71461031957806352892478146103435780635c975abb14610359578063666a342714610380578063672f412c1461039f57806368b8c5a1146103b7578063710bf322146103ca578063793c0fd4146103e957806379ba50971461040d5780638422927d146104205780638456cb5914610436578063846a5dde14610449578063859bcc7114610462578063863da00014610475578063892db057146104c45780638da5cb5b146104e357806391f5c3a8146104f6578063a0927a6a14610517578063a142d608146105fb578063b2ca3ec41461061a578063bb2a51d11461062d578063bd541ad01461064c578063bde60ac914610654578063d085835a1461066f578063d091b55014610682578063d836fbe814610695578063d8528af0146106b4578063da4793ac146106d3578063ea8a66c7146106e9578063f37b74ca146106fc578063f5b6123014610736575b600080fd5b34156101ef57600080fd5b6101f7610749565b60405190815260200160405180910390f35b341561021457600080fd5b61022d600160a060020a0360043516602435151561074f565b005b341561023a57600080fd5b61022d6107a5565b61022d600160a060020a0360043581169067ffffffffffffffff6024351690604435166064356107cd565b341561027857600080fd5b61022d600160a060020a0360043516602435610881565b341561029a57600080fd5b61022d6004356109ca565b34156102b057600080fd5b6102b86109f9565b604051600160a060020a03909116815260200160405180910390f35b34156102df57600080fd5b61022d600160a060020a0360043516610a08565b34156102fe57600080fd5b6101f7610a9c565b341561031157600080fd5b61022d610aa2565b61022d67ffffffffffffffff60043581169060243516600160a060020a0360443516606435610b06565b341561034e57600080fd5b61022d600435610bbb565b341561036457600080fd5b61036c610c33565b604051901515815260200160405180910390f35b341561038b57600080fd5b61022d600160a060020a0360043516610c3c565b34156103aa57600080fd5b61022d6004351515610cb9565b34156103c257600080fd5b6101f7610cf8565b34156103d557600080fd5b61022d600160a060020a0360043516610cff565b34156103f457600080fd5b61022d600160a060020a03600435166024351515610d70565b341561041857600080fd5b61022d610dea565b341561042b57600080fd5b61022d600435610e6a565b341561044157600080fd5b61022d610f1e565b341561045457600080fd5b61022d600435602435610f5d565b341561046d57600080fd5b61036c611013565b341561048057600080fd5b61022d600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061101c95505050505050565b34156104cf57600080fd5b61036c600160a060020a036004351661105a565b34156104ee57600080fd5b6102b8611079565b61022d600160a060020a036004351667ffffffffffffffff60243516611088565b341561052257600080fd5b61052d600435611095565b604051602081018a9052600160a060020a03808a16604083015260608201899052871515608083015286151560a083015285811660c0830152841660e082015261010081018390526101208101829052610140808252819081018c818151815260200191508051906020019080838360005b838110156105b757808201518382015260200161059f565b50505050905090810190601f1680156105e45780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b341561060657600080fd5b61022d600160a060020a03600435166111a9565b341561062557600080fd5b6102b86113ca565b341561063857600080fd5b61022d600160a060020a03600435166113d9565b61022d611416565b61022d67ffffffffffffffff60043581169060243516611431565b341561067a57600080fd5b6101f761143e565b341561068d57600080fd5b6102b8611444565b34156106a057600080fd5b61022d600160a060020a0360043516611453565b34156106bf57600080fd5b61036c600160a060020a03600435166114ab565b34156106de57600080fd5b61022d6004356114c0565b34156106f457600080fd5b6101f76114e0565b341561070757600080fd5b6101f7602460048035828101929101359035600160a060020a036044358116906064351660843560a4356114e6565b341561074157600080fd5b6102b8611698565b600a5481565b60055460ff161561075f57600080fd5b60005433600160a060020a0390811691161461077a57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b60075433600160a060020a039081169116146107c057600080fd5b6107c86116a7565b600d55565b60055460009060ff16156107e057600080fd5b600160a060020a03851615156107f557600080fd5b67ffffffffffffffff8416151561080b57600080fd5b61081583836116ab565b90507f300ed237d4114d1c2df9984e698721646d6c45633d6c1c5430450cdecf61571d85858584604051600160a060020a03948516815267ffffffffffffffff909316602084015292166040808301919091526060820192909252608001905180910390a15050505050565b60025460009033600160a060020a03908116911614806108af575060005433600160a060020a039081169116145b15156108ba57600080fd5b600160a060020a038316151561090257600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156108fd57600080fd5b610981565b506003548290600160a060020a038083169163a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561095f57600080fd5b5af1151561096c57600080fd5b50505060405180519050151561098157600080fd5b7f4ccddcd1a4e33721aee316370fb3e014294985be0755a68c88009b31e1dc4ae38383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b60005433600160a060020a039081169116146109e557600080fd5b6008548110156109f457600080fd5b600955565b600254600160a060020a031681565b6000805433600160a060020a03908116911614610a2457600080fd5b600160a060020a0382161515610a3957600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600d5481565b60005433600160a060020a03908116911614610abd57600080fd5b60055460ff161515610ace57600080fd5b6005805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055460009060ff1615610b1957600080fd5b67ffffffffffffffff85161515610b2f57600080fd5b67ffffffffffffffff84161515610b4557600080fd5b610b4f83836116ab565b90507fc77b8feedf86922981aed41179f4a071d80467c7f17c5c13837269e363ac545b8585858460405167ffffffffffffffff9485168152929093166020830152600160a060020a03166040808301919091526060820192909252608001905180910390a15050505050565b60055460009060ff161580610bd25750600b5460ff165b1515610bdd57600080fd5b6006548210610beb57600080fd5b6006805483908110610bf957fe5b9060005260206000209060080201905060095481600301540361070801600d5410151515610c2657600080fd5b610c2f8261178c565b5050565b60055460ff1681565b60005433600160a060020a03908116911614610c5757600080fd5b610dac600160a060020a03821614610c6e57600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610cd457600080fd5b60055460ff161515610ce557600080fd5b600b805460ff1916911515919091179055565b6006545b90565b60005433600160a060020a03908116911614610d1a57600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60005433600160a060020a03908116911614610d8b57600080fd5b600160a060020a0382166000818152600c602052604090819020805460ff19168415151790557f801f568efbc3346a6ae3d0c3eb335a30d64e0d3cf08f1c39626d62cd5c82728190839051901515815260200160405180910390a25050565b60015460009033600160a060020a03908116911614610e0857600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000805433600160a060020a03908116911614610e8657600080fd5b6006548210610e9457600080fd5b6006805483908110610ea257fe5b60009182526020909120600890910201600481015490915060ff1615610ec757600080fd5b6004810154610100900460ff1615610ede57600080fd5b60048101805460ff19166001179055817ffdf197ed54809861dafe0b4d391843652730ac67274c1e9e46db7687dccaa30160405160405180910390a25050565b60005433600160a060020a03908116911614610f3957600080fd5b60055460ff1615610f4957600080fd5b600b805460ff19169055610f5b6119ad565b565b60075460009033600160a060020a03908116911614610f7b57600080fd5b6006548310610f8957600080fd5b670de0b6b3a7640000821115610f9e57600080fd5b6006805484908110610fac57fe5b90600052602060002090600802019050600a548282600701540111151515610fd357600080fd5b6004810154610100900460ff1615610fea57600080fd5b600481015460ff1615610ffc57600080fd5b600781018054830190556003018054909101905550565b600b5460ff1681565b6000805b82518210156110555782828151811061103557fe5b90602001906020020151905061104a81610bbb565b600190910190611020565b505050565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b610c2f82826000806107cd565b60068054829081106110a357fe5b9060005260206000209060080201600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505060018301546002840154600385015460048601546005870154600688015460079098015496979496600160a060020a039485169650929460ff80841695610100850490911694620100009094048116939216918a565b600254600090819033600160a060020a03908116911614806111d9575060005433600160a060020a039081169116145b15156111e457600080fd5b600160a060020a03831660009081526004602052604090205460ff161561120a57600080fd5b600160a060020a038316151561129c57600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f19350505050151561125357600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1611055565b5081600160a060020a0381166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156112ec57600080fd5b5af115156112f957600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561135f57600080fd5b5af1151561136c57600080fd5b50505060405180519050151561138157600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b600754600160a060020a031681565b60005433600160a060020a039081169116146113f457600080fd5b60078054600160a060020a031916600160a060020a0392909216919091179055565b60035433600160a060020a03908116911614610f5b57600080fd5b610c2f8282600080610b06565b60095481565b600154600160a060020a031681565b60025433600160a060020a039081169116148061147e575060005433600160a060020a039081169116145b151561148957600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b60005433600160a060020a039081169116146114db57600080fd5b600a55565b60085481565b6005546000908190819060ff16156114fd57600080fd5b600160a060020a0333166000908152600c602052604090205460ff16151561152457600080fd5b60068054925082906115399060018301611a13565b50600680548390811061154857fe5b60009182526020909120600890910201600281018054600160a060020a03191633600160a060020a03161790559050670de0b6b3a764000084111561158c57600080fd5b6009548410156115a7576009546115a16116a7565b016115b2565b836115b06116a7565b015b600382015560048101805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038a1602179055600681018590556115fa818b8b611a3f565b5060018101889055600581018054600160a060020a031916600160a060020a038881169190911791829055600483015460068401546201000090910482169285927fd11935115aa93b9f1f616d0d7702f4593572daa610390123241b3785430281c49291168c604051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a35098975050505050505050565b600354600160a060020a031681565b4290565b600160a060020a0382166000908152600e602052604081205460ff1615156116d257600080fd5b5080600160a060020a03831615156116e75750345b600081116116f457600080fd5b600160a060020a038316156117865782600160a060020a03166323b872dd33308460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561176457600080fd5b5af1151561177157600080fd5b50505060405180519050151561178657600080fd5b92915050565b60055460009060ff1615806117a35750600b5460ff165b15156117ae57600080fd5b60065482106117bc57600080fd5b60068054839081106117ca57fe5b60009182526020808320600260089093020191820154600160a060020a03168352600c905260409091205490915060ff16151561180657600080fd5b80600301546118136116a7565b101561181e57600080fd5b600481015460ff161561183057600080fd5b6004810154610100900460ff161561184757600080fd5b60048101805461ff0019166101001790556005810154600160a060020a031615156118b3576004810154600682015462010000909104600160a060020a0316906108fc81150290604051600060405180830381858888f1935050505015156118ae57600080fd5b611941565b600581015460048201546006830154600160a060020a039283169263a9059cbb92620100009004169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561191f57600080fd5b5af1151561192c57600080fd5b50505060405180519050151561194157600080fd5b600481015460068201546005830154600160a060020a036201000090930483169285927f354f3c0c8efabe1a1a07cf222842b008ef284ac185e63bdf8245be8cd2d97f5192909116604051918252600160a060020a031660208201526040908101905180910390a35050565b60005433600160a060020a039081169116146119c857600080fd5b60055460ff16156119d857600080fd5b6005805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b815481835581811511611055576008028160080283600052602060002091820191016110559190611abd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a805782800160ff19823516178555611aad565b82800160010185558215611aad579182015b82811115611aad578235825591602001919060010190611a92565b50611ab9929150611b3d565b5090565b610cfc91905b80821115611ab9576000611ad78282611b57565b50600060018201819055600282018054600160a060020a03199081169091556003830182905560048301805475ffffffffffffffffffffffffffffffffffffffffffff191690556005830180549091169055600682018190556007820155600801611ac3565b610cfc91905b80821115611ab95760008155600101611b43565b50805460018160011615610100020316600290046000825580601f10611b7d5750611b9b565b601f016020900490600052602060002090810190611b9b9190611b3d565b505600a165627a7a723058202c93896a99ed00f70c3be01dbfcc817d0371f619dedcd25175f540c4e980677a00290000000000000000000000001e9f6746147e937e8e1c29180e15af0bd5fd64bb00000000000000000000000016fda2fcc887dd7ac65c46be144473067cff86540000000000000000000000000000000000000000000000000000000000015f90000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000daa172456f5815256831aee19c8a370a835228710000000000000000000000000000000000000000000000000000000000278d00
Deployed Bytecode
0x6060604052600436106101df5763ffffffff60e060020a6000350416630b2e742381146101e45780630ffb1d8b14610209578063183ff0851461022f5780631870c10f146102425780631b28591c1461026d5780631e891c0a1461028f5780631f6eb6e7146102a55780632af4c31e146102d45780633f487b8b146102f35780633f4ba83a146103065780634c4316c71461031957806352892478146103435780635c975abb14610359578063666a342714610380578063672f412c1461039f57806368b8c5a1146103b7578063710bf322146103ca578063793c0fd4146103e957806379ba50971461040d5780638422927d146104205780638456cb5914610436578063846a5dde14610449578063859bcc7114610462578063863da00014610475578063892db057146104c45780638da5cb5b146104e357806391f5c3a8146104f6578063a0927a6a14610517578063a142d608146105fb578063b2ca3ec41461061a578063bb2a51d11461062d578063bd541ad01461064c578063bde60ac914610654578063d085835a1461066f578063d091b55014610682578063d836fbe814610695578063d8528af0146106b4578063da4793ac146106d3578063ea8a66c7146106e9578063f37b74ca146106fc578063f5b6123014610736575b600080fd5b34156101ef57600080fd5b6101f7610749565b60405190815260200160405180910390f35b341561021457600080fd5b61022d600160a060020a0360043516602435151561074f565b005b341561023a57600080fd5b61022d6107a5565b61022d600160a060020a0360043581169067ffffffffffffffff6024351690604435166064356107cd565b341561027857600080fd5b61022d600160a060020a0360043516602435610881565b341561029a57600080fd5b61022d6004356109ca565b34156102b057600080fd5b6102b86109f9565b604051600160a060020a03909116815260200160405180910390f35b34156102df57600080fd5b61022d600160a060020a0360043516610a08565b34156102fe57600080fd5b6101f7610a9c565b341561031157600080fd5b61022d610aa2565b61022d67ffffffffffffffff60043581169060243516600160a060020a0360443516606435610b06565b341561034e57600080fd5b61022d600435610bbb565b341561036457600080fd5b61036c610c33565b604051901515815260200160405180910390f35b341561038b57600080fd5b61022d600160a060020a0360043516610c3c565b34156103aa57600080fd5b61022d6004351515610cb9565b34156103c257600080fd5b6101f7610cf8565b34156103d557600080fd5b61022d600160a060020a0360043516610cff565b34156103f457600080fd5b61022d600160a060020a03600435166024351515610d70565b341561041857600080fd5b61022d610dea565b341561042b57600080fd5b61022d600435610e6a565b341561044157600080fd5b61022d610f1e565b341561045457600080fd5b61022d600435602435610f5d565b341561046d57600080fd5b61036c611013565b341561048057600080fd5b61022d600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061101c95505050505050565b34156104cf57600080fd5b61036c600160a060020a036004351661105a565b34156104ee57600080fd5b6102b8611079565b61022d600160a060020a036004351667ffffffffffffffff60243516611088565b341561052257600080fd5b61052d600435611095565b604051602081018a9052600160a060020a03808a16604083015260608201899052871515608083015286151560a083015285811660c0830152841660e082015261010081018390526101208101829052610140808252819081018c818151815260200191508051906020019080838360005b838110156105b757808201518382015260200161059f565b50505050905090810190601f1680156105e45780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b341561060657600080fd5b61022d600160a060020a03600435166111a9565b341561062557600080fd5b6102b86113ca565b341561063857600080fd5b61022d600160a060020a03600435166113d9565b61022d611416565b61022d67ffffffffffffffff60043581169060243516611431565b341561067a57600080fd5b6101f761143e565b341561068d57600080fd5b6102b8611444565b34156106a057600080fd5b61022d600160a060020a0360043516611453565b34156106bf57600080fd5b61036c600160a060020a03600435166114ab565b34156106de57600080fd5b61022d6004356114c0565b34156106f457600080fd5b6101f76114e0565b341561070757600080fd5b6101f7602460048035828101929101359035600160a060020a036044358116906064351660843560a4356114e6565b341561074157600080fd5b6102b8611698565b600a5481565b60055460ff161561075f57600080fd5b60005433600160a060020a0390811691161461077a57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b60075433600160a060020a039081169116146107c057600080fd5b6107c86116a7565b600d55565b60055460009060ff16156107e057600080fd5b600160a060020a03851615156107f557600080fd5b67ffffffffffffffff8416151561080b57600080fd5b61081583836116ab565b90507f300ed237d4114d1c2df9984e698721646d6c45633d6c1c5430450cdecf61571d85858584604051600160a060020a03948516815267ffffffffffffffff909316602084015292166040808301919091526060820192909252608001905180910390a15050505050565b60025460009033600160a060020a03908116911614806108af575060005433600160a060020a039081169116145b15156108ba57600080fd5b600160a060020a038316151561090257600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156108fd57600080fd5b610981565b506003548290600160a060020a038083169163a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561095f57600080fd5b5af1151561096c57600080fd5b50505060405180519050151561098157600080fd5b7f4ccddcd1a4e33721aee316370fb3e014294985be0755a68c88009b31e1dc4ae38383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b60005433600160a060020a039081169116146109e557600080fd5b6008548110156109f457600080fd5b600955565b600254600160a060020a031681565b6000805433600160a060020a03908116911614610a2457600080fd5b600160a060020a0382161515610a3957600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600d5481565b60005433600160a060020a03908116911614610abd57600080fd5b60055460ff161515610ace57600080fd5b6005805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055460009060ff1615610b1957600080fd5b67ffffffffffffffff85161515610b2f57600080fd5b67ffffffffffffffff84161515610b4557600080fd5b610b4f83836116ab565b90507fc77b8feedf86922981aed41179f4a071d80467c7f17c5c13837269e363ac545b8585858460405167ffffffffffffffff9485168152929093166020830152600160a060020a03166040808301919091526060820192909252608001905180910390a15050505050565b60055460009060ff161580610bd25750600b5460ff165b1515610bdd57600080fd5b6006548210610beb57600080fd5b6006805483908110610bf957fe5b9060005260206000209060080201905060095481600301540361070801600d5410151515610c2657600080fd5b610c2f8261178c565b5050565b60055460ff1681565b60005433600160a060020a03908116911614610c5757600080fd5b610dac600160a060020a03821614610c6e57600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610cd457600080fd5b60055460ff161515610ce557600080fd5b600b805460ff1916911515919091179055565b6006545b90565b60005433600160a060020a03908116911614610d1a57600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60005433600160a060020a03908116911614610d8b57600080fd5b600160a060020a0382166000818152600c602052604090819020805460ff19168415151790557f801f568efbc3346a6ae3d0c3eb335a30d64e0d3cf08f1c39626d62cd5c82728190839051901515815260200160405180910390a25050565b60015460009033600160a060020a03908116911614610e0857600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000805433600160a060020a03908116911614610e8657600080fd5b6006548210610e9457600080fd5b6006805483908110610ea257fe5b60009182526020909120600890910201600481015490915060ff1615610ec757600080fd5b6004810154610100900460ff1615610ede57600080fd5b60048101805460ff19166001179055817ffdf197ed54809861dafe0b4d391843652730ac67274c1e9e46db7687dccaa30160405160405180910390a25050565b60005433600160a060020a03908116911614610f3957600080fd5b60055460ff1615610f4957600080fd5b600b805460ff19169055610f5b6119ad565b565b60075460009033600160a060020a03908116911614610f7b57600080fd5b6006548310610f8957600080fd5b670de0b6b3a7640000821115610f9e57600080fd5b6006805484908110610fac57fe5b90600052602060002090600802019050600a548282600701540111151515610fd357600080fd5b6004810154610100900460ff1615610fea57600080fd5b600481015460ff1615610ffc57600080fd5b600781018054830190556003018054909101905550565b600b5460ff1681565b6000805b82518210156110555782828151811061103557fe5b90602001906020020151905061104a81610bbb565b600190910190611020565b505050565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b610c2f82826000806107cd565b60068054829081106110a357fe5b9060005260206000209060080201600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505060018301546002840154600385015460048601546005870154600688015460079098015496979496600160a060020a039485169650929460ff80841695610100850490911694620100009094048116939216918a565b600254600090819033600160a060020a03908116911614806111d9575060005433600160a060020a039081169116145b15156111e457600080fd5b600160a060020a03831660009081526004602052604090205460ff161561120a57600080fd5b600160a060020a038316151561129c57600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f19350505050151561125357600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1611055565b5081600160a060020a0381166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156112ec57600080fd5b5af115156112f957600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561135f57600080fd5b5af1151561136c57600080fd5b50505060405180519050151561138157600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b600754600160a060020a031681565b60005433600160a060020a039081169116146113f457600080fd5b60078054600160a060020a031916600160a060020a0392909216919091179055565b60035433600160a060020a03908116911614610f5b57600080fd5b610c2f8282600080610b06565b60095481565b600154600160a060020a031681565b60025433600160a060020a039081169116148061147e575060005433600160a060020a039081169116145b151561148957600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b60005433600160a060020a039081169116146114db57600080fd5b600a55565b60085481565b6005546000908190819060ff16156114fd57600080fd5b600160a060020a0333166000908152600c602052604090205460ff16151561152457600080fd5b60068054925082906115399060018301611a13565b50600680548390811061154857fe5b60009182526020909120600890910201600281018054600160a060020a03191633600160a060020a03161790559050670de0b6b3a764000084111561158c57600080fd5b6009548410156115a7576009546115a16116a7565b016115b2565b836115b06116a7565b015b600382015560048101805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038a1602179055600681018590556115fa818b8b611a3f565b5060018101889055600581018054600160a060020a031916600160a060020a038881169190911791829055600483015460068401546201000090910482169285927fd11935115aa93b9f1f616d0d7702f4593572daa610390123241b3785430281c49291168c604051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a35098975050505050505050565b600354600160a060020a031681565b4290565b600160a060020a0382166000908152600e602052604081205460ff1615156116d257600080fd5b5080600160a060020a03831615156116e75750345b600081116116f457600080fd5b600160a060020a038316156117865782600160a060020a03166323b872dd33308460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561176457600080fd5b5af1151561177157600080fd5b50505060405180519050151561178657600080fd5b92915050565b60055460009060ff1615806117a35750600b5460ff165b15156117ae57600080fd5b60065482106117bc57600080fd5b60068054839081106117ca57fe5b60009182526020808320600260089093020191820154600160a060020a03168352600c905260409091205490915060ff16151561180657600080fd5b80600301546118136116a7565b101561181e57600080fd5b600481015460ff161561183057600080fd5b6004810154610100900460ff161561184757600080fd5b60048101805461ff0019166101001790556005810154600160a060020a031615156118b3576004810154600682015462010000909104600160a060020a0316906108fc81150290604051600060405180830381858888f1935050505015156118ae57600080fd5b611941565b600581015460048201546006830154600160a060020a039283169263a9059cbb92620100009004169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561191f57600080fd5b5af1151561192c57600080fd5b50505060405180519050151561194157600080fd5b600481015460068201546005830154600160a060020a036201000090930483169285927f354f3c0c8efabe1a1a07cf222842b008ef284ac185e63bdf8245be8cd2d97f5192909116604051918252600160a060020a031660208201526040908101905180910390a35050565b60005433600160a060020a039081169116146119c857600080fd5b60055460ff16156119d857600080fd5b6005805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b815481835581811511611055576008028160080283600052602060002091820191016110559190611abd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a805782800160ff19823516178555611aad565b82800160010185558215611aad579182015b82811115611aad578235825591602001919060010190611a92565b50611ab9929150611b3d565b5090565b610cfc91905b80821115611ab9576000611ad78282611b57565b50600060018201819055600282018054600160a060020a03199081169091556003830182905560048301805475ffffffffffffffffffffffffffffffffffffffffffff191690556005830180549091169055600682018190556007820155600801611ac3565b610cfc91905b80821115611ab95760008155600101611b43565b50805460018160011615610100020316600290046000825580601f10611b7d5750611b9b565b601f016020900490600052602060002090810190611b9b9190611b3d565b505600a165627a7a723058202c93896a99ed00f70c3be01dbfcc817d0371f619dedcd25175f540c4e980677a0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001e9f6746147e937e8e1c29180e15af0bd5fd64bb00000000000000000000000016fda2fcc887dd7ac65c46be144473067cff86540000000000000000000000000000000000000000000000000000000000015f90000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000daa172456f5815256831aee19c8a370a835228710000000000000000000000000000000000000000000000000000000000278d00
-----Decoded View---------------
Arg [0] : _escapeHatchCaller (address): 0x1e9F6746147E937E8E1C29180e15aF0bd5fd64bb
Arg [1] : _escapeHatchDestination (address): 0x16Fda2Fcc887Dd7Ac65c46Be144473067CfF8654
Arg [2] : _absoluteMinTimeLock (uint256): 90000
Arg [3] : _timeLock (uint256): 172800
Arg [4] : _securityGuard (address): 0xDAa172456F5815256831aeE19C8A370a83522871
Arg [5] : _maxSecurityGuardDelay (uint256): 2592000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000001e9f6746147e937e8e1c29180e15af0bd5fd64bb
Arg [1] : 00000000000000000000000016fda2fcc887dd7ac65c46be144473067cff8654
Arg [2] : 0000000000000000000000000000000000000000000000000000000000015f90
Arg [3] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [4] : 000000000000000000000000daa172456f5815256831aee19c8a370a83522871
Arg [5] : 0000000000000000000000000000000000000000000000000000000000278d00
Swarm Source
bzzr://2c93896a99ed00f70c3be01dbfcc817d0371f619dedcd25175f540c4e980677a
Loading...
Loading
Loading...
Loading
OVERVIEW
Bridge to Rinkeby to minimize gas fees for Traceable Donations on MainnetMultichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100,000,000,000.00% | $3,104.83 | 0.0000000000001243 | $0.385973 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.