Contract Overview |  Musiconomi_MultiSig
Balance: 16,475.534165330527033716 Ether
Ether Value: $1,992,386.35 (@ $120.93/ETH)
Transactions: 100 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0x00d74c25bbf93df8b2a41d82b0076843b4db0349at txn 0x71e0fa7a5e279721920e0951bbc328427db6d52737d3addca495460defa63783
Token Balance:
 Latest 25 transactions from a total of 100 transactions

TxHash Age From To Value [TxFee]
0x60f2f5ee2389d83180be9d98a2669260cf81f98766601085de7ca2e6923c07ac437 days 6 hrs ago0x0050535ebb0c2adc93578e363aaa97f43eb38f76  IN   Musiconomi_MultiSig0 Ether0.000119475
0xe594c37642a5ed956bcc7623358f0340b5102e660ef139d75606dfeba0a0a2d3437 days 6 hrs ago0x0050535ebb0c2adc93578e363aaa97f43eb38f76  IN   Musiconomi_MultiSig0 Ether0.000121745
0x651824db0a202a7678ed64725b4c9f4fb3832f96b71c26a0286258607dd000d4437 days 6 hrs ago0x0050535ebb0c2adc93578e363aaa97f43eb38f76  IN   Musiconomi_MultiSig0 Ether0.000120465
0x2973426b39dcc8bc89f5457e4307ef356ec5620488841be61023ac2858f3dee9437 days 7 hrs ago0x0050535ebb0c2adc93578e363aaa97f43eb38f76  IN   Musiconomi_MultiSig0 Ether0.000122795
0xabea872fd255ec25559665b5c771de1462bfcb0f6a30ba43b7c10db895c3cb45437 days 8 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.00029778
0xb986dd2a282b151ad7c0b3f8299618a96ce3fb441448670a86bcadca645ccd91437 days 12 hrs ago0xc86f0c6a8c71247dfb2865a6e007102ef3d7a7d2  IN   Musiconomi_MultiSig0 Ether0.000025071
0xffadeb522c2c3646b32ced5a89a1a2bab3afa0533390a2d3b3b1f7b537db4644437 days 12 hrs ago0xc86f0c6a8c71247dfb2865a6e007102ef3d7a7d2  IN   Musiconomi_MultiSig0 Ether0.000024623
0xdad830626288c2308afa08e94c4223db196c4ad26dd340c13fa84b1148315b11438 days 6 hrs ago0xae7168deb525862f4fee37d987a971b385b96952  IN   Musiconomi_MultiSig0 Ether0.00025007
0x4c082a583ee9c0babd2b227fc3c0613426f112036f35db3de9e874a3e84a99b9458 days 8 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000809046
0x0f6fc3e8619f7024a2e92f9970f63a56c7a093895cdf4395c036eb3d26298c2c459 days 7 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000809046
0xb27141e4ae1e39ceea2508309389f31fcb1a0f1efccd884d59aa89a1d662b7da459 days 7 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.002122896
0x04ffb7b6bf2963c681f0c1d43d0011c07eae8eb9d9410f4c4cc3a5760f3d528a459 days 7 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.002122128
0x7fd7b3d5d7aa762ad063d13cf62f9f41721420b44c7ba93a89bdc737973ed043459 days 16 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.000462312
0xb4122500085db77b9168ce9f5b9618aba7fa0573e62f646a1cd3e1b94f0b5ea0459 days 17 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.000461928
0x3904d065171318011e7b9fcce290b218cb92243c1ea802b4a12394e992dbfb90459 days 18 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.000462312
0x24f6b7039408004f558842d30d905c1337855bbe397c2728505293f896e5c07f459 days 18 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.000462312
0x6cf6cda52163c68a70d110536d27314a511f9e44f8a72b8110f29d273666afc1459 days 18 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.003713724
0x31288db83d48a5448f5f4d749455357bd144bc55d545cb93d6cedfd332f7e98f459 days 18 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.003713724
0x969f1e4e3112f25d66ca225170264e7991bc8985caf5d6766af5268f78ec11d2459 days 18 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.003715068
0xf53bdddd800379577976e2058da9bdb760fa6d250b0390f3caa42fb87f8f389d459 days 18 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.003715068
0xc73594ac7f0ced56bc0d83617950f870d98e367bf7d46e479de19b0863ea0d33459 days 19 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000809046
0x3361b7399a5ecb0def706cab0e897eb4e447dc4a1536fc2ad6c5aeabd0c245f1459 days 19 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000808374
0x8ed8719e3b43e6c2af2714d01f96e8d6df2e949b52d15879b268fd1d4dd342f0459 days 19 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000809046
0xb3d4891a232461367799b55bae366c692c35332b150714df00c989abb8d263d2459 days 19 hrs ago0x21cfb1c9dbc6f144a90555977f224df9c671f1c7  IN   Musiconomi_MultiSig0 Ether0.000809046
0x514189fc792b0e2fd127f33b9aafbb24d35438354c4de13b826b5f3f4d68887b459 days 21 hrs ago0x75f6f22cf096ed6b79722db74d1f0b059cb66789  IN   Musiconomi_MultiSig0 Ether0.002122128
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x4c082a583ee9c0babd2b227fc3c0613426f112036f35db3de9e874a3e84a99b94377345458 days 8 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x3028bad432adad50f7d61c9ee89446bff7f3436422.25519288 Ether
0x0f6fc3e8619f7024a2e92f9970f63a56c7a093895cdf4395c036eb3d26298c2c4371635459 days 7 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x0b769f84492fb8ac2b27e23ad2989670f5bfb4fa2.37388724 Ether
0x7fd7b3d5d7aa762ad063d13cf62f9f41721420b44c7ba93a89bdc737973ed0434370009459 days 16 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6ba2aba098514e86cfdf8a77febc0487b92b0e173.857566766 Ether
0xb4122500085db77b9168ce9f5b9618aba7fa0573e62f646a1cd3e1b94f0b5ea04369891459 days 17 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x21cfb1c9dbc6f144a90555977f224df9c671f1c716.33827893 Ether
0x3904d065171318011e7b9fcce290b218cb92243c1ea802b4a12394e992dbfb904369863459 days 18 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x75f6f22cf096ed6b79722db74d1f0b059cb6678920.65281899 Ether
0x24f6b7039408004f558842d30d905c1337855bbe397c2728505293f896e5c07f4369852459 days 18 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6caf46378927e025936ee91768e919fc2da1e2c6186.1335312 Ether
0xc73594ac7f0ced56bc0d83617950f870d98e367bf7d46e479de19b0863ea0d334369713459 days 19 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x75f6f22cf096ed6b79722db74d1f0b059cb6678924.72 Ether
0x3361b7399a5ecb0def706cab0e897eb4e447dc4a1536fc2ad6c5aeabd0c245f14369707459 days 19 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x21cfb1c9dbc6f144a90555977f224df9c671f1c724.72 Ether
0x8ed8719e3b43e6c2af2714d01f96e8d6df2e949b52d15879b268fd1d4dd342f04369706459 days 19 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6ba2aba098514e86cfdf8a77febc0487b92b0e1724.72 Ether
0xb3d4891a232461367799b55bae366c692c35332b150714df00c989abb8d263d24369696459 days 19 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6caf46378927e025936ee91768e919fc2da1e2c624.72 Ether
0x1fc0a786cc4540e8dfea466c930543e432ed4f130164399dc006608d984a7d764301586483 days 10 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x21cfb1c9dbc6f144a90555977f224df9c671f1c783 Ether
0xeb515b2a482ba9c8ec388fedae07ebc293dee481a7ac2b50b2a35b5cc1df32ce4260086495 days 1 hr ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6ba2aba098514e86cfdf8a77febc0487b92b0e17168 Ether
0x780dec74e9832431b97417b51faadc3b2641d773ca60491ed95df9d6b34530bd4248127498 days 9 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x3028bad432adad50f7d61c9ee89446bff7f343644 Ether
0x8c5f38d1ba4473a598788f4c60a2a5dcf0fed75c8127bc563e66244cec7110084248122498 days 9 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x0b769f84492fb8ac2b27e23ad2989670f5bfb4fa4 Ether
0x5f092fee9d95253fc1240b887e5f20f823067d31507db9fea4291d5a4962c4cf4225236504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x75f6f22cf096ed6b79722db74d1f0b059cb66789103.7 Ether
0x0894b2c203537b439641c2e4ae82561a8dcb2c3eecca7665207d080cc7a0671b4225231504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x21cfb1c9dbc6f144a90555977f224df9c671f1c7104.1 Ether
0x5f8b22144855ad4bea00bc2a6ecf27a0d4ab41e2e829cc896af26a1bf87085524225215504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250xafbca17e980638a59c5654eaa9c9dbc757a74153110.7 Ether
0x801f1af3735389226e6b8d5e5c3f100408823ef14c552509aa4c0c3a3c3c8a8b4225204504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x21cfb1c9dbc6f144a90555977f224df9c671f1c7104 wei
0x031d0ef395e4874626fbbb40c44323ccaae5357685a12763340ca043a77d81894225164504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6caf46378927e025936ee91768e919fc2da1e2c6122 Ether
0xbf5d6c6ed49e49683785c23c13c843642a1978979549ede4270c34339ec3e6324225131504 days 21 hrs ago0xc7cd9d874f93f2409f39a95987b3e3c7383139250x6ba2aba098514e86cfdf8a77febc0487b92b0e17122.5 Ether
0x6cbe556d3f0f8b6fb5dd061e57c488ed1b9c4a1d699978a4a2a684b644ecdea34224770505 days 12 mins ago0xb9e0fc2a1c9d567af555e07e72f27e686f2c68720xc7cd9d874f93f2409f39a95987b3e3c7383139252,840.402194886444781333 Ether
0xc22fb7141735cb6fc86d9fbc99fd776ee04a3ca9eed4ed53a1576670acb4e9264223406505 days 9 hrs ago0xb9e0fc2a1c9d567af555e07e72f27e686f2c68720xc7cd9d874f93f2409f39a95987b3e3c7383139251,475.81993783052422 Ether
0x2f0cb81837992f2460f9aad2e6f8719a70d4b7f9545ed8ead0058f5d3c3b41644222408505 days 16 hrs ago0xb9e0fc2a1c9d567af555e07e72f27e686f2c68720xc7cd9d874f93f2409f39a95987b3e3c738313925868.961390308690373096 Ether
0x91a82bf13553de0d5103e29503d1a44c5e2078a7efd581f14ed548e56222aece4221047506 days 1 hr ago0xb9e0fc2a1c9d567af555e07e72f27e686f2c68720xc7cd9d874f93f2409f39a95987b3e3c738313925651.25131302679777 Ether
0xec9b58a8b0d7739fb6cf46ee603f05fe79336c57744f4d0a35be0bc64d8dfd8d4220855506 days 3 hrs ago0xb9e0fc2a1c9d567af555e07e72f27e686f2c68720xc7cd9d874f93f2409f39a95987b3e3c73831392511,811.565163947542855571 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity), ConstantOptimizerSubtraction (low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Similar Match)
Note: Displaying Similar Match Verified Source Code At Contract 0xC16ba0Bf101682e0E7fcBD0B7BC160A8E2E59471(Excluding Constructor Arguments if any)
Contract Name: Wallet
Compiler Text: v0.4.10+commit.f0d539ae
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

//sol Wallet
// Multi-sig, daily-limited account proxy/wallet.
// @authors:
// Gav Wood <[email protected]>
// inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a
// single, or, crucially, each of a number of, designated owners.
// usage:
// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by
// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the
// interior is executed.

pragma solidity ^0.4.9;

contract WalletEvents {
  // EVENTS

  // this contract only has six types of events: it can accept a confirmation, in which case
  // we record owner and operation (hash) alongside it.
  event Confirmation(address owner, bytes32 operation);
  event Revoke(address owner, bytes32 operation);

  // some others are in the case of an owner changing.
  event OwnerChanged(address oldOwner, address newOwner);
  event OwnerAdded(address newOwner);
  event OwnerRemoved(address oldOwner);

  // the last one is emitted if the required signatures change
  event RequirementChanged(uint newRequirement);

  // Funds has arrived into the wallet (record how much).
  event Deposit(address _from, uint value);
  // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
  event SingleTransact(address owner, uint value, address to, bytes data, address created);
  // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
  event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data, address created);
  // Confirmation still needed for a transaction.
  event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
}

contract WalletAbi {
  // Revokes a prior confirmation of the given operation
  function revoke(bytes32 _operation) external;

  // Replaces an owner `_from` with another `_to`.
  function changeOwner(address _from, address _to) external;

  function addOwner(address _owner) external;

  function removeOwner(address _owner) external;

  function changeRequirement(uint _newRequired) external;

  function isOwner(address _addr) constant returns (bool);

  function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool);

  // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
  function setDailyLimit(uint _newLimit) external;

  function execute(address _to, uint _value, bytes _data) external returns (bytes32 o_hash);
  function confirm(bytes32 _h) returns (bool o_success);
}

contract WalletLibrary is WalletEvents {
  // TYPES

  // struct for the status of a pending operation.
  struct PendingState {
    uint yetNeeded;
    uint ownersDone;
    uint index;
  }

  // Transaction structure to remember details of transaction lest it need be saved for a later call.
  struct Transaction {
    address to;
    uint value;
    bytes data;
  }

  // MODIFIERS

  // simple single-sig function modifier.
  modifier onlyowner {
    if (isOwner(msg.sender))
      _;
  }
  // multi-sig function modifier: the operation must have an intrinsic hash in order
  // that later attempts can be realised as the same underlying operation and
  // thus count as confirmations.
  modifier onlymanyowners(bytes32 _operation) {
    if (confirmAndCheck(_operation))
      _;
  }

  // METHODS

  // gets called when no other function matches
  function() payable {
    // just being sent some cash?
    if (msg.value > 0)
      Deposit(msg.sender, msg.value);
  }

  // constructor is given number of sigs required to do protected "onlymanyowners" transactions
  // as well as the selection of addresses capable of confirming them.
  function initMultiowned(address[] _owners, uint _required) only_uninitialized {
    m_numOwners = _owners.length + 1;
    m_owners[1] = uint(msg.sender);
    m_ownerIndex[uint(msg.sender)] = 1;
    for (uint i = 0; i < _owners.length; ++i)
    {
      m_owners[2 + i] = uint(_owners[i]);
      m_ownerIndex[uint(_owners[i])] = 2 + i;
    }
    m_required = _required;
  }

  // Revokes a prior confirmation of the given operation
  function revoke(bytes32 _operation) external {
    uint ownerIndex = m_ownerIndex[uint(msg.sender)];
    // make sure they're an owner
    if (ownerIndex == 0) return;
    uint ownerIndexBit = 2**ownerIndex;
    var pending = m_pending[_operation];
    if (pending.ownersDone & ownerIndexBit > 0) {
      pending.yetNeeded++;
      pending.ownersDone -= ownerIndexBit;
      Revoke(msg.sender, _operation);
    }
  }

  // Replaces an owner `_from` with another `_to`.
  function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external {
    if (isOwner(_to)) return;
    uint ownerIndex = m_ownerIndex[uint(_from)];
    if (ownerIndex == 0) return;

    clearPending();
    m_owners[ownerIndex] = uint(_to);
    m_ownerIndex[uint(_from)] = 0;
    m_ownerIndex[uint(_to)] = ownerIndex;
    OwnerChanged(_from, _to);
  }

  function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
    if (isOwner(_owner)) return;

    clearPending();
    if (m_numOwners >= c_maxOwners)
      reorganizeOwners();
    if (m_numOwners >= c_maxOwners)
      return;
    m_numOwners++;
    m_owners[m_numOwners] = uint(_owner);
    m_ownerIndex[uint(_owner)] = m_numOwners;
    OwnerAdded(_owner);
  }

  function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
    uint ownerIndex = m_ownerIndex[uint(_owner)];
    if (ownerIndex == 0) return;
    if (m_required > m_numOwners - 1) return;

    m_owners[ownerIndex] = 0;
    m_ownerIndex[uint(_owner)] = 0;
    clearPending();
    reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
    OwnerRemoved(_owner);
  }

  function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external {
    if (_newRequired > m_numOwners) return;
    m_required = _newRequired;
    clearPending();
    RequirementChanged(_newRequired);
  }

  // Gets an owner by 0-indexed position (using numOwners as the count)
  function getOwner(uint ownerIndex) external constant returns (address) {
    return address(m_owners[ownerIndex + 1]);
  }

  function isOwner(address _addr) constant returns (bool) {
    return m_ownerIndex[uint(_addr)] > 0;
  }

  function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) {
    var pending = m_pending[_operation];
    uint ownerIndex = m_ownerIndex[uint(_owner)];

    // make sure they're an owner
    if (ownerIndex == 0) return false;

    // determine the bit to set for this owner.
    uint ownerIndexBit = 2**ownerIndex;
    return !(pending.ownersDone & ownerIndexBit == 0);
  }

  // constructor - stores initial daily limit and records the present day's index.
  function initDaylimit(uint _limit) only_uninitialized {
    m_dailyLimit = _limit;
    m_lastDay = today();
  }
  // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
  function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external {
    m_dailyLimit = _newLimit;
  }
  // resets the amount already spent today. needs many of the owners to confirm.
  function resetSpentToday() onlymanyowners(sha3(msg.data)) external {
    m_spentToday = 0;
  }

  // throw unless the contract is not yet initialized.
  modifier only_uninitialized { if (m_numOwners > 0) throw; _; }

  // constructor - just pass on the owner array to the multiowned and
  // the limit to daylimit
  function initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized {
    initDaylimit(_daylimit);
    initMultiowned(_owners, _required);
  }

  // kills the contract sending everything to `_to`.
  function kill(address _to) onlymanyowners(sha3(msg.data)) external {
    suicide(_to);
  }

  // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
  // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
  // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
  // and _data arguments). They still get the option of using them if they want, anyways.
  function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 o_hash) {
    // first, take the opportunity to check that we're under the daily limit.
    if ((_data.length == 0 && underLimit(_value)) || m_required == 1) {
      // yes - just execute the call.
      address created;
      if (_to == 0) {
        created = create(_value, _data);
      } else {
        if (!_to.call.value(_value)(_data))
          throw;
      }
      SingleTransact(msg.sender, _value, _to, _data, created);
    } else {
      // determine our operation hash.
      o_hash = sha3(msg.data, block.number);
      // store if it's new
      if (m_txs[o_hash].to == 0 && m_txs[o_hash].value == 0 && m_txs[o_hash].data.length == 0) {
        m_txs[o_hash].to = _to;
        m_txs[o_hash].value = _value;
        m_txs[o_hash].data = _data;
      }
      if (!confirm(o_hash)) {
        ConfirmationNeeded(o_hash, msg.sender, _value, _to, _data);
      }
    }
  }

  function create(uint _value, bytes _code) internal returns (address o_addr) {
    assembly {
      o_addr := create(_value, add(_code, 0x20), mload(_code))
      jumpi(invalidJumpLabel, iszero(extcodesize(o_addr)))
    }
  }

  // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
  // to determine the body of the transaction from the hash provided.
  function confirm(bytes32 _h) onlymanyowners(_h) returns (bool o_success) {
    if (m_txs[_h].to != 0 || m_txs[_h].value != 0 || m_txs[_h].data.length != 0) {
      address created;
      if (m_txs[_h].to == 0) {
        created = create(m_txs[_h].value, m_txs[_h].data);
      } else {
        if (!m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data))
          throw;
      }

      MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data, created);
      delete m_txs[_h];
      return true;
    }
  }

  // INTERNAL METHODS

  function confirmAndCheck(bytes32 _operation) internal returns (bool) {
    // determine what index the present sender is:
    uint ownerIndex = m_ownerIndex[uint(msg.sender)];
    // make sure they're an owner
    if (ownerIndex == 0) return;

    var pending = m_pending[_operation];
    // if we're not yet working on this operation, switch over and reset the confirmation status.
    if (pending.yetNeeded == 0) {
      // reset count of confirmations needed.
      pending.yetNeeded = m_required;
      // reset which owners have confirmed (none) - set our bitmap to 0.
      pending.ownersDone = 0;
      pending.index = m_pendingIndex.length++;
      m_pendingIndex[pending.index] = _operation;
    }
    // determine the bit to set for this owner.
    uint ownerIndexBit = 2**ownerIndex;
    // make sure we (the message sender) haven't confirmed this operation previously.
    if (pending.ownersDone & ownerIndexBit == 0) {
      Confirmation(msg.sender, _operation);
      // ok - check if count is enough to go ahead.
      if (pending.yetNeeded <= 1) {
        // enough confirmations: reset and run interior.
        delete m_pendingIndex[m_pending[_operation].index];
        delete m_pending[_operation];
        return true;
      }
      else
      {
        // not enough: record that this owner in particular confirmed.
        pending.yetNeeded--;
        pending.ownersDone |= ownerIndexBit;
      }
    }
  }

  function reorganizeOwners() private {
    uint free = 1;
    while (free < m_numOwners)
    {
      while (free < m_numOwners && m_owners[free] != 0) free++;
      while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
      if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
      {
        m_owners[free] = m_owners[m_numOwners];
        m_ownerIndex[m_owners[free]] = free;
        m_owners[m_numOwners] = 0;
      }
    }
  }

  // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
  // returns true. otherwise just returns false.
  function underLimit(uint _value) internal onlyowner returns (bool) {
    // reset the spend limit if we're on a different day to last time.
    if (today() > m_lastDay) {
      m_spentToday = 0;
      m_lastDay = today();
    }
    // check to see if there's enough left - if so, subtract and return true.
    // overflow protection                    // dailyLimit check
    if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
      m_spentToday += _value;
      return true;
    }
    return false;
  }

  // determines today's index.
  function today() private constant returns (uint) { return now / 1 days; }

  function clearPending() internal {
    uint length = m_pendingIndex.length;

    for (uint i = 0; i < length; ++i) {
      delete m_txs[m_pendingIndex[i]];

      if (m_pendingIndex[i] != 0)
        delete m_pending[m_pendingIndex[i]];
    }

    delete m_pendingIndex;
  }

  // FIELDS
  address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe;

  // the number of owners that must confirm the same operation before it is run.
  uint public m_required;
  // pointer used to find a free slot in m_owners
  uint public m_numOwners;

  uint public m_dailyLimit;
  uint public m_spentToday;
  uint public m_lastDay;

  // list of owners
  uint[256] m_owners;

  uint constant c_maxOwners = 250;
  // index on the list of owners to allow reverse lookup
  mapping(uint => uint) m_ownerIndex;
  // the ongoing operations.
  mapping(bytes32 => PendingState) m_pending;
  bytes32[] m_pendingIndex;

  // pending transactions we have at present.
  mapping (bytes32 => Transaction) m_txs;
}

contract Wallet is WalletEvents {

  // WALLET CONSTRUCTOR
  //   calls the `initWallet` method of the Library in this context
  function Wallet(address[] _owners, uint _required, uint _daylimit) {
    // Signature of the Wallet Library's init function
    bytes4 sig = bytes4(sha3("initWallet(address[],uint256,uint256)"));
    address target = _walletLibrary;

    // Compute the size of the call data : arrays has 2
    // 32bytes for offset and length, plus 32bytes per element ;
    // plus 2 32bytes for each uint
    uint argarraysize = (2 + _owners.length);
    uint argsize = (2 + argarraysize) * 32;

    assembly {
      // Add the signature first to memory
      mstore(0x0, sig)
      // Add the call data, which is at the end of the
      // code
      codecopy(0x4,  sub(codesize, argsize), argsize)
      // Delegate call to the library
      delegatecall(sub(gas, 10000), target, 0x0, add(argsize, 0x4), 0x0, 0x0)
    }
  }

  // METHODS

  // gets called when no other function matches
  function() payable {
    // just being sent some cash?
    if (msg.value > 0)
      Deposit(msg.sender, msg.value);
    else if (msg.data.length > 0)
      _walletLibrary.delegatecall(msg.data);
  }

  // Gets an owner by 0-indexed position (using numOwners as the count)
  function getOwner(uint ownerIndex) constant returns (address) {
    return address(m_owners[ownerIndex + 1]);
  }

  // As return statement unavailable in fallback, explicit the method here

  function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) {
    return _walletLibrary.delegatecall(msg.data);
  }

  function isOwner(address _addr) constant returns (bool) {
    return _walletLibrary.delegatecall(msg.data);
  }

  // FIELDS
  address constant _walletLibrary = 0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4;

  // the number of owners that must confirm the same operation before it is run.
  uint public m_required;
  // pointer used to find a free slot in m_owners
  uint public m_numOwners;

  uint public m_dailyLimit;
  uint public m_spentToday;
  uint public m_lastDay;

  // list of owners
  uint[256] m_owners;
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_lastDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_spentToday","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_required","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"},{"name":"_daylimit","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052341561000c57fe5b60405161048538038061048583398101604090815281516020830151918301519201915b604080517f696e697457616c6c657428616464726573735b5d2c75696e743235362c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602080830191909152915190819003602501902084516000829052909173863df6bfa4469f3ead0be8f9f2aae51c91a907b491600281019160049182010290819038829003903960006000600483016000866127105a03f45b505050505050505b61039d806100e86000396000f300606060405236156100725763ffffffff60e060020a6000350416632f54bf6e811461012d5780634123cb6b1461015d578063523750931461017f578063659010e7146101a1578063746c9171146101c3578063c2cf7326146101e5578063c41a360a14610218578063f1736d8614610247575b61012b5b60003411156100c75760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a1610127565b60003611156101275773863df6bfa4469f3ead0be8f9f2aae51c91a907b4600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561012457fe5b50505b5b5b565b005b341561013557fe5b610149600160a060020a0360043516610269565b604080519115158252519081900360200190f35b341561016557fe5b61016d6102cd565b60408051918252519081900360200190f35b341561018757fe5b61016d6102d3565b60408051918252519081900360200190f35b34156101a957fe5b61016d6102d9565b60408051918252519081900360200190f35b34156101cb57fe5b61016d6102df565b60408051918252519081900360200190f35b34156101ed57fe5b610149600435600160a060020a03602435166102e5565b604080519115158252519081900360200190f35b341561022057fe5b61022b60043561034a565b60408051600160a060020a039092168252519081900360200190f35b341561024f57fe5b61016d61036b565b60408051918252519081900360200190f35b600073863df6bfa4469f3ead0be8f9f2aae51c91a907b4600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f415156102bf57fe5b50506040515190505b919050565b60015481565b60045481565b60035481565b60005481565b600073863df6bfa4469f3ead0be8f9f2aae51c91a907b4600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561033b57fe5b50506040515190505b92915050565b6000600560018301610100811061035d57fe5b0160005b505490505b919050565b600254815600a165627a7a72305820c20a8475c42598c198f6629bada37e1b234da85ac2c0cbac3d96089030b180400029000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000

   Swarm Source:
bzzr://c20a8475c42598c198f6629bada37e1b234da85ac2c0cbac3d96089030b18040

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.