Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
4 addresses found via
Latest 25 from a total of 4,575 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Disburse Authori... | 15890820 | 329 days 2 hrs ago | IN | 0 ETH | 0.00180763 | ||||
Check In | 15890817 | 329 days 2 hrs ago | IN | 0 ETH | 0.00076368 | ||||
Authorize Paymen... | 15875554 | 331 days 5 hrs ago | IN | 0 ETH | 0.00276283 | ||||
Disburse Authori... | 15826109 | 338 days 3 hrs ago | IN | 0 ETH | 0.00585652 | ||||
Check In | 15825692 | 338 days 4 hrs ago | IN | 0 ETH | 0.00086729 | ||||
Authorize Paymen... | 15732038 | 351 days 6 hrs ago | IN | 0 ETH | 0.00310447 | ||||
Authorize Paymen... | 15730646 | 351 days 11 hrs ago | IN | 0 ETH | 0.00259886 | ||||
Donate | 15727972 | 351 days 20 hrs ago | IN | 0 ETH | 0.00085009 | ||||
Donate | 15727972 | 351 days 20 hrs ago | IN | 0 ETH | 0.00084988 | ||||
Authorize Paymen... | 15725559 | 352 days 4 hrs ago | IN | 0 ETH | 0.00359855 | ||||
Authorize Paymen... | 15725301 | 352 days 5 hrs ago | IN | 0 ETH | 0.00466538 | ||||
Donate | 15685726 | 357 days 17 hrs ago | IN | 0 ETH | 0.00050977 | ||||
Disburse Authori... | 15620916 | 366 days 19 hrs ago | IN | 0 ETH | 0.0006146 | ||||
Check In | 15620914 | 366 days 19 hrs ago | IN | 0 ETH | 0.00027752 | ||||
Check In | 15583045 | 372 days 2 hrs ago | IN | 0 ETH | 0.00054888 | ||||
Authorize Paymen... | 15576136 | 373 days 1 hr ago | IN | 0 ETH | 0.00583416 | ||||
Disburse Authori... | 15576136 | 373 days 1 hr ago | IN | 0 ETH | 0.00880929 | ||||
Check In | 15576133 | 373 days 1 hr ago | IN | 0 ETH | 0.00105673 | ||||
Authorize Paymen... | 15566640 | 374 days 9 hrs ago | IN | 0 ETH | 0.0008016 | ||||
Authorize Paymen... | 15545770 | 377 days 7 hrs ago | IN | 0 ETH | 0.00099201 | ||||
Check In | 15538035 | 378 days 10 hrs ago | IN | 0 ETH | 0.00042738 | ||||
Authorize Paymen... | 15537796 | 378 days 10 hrs ago | IN | 0 ETH | 0.00430983 | ||||
Authorize Paymen... | 15526072 | 380 days 9 hrs ago | IN | 0 ETH | 0.00455535 | ||||
Authorize Paymen... | 15525908 | 380 days 10 hrs ago | IN | 0 ETH | 0.00132197 | ||||
Disburse Authori... | 15522119 | 381 days 1 hr ago | IN | 0 ETH | 0.00142753 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
16133931 | 295 days 2 hrs ago | 16.5117478 ETH | ||||
15264395 | 422 days 1 hr ago | 3 ETH | ||||
13889900 | 639 days 20 hrs ago | 0.178472 ETH | ||||
13591241 | 686 days 20 hrs ago | 0.596667 ETH | ||||
13584046 | 687 days 23 hrs ago | 0.093979 ETH | ||||
13577868 | 688 days 22 hrs ago | 0.459367 ETH | ||||
13561159 | 691 days 13 hrs ago | 1.136722 ETH | ||||
13456029 | 708 days 1 hr ago | 0.849189 ETH | ||||
13431138 | 711 days 22 hrs ago | 0.284116 ETH | ||||
13431138 | 711 days 22 hrs ago | 0.3 ETH | ||||
13381009 | 719 days 19 hrs ago | 0.95 ETH | ||||
13376364 | 720 days 13 hrs ago | 1.941748 ETH | ||||
13373274 | 721 days 54 mins ago | 1.04589 ETH | ||||
13373274 | 721 days 54 mins ago | 0.40633 ETH | ||||
13373274 | 721 days 54 mins ago | 0.95 ETH | ||||
13366094 | 722 days 3 hrs ago | 0.461934 ETH | ||||
13366094 | 722 days 3 hrs ago | 1.39452 ETH | ||||
13322071 | 729 days 1 hr ago | 0.320671 ETH | ||||
13306630 | 731 days 10 hrs ago | 0.858316 ETH | ||||
13264668 | 737 days 22 hrs ago | 0.554341 ETH | ||||
13239372 | 741 days 20 hrs ago | 0.628127 ETH | ||||
13218774 | 745 days 1 hr ago | 1.405 ETH | ||||
13189340 | 749 days 14 hrs ago | 2.811253 ETH | ||||
13180101 | 751 days 1 hr ago | 0.791 ETH | ||||
13175308 | 751 days 18 hrs ago | 1.190674 ETH |
Loading...
Loading
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 Mainnet
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.