Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 4459514 | 3074 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MultiSigStub
Compiler Version
v0.4.15+commit.bbb8e64f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2017-10-30
*/
pragma solidity ^0.4.15;
/**
* @title MultiSigStub
* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
* @dev Contract that delegates calls to a library to build a full MultiSigWallet that is cheap to create.
*/
contract MultiSigStub {
address[] public owners;
address[] public tokens;
mapping (uint => Transaction) public transactions;
mapping (uint => mapping (address => bool)) public confirmations;
uint public transactionCount;
struct Transaction {
address destination;
uint value;
bytes data;
bool executed;
}
function MultiSigStub(address[] _owners, uint256 _required) {
//bytes4 sig = bytes4(sha3("constructor(address[],uint256)"));
bytes4 sig = 0x36756a23;
uint argarraysize = (2 + _owners.length);
uint argsize = (1 + argarraysize) * 32;
uint size = 4 + argsize;
bytes32 mData = _malloc(size);
assembly {
mstore(mData, sig)
codecopy(add(mData, 0x4), sub(codesize, argsize), argsize)
}
_delegatecall(mData, size);
}
modifier delegated {
uint size = msg.data.length;
bytes32 mData = _malloc(size);
assembly {
calldatacopy(mData, 0x0, size)
}
bytes32 mResult = _delegatecall(mData, size);
_;
assembly {
return(mResult, 0x20)
}
}
function()
payable
delegated
{
}
function submitTransaction(address destination, uint value, bytes data)
public
delegated
returns (uint)
{
}
function confirmTransaction(uint transactionId)
public
delegated
{
}
function watch(address _tokenAddr)
public
delegated
{
}
function setMyTokenList(address[] _tokenList)
public
delegated
{
}
/// @dev Returns the confirmation status of a transaction.
/// @param transactionId Transaction ID.
/// @return Confirmation status.
function isConfirmed(uint transactionId)
public
constant
delegated
returns (bool)
{
}
/*
* Web3 call functions
*/
function tokenBalances(address tokenAddress)
public
constant
delegated
returns (uint)
{
}
/// @dev Returns number of confirmations of a transaction.
/// @param transactionId Transaction ID.
/// @return Number of confirmations.
function getConfirmationCount(uint transactionId)
public
constant
delegated
returns (uint)
{
}
/// @dev Returns total number of transactions after filters are applied.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Total number of transactions after filters are applied.
function getTransactionCount(bool pending, bool executed)
public
constant
delegated
returns (uint)
{
}
/// @dev Returns list of owners.
/// @return List of owner addresses.
function getOwners()
public
constant
returns (address[])
{
return owners;
}
/// @dev Returns list of tokens.
/// @return List of token addresses.
function getTokenList()
public
constant
returns (address[])
{
return tokens;
}
/// @dev Returns array with owner addresses, which confirmed transaction.
/// @param transactionId Transaction ID.
/// @return Returns array of owner addresses.
function getConfirmations(uint transactionId)
public
constant
returns (address[] _confirmations)
{
address[] memory confirmationsTemp = new address[](owners.length);
uint count = 0;
uint i;
for (i = 0; i < owners.length; i++) {
if (confirmations[transactionId][owners[i]]) {
confirmationsTemp[count] = owners[i];
count += 1;
}
}
_confirmations = new address[](count);
for (i = 0; i < count; i++) {
_confirmations[i] = confirmationsTemp[i];
}
}
/// @dev Returns list of transaction IDs in defined range.
/// @param from Index start position of transaction array.
/// @param to Index end position of transaction array.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Returns array of transaction IDs.
function getTransactionIds(uint from, uint to, bool pending, bool executed)
public
constant
returns (uint[] _transactionIds)
{
uint[] memory transactionIdsTemp = new uint[](transactionCount);
uint count = 0;
uint i;
for (i = 0; i < transactionCount; i++) {
if (pending && !transactions[i].executed || executed && transactions[i].executed) {
transactionIdsTemp[count] = i;
count += 1;
}
}
_transactionIds = new uint[](to - from);
for (i = from; i < to; i++) {
_transactionIds[i - from] = transactionIdsTemp[i];
}
}
function _malloc(uint size)
private
returns(bytes32 mData)
{
assembly {
mData := mload(0x40)
mstore(0x40, add(mData, size))
}
}
function _delegatecall(bytes32 mData, uint size)
private
returns(bytes32 mResult)
{
address target = 0xc0FFeEE61948d8993864a73a099c0E38D887d3F4; //Multinetwork
mResult = _malloc(32);
bool failed;
assembly {
failed := iszero(delegatecall(sub(gas, 10000), target, mData, size, mResult, 0x20))
}
assert(!failed);
}
}
contract MultiSigFactory {
event Create(address indexed caller, address createdContract);
function create(address[] owners, uint256 required) returns (address wallet){
wallet = new MultiSigStub(owners, required);
Create(msg.sender, wallet);
}
}
///////////////////////////////////////////////////////////////////
// MultiSigTokenWallet as in 0xc0FFeEE61948d8993864a73a099c0E38D887d3F4
///////////////////////////////////////////////////////////////////
pragma solidity ^0.4.15;
contract ERC20 {
uint256 public totalSupply;
function balanceOf(address who) constant returns (uint256 balance);
function allowance(address owner, address spender) constant returns (uint256 remaining);
function transfer(address to, uint256 value) returns (bool ok);
function transferFrom(address from, address to, uint256 value) returns (bool ok);
function approve(address spender, uint256 value) returns (bool ok);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract MultiSigTokenWallet {
address[] public owners;
address[] public tokens;
mapping (uint => Transaction) public transactions;
mapping (uint => mapping (address => bool)) public confirmations;
uint public transactionCount;
mapping (address => uint) public tokenBalances;
mapping (address => bool) public isOwner;
mapping (address => address[]) public userList;
uint public required;
uint public nonce;
struct Transaction {
address destination;
uint value;
bytes data;
bool executed;
}
uint constant public MAX_OWNER_COUNT = 50;
event Confirmation(address indexed _sender, uint indexed _transactionId);
event Revocation(address indexed _sender, uint indexed _transactionId);
event Submission(uint indexed _transactionId);
event Execution(uint indexed _transactionId);
event ExecutionFailure(uint indexed _transactionId);
event Deposit(address indexed _sender, uint _value);
event TokenDeposit(address _token, address indexed _sender, uint _value);
event OwnerAddition(address indexed _owner);
event OwnerRemoval(address indexed _owner);
event RequirementChange(uint _required);
modifier onlyWallet() {
require (msg.sender == address(this));
_;
}
modifier ownerDoesNotExist(address owner) {
require (!isOwner[owner]);
_;
}
modifier ownerExists(address owner) {
require (isOwner[owner]);
_;
}
modifier transactionExists(uint transactionId) {
require (transactions[transactionId].destination != 0);
_;
}
modifier confirmed(uint transactionId, address owner) {
require (confirmations[transactionId][owner]);
_;
}
modifier notConfirmed(uint transactionId, address owner) {
require(!confirmations[transactionId][owner]);
_;
}
modifier notExecuted(uint transactionId) {
require (!transactions[transactionId].executed);
_;
}
modifier notNull(address _address) {
require (_address != 0);
_;
}
modifier validRequirement(uint ownerCount, uint _required) {
require (ownerCount <= MAX_OWNER_COUNT && _required <= ownerCount && _required != 0 && ownerCount != 0);
_;
}
/// @dev Fallback function allows to deposit ether.
function()
payable
{
if (msg.value > 0)
Deposit(msg.sender, msg.value);
}
/**
* Public functions
*
**/
/// @dev Contract constructor sets initial owners and required number of confirmations.
/// @param _owners List of initial owners.
/// @param _required Number of required confirmations.
function constructor(address[] _owners, uint _required)
public
validRequirement(_owners.length, _required)
{
require(owners.length == 0 && required == 0);
for (uint i = 0; i < _owners.length; i++) {
require(!isOwner[_owners[i]] && _owners[i] != 0);
isOwner[_owners[i]] = true;
}
owners = _owners;
required = _required;
}
/**
* @notice deposit a ERC20 token. The amount of deposit is the allowance set to this contract.
* @param _token the token contract address
* @param _data might be used by child implementations
**/
function depositToken(address _token, bytes _data)
public
{
address sender = msg.sender;
uint amount = ERC20(_token).allowance(sender, this);
deposit(sender, amount, _token, _data);
}
/**
* @notice deposit a ERC20 token. The amount of deposit is the allowance set to this contract.
* @param _token the token contract address
* @param _data might be used by child implementations
**/
function deposit(address _from, uint256 _amount, address _token, bytes _data)
public
{
if (_from == address(this))
return;
uint _nonce = nonce;
bool result = ERC20(_token).transferFrom(_from, this, _amount);
assert(result);
//ERC23 not executed _deposited tokenFallback by
if (nonce == _nonce) {
_deposited(_from, _amount, _token, _data);
}
}
/**
* @notice watches for balance in a token contract
* @param _tokenAddr the token contract address
**/
function watch(address _tokenAddr)
ownerExists(msg.sender)
{
uint oldBal = tokenBalances[_tokenAddr];
uint newBal = ERC20(_tokenAddr).balanceOf(this);
if (newBal > oldBal) {
_deposited(0x0, newBal-oldBal, _tokenAddr, new bytes(0));
}
}
function setMyTokenList(address[] _tokenList)
public
{
userList[msg.sender] = _tokenList;
}
function setTokenList(address[] _tokenList)
onlyWallet
{
tokens = _tokenList;
}
/**
* @notice ERC23 Token fallback
* @param _from address incoming token
* @param _amount incoming amount
**/
function tokenFallback(address _from, uint _amount, bytes _data)
public
{
_deposited(_from, _amount, msg.sender, _data);
}
/**
* @notice Called MiniMeToken approvesAndCall to this contract, calls deposit.
* @param _from address incoming token
* @param _amount incoming amount
* @param _token the token contract address
* @param _data (might be used by child classes)
*/
function receiveApproval(address _from, uint256 _amount, address _token, bytes _data) {
deposit(_from, _amount, _token, _data);
}
/// @dev Allows to add a new owner. Transaction has to be sent by wallet.
/// @param owner Address of new owner.
function addOwner(address owner)
public
onlyWallet
ownerDoesNotExist(owner)
notNull(owner)
validRequirement(owners.length + 1, required)
{
isOwner[owner] = true;
owners.push(owner);
OwnerAddition(owner);
}
/// @dev Allows to remove an owner. Transaction has to be sent by wallet.
/// @param owner Address of owner.
function removeOwner(address owner)
public
onlyWallet
ownerExists(owner)
{
isOwner[owner] = false;
uint _len = owners.length - 1;
for (uint i = 0; i < _len; i++) {
if (owners[i] == owner) {
owners[i] = owners[owners.length - 1];
break;
}
}
owners.length -= 1;
if (required > owners.length)
changeRequirement(owners.length);
OwnerRemoval(owner);
}
/// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
/// @param owner Address of owner to be replaced.
/// @param owner Address of new owner.
function replaceOwner(address owner, address newOwner)
public
onlyWallet
ownerExists(owner)
ownerDoesNotExist(newOwner)
{
for (uint i = 0; i < owners.length; i++) {
if (owners[i] == owner) {
owners[i] = newOwner;
break;
}
}
isOwner[owner] = false;
isOwner[newOwner] = true;
OwnerRemoval(owner);
OwnerAddition(newOwner);
}
/**
* @dev gives full ownership of this wallet to `_dest` removing older owners from wallet
* @param _dest the address of new controller
**/
function releaseWallet(address _dest)
public
notNull(_dest)
ownerDoesNotExist(_dest)
onlyWallet
{
address[] memory _owners = owners;
uint numOwners = _owners.length;
addOwner(_dest);
for (uint i = 0; i < numOwners; i++) {
removeOwner(_owners[i]);
}
}
/// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
/// @param _required Number of required confirmations.
function changeRequirement(uint _required)
public
onlyWallet
validRequirement(owners.length, _required)
{
required = _required;
RequirementChange(_required);
}
/// @dev Allows an owner to submit and confirm a transaction.
/// @param destination Transaction target address.
/// @param value Transaction ether value.
/// @param data Transaction data payload.
/// @return Returns transaction ID.
function submitTransaction(address destination, uint value, bytes data)
public
returns (uint transactionId)
{
transactionId = addTransaction(destination, value, data);
confirmTransaction(transactionId);
}
/// @dev Allows an owner to confirm a transaction.
/// @param transactionId Transaction ID.
function confirmTransaction(uint transactionId)
public
ownerExists(msg.sender)
transactionExists(transactionId)
notConfirmed(transactionId, msg.sender)
{
confirmations[transactionId][msg.sender] = true;
Confirmation(msg.sender, transactionId);
executeTransaction(transactionId);
}
/// @dev Allows an owner to revoke a confirmation for a transaction.
/// @param transactionId Transaction ID.
function revokeConfirmation(uint transactionId)
public
ownerExists(msg.sender)
confirmed(transactionId, msg.sender)
notExecuted(transactionId)
{
confirmations[transactionId][msg.sender] = false;
Revocation(msg.sender, transactionId);
}
/// @dev Allows anyone to execute a confirmed transaction.
/// @param transactionId Transaction ID.
function executeTransaction(uint transactionId)
public
notExecuted(transactionId)
{
if (isConfirmed(transactionId)) {
Transaction storage txx = transactions[transactionId];
txx.executed = true;
if (txx.destination.call.value(txx.value)(txx.data)) {
Execution(transactionId);
} else {
ExecutionFailure(transactionId);
txx.executed = false;
}
}
}
/**
* @dev withdraw all recognized tokens balances and ether to `_dest`
* @param _dest the address of receiver
**/
function withdrawEverything(address _dest)
public
notNull(_dest)
onlyWallet
{
withdrawAllTokens(_dest);
_dest.transfer(this.balance);
}
/**
* @dev withdraw all recognized tokens balances to `_dest`
* @param _dest the address of receiver
**/
function withdrawAllTokens(address _dest)
public
notNull(_dest)
onlyWallet
{
address[] memory _tokenList;
if (userList[_dest].length > 0) {
_tokenList = userList[_dest];
} else {
_tokenList = tokens;
}
uint len = _tokenList.length;
for (uint i = 0;i < len; i++) {
address _tokenAddr = _tokenList[i];
uint _amount = tokenBalances[_tokenAddr];
if (_amount > 0) {
delete tokenBalances[_tokenAddr];
ERC20(_tokenAddr).transfer(_dest, _amount);
}
}
}
/**
* @dev withdraw `_tokenAddr` `_amount` to `_dest`
* @param _tokenAddr the address of the token
* @param _dest the address of receiver
* @param _amount the number of tokens to send
**/
function withdrawToken(address _tokenAddr, address _dest, uint _amount)
public
notNull(_dest)
onlyWallet
{
require(_amount > 0);
uint _balance = tokenBalances[_tokenAddr];
require(_amount <= _balance);
tokenBalances[_tokenAddr] = _balance - _amount;
bool result = ERC20(_tokenAddr).transfer(_dest, _amount);
assert(result);
}
/// @dev Returns the confirmation status of a transaction.
/// @param transactionId Transaction ID.
/// @return Confirmation status.
function isConfirmed(uint transactionId)
public
constant
returns (bool)
{
uint count = 0;
for (uint i = 0; i < owners.length; i++) {
if (confirmations[transactionId][owners[i]])
count += 1;
if (count == required)
return true;
}
}
/*
* Internal functions
*/
/// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
/// @param destination Transaction target address.
/// @param value Transaction ether value.
/// @param data Transaction data payload.
/// @return Returns transaction ID.
function addTransaction(address destination, uint value, bytes data)
internal
notNull(destination)
returns (uint transactionId)
{
transactionId = transactionCount;
transactions[transactionId] = Transaction({
destination: destination,
value: value,
data: data,
executed: false
});
transactionCount += 1;
Submission(transactionId);
}
/**
* @dev register the deposit
**/
function _deposited(address _from, uint _amount, address _tokenAddr, bytes)
internal
{
TokenDeposit(_tokenAddr,_from,_amount);
nonce++;
if (tokenBalances[_tokenAddr] == 0) {
tokens.push(_tokenAddr);
tokenBalances[_tokenAddr] = ERC20(_tokenAddr).balanceOf(this);
} else {
tokenBalances[_tokenAddr] += _amount;
}
}
/*
* Web3 call functions
*/
/// @dev Returns number of confirmations of a transaction.
/// @param transactionId Transaction ID.
/// @return Number of confirmations.
function getConfirmationCount(uint transactionId)
public
constant
returns (uint count)
{
for (uint i = 0; i < owners.length; i++) {
if (confirmations[transactionId][owners[i]])
count += 1;
}
}
/// @dev Returns total number of transactions after filters are applied.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Total number of transactions after filters are applied.
function getTransactionCount(bool pending, bool executed)
public
constant
returns (uint count)
{
for (uint i = 0; i < transactionCount; i++) {
if (pending && !transactions[i].executed || executed && transactions[i].executed)
count += 1;
}
}
/// @dev Returns list of owners.
/// @return List of owner addresses.
function getOwners()
public
constant
returns (address[])
{
return owners;
}
/// @dev Returns list of tokens.
/// @return List of token addresses.
function getTokenList()
public
constant
returns (address[])
{
return tokens;
}
/// @dev Returns array with owner addresses, which confirmed transaction.
/// @param transactionId Transaction ID.
/// @return Returns array of owner addresses.
function getConfirmations(uint transactionId)
public
constant
returns (address[] _confirmations)
{
address[] memory confirmationsTemp = new address[](owners.length);
uint count = 0;
uint i;
for (i = 0; i < owners.length; i++) {
if (confirmations[transactionId][owners[i]]) {
confirmationsTemp[count] = owners[i];
count += 1;
}
}
_confirmations = new address[](count);
for (i = 0; i < count; i++) {
_confirmations[i] = confirmationsTemp[i];
}
}
/// @dev Returns list of transaction IDs in defined range.
/// @param from Index start position of transaction array.
/// @param to Index end position of transaction array.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Returns array of transaction IDs.
function getTransactionIds(uint from, uint to, bool pending, bool executed)
public
constant
returns (uint[] _transactionIds)
{
uint[] memory transactionIdsTemp = new uint[](transactionCount);
uint count = 0;
uint i;
for (i = 0; i < transactionCount; i++) {
if (pending && !transactions[i].executed || executed && transactions[i].executed) {
transactionIdsTemp[count] = i;
count += 1;
}
}
_transactionIds = new uint[](to - from);
for (i = from; i < to; i++) {
_transactionIds[i - from] = transactionIdsTemp[i];
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"owners","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getTokenList","outputs":[{"name":"","type":"address[]"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"address"}],"name":"confirmations","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_tokenList","type":"address[]"}],"name":"setMyTokenList","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokens","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"tokenBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"pending","type":"bool"},{"name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddr","type":"address"}],"name":"watch","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"transactionId","type":"uint256"}],"name":"getConfirmationCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactions","outputs":[{"name":"destination","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"executed","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"from","type":"uint256"},{"name":"to","type":"uint256"},{"name":"pending","type":"bool"},{"name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"name":"_transactionIds","type":"uint256[]"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"transactionId","type":"uint256"}],"name":"getConfirmations","outputs":[{"name":"_confirmations","type":"address[]"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transactionCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"}]Contract Creation Code
6060604052341561000f57600080fd5b604051610d80380380610d80833981016040528080518201919060200180519150505b7f36756a230000000000000000000000000000000000000000000000000000000060008080808651600201935083600101602002925082600401915061008a826100bd640100000000026105fa176401000000009004565b90508481528283380360048301396100af818364010000000061060d6100d082021704565b505b50505050505050610121565b600060405190508181016040525b919050565b600073c0ffeee61948d8993864a73a099c0e38d887d3f4816100ff60206401000000006105fa6100bd82021704565b92506020838587856127105a03f4159050801561011857fe5b5b505092915050565b610c50806101306000396000f300606060405236156100ee5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461011a578063273cbaa01461014c5780633411c81c146101b35780634f383934146101e95780634f64b2be1461023a578063523fba7f1461026c578063547415251461029d57806358e2cd76146102cc578063784547a7146102ed5780638b51d13f146103175780639ace38c21461033f578063a0e67e2b146103fe578063a8abe69a14610465578063b5dc40c3146104dc578063b77bf60014610546578063c01a8c841461056b578063c642747414610583575b5b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050005b341561012557600080fd5b610130600435610651565b604051600160a060020a03909116815260200160405180910390f35b341561015757600080fd5b61015f610683565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b34156101be57600080fd5b6101d5600435600160a060020a03602435166106ec565b604051901515815260200160405180910390f35b34156101f457600080fd5b61023860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506100ee95505050505050565b005b341561024557600080fd5b610130600435610738565b604051600160a060020a03909116815260200160405180910390f35b341561027757600080fd5b61028b600160a060020a036004351661076a565b60405190815260200160405180910390f35b34156102a857600080fd5b61028b6004351515602435151561076a565b60405190815260200160405180910390f35b34156102d757600080fd5b610238600160a060020a03600435166100ee565b005b34156102f857600080fd5b6101d560043561076a565b604051901515815260200160405180910390f35b341561032257600080fd5b61028b60043561076a565b60405190815260200160405180910390f35b341561034a57600080fd5b610355600435610853565b604051600160a060020a03851681526020810184905281151560608201526080604082018181528454600260001961010060018416150201909116049183018290529060a0830190859080156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b50509550505050505060405180910390f35b341561040957600080fd5b61015f610886565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b341561047057600080fd5b61015f600435602435604435151560643515156108ef565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b34156104e757600080fd5b61015f600435610a1d565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b341561055157600080fd5b61028b610b9d565b60405190815260200160405180910390f35b341561057657600080fd5b6102386004356100ee565b005b341561058e57600080fd5b61028b60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061076a95505050505050565b60405190815260200160405180910390f35b600060405190508181016040525b919050565b600073c0ffeee61948d8993864a73a099c0e38d887d3f48161062f60206105fa565b92506020838587856127105a03f4159050801561064857fe5b5b505092915050565b600080548290811061065f57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b61068b610c00565b60018054806020026020016040519081016040528092919081815260200182805480156106e157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116106c3575b505050505090505b90565b600360209081526000928352604080842090915290825290205460ff1681565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b600180548290811061065f57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505092915050565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b6002602081905260009182526040909120805460018201546003830154600160a060020a03909216939092019060ff1684565b61088e610c00565b60008054806020026020016040519081016040528092919081815260200182805480156106e157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116106c3575b505050505090505b90565b6108f7610c00565b6108ff610c00565b6000806004546040518059106109125750595b908082528060200260200182016040525b50925060009150600090505b6004548110156109aa57858015610958575060008181526002602052604090206003015460ff16155b8061097c575084801561097c575060008181526002602052604090206003015460ff165b5b156109a1578083838151811061098f57fe5b60209081029091010152600191909101905b5b60010161092f565b8787036040518059106109ba5750595b908082528060200260200182016040525b5093508790505b86811015610a11578281815181106109e657fe5b9060200190602002015184898303815181106109fe57fe5b602090810290910101525b6001016109d2565b5b505050949350505050565b610a25610c00565b610a2d610c00565b600080548190604051805910610a405750595b908082528060200260200182016040525b50925060009150600090505b600054811015610b235760008581526003602052604081208154909190819084908110610a8657fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610b1a576000805482908110610acf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110610afb57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b600101610a5d565b81604051805910610b315750595b908082528060200260200182016040525b509350600090505b8181101561079157828181518110610b5e57fe5b90602001906020020151848281518110610b7457fe5b600160a060020a039092166020928302909101909101525b600101610b4a565b5b505050919050565b60045481565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b5050509392505050565b60206040519081016040526000815290565b602060405190810160405260008152905600a165627a7a723058205f9067556e9c3090e70abee6b5c474ddf7236e257a45355efc079c90d5a5829e002900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000ce93832b0c878d21ee78cbe27ad3e6574bba7a00000000000000000000000000c58c654b91b3de2b23d24b12534759d72fed39
Deployed Bytecode
0x606060405236156100ee5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461011a578063273cbaa01461014c5780633411c81c146101b35780634f383934146101e95780634f64b2be1461023a578063523fba7f1461026c578063547415251461029d57806358e2cd76146102cc578063784547a7146102ed5780638b51d13f146103175780639ace38c21461033f578063a0e67e2b146103fe578063a8abe69a14610465578063b5dc40c3146104dc578063b77bf60014610546578063c01a8c841461056b578063c642747414610583575b5b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050005b341561012557600080fd5b610130600435610651565b604051600160a060020a03909116815260200160405180910390f35b341561015757600080fd5b61015f610683565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b34156101be57600080fd5b6101d5600435600160a060020a03602435166106ec565b604051901515815260200160405180910390f35b34156101f457600080fd5b61023860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506100ee95505050505050565b005b341561024557600080fd5b610130600435610738565b604051600160a060020a03909116815260200160405180910390f35b341561027757600080fd5b61028b600160a060020a036004351661076a565b60405190815260200160405180910390f35b34156102a857600080fd5b61028b6004351515602435151561076a565b60405190815260200160405180910390f35b34156102d757600080fd5b610238600160a060020a03600435166100ee565b005b34156102f857600080fd5b6101d560043561076a565b604051901515815260200160405180910390f35b341561032257600080fd5b61028b60043561076a565b60405190815260200160405180910390f35b341561034a57600080fd5b610355600435610853565b604051600160a060020a03851681526020810184905281151560608201526080604082018181528454600260001961010060018416150201909116049183018290529060a0830190859080156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b50509550505050505060405180910390f35b341561040957600080fd5b61015f610886565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b341561047057600080fd5b61015f600435602435604435151560643515156108ef565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b34156104e757600080fd5b61015f600435610a1d565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561019f5780820151818401525b602001610186565b505050509050019250505060405180910390f35b341561055157600080fd5b61028b610b9d565b60405190815260200160405180910390f35b341561057657600080fd5b6102386004356100ee565b005b341561058e57600080fd5b61028b60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061076a95505050505050565b60405190815260200160405180910390f35b600060405190508181016040525b919050565b600073c0ffeee61948d8993864a73a099c0e38d887d3f48161062f60206105fa565b92506020838587856127105a03f4159050801561064857fe5b5b505092915050565b600080548290811061065f57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b61068b610c00565b60018054806020026020016040519081016040528092919081815260200182805480156106e157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116106c3575b505050505090505b90565b600360209081526000928352604080842090915290825290205460ff1681565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b600180548290811061065f57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505092915050565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b505050919050565b6002602081905260009182526040909120805460018201546003830154600160a060020a03909216939092019060ff1684565b61088e610c00565b60008054806020026020016040519081016040528092919081815260200182805480156106e157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116106c3575b505050505090505b90565b6108f7610c00565b6108ff610c00565b6000806004546040518059106109125750595b908082528060200260200182016040525b50925060009150600090505b6004548110156109aa57858015610958575060008181526002602052604090206003015460ff16155b8061097c575084801561097c575060008181526002602052604090206003015460ff165b5b156109a1578083838151811061098f57fe5b60209081029091010152600191909101905b5b60010161092f565b8787036040518059106109ba5750595b908082528060200260200182016040525b5093508790505b86811015610a11578281815181106109e657fe5b9060200190602002015184898303815181106109fe57fe5b602090810290910101525b6001016109d2565b5b505050949350505050565b610a25610c00565b610a2d610c00565b600080548190604051805910610a405750595b908082528060200260200182016040525b50925060009150600090505b600054811015610b235760008581526003602052604081208154909190819084908110610a8657fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610b1a576000805482908110610acf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110610afb57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b600101610a5d565b81604051805910610b315750595b908082528060200260200182016040525b509350600090505b8181101561079157828181518110610b5e57fe5b90602001906020020151848281518110610b7457fe5b600160a060020a039092166020928302909101909101525b600101610b4a565b5b505050919050565b60045481565b366000806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b50505050565b60003681806100fc836105fa565b9150826000833761010d828461060d565b90505b602081f35b5050509392505050565b60206040519081016040526000815290565b602060405190810160405260008152905600a165627a7a723058205f9067556e9c3090e70abee6b5c474ddf7236e257a45355efc079c90d5a5829e0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000ce93832b0c878d21ee78cbe27ad3e6574bba7a00000000000000000000000000c58c654b91b3de2b23d24b12534759d72fed39
-----Decoded View---------------
Arg [0] : _owners (address[]): 0x00cE93832b0c878d21Ee78CbE27AD3E6574bba7A,0x00c58C654b91B3De2b23D24b12534759D72FEd39
Arg [1] : _required (uint256): 2
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 00000000000000000000000000ce93832b0c878d21ee78cbe27ad3e6574bba7a
Arg [4] : 00000000000000000000000000c58c654b91b3de2b23d24b12534759d72fed39
Swarm Source
bzzr://5f9067556e9c3090e70abee6b5c474ddf7236e257a45355efc079c90d5a5829e
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 ]
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.