Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 4 from a total of 4 transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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 <adria@codecontext.io>
/// @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 <adria@codecontext.io>
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 <perissology@protonmail.com>
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);
}
//== 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
Contract ABI
API[{"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":"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
60606040526005805460ff19169055341561001957600080fd5b60405160c080611c9483398101604052808051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a03338116600160a060020a0319928316178355600280549b82169b83169b909b17909a5560038054998b1699821699909917909855600896909655600994909455505060078054959091169490931693909317909155600a919091558052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805460ff19166001179055611b9c806100f86000396000f3006060604052600436106101d45763ffffffff60e060020a6000350416630b2e742381146101d95780630ffb1d8b146101fe578063183ff085146102245780631870c10f146102375780631b28591c146102625780631e891c0a146102845780631f6eb6e71461029a5780632af4c31e146102c95780633f487b8b146102e85780633f4ba83a146102fb5780634c4316c71461030e57806352892478146103385780635c975abb1461034e578063666a342714610375578063672f412c1461039457806368b8c5a1146103ac578063710bf322146103bf578063793c0fd4146103de57806379ba5097146104025780638422927d146104155780638456cb591461042b578063846a5dde1461043e578063859bcc7114610457578063863da0001461046a578063892db057146104b95780638da5cb5b146104d857806391f5c3a8146104eb578063a0927a6a1461050c578063a142d608146105f0578063b2ca3ec41461060f578063bb2a51d114610622578063bde60ac914610641578063d085835a1461065c578063d091b5501461066f578063d836fbe814610682578063d8528af0146106a1578063da4793ac146106c0578063ea8a66c7146106d6578063f37b74ca146106e9578063f5b6123014610723575b600080fd5b34156101e457600080fd5b6101ec610736565b60405190815260200160405180910390f35b341561020957600080fd5b610222600160a060020a0360043516602435151561073c565b005b341561022f57600080fd5b610222610792565b610222600160a060020a0360043581169067ffffffffffffffff6024351690604435166064356107ba565b341561026d57600080fd5b610222600160a060020a036004351660243561086e565b341561028f57600080fd5b6102226004356109b7565b34156102a557600080fd5b6102ad6109e6565b604051600160a060020a03909116815260200160405180910390f35b34156102d457600080fd5b610222600160a060020a03600435166109f5565b34156102f357600080fd5b6101ec610a89565b341561030657600080fd5b610222610a8f565b61022267ffffffffffffffff60043581169060243516600160a060020a0360443516606435610af3565b341561034357600080fd5b610222600435610ba8565b341561035957600080fd5b610361610c20565b604051901515815260200160405180910390f35b341561038057600080fd5b610222600160a060020a0360043516610c29565b341561039f57600080fd5b6102226004351515610ca6565b34156103b757600080fd5b6101ec610ce5565b34156103ca57600080fd5b610222600160a060020a0360043516610cec565b34156103e957600080fd5b610222600160a060020a03600435166024351515610d5d565b341561040d57600080fd5b610222610dd7565b341561042057600080fd5b610222600435610e57565b341561043657600080fd5b610222610f0b565b341561044957600080fd5b610222600435602435610f4a565b341561046257600080fd5b610361611000565b341561047557600080fd5b610222600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061100995505050505050565b34156104c457600080fd5b610361600160a060020a0360043516611047565b34156104e357600080fd5b6102ad611066565b610222600160a060020a036004351667ffffffffffffffff60243516611075565b341561051757600080fd5b610522600435611082565b604051602081018a9052600160a060020a03808a16604083015260608201899052871515608083015286151560a083015285811660c0830152841660e082015261010081018390526101208101829052610140808252819081018c818151815260200191508051906020019080838360005b838110156105ac578082015183820152602001610594565b50505050905090810190601f1680156105d95780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b34156105fb57600080fd5b610222600160a060020a0360043516611196565b341561061a57600080fd5b6102ad6113b7565b341561062d57600080fd5b610222600160a060020a03600435166113c6565b61022267ffffffffffffffff60043581169060243516611403565b341561066757600080fd5b6101ec611410565b341561067a57600080fd5b6102ad611416565b341561068d57600080fd5b610222600160a060020a0360043516611425565b34156106ac57600080fd5b610361600160a060020a036004351661147d565b34156106cb57600080fd5b610222600435611492565b34156106e157600080fd5b6101ec6114b2565b34156106f457600080fd5b6101ec602460048035828101929101359035600160a060020a036044358116906064351660843560a4356114b8565b341561072e57600080fd5b6102ad61166a565b600a5481565b60055460ff161561074c57600080fd5b60005433600160a060020a0390811691161461076757600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b60075433600160a060020a039081169116146107ad57600080fd5b6107b5611679565b600d55565b60055460009060ff16156107cd57600080fd5b600160a060020a03851615156107e257600080fd5b67ffffffffffffffff841615156107f857600080fd5b610802838361167d565b90507f300ed237d4114d1c2df9984e698721646d6c45633d6c1c5430450cdecf61571d85858584604051600160a060020a03948516815267ffffffffffffffff909316602084015292166040808301919091526060820192909252608001905180910390a15050505050565b60025460009033600160a060020a039081169116148061089c575060005433600160a060020a039081169116145b15156108a757600080fd5b600160a060020a03831615156108ef57600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156108ea57600080fd5b61096e565b506003548290600160a060020a038083169163a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561094c57600080fd5b5af1151561095957600080fd5b50505060405180519050151561096e57600080fd5b7f4ccddcd1a4e33721aee316370fb3e014294985be0755a68c88009b31e1dc4ae38383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b60005433600160a060020a039081169116146109d257600080fd5b6008548110156109e157600080fd5b600955565b600254600160a060020a031681565b6000805433600160a060020a03908116911614610a1157600080fd5b600160a060020a0382161515610a2657600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600d5481565b60005433600160a060020a03908116911614610aaa57600080fd5b60055460ff161515610abb57600080fd5b6005805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055460009060ff1615610b0657600080fd5b67ffffffffffffffff85161515610b1c57600080fd5b67ffffffffffffffff84161515610b3257600080fd5b610b3c838361167d565b90507fc77b8feedf86922981aed41179f4a071d80467c7f17c5c13837269e363ac545b8585858460405167ffffffffffffffff9485168152929093166020830152600160a060020a03166040808301919091526060820192909252608001905180910390a15050505050565b60055460009060ff161580610bbf5750600b5460ff165b1515610bca57600080fd5b6006548210610bd857600080fd5b6006805483908110610be657fe5b9060005260206000209060080201905060095481600301540361070801600d5410151515610c1357600080fd5b610c1c8261175e565b5050565b60055460ff1681565b60005433600160a060020a03908116911614610c4457600080fd5b610dac600160a060020a03821614610c5b57600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610cc157600080fd5b60055460ff161515610cd257600080fd5b600b805460ff1916911515919091179055565b6006545b90565b60005433600160a060020a03908116911614610d0757600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60005433600160a060020a03908116911614610d7857600080fd5b600160a060020a0382166000818152600c602052604090819020805460ff19168415151790557f801f568efbc3346a6ae3d0c3eb335a30d64e0d3cf08f1c39626d62cd5c82728190839051901515815260200160405180910390a25050565b60015460009033600160a060020a03908116911614610df557600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000805433600160a060020a03908116911614610e7357600080fd5b6006548210610e8157600080fd5b6006805483908110610e8f57fe5b60009182526020909120600890910201600481015490915060ff1615610eb457600080fd5b6004810154610100900460ff1615610ecb57600080fd5b60048101805460ff19166001179055817ffdf197ed54809861dafe0b4d391843652730ac67274c1e9e46db7687dccaa30160405160405180910390a25050565b60005433600160a060020a03908116911614610f2657600080fd5b60055460ff1615610f3657600080fd5b600b805460ff19169055610f4861197f565b565b60075460009033600160a060020a03908116911614610f6857600080fd5b6006548310610f7657600080fd5b670de0b6b3a7640000821115610f8b57600080fd5b6006805484908110610f9957fe5b90600052602060002090600802019050600a548282600701540111151515610fc057600080fd5b6004810154610100900460ff1615610fd757600080fd5b600481015460ff1615610fe957600080fd5b600781018054830190556003018054909101905550565b600b5460ff1681565b6000805b82518210156110425782828151811061102257fe5b90602001906020020151905061103781610ba8565b60019091019061100d565b505050565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b610c1c82826000806107ba565b600680548290811061109057fe5b9060005260206000209060080201600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561113c5780601f106111115761010080835404028352916020019161113c565b820191906000526020600020905b81548152906001019060200180831161111f57829003601f168201915b5050505060018301546002840154600385015460048601546005870154600688015460079098015496979496600160a060020a039485169650929460ff80841695610100850490911694620100009094048116939216918a565b600254600090819033600160a060020a03908116911614806111c6575060005433600160a060020a039081169116145b15156111d157600080fd5b600160a060020a03831660009081526004602052604090205460ff16156111f757600080fd5b600160a060020a038316151561128957600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f19350505050151561124057600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1611042565b5081600160a060020a0381166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156112d957600080fd5b5af115156112e657600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561134c57600080fd5b5af1151561135957600080fd5b50505060405180519050151561136e57600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b600754600160a060020a031681565b60005433600160a060020a039081169116146113e157600080fd5b60078054600160a060020a031916600160a060020a0392909216919091179055565b610c1c8282600080610af3565b60095481565b600154600160a060020a031681565b60025433600160a060020a0390811691161480611450575060005433600160a060020a039081169116145b151561145b57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b60005433600160a060020a039081169116146114ad57600080fd5b600a55565b60085481565b6005546000908190819060ff16156114cf57600080fd5b600160a060020a0333166000908152600c602052604090205460ff1615156114f657600080fd5b600680549250829061150b90600183016119e5565b50600680548390811061151a57fe5b60009182526020909120600890910201600281018054600160a060020a03191633600160a060020a03161790559050670de0b6b3a764000084111561155e57600080fd5b60095484101561157957600954611573611679565b01611584565b83611582611679565b015b600382015560048101805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038a1602179055600681018590556115cc818b8b611a11565b5060018101889055600581018054600160a060020a031916600160a060020a038881169190911791829055600483015460068401546201000090910482169285927fd11935115aa93b9f1f616d0d7702f4593572daa610390123241b3785430281c49291168c604051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a35098975050505050505050565b600354600160a060020a031681565b4290565b600160a060020a0382166000908152600e602052604081205460ff1615156116a457600080fd5b5080600160a060020a03831615156116b95750345b600081116116c657600080fd5b600160a060020a038316156117585782600160a060020a03166323b872dd33308460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561173657600080fd5b5af1151561174357600080fd5b50505060405180519050151561175857600080fd5b92915050565b60055460009060ff1615806117755750600b5460ff165b151561178057600080fd5b600654821061178e57600080fd5b600680548390811061179c57fe5b60009182526020808320600260089093020191820154600160a060020a03168352600c905260409091205490915060ff1615156117d857600080fd5b80600301546117e5611679565b10156117f057600080fd5b600481015460ff161561180257600080fd5b6004810154610100900460ff161561181957600080fd5b60048101805461ff0019166101001790556005810154600160a060020a03161515611885576004810154600682015462010000909104600160a060020a0316906108fc81150290604051600060405180830381858888f19350505050151561188057600080fd5b611913565b600581015460048201546006830154600160a060020a039283169263a9059cbb92620100009004169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156118f157600080fd5b5af115156118fe57600080fd5b50505060405180519050151561191357600080fd5b600481015460068201546005830154600160a060020a036201000090930483169285927f354f3c0c8efabe1a1a07cf222842b008ef284ac185e63bdf8245be8cd2d97f5192909116604051918252600160a060020a031660208201526040908101905180910390a35050565b60005433600160a060020a0390811691161461199a57600080fd5b60055460ff16156119aa57600080fd5b6005805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b815481835581811511611042576008028160080283600052602060002091820191016110429190611a8f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a525782800160ff19823516178555611a7f565b82800160010185558215611a7f579182015b82811115611a7f578235825591602001919060010190611a64565b50611a8b929150611b0f565b5090565b610ce991905b80821115611a8b576000611aa98282611b29565b50600060018201819055600282018054600160a060020a03199081169091556003830182905560048301805475ffffffffffffffffffffffffffffffffffffffffffff191690556005830180549091169055600682018190556007820155600801611a95565b610ce991905b80821115611a8b5760008155600101611b15565b50805460018160011615610100020316600290046000825580601f10611b4f5750611b6d565b601f016020900490600052602060002090810190611b6d9190611b0f565b505600a165627a7a723058203ba22886c60036ed35be37f7fbfa475c2c50042ebe76cb8123648f41a18b4bf900290000000000000000000000001e9f6746147e937e8e1c29180e15af0bd5fd64bb00000000000000000000000016fda2fcc887dd7ac65c46be144473067cff86540000000000000000000000000000000000000000000000000000000000015f90000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000daa172456f5815256831aee19c8a370a835228710000000000000000000000000000000000000000000000000000000000278d00
Deployed Bytecode
0x6060604052600436106101d45763ffffffff60e060020a6000350416630b2e742381146101d95780630ffb1d8b146101fe578063183ff085146102245780631870c10f146102375780631b28591c146102625780631e891c0a146102845780631f6eb6e71461029a5780632af4c31e146102c95780633f487b8b146102e85780633f4ba83a146102fb5780634c4316c71461030e57806352892478146103385780635c975abb1461034e578063666a342714610375578063672f412c1461039457806368b8c5a1146103ac578063710bf322146103bf578063793c0fd4146103de57806379ba5097146104025780638422927d146104155780638456cb591461042b578063846a5dde1461043e578063859bcc7114610457578063863da0001461046a578063892db057146104b95780638da5cb5b146104d857806391f5c3a8146104eb578063a0927a6a1461050c578063a142d608146105f0578063b2ca3ec41461060f578063bb2a51d114610622578063bde60ac914610641578063d085835a1461065c578063d091b5501461066f578063d836fbe814610682578063d8528af0146106a1578063da4793ac146106c0578063ea8a66c7146106d6578063f37b74ca146106e9578063f5b6123014610723575b600080fd5b34156101e457600080fd5b6101ec610736565b60405190815260200160405180910390f35b341561020957600080fd5b610222600160a060020a0360043516602435151561073c565b005b341561022f57600080fd5b610222610792565b610222600160a060020a0360043581169067ffffffffffffffff6024351690604435166064356107ba565b341561026d57600080fd5b610222600160a060020a036004351660243561086e565b341561028f57600080fd5b6102226004356109b7565b34156102a557600080fd5b6102ad6109e6565b604051600160a060020a03909116815260200160405180910390f35b34156102d457600080fd5b610222600160a060020a03600435166109f5565b34156102f357600080fd5b6101ec610a89565b341561030657600080fd5b610222610a8f565b61022267ffffffffffffffff60043581169060243516600160a060020a0360443516606435610af3565b341561034357600080fd5b610222600435610ba8565b341561035957600080fd5b610361610c20565b604051901515815260200160405180910390f35b341561038057600080fd5b610222600160a060020a0360043516610c29565b341561039f57600080fd5b6102226004351515610ca6565b34156103b757600080fd5b6101ec610ce5565b34156103ca57600080fd5b610222600160a060020a0360043516610cec565b34156103e957600080fd5b610222600160a060020a03600435166024351515610d5d565b341561040d57600080fd5b610222610dd7565b341561042057600080fd5b610222600435610e57565b341561043657600080fd5b610222610f0b565b341561044957600080fd5b610222600435602435610f4a565b341561046257600080fd5b610361611000565b341561047557600080fd5b610222600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061100995505050505050565b34156104c457600080fd5b610361600160a060020a0360043516611047565b34156104e357600080fd5b6102ad611066565b610222600160a060020a036004351667ffffffffffffffff60243516611075565b341561051757600080fd5b610522600435611082565b604051602081018a9052600160a060020a03808a16604083015260608201899052871515608083015286151560a083015285811660c0830152841660e082015261010081018390526101208101829052610140808252819081018c818151815260200191508051906020019080838360005b838110156105ac578082015183820152602001610594565b50505050905090810190601f1680156105d95780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b34156105fb57600080fd5b610222600160a060020a0360043516611196565b341561061a57600080fd5b6102ad6113b7565b341561062d57600080fd5b610222600160a060020a03600435166113c6565b61022267ffffffffffffffff60043581169060243516611403565b341561066757600080fd5b6101ec611410565b341561067a57600080fd5b6102ad611416565b341561068d57600080fd5b610222600160a060020a0360043516611425565b34156106ac57600080fd5b610361600160a060020a036004351661147d565b34156106cb57600080fd5b610222600435611492565b34156106e157600080fd5b6101ec6114b2565b34156106f457600080fd5b6101ec602460048035828101929101359035600160a060020a036044358116906064351660843560a4356114b8565b341561072e57600080fd5b6102ad61166a565b600a5481565b60055460ff161561074c57600080fd5b60005433600160a060020a0390811691161461076757600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b60075433600160a060020a039081169116146107ad57600080fd5b6107b5611679565b600d55565b60055460009060ff16156107cd57600080fd5b600160a060020a03851615156107e257600080fd5b67ffffffffffffffff841615156107f857600080fd5b610802838361167d565b90507f300ed237d4114d1c2df9984e698721646d6c45633d6c1c5430450cdecf61571d85858584604051600160a060020a03948516815267ffffffffffffffff909316602084015292166040808301919091526060820192909252608001905180910390a15050505050565b60025460009033600160a060020a039081169116148061089c575060005433600160a060020a039081169116145b15156108a757600080fd5b600160a060020a03831615156108ef57600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156108ea57600080fd5b61096e565b506003548290600160a060020a038083169163a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561094c57600080fd5b5af1151561095957600080fd5b50505060405180519050151561096e57600080fd5b7f4ccddcd1a4e33721aee316370fb3e014294985be0755a68c88009b31e1dc4ae38383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b60005433600160a060020a039081169116146109d257600080fd5b6008548110156109e157600080fd5b600955565b600254600160a060020a031681565b6000805433600160a060020a03908116911614610a1157600080fd5b600160a060020a0382161515610a2657600080fd5b5060008054600160a060020a03838116600160a060020a031980841691909117938490556001805490911690559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600d5481565b60005433600160a060020a03908116911614610aaa57600080fd5b60055460ff161515610abb57600080fd5b6005805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055460009060ff1615610b0657600080fd5b67ffffffffffffffff85161515610b1c57600080fd5b67ffffffffffffffff84161515610b3257600080fd5b610b3c838361167d565b90507fc77b8feedf86922981aed41179f4a071d80467c7f17c5c13837269e363ac545b8585858460405167ffffffffffffffff9485168152929093166020830152600160a060020a03166040808301919091526060820192909252608001905180910390a15050505050565b60055460009060ff161580610bbf5750600b5460ff165b1515610bca57600080fd5b6006548210610bd857600080fd5b6006805483908110610be657fe5b9060005260206000209060080201905060095481600301540361070801600d5410151515610c1357600080fd5b610c1c8261175e565b5050565b60055460ff1681565b60005433600160a060020a03908116911614610c4457600080fd5b610dac600160a060020a03821614610c5b57600080fd5b60008054600160a060020a03199081169091556001805490911690557f94e8b32e01b9eedfddd778ffbd051a7718cdc14781702884561162dca6f74dbb60405160405180910390a150565b60005433600160a060020a03908116911614610cc157600080fd5b60055460ff161515610cd257600080fd5b600b805460ff1916911515919091179055565b6006545b90565b60005433600160a060020a03908116911614610d0757600080fd5b60018054600160a060020a031916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60005433600160a060020a03908116911614610d7857600080fd5b600160a060020a0382166000818152600c602052604090819020805460ff19168415151790557f801f568efbc3346a6ae3d0c3eb335a30d64e0d3cf08f1c39626d62cd5c82728190839051901515815260200160405180910390a25050565b60015460009033600160a060020a03908116911614610df557600080fd5b506000805460018054600160a060020a0319808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000805433600160a060020a03908116911614610e7357600080fd5b6006548210610e8157600080fd5b6006805483908110610e8f57fe5b60009182526020909120600890910201600481015490915060ff1615610eb457600080fd5b6004810154610100900460ff1615610ecb57600080fd5b60048101805460ff19166001179055817ffdf197ed54809861dafe0b4d391843652730ac67274c1e9e46db7687dccaa30160405160405180910390a25050565b60005433600160a060020a03908116911614610f2657600080fd5b60055460ff1615610f3657600080fd5b600b805460ff19169055610f4861197f565b565b60075460009033600160a060020a03908116911614610f6857600080fd5b6006548310610f7657600080fd5b670de0b6b3a7640000821115610f8b57600080fd5b6006805484908110610f9957fe5b90600052602060002090600802019050600a548282600701540111151515610fc057600080fd5b6004810154610100900460ff1615610fd757600080fd5b600481015460ff1615610fe957600080fd5b600781018054830190556003018054909101905550565b600b5460ff1681565b6000805b82518210156110425782828151811061102257fe5b90602001906020020151905061103781610ba8565b60019091019061100d565b505050565b600160a060020a031660009081526004602052604090205460ff161590565b600054600160a060020a031681565b610c1c82826000806107ba565b600680548290811061109057fe5b9060005260206000209060080201600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561113c5780601f106111115761010080835404028352916020019161113c565b820191906000526020600020905b81548152906001019060200180831161111f57829003601f168201915b5050505060018301546002840154600385015460048601546005870154600688015460079098015496979496600160a060020a039485169650929460ff80841695610100850490911694620100009094048116939216918a565b600254600090819033600160a060020a03908116911614806111c6575060005433600160a060020a039081169116145b15156111d157600080fd5b600160a060020a03831660009081526004602052604090205460ff16156111f757600080fd5b600160a060020a038316151561128957600354600160a060020a033081163193501682156108fc0283604051600060405180830381858888f19350505050151561124057600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1611042565b5081600160a060020a0381166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156112d957600080fd5b5af115156112e657600080fd5b5050506040518051600354909350600160a060020a03808416925063a9059cbb91168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561134c57600080fd5b5af1151561135957600080fd5b50505060405180519050151561136e57600080fd5b7fa50dde912fa22ea0d215a0236093ac45b4d55d6ef0c604c319f900029c5d10f28383604051600160a060020a03909216825260208201526040908101905180910390a1505050565b600754600160a060020a031681565b60005433600160a060020a039081169116146113e157600080fd5b60078054600160a060020a031916600160a060020a0392909216919091179055565b610c1c8282600080610af3565b60095481565b600154600160a060020a031681565b60025433600160a060020a0390811691161480611450575060005433600160a060020a039081169116145b151561145b57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b60005433600160a060020a039081169116146114ad57600080fd5b600a55565b60085481565b6005546000908190819060ff16156114cf57600080fd5b600160a060020a0333166000908152600c602052604090205460ff1615156114f657600080fd5b600680549250829061150b90600183016119e5565b50600680548390811061151a57fe5b60009182526020909120600890910201600281018054600160a060020a03191633600160a060020a03161790559050670de0b6b3a764000084111561155e57600080fd5b60095484101561157957600954611573611679565b01611584565b83611582611679565b015b600382015560048101805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038a1602179055600681018590556115cc818b8b611a11565b5060018101889055600581018054600160a060020a031916600160a060020a038881169190911791829055600483015460068401546201000090910482169285927fd11935115aa93b9f1f616d0d7702f4593572daa610390123241b3785430281c49291168c604051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a35098975050505050505050565b600354600160a060020a031681565b4290565b600160a060020a0382166000908152600e602052604081205460ff1615156116a457600080fd5b5080600160a060020a03831615156116b95750345b600081116116c657600080fd5b600160a060020a038316156117585782600160a060020a03166323b872dd33308460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561173657600080fd5b5af1151561174357600080fd5b50505060405180519050151561175857600080fd5b92915050565b60055460009060ff1615806117755750600b5460ff165b151561178057600080fd5b600654821061178e57600080fd5b600680548390811061179c57fe5b60009182526020808320600260089093020191820154600160a060020a03168352600c905260409091205490915060ff1615156117d857600080fd5b80600301546117e5611679565b10156117f057600080fd5b600481015460ff161561180257600080fd5b6004810154610100900460ff161561181957600080fd5b60048101805461ff0019166101001790556005810154600160a060020a03161515611885576004810154600682015462010000909104600160a060020a0316906108fc81150290604051600060405180830381858888f19350505050151561188057600080fd5b611913565b600581015460048201546006830154600160a060020a039283169263a9059cbb92620100009004169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156118f157600080fd5b5af115156118fe57600080fd5b50505060405180519050151561191357600080fd5b600481015460068201546005830154600160a060020a036201000090930483169285927f354f3c0c8efabe1a1a07cf222842b008ef284ac185e63bdf8245be8cd2d97f5192909116604051918252600160a060020a031660208201526040908101905180910390a35050565b60005433600160a060020a0390811691161461199a57600080fd5b60055460ff16156119aa57600080fd5b6005805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b815481835581811511611042576008028160080283600052602060002091820191016110429190611a8f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a525782800160ff19823516178555611a7f565b82800160010185558215611a7f579182015b82811115611a7f578235825591602001919060010190611a64565b50611a8b929150611b0f565b5090565b610ce991905b80821115611a8b576000611aa98282611b29565b50600060018201819055600282018054600160a060020a03199081169091556003830182905560048301805475ffffffffffffffffffffffffffffffffffffffffffff191690556005830180549091169055600682018190556007820155600801611a95565b610ce991905b80821115611a8b5760008155600101611b15565b50805460018160011615610100020316600290046000825580601f10611b4f5750611b6d565b601f016020900490600052602060002090810190611b6d9190611b0f565b505600a165627a7a723058203ba22886c60036ed35be37f7fbfa475c2c50042ebe76cb8123648f41a18b4bf90029
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://3ba22886c60036ed35be37f7fbfa475c2c50042ebe76cb8123648f41a18b4bf9
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.