More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,260 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Txn | 14365336 | 1026 days ago | IN | 0.00004411 ETH | 0.00347731 | ||||
Create Txn | 14338660 | 1031 days ago | IN | 0.00004411 ETH | 0.00971938 | ||||
Create Txn | 14337615 | 1031 days ago | IN | 0.00004411 ETH | 0.00802458 | ||||
Propose New Txn | 14336200 | 1031 days ago | IN | 0 ETH | 0.02603714 | ||||
Propose New Txn | 14335823 | 1031 days ago | IN | 0 ETH | 0.02442765 | ||||
Create Txn | 14335600 | 1031 days ago | IN | 0.00004411 ETH | 0.02514368 | ||||
Propose New Txn | 14334745 | 1031 days ago | IN | 0 ETH | 0.02903272 | ||||
Propose New Txn | 14332532 | 1032 days ago | IN | 0 ETH | 0.02070291 | ||||
Propose New Txn | 14331150 | 1032 days ago | IN | 0 ETH | 0.02149899 | ||||
Create Txn | 14330899 | 1032 days ago | IN | 0.00004411 ETH | 0.00775709 | ||||
Propose New Txn | 14328001 | 1032 days ago | IN | 0 ETH | 0.02734272 | ||||
Propose New Txn | 14327735 | 1032 days ago | IN | 0 ETH | 0.02292344 | ||||
Propose New Txn | 14327618 | 1032 days ago | IN | 0 ETH | 0.02471343 | ||||
Propose New Txn | 14327595 | 1032 days ago | IN | 0 ETH | 0.02725986 | ||||
Propose New Txn | 14327578 | 1032 days ago | IN | 0 ETH | 0.02196473 | ||||
Create Txn | 14327541 | 1032 days ago | IN | 0.00004411 ETH | 0.00909452 | ||||
Propose New Txn | 14327540 | 1032 days ago | IN | 0 ETH | 0.02375737 | ||||
Propose New Txn | 14327509 | 1032 days ago | IN | 0 ETH | 0.02148929 | ||||
Propose New Txn | 14327226 | 1032 days ago | IN | 0 ETH | 0.02313005 | ||||
Propose New Txn | 14327222 | 1032 days ago | IN | 0 ETH | 0.0237016 | ||||
Propose New Txn | 14327122 | 1032 days ago | IN | 0 ETH | 0.02089369 | ||||
Propose New Txn | 14327078 | 1032 days ago | IN | 0 ETH | 0.01997087 | ||||
Propose New Txn | 14327063 | 1032 days ago | IN | 0 ETH | 0.02177716 | ||||
Propose New Txn | 14326994 | 1032 days ago | IN | 0 ETH | 0.01908224 | ||||
Propose New Txn | 14326932 | 1032 days ago | IN | 0 ETH | 0.02037022 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14365336 | 1026 days ago | 0.00004411 ETH | ||||
14338660 | 1031 days ago | 0.00004411 ETH | ||||
14337615 | 1031 days ago | 0.00004411 ETH | ||||
14335600 | 1031 days ago | 0.00004411 ETH | ||||
14330899 | 1032 days ago | 0.00004411 ETH | ||||
14327541 | 1032 days ago | 0.00004411 ETH | ||||
14313422 | 1035 days ago | 0.00004411 ETH | ||||
14313285 | 1035 days ago | 0.00004411 ETH | ||||
14305835 | 1036 days ago | 0.00004411 ETH | ||||
14300990 | 1036 days ago | 0.00004411 ETH | ||||
14300754 | 1036 days ago | 0.00004411 ETH | ||||
14288053 | 1038 days ago | 0.00004411 ETH | ||||
14282820 | 1039 days ago | 0.00004411 ETH | ||||
14273305 | 1041 days ago | 0.00004411 ETH | ||||
14273278 | 1041 days ago | 0.00004411 ETH | ||||
14272433 | 1041 days ago | 0.00004411 ETH | ||||
14269992 | 1041 days ago | 0.00004411 ETH | ||||
14247473 | 1045 days ago | 0.00004411 ETH | ||||
14247112 | 1045 days ago | 0.00004411 ETH | ||||
14245486 | 1045 days ago | 0.00004411 ETH | ||||
14242157 | 1046 days ago | 0.00004411 ETH | ||||
14234546 | 1047 days ago | 0.00004411 ETH | ||||
14234470 | 1047 days ago | 0.00004411 ETH | ||||
14232374 | 1047 days ago | 0.00004411 ETH | ||||
14232253 | 1047 days ago | 0.00004411 ETH |
Loading...
Loading
Contract Name:
Dispatcher
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-16 */ /* .... . u :i:::.EBi .r:::.JB. ii:::.Rg :i:i:.QE .:.BB: .. . QBQ: :::.. bBB: i.:...BBB i::...BBB .i:. DBB .J::..iBBB i:....BBB .::.. 7BBQ .::.. vBBg :::.:. dBg KBBBBBBB2 .:.:. rBBZ ::.:. PBBi ::... EBB. .:::.:.. ZBg ..... . ..... . rdUSUis ..:::.:.. i::.. EBB: ...:::. i.:...BBB i.:...BBB .. . .BBv..:... PBD .ri:i:.gg .ri::..BBi r:. .B. ::i::::.:::ii:. .i:.. .BBB .iii:::::::: .::.. LBBS :::.. sQB2.:i:i.jB. bi.:.. dBD i:::: sQB i::. .gBBB..::.. XBB7 :i::.. ..:::i7 ::.:. vBBS .ii::.. .::::.:. ZBB. ::.:. gBQ. :::...BQ. ..:.. Sb PBg ::.:..iBB i:.. ZBQB. ::.:..BBQ .ii:.. rqgQQZ:..:..:B: i::.. MBB. :i:... :YXbP5:..:::..:BQB i::..:BBB ::.:..QB: :::.. sBBBbBB :::::.:BB :i... bBQB: .i::. rBBD i:::.:QBBBBBQB:..:. PB. .i::: :BBQ i::.. .PBBBBBBBr..:.. uBBJ :::.. IBBY i::.. gB7 :i:.. LBBBS :Q .i.:...BB. :i.:. PBBB: :::.. dBB: ::::.iBBBB7 .:::. JBB :i::. uBBY .::::..BBBBP: .::.:..MBB i:.:..QBB i:.:. qB1 .i:.. vBBBK i:::. MBi .i:.. XBBBi i:.:..QBB .:::..:i.:. ........ 2BB i::...QBB i:::..ZBBB. i.:..:BBQ .i::..iBBQ :::.. 1BZ i:.. 7BBBb i:::: ZBs r::. 5BBBr :i:::.vBBI i::::. ....... RQB i:::.rBBM .r:::.rBBB .i::: XBBr i:::: qQBr .r:::.vBQ :i:: rBBQZ :r:::.XBb.::. 5BBB7 r:::..gBB i:::.72uuUUIUIUI1I12sIBBQ :i::..XBBr ii:::.SBBY ii::..QBQ ri::.:QBB .r:::.rQB:::: rBBBM .r:::.SB:.:. uBQBL .r:::.iBBQ .i:::.EBBBBBBBBBBBQBBBBBBJ i:::..BBB ii:::.IBB :i:::.rBBD .r:::.7BBZ r:::.iB7..: iBBBR r:::.v7.:. jBBBJ :i::. 1BBu :i:::.vBB .:... i .i:::.7QBd r::::.iQB :r:::. PBB: i:::. EBBi ::::.iu... iQBBQ i:::.:... LBBB2 r:::..QBB .r::.:.LE .... :BBi ::::. PBB: :i:::..rD .:i::::..BBB r:::.:BBB :i:::.... :BBBB :i:::::. vBBB5 .i:.: rBBQ :r::....:::i::.. .IBBBB i.:...BBB ri::.:..:i::.:::.:. 7BBK .i.:..LBBK .r::::.: :BBBB .r::::. 7BBBK :... 5BBv .7:......... .:5BBBBb :.... vBBS ir........ rg: .. EBB. i.. gBB. i:::::.:BBBB i:::..7BQBb qQq5I1BBB .EQIri:i:rsqQBBBBB: YBqS21MBB. rg2riiivIQBBqb5SU5BBB EQSS1SBBB :::::.:QBQB .r::..rBQBE bBBBBBBR vBBQBBBQBBBQB1. sBBBBBBB .QBBBBBBBBBSPBBBBBBI QBBBBBBI i:::..QBBB .r::. rBQBg .rrri: .iiri. ii::..MBBB iiii::. 7BBBR r::.......::i:i:i::.. ...::::i:::.......::::::::::.. ...........:i::........:iii:ii::. :RBBB. r::.. .1BQBM :i:::.:.:.:::::::.:::.:.....:.:::::::::::.:::.:::::::::::::.:.:.:::::::.:.:.:::::.:.:.:::::::.... 7BBBB. ir..::JRBBBP vi.............................................................................................:7DBBBB .BBBQBQBBBr 7BBBBQBBBBBQBBBQBQBBBBBBBBBBBBBBBBBBBQBBBQBBBQBQBBBBBBBBBQBBBBBBBQBBBBBBBBBBBBBQBBBBBBBBBBBQBQBBBBBBK XDbq5Y: .DZPEPEPdPEPdPdPdPdbEPEbEPEbEPEPdPEPEbdbEdZbZdEdEdEdEbEdZbEdZdZdEbEdZdEbEdZdEbEdZdEdZdEbEdZdZPP5ji */ // File contracts/openzeppelin_contracts/utils/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/openzeppelin_contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { revert("Cannot renounceOwnership with this contract"); //not possible for these contracts } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/openzeppelin_contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/openzeppelin_contracts/token/ERC20/ERC20.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overloaded; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File contracts/Vault.sol pragma solidity 0.8.4; contract Vault is Ownable { address private dispatcherAddress; address private multiSigAddress; address[] private tokens; struct supportedToken { ERC20 token; bool active; } mapping(address => supportedToken) private tokensStore; constructor(address _multiSigAddress) Ownable() { require(_multiSigAddress != address(0), "Cannot set address to 0"); multiSigAddress = _multiSigAddress; } /***************** Getters **************** */ function getDispatcherAddress() public view returns (address) { return dispatcherAddress; } function getMultiSigAddress() public view returns (address) { return multiSigAddress; } function getTokenAddresses() public view returns (address[] memory) { return tokens; } /***************** Calls **************** */ function transferFunds(address _tokenAddress, address _recipient, uint256 _amount) external onlyDispatcher { require(tokensStore[_tokenAddress].active == true, "Token not supported"); require(_amount > 0, "Cannot transfer 0 tokens"); ERC20(_tokenAddress).transfer(_recipient, _amount); emit ReleasedFundsEvent(_recipient, _amount); } function newMultiSig(address _multiSigAddress) external onlyMultiSig { require(_multiSigAddress != address(0), "Cannot set address to 0"); multiSigAddress = _multiSigAddress; emit NewMultiSigEvent(_multiSigAddress); } function newDispatcher(address _dispatcherAddress) external onlyMultiSig { require(_dispatcherAddress != address(0), "Can't set address to 0"); dispatcherAddress = _dispatcherAddress; emit NewDispatcherEvent(dispatcherAddress); } function addToken(address _tokenAddress) external onlyMultiSig { require(tokensStore[_tokenAddress].active != true, "Token already supported"); tokensStore[_tokenAddress].token = ERC20(_tokenAddress); tokensStore[_tokenAddress].active = true; tokens.push(_tokenAddress); emit AddTokenEvent(_tokenAddress); } function removeToken(address _tokenAddress) external onlyMultiSig { require(tokensStore[_tokenAddress].active == true, "Token not supported already"); tokensStore[_tokenAddress].active = false; popTokenArray(_tokenAddress); emit RemoveTokenEvent(_tokenAddress); } /***************** Internal **************** */ function popTokenArray(address _tokenAddress) private { for(uint256 i = 0; i <= tokens.length; i++) { if(_tokenAddress == tokens[i]) { tokens[i] = tokens[tokens.length - 1]; tokens.pop(); break; } } } /***************** Modifiers **************** */ modifier onlyDispatcher() { require(dispatcherAddress == msg.sender, "Not the disptacher"); _; } modifier onlyMultiSig() { require(multiSigAddress == msg.sender, "Not the multisig"); _; } /***************** Events **************** */ event NewMultiSigEvent(address newMultiSigAddress); event AddTokenEvent(address newTokenAddress); event RemoveTokenEvent(address removedTokenAddress); event NewDispatcherEvent(address newdDspatcherAddress); event ReleasedFundsEvent(address indexed recipient, uint256 amount); } // File contracts/Dispatcher.sol pragma solidity 0.8.4; contract Dispatcher is Ownable { Vault private vault; address private multiSigAddress; address private bridgeControllerAddress; address[] private validators; uint256 private valThreshold = 1; uint256 private uuid = 0; uint256[] private outstandingTransferProposalsIndex; struct transferProposal { address recipientAddress; uint256 amount; address tokenAddress; address[] signatures; string note; bool signed; } mapping(uint256 => transferProposal) private transferProposalStore; mapping(string => string) private transactions; constructor(address _vaultAddress, address _multiSigAddress) Ownable() { require(_multiSigAddress != address(0), "Cannot set address to 0"); multiSigAddress = _multiSigAddress; vault = Vault(_vaultAddress); bridgeControllerAddress = msg.sender; } /***************** Getters **************** */ function getBridgeController() public view returns (address) { return bridgeControllerAddress; } function getValidators() public view returns (address[] memory) { return validators; } function getVaultAddress() public view returns (Vault) { return vault; } function getMultiSig() public view returns (address) { return multiSigAddress; } function getOutstandingTransferProposals() public view returns (uint256[] memory) { return outstandingTransferProposalsIndex; } function getValThreshold() public view returns (uint256) { return valThreshold; } function getCreatedTransanction(string memory txID) public view returns (string memory) { return transactions[txID]; } function getUUID() public view returns (uint256) { return uuid; } /***************** Setters **************** */ function newThreshold(uint256 _threshold) external onlyMultiSig { require(_threshold <= validators.length, "Validation threshold cannot exceed amount of validators"); require(_threshold > 0, "Threshold must be greater than 0"); valThreshold = _threshold; emit NewThresholdEvent(_threshold); } function newMultiSig(address _multiSigAddress) external onlyMultiSig { require(_multiSigAddress != address(0), "Cannot set address to 0"); multiSigAddress = _multiSigAddress; emit NewMultiSigEvent(_multiSigAddress); } function newVault(address _vaultAddress) external onlyMultiSig { require(_vaultAddress != address(0), "Vault address cannot be 0"); vault = Vault(_vaultAddress); emit NewVault(_vaultAddress); } function newBridgeController(address _bridgeControllerAddress) external onlyMultiSig { require(_bridgeControllerAddress != address(0), "Bridge controller address cannot be 0"); bridgeControllerAddress = _bridgeControllerAddress; emit NewBridgeController(_bridgeControllerAddress); } function addNewValidator(address _validatorAddress) external onlyMultiSig { require(_validatorAddress != address(0), "Validator cannot be 0"); validators.push(_validatorAddress); emit AddedNewValidator(_validatorAddress); } function removeValidator(address _validatorAddress) external onlyMultiSig { //Remove a validator threshold count in order to avoid not having enough validators for(uint256 i = 0; i <= validators.length; i++) { if(validators[i] == _validatorAddress) { validators[i] = validators[validators.length - 1]; validators.pop(); if(valThreshold > 1) { valThreshold = valThreshold - 1; } break; } } emit RemovedValidator(_validatorAddress); } /***************** Calls **************** */ function proposeNewTxn(address _userAddress, address _tokenAddress, uint256 _amount, string memory _note) external onlyBridgeController{ transferProposalStore[uuid].recipientAddress = _userAddress; transferProposalStore[uuid].amount = _amount; transferProposalStore[uuid].tokenAddress = _tokenAddress; transferProposalStore[uuid].note = _note; if(valThreshold == 1) { vault.transferFunds(transferProposalStore[uuid].tokenAddress, transferProposalStore[uuid].recipientAddress, transferProposalStore[uuid].amount); emit ApprovedTransaction(transferProposalStore[uuid].recipientAddress, transferProposalStore[uuid].amount, uuid); emit proposalCreated(uuid); transferProposalStore[uuid].signed = true; } else { transferProposalStore[uuid].signatures.push(msg.sender); outstandingTransferProposalsIndex.push(uuid); emit proposalCreated(uuid); } uuid += 1; } function approveTxn(uint256 _proposal) external onlyValidators oneVoteTransfer(_proposal){ require(transferProposalStore[_proposal].signed == false, "Already Signed"); transferProposalStore[_proposal].signatures.push(msg.sender); if (transferProposalStore[_proposal].signatures.length >= valThreshold) { vault.transferFunds(transferProposalStore[_proposal].tokenAddress, transferProposalStore[_proposal].recipientAddress, transferProposalStore[_proposal].amount); popTransferProposal(_proposal); emit ApprovedTransaction(transferProposalStore[_proposal].recipientAddress, transferProposalStore[_proposal].amount, _proposal); } } function createTxn( string memory _id, string memory _note, address _tokenAddress, uint256 _calculatedFee, uint256 _amount ) external payable{ require(_amount > 0, "Must send an amount"); require(msg.value == _calculatedFee, "Calculated fee sent wrong"); require(bytes(transactions[_id]).length == 0, "Must be a new transaction"); transactions[_id] = _note; ERC20(_tokenAddress).transferFrom(msg.sender, address(vault), _amount); payable(bridgeControllerAddress).transfer(msg.value); emit NewTransactionCreated(msg.sender, _tokenAddress, _amount); } /***************** Internal **************** */ function popTransferProposal(uint256 _uuid) private { for(uint256 i = 0; i <= outstandingTransferProposalsIndex.length; i++) { if(outstandingTransferProposalsIndex[i] == _uuid) { outstandingTransferProposalsIndex[i] = outstandingTransferProposalsIndex[outstandingTransferProposalsIndex.length - 1]; outstandingTransferProposalsIndex.pop(); break; } } } /***************** Modifiers **************** */ modifier onlyBridgeController() { require(bridgeControllerAddress == msg.sender, "Only the controller can create new transactions"); _; } modifier onlyMultiSig() { require(multiSigAddress == msg.sender, "Not the multisig"); _; } modifier onlyValidators() { for (uint256 i = 0; i < validators.length; i++) { if (validators[i] == msg.sender) { _; } } } modifier oneVoteTransfer (uint256 _proposal) { for(uint256 i = 0; i < transferProposalStore[_proposal].signatures.length; i++){ require(transferProposalStore[_proposal].signatures[i] != msg.sender, "You have already voted"); } _; } /***************** Events **************** */ event NewVault(address newAddress); event NewMultiSigEvent(address newMultiSigAddress); event AddedNewValidator(address newValidator); event RemovedValidator(address oldValidator); event NewBridgeController(address newBridgeController); event NewThresholdEvent(uint256 newThreshold); event proposalCreated(uint256 UUID); event ApprovedTransaction(address indexed recipient, uint256 amount, uint256 UUID); event NewTransactionCreated(address indexed sender, address tokenAddress, uint256 amount); event ReleasedFunds(address indexed recipient, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"},{"internalType":"address","name":"_multiSigAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"AddedNewValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"UUID","type":"uint256"}],"name":"ApprovedTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBridgeController","type":"address"}],"name":"NewBridgeController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMultiSigAddress","type":"address"}],"name":"NewMultiSigEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"NewThresholdEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NewTransactionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"NewVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReleasedFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldValidator","type":"address"}],"name":"RemovedValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"UUID","type":"uint256"}],"name":"proposalCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"}],"name":"addNewValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposal","type":"uint256"}],"name":"approveTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"string","name":"_note","type":"string"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_calculatedFee","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createTxn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getBridgeController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"txID","type":"string"}],"name":"getCreatedTransanction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultiSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOutstandingTransferProposals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUUID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultAddress","outputs":[{"internalType":"contract Vault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeControllerAddress","type":"address"}],"name":"newBridgeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multiSigAddress","type":"address"}],"name":"newMultiSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"newThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"newVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_note","type":"string"}],"name":"proposeNewTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorAddress","type":"address"}],"name":"removeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600160055560006006553480156200001b57600080fd5b5060405162001c7f38038062001c7f8339810160408190526200003e9162000138565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116620000da5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420736574206164647265737320746f2030000000000000000000604482015260640160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600180549390921692811692909217905560038054909116331790556200016f565b80516001600160a01b03811681146200013357600080fd5b919050565b600080604083850312156200014b578182fd5b62000156836200011b565b915062000166602084016200011b565b90509250929050565b611b00806200017f6000396000f3fe60806040526004361061011f5760003560e01c806385652740116100a0578063d5f2142f11610064578063d5f2142f14610311578063d88532aa14610331578063de2a0b3814610351578063ed1be9e414610371578063f2fde38b1461038457600080fd5b8063856527401461026f5780638da5cb5b14610291578063b7ab4db5146102af578063c8fa97d8146102d1578063d01adcc1146102f157600080fd5b806366e992e5116100e757806366e992e5146101e9578063707d5fda14610207578063715018a614610227578063773b6a161461023c57806379a432fd1461025157600080fd5b80630a036a0a1461012457806310edcb10146101465780631c8bc79b1461016a57806340a141ff1461019757806365cacaa4146101b7575b600080fd5b34801561013057600080fd5b5061014461013f36600461176e565b6103a4565b005b34801561015257600080fd5b506005545b6040519081526020015b60405180910390f35b34801561017657600080fd5b5061018a610185366004611815565b610482565b604051610161919061198c565b3480156101a357600080fd5b506101446101b236600461176e565b610532565b3480156101c357600080fd5b506001546001600160a01b03165b6040516001600160a01b039091168152602001610161565b3480156101f557600080fd5b506002546001600160a01b03166101d1565b34801561021357600080fd5b5061014461022236600461178f565b6106f4565b34801561023357600080fd5b506101446109f3565b34801561024857600080fd5b50600654610157565b34801561025d57600080fd5b506003546001600160a01b03166101d1565b34801561027b57600080fd5b50610284610aa9565b6040516101619190611954565b34801561029d57600080fd5b506000546001600160a01b03166101d1565b3480156102bb57600080fd5b506102c4610b01565b6040516101619190611907565b3480156102dd57600080fd5b506101446102ec3660046118d3565b610b62565b3480156102fd57600080fd5b5061014461030c36600461176e565b610e0f565b34801561031d57600080fd5b5061014461032c36600461176e565b610eeb565b34801561033d57600080fd5b5061014461034c3660046118d3565b610fb9565b34801561035d57600080fd5b5061014461036c36600461176e565b6110e0565b61014461037f366004611850565b6111d6565b34801561039057600080fd5b5061014461039f36600461176e565b611428565b6002546001600160a01b031633146103d75760405162461bcd60e51b81526004016103ce906119bf565b60405180910390fd5b6001600160a01b03811661042d5760405162461bcd60e51b815260206004820152601960248201527f5661756c7420616464726573732063616e6e6f7420626520300000000000000060448201526064016103ce565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f2cd7a531712f8899004c782d9607e0886d1dbc91bfac7be88dadf6750d9e1419906020015b60405180910390a150565b606060098260405161049491906118eb565b908152602001604051809103902080546104ad90611a48565b80601f01602080910402602001604051908101604052809291908181526020018280546104d990611a48565b80156105265780601f106104fb57610100808354040283529160200191610526565b820191906000526020600020905b81548152906001019060200180831161050957829003601f168201915b50505050509050919050565b6002546001600160a01b0316331461055c5760405162461bcd60e51b81526004016103ce906119bf565b60005b60045481116106ba57816001600160a01b03166004828154811061059357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156106a857600480546105be90600190611a01565b815481106105dc57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600480546001600160a01b03909216918390811061061657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600480548061066357634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055600554600110156106a357600160055461069f9190611a01565b6005555b6106ba565b806106b281611a83565b91505061055f565b506040516001600160a01b03821681527fb625c55cf7e37b54fcd18bc4edafdf3f4f9acd59a5ec824c77c795dcb2d6507090602001610477565b6003546001600160a01b031633146107665760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e74726f6c6c65722063616e20637265617465206e60448201526e6577207472616e73616374696f6e7360881b60648201526084016103ce565b60068054600090815260086020908152604080832080546001600160a01b03808b166001600160a01b03199283161790925585548552828520600101889055855485528285206002018054928a16929091169190911790559254825291902082516107d992600490920191840190611632565b50600554600114156109375760018054600654600090815260086020526040908190206002810154815491909401549151631501bf0360e01b81526001600160a01b03948516600482015290841660248201526044810191909152911690631501bf0390606401600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b505060065460008181526008602052604090819020805460019091015491516001600160a01b0390911694507f8eeb3b735823598d4f0983d7d10160591a8093ab8909ba839a8bb63e01e400e993506108d09290918252602082015260400190565b60405180910390a27f1fc8f2a696a1eb2860eaa6ee37c3ae6f7f4998983cb8232dbecc5a3c3f3fb1d560065460405161090b91815260200190565b60405180910390a16006546000908152600860205260409020600501805460ff191660011790556109d5565b6006805460009081526008602090815260408083206003018054600180820183559185528385200180546001600160a01b0319163317905593546007805495860181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890930182905591519081527f1fc8f2a696a1eb2860eaa6ee37c3ae6f7f4998983cb8232dbecc5a3c3f3fb1d5910160405180910390a15b6001600660008282546109e891906119e9565b909155505050505050565b6000546001600160a01b03163314610a4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b60405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742072656e6f756e63654f776e657273686970207769746820746860448201526a1a5cc818dbdb9d1c9858dd60aa1b60648201526084016103ce565b60606007805480602002602001604051908101604052809291908181526020018280548015610af757602002820191906000526020600020905b815481526020019060010190808311610ae3575b5050505050905090565b60606004805480602002602001604051908101604052809291908181526020018280548015610af757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b3b575050505050905090565b60005b600454811015610e0b57336001600160a01b031660048281548110610b9a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610df9578160005b600082815260086020526040902060030154811015610c74576000828152600860205260409020600301805433919083908110610c0657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610c625760405162461bcd60e51b8152602060048201526016602482015275165bdd481a185d9948185b1c9958591e481d9bdd195960521b60448201526064016103ce565b80610c6c81611a83565b915050610bb9565b5060008381526008602052604090206005015460ff1615610cc85760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4814da59db995960921b60448201526064016103ce565b60008381526008602090815260408220600301805460018101825581845291832090910180546001600160a01b03191633179055600554918590525410610df75760018054600085815260086020526040908190206002810154815491909401549151631501bf0360e01b81526001600160a01b03948516600482015290841660248201526044810191909152911690631501bf0390606401600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b50505050610d9c83611542565b600083815260086020908152604091829020805460019091015483519081529182018690526001600160a01b0316917f8eeb3b735823598d4f0983d7d10160591a8093ab8909ba839a8bb63e01e400e9910160405180910390a25b505b80610e0381611a83565b915050610b65565b5050565b6002546001600160a01b03163314610e395760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b038116610e9d5760405162461bcd60e51b815260206004820152602560248201527f42726964676520636f6e74726f6c6c657220616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084016103ce565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f03cc69f07650269dffd0ab57addc196077b15d88a45cc3fc1a8789e9a5d7e56590602001610477565b6002546001600160a01b03163314610f155760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b038116610f6b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420736574206164647265737320746f203000000000000000000060448201526064016103ce565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd98884b1ee7930ff2f73f6350aa67967fb4602d47c36aac140b52b7b4234169290602001610477565b6002546001600160a01b03163314610fe35760405162461bcd60e51b81526004016103ce906119bf565b60045481111561105b5760405162461bcd60e51b815260206004820152603760248201527f56616c69646174696f6e207468726573686f6c642063616e6e6f74206578636560448201527f656420616d6f756e74206f662076616c696461746f727300000000000000000060648201526084016103ce565b600081116110ab5760405162461bcd60e51b815260206004820181905260248201527f5468726573686f6c64206d7573742062652067726561746572207468616e203060448201526064016103ce565b60058190556040518181527f1708f63877de5b15d362050c10cd950fac8aa3cf866ecb3221cded5f0b0defae90602001610477565b6002546001600160a01b0316331461110a5760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b0381166111585760405162461bcd60e51b8152602060048201526015602482015274056616c696461746f722063616e6e6f74206265203605c1b60448201526064016103ce565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383169081179091556040519081527fde513172fa9aebe33b2500a73bc4da571623297742469f4701069fc69a4b528f90602001610477565b6000811161121c5760405162461bcd60e51b8152602060048201526013602482015272135d5cdd081cd95b9908185b88185b5bdd5b9d606a1b60448201526064016103ce565b81341461126b5760405162461bcd60e51b815260206004820152601960248201527f43616c63756c61746564206665652073656e742077726f6e670000000000000060448201526064016103ce565b60098560405161127b91906118eb565b9081526020016040518091039020805461129490611a48565b1590506112e35760405162461bcd60e51b815260206004820152601960248201527f4d7573742062652061206e6577207472616e73616374696f6e0000000000000060448201526064016103ce565b836009866040516112f491906118eb565b90815260200160405180910390209080519060200190611315929190611632565b506001546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908416906323b872dd90606401602060405180830381600087803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a291906117f5565b506003546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156113dc573d6000803e3d6000fd5b50604080516001600160a01b03851681526020810183905233917f22eb28040fe59a536771aef43cac330a1613b301e769100ba3ad6f14cc1f70be910160405180910390a25050505050565b6000546001600160a01b031633146114825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b6001600160a01b0381166114e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103ce565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005b6007548111610e0b57816007828154811061157057634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415611620576007805461159190600190611a01565b815481106115af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600782815481106115db57634e487b7160e01b600052603260045260246000fd5b600091825260209091200155600780548061160657634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050565b8061162a81611a83565b915050611545565b82805461163e90611a48565b90600052602060002090601f01602090048101928261166057600085556116a6565b82601f1061167957805160ff19168380011785556116a6565b828001600101855582156116a6579182015b828111156116a657825182559160200191906001019061168b565b506116b29291506116b6565b5090565b5b808211156116b257600081556001016116b7565b80356001600160a01b03811681146116e257600080fd5b919050565b600082601f8301126116f7578081fd5b813567ffffffffffffffff8082111561171257611712611ab4565b604051601f8301601f19908116603f0116810190828211818310171561173a5761173a611ab4565b81604052838152866020858801011115611752578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561177f578081fd5b611788826116cb565b9392505050565b600080600080608085870312156117a4578283fd5b6117ad856116cb565b93506117bb602086016116cb565b925060408501359150606085013567ffffffffffffffff8111156117dd578182fd5b6117e9878288016116e7565b91505092959194509250565b600060208284031215611806578081fd5b81518015158114611788578182fd5b600060208284031215611826578081fd5b813567ffffffffffffffff81111561183c578182fd5b611848848285016116e7565b949350505050565b600080600080600060a08688031215611867578081fd5b853567ffffffffffffffff8082111561187e578283fd5b61188a89838a016116e7565b9650602088013591508082111561189f578283fd5b506118ac888289016116e7565b9450506118bb604087016116cb565b94979396509394606081013594506080013592915050565b6000602082840312156118e4578081fd5b5035919050565b600082516118fd818460208701611a18565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156119485783516001600160a01b031683529284019291840191600101611923565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561194857835183529284019291840191600101611970565b60208152600082518060208401526119ab816040850160208701611a18565b601f01601f19169190910160400192915050565b60208082526010908201526f4e6f7420746865206d756c746973696760801b604082015260600190565b600082198211156119fc576119fc611a9e565b500190565b600082821015611a1357611a13611a9e565b500390565b60005b83811015611a33578181015183820152602001611a1b565b83811115611a42576000848401525b50505050565b600181811c90821680611a5c57607f821691505b60208210811415611a7d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a9757611a97611a9e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203887473fb0617b58e5a6a1cc0388e02c7ab613c8675715157be4d7c9cd11910664736f6c634300080400330000000000000000000000009501f2e5a151eeafbf52e7bc05e550ff90882944000000000000000000000000063f75e139b7d72d0b8058bb5586d2137774b9af
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806385652740116100a0578063d5f2142f11610064578063d5f2142f14610311578063d88532aa14610331578063de2a0b3814610351578063ed1be9e414610371578063f2fde38b1461038457600080fd5b8063856527401461026f5780638da5cb5b14610291578063b7ab4db5146102af578063c8fa97d8146102d1578063d01adcc1146102f157600080fd5b806366e992e5116100e757806366e992e5146101e9578063707d5fda14610207578063715018a614610227578063773b6a161461023c57806379a432fd1461025157600080fd5b80630a036a0a1461012457806310edcb10146101465780631c8bc79b1461016a57806340a141ff1461019757806365cacaa4146101b7575b600080fd5b34801561013057600080fd5b5061014461013f36600461176e565b6103a4565b005b34801561015257600080fd5b506005545b6040519081526020015b60405180910390f35b34801561017657600080fd5b5061018a610185366004611815565b610482565b604051610161919061198c565b3480156101a357600080fd5b506101446101b236600461176e565b610532565b3480156101c357600080fd5b506001546001600160a01b03165b6040516001600160a01b039091168152602001610161565b3480156101f557600080fd5b506002546001600160a01b03166101d1565b34801561021357600080fd5b5061014461022236600461178f565b6106f4565b34801561023357600080fd5b506101446109f3565b34801561024857600080fd5b50600654610157565b34801561025d57600080fd5b506003546001600160a01b03166101d1565b34801561027b57600080fd5b50610284610aa9565b6040516101619190611954565b34801561029d57600080fd5b506000546001600160a01b03166101d1565b3480156102bb57600080fd5b506102c4610b01565b6040516101619190611907565b3480156102dd57600080fd5b506101446102ec3660046118d3565b610b62565b3480156102fd57600080fd5b5061014461030c36600461176e565b610e0f565b34801561031d57600080fd5b5061014461032c36600461176e565b610eeb565b34801561033d57600080fd5b5061014461034c3660046118d3565b610fb9565b34801561035d57600080fd5b5061014461036c36600461176e565b6110e0565b61014461037f366004611850565b6111d6565b34801561039057600080fd5b5061014461039f36600461176e565b611428565b6002546001600160a01b031633146103d75760405162461bcd60e51b81526004016103ce906119bf565b60405180910390fd5b6001600160a01b03811661042d5760405162461bcd60e51b815260206004820152601960248201527f5661756c7420616464726573732063616e6e6f7420626520300000000000000060448201526064016103ce565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f2cd7a531712f8899004c782d9607e0886d1dbc91bfac7be88dadf6750d9e1419906020015b60405180910390a150565b606060098260405161049491906118eb565b908152602001604051809103902080546104ad90611a48565b80601f01602080910402602001604051908101604052809291908181526020018280546104d990611a48565b80156105265780601f106104fb57610100808354040283529160200191610526565b820191906000526020600020905b81548152906001019060200180831161050957829003601f168201915b50505050509050919050565b6002546001600160a01b0316331461055c5760405162461bcd60e51b81526004016103ce906119bf565b60005b60045481116106ba57816001600160a01b03166004828154811061059357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156106a857600480546105be90600190611a01565b815481106105dc57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600480546001600160a01b03909216918390811061061657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600480548061066357634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055600554600110156106a357600160055461069f9190611a01565b6005555b6106ba565b806106b281611a83565b91505061055f565b506040516001600160a01b03821681527fb625c55cf7e37b54fcd18bc4edafdf3f4f9acd59a5ec824c77c795dcb2d6507090602001610477565b6003546001600160a01b031633146107665760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e74726f6c6c65722063616e20637265617465206e60448201526e6577207472616e73616374696f6e7360881b60648201526084016103ce565b60068054600090815260086020908152604080832080546001600160a01b03808b166001600160a01b03199283161790925585548552828520600101889055855485528285206002018054928a16929091169190911790559254825291902082516107d992600490920191840190611632565b50600554600114156109375760018054600654600090815260086020526040908190206002810154815491909401549151631501bf0360e01b81526001600160a01b03948516600482015290841660248201526044810191909152911690631501bf0390606401600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b505060065460008181526008602052604090819020805460019091015491516001600160a01b0390911694507f8eeb3b735823598d4f0983d7d10160591a8093ab8909ba839a8bb63e01e400e993506108d09290918252602082015260400190565b60405180910390a27f1fc8f2a696a1eb2860eaa6ee37c3ae6f7f4998983cb8232dbecc5a3c3f3fb1d560065460405161090b91815260200190565b60405180910390a16006546000908152600860205260409020600501805460ff191660011790556109d5565b6006805460009081526008602090815260408083206003018054600180820183559185528385200180546001600160a01b0319163317905593546007805495860181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890930182905591519081527f1fc8f2a696a1eb2860eaa6ee37c3ae6f7f4998983cb8232dbecc5a3c3f3fb1d5910160405180910390a15b6001600660008282546109e891906119e9565b909155505050505050565b6000546001600160a01b03163314610a4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b60405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742072656e6f756e63654f776e657273686970207769746820746860448201526a1a5cc818dbdb9d1c9858dd60aa1b60648201526084016103ce565b60606007805480602002602001604051908101604052809291908181526020018280548015610af757602002820191906000526020600020905b815481526020019060010190808311610ae3575b5050505050905090565b60606004805480602002602001604051908101604052809291908181526020018280548015610af757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b3b575050505050905090565b60005b600454811015610e0b57336001600160a01b031660048281548110610b9a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610df9578160005b600082815260086020526040902060030154811015610c74576000828152600860205260409020600301805433919083908110610c0657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610c625760405162461bcd60e51b8152602060048201526016602482015275165bdd481a185d9948185b1c9958591e481d9bdd195960521b60448201526064016103ce565b80610c6c81611a83565b915050610bb9565b5060008381526008602052604090206005015460ff1615610cc85760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4814da59db995960921b60448201526064016103ce565b60008381526008602090815260408220600301805460018101825581845291832090910180546001600160a01b03191633179055600554918590525410610df75760018054600085815260086020526040908190206002810154815491909401549151631501bf0360e01b81526001600160a01b03948516600482015290841660248201526044810191909152911690631501bf0390606401600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b50505050610d9c83611542565b600083815260086020908152604091829020805460019091015483519081529182018690526001600160a01b0316917f8eeb3b735823598d4f0983d7d10160591a8093ab8909ba839a8bb63e01e400e9910160405180910390a25b505b80610e0381611a83565b915050610b65565b5050565b6002546001600160a01b03163314610e395760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b038116610e9d5760405162461bcd60e51b815260206004820152602560248201527f42726964676520636f6e74726f6c6c657220616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084016103ce565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f03cc69f07650269dffd0ab57addc196077b15d88a45cc3fc1a8789e9a5d7e56590602001610477565b6002546001600160a01b03163314610f155760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b038116610f6b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420736574206164647265737320746f203000000000000000000060448201526064016103ce565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd98884b1ee7930ff2f73f6350aa67967fb4602d47c36aac140b52b7b4234169290602001610477565b6002546001600160a01b03163314610fe35760405162461bcd60e51b81526004016103ce906119bf565b60045481111561105b5760405162461bcd60e51b815260206004820152603760248201527f56616c69646174696f6e207468726573686f6c642063616e6e6f74206578636560448201527f656420616d6f756e74206f662076616c696461746f727300000000000000000060648201526084016103ce565b600081116110ab5760405162461bcd60e51b815260206004820181905260248201527f5468726573686f6c64206d7573742062652067726561746572207468616e203060448201526064016103ce565b60058190556040518181527f1708f63877de5b15d362050c10cd950fac8aa3cf866ecb3221cded5f0b0defae90602001610477565b6002546001600160a01b0316331461110a5760405162461bcd60e51b81526004016103ce906119bf565b6001600160a01b0381166111585760405162461bcd60e51b8152602060048201526015602482015274056616c696461746f722063616e6e6f74206265203605c1b60448201526064016103ce565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383169081179091556040519081527fde513172fa9aebe33b2500a73bc4da571623297742469f4701069fc69a4b528f90602001610477565b6000811161121c5760405162461bcd60e51b8152602060048201526013602482015272135d5cdd081cd95b9908185b88185b5bdd5b9d606a1b60448201526064016103ce565b81341461126b5760405162461bcd60e51b815260206004820152601960248201527f43616c63756c61746564206665652073656e742077726f6e670000000000000060448201526064016103ce565b60098560405161127b91906118eb565b9081526020016040518091039020805461129490611a48565b1590506112e35760405162461bcd60e51b815260206004820152601960248201527f4d7573742062652061206e6577207472616e73616374696f6e0000000000000060448201526064016103ce565b836009866040516112f491906118eb565b90815260200160405180910390209080519060200190611315929190611632565b506001546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908416906323b872dd90606401602060405180830381600087803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a291906117f5565b506003546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156113dc573d6000803e3d6000fd5b50604080516001600160a01b03851681526020810183905233917f22eb28040fe59a536771aef43cac330a1613b301e769100ba3ad6f14cc1f70be910160405180910390a25050505050565b6000546001600160a01b031633146114825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b6001600160a01b0381166114e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103ce565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005b6007548111610e0b57816007828154811061157057634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415611620576007805461159190600190611a01565b815481106115af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600782815481106115db57634e487b7160e01b600052603260045260246000fd5b600091825260209091200155600780548061160657634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050565b8061162a81611a83565b915050611545565b82805461163e90611a48565b90600052602060002090601f01602090048101928261166057600085556116a6565b82601f1061167957805160ff19168380011785556116a6565b828001600101855582156116a6579182015b828111156116a657825182559160200191906001019061168b565b506116b29291506116b6565b5090565b5b808211156116b257600081556001016116b7565b80356001600160a01b03811681146116e257600080fd5b919050565b600082601f8301126116f7578081fd5b813567ffffffffffffffff8082111561171257611712611ab4565b604051601f8301601f19908116603f0116810190828211818310171561173a5761173a611ab4565b81604052838152866020858801011115611752578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561177f578081fd5b611788826116cb565b9392505050565b600080600080608085870312156117a4578283fd5b6117ad856116cb565b93506117bb602086016116cb565b925060408501359150606085013567ffffffffffffffff8111156117dd578182fd5b6117e9878288016116e7565b91505092959194509250565b600060208284031215611806578081fd5b81518015158114611788578182fd5b600060208284031215611826578081fd5b813567ffffffffffffffff81111561183c578182fd5b611848848285016116e7565b949350505050565b600080600080600060a08688031215611867578081fd5b853567ffffffffffffffff8082111561187e578283fd5b61188a89838a016116e7565b9650602088013591508082111561189f578283fd5b506118ac888289016116e7565b9450506118bb604087016116cb565b94979396509394606081013594506080013592915050565b6000602082840312156118e4578081fd5b5035919050565b600082516118fd818460208701611a18565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156119485783516001600160a01b031683529284019291840191600101611923565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561194857835183529284019291840191600101611970565b60208152600082518060208401526119ab816040850160208701611a18565b601f01601f19169190910160400192915050565b60208082526010908201526f4e6f7420746865206d756c746973696760801b604082015260600190565b600082198211156119fc576119fc611a9e565b500190565b600082821015611a1357611a13611a9e565b500390565b60005b83811015611a33578181015183820152602001611a1b565b83811115611a42576000848401525b50505050565b600181811c90821680611a5c57607f821691505b60208210811415611a7d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a9757611a97611a9e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203887473fb0617b58e5a6a1cc0388e02c7ab613c8675715157be4d7c9cd11910664736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009501f2e5a151eeafbf52e7bc05e550ff90882944000000000000000000000000063f75e139b7d72d0b8058bb5586d2137774b9af
-----Decoded View---------------
Arg [0] : _vaultAddress (address): 0x9501f2e5a151EEAFBF52E7BC05E550FF90882944
Arg [1] : _multiSigAddress (address): 0x063F75e139b7d72D0b8058BB5586d2137774b9AF
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009501f2e5a151eeafbf52e7bc05e550ff90882944
Arg [1] : 000000000000000000000000063f75e139b7d72d0b8058bb5586d2137774b9af
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.