ETH Price: $2,349.03 (+5.05%)

Contract

0xD403cC1e2dA3aa7d954E0Ad34beF2df2B9A9f238
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Do Distribution48873582018-01-10 21:48:162987 days ago1515620896IN
0xD403cC1e...2B9A9f238
0 ETH0.0016068831.00000001
Handle Tokens Re...48839932018-01-10 6:59:272987 days ago1515567567IN
0xD403cC1e...2B9A9f238
0 ETH0.0007735822.00000001

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Distribution

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-01-10
*/

pragma solidity ^0.4.18;

interface ERC20 {
    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
}

library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    require(c / a == b);
    return c;
  }
}


contract Distribution {
  using SafeMath for uint256;

  enum State {
    AwaitingTokens,
    DistributingNormally,
    DistributingProRata,
    Done
  }
 
  address admin;
  ERC20 tokenContract;
  State state;
  uint256 actualTotalTokens;
  uint256 tokensTransferred;

  bytes32[] contributionHashes;
  uint256 expectedTotalTokens;

  function Distribution(address _admin, ERC20 _tokenContract,
                        bytes32[] _contributionHashes, uint256 _expectedTotalTokens) public {
    expectedTotalTokens = _expectedTotalTokens;
    contributionHashes = _contributionHashes;
    tokenContract = _tokenContract;
    admin = _admin;

    state = State.AwaitingTokens;
  }

  function handleTokensReceived() public {
    require(state == State.AwaitingTokens);
    uint256 totalTokens = tokenContract.balanceOf(this);
    require(totalTokens > 0);

    tokensTransferred = 0;
    if (totalTokens == expectedTotalTokens) {
      state = State.DistributingNormally;
    } else {
      actualTotalTokens = totalTokens;
      state = State.DistributingProRata;
    }
  }

  function _numTokensForContributor(uint256 contributorExpectedTokens, State _state)
      internal view returns (uint256) {
    if (_state == State.DistributingNormally) {
      return contributorExpectedTokens;
    } else if (_state == State.DistributingProRata) {
      uint256 tokensRemaining = actualTotalTokens - tokensTransferred;
      uint256 tokens = actualTotalTokens.mul(contributorExpectedTokens) / expectedTotalTokens;

      // Handle roundoff on last contributor.
      if (tokens < tokensRemaining) {
        return tokens;
      } else {
        return tokensRemaining;
      }
    } else {
      revert();
    }
  }

  function doDistribution(uint256 contributorIndex, address contributor,
                          uint256 contributorExpectedTokens)
      public {
    require(contributionHashes[contributorIndex] == keccak256(contributor, contributorExpectedTokens));

    uint256 numTokens = _numTokensForContributor(contributorExpectedTokens, state);
    contributionHashes[contributorIndex] = 0x00000000000000000000000000000000;
    tokensTransferred += numTokens;
    if (tokensTransferred == actualTotalTokens) {
      state = State.Done;
    }

    require(tokenContract.transfer(contributor, numTokens));
  }

  function doDistributionRange(uint256 start, address[] contributors,
                               uint256[] contributorExpectedTokens) public {
    require(contributors.length == contributorExpectedTokens.length);

    uint256 tokensTransferredThisCall = 0;
    uint256 end = start + contributors.length;
    State _state = state;
    for (uint256 i = start; i < end; ++i) {
      address contributor = contributors[i];
      uint256 expectedTokens = contributorExpectedTokens[i];
      require(contributionHashes[i] == keccak256(contributor, expectedTokens));
      contributionHashes[i] = 0x00000000000000000000000000000000;

      uint256 numTokens = _numTokensForContributor(expectedTokens, _state);
      tokensTransferredThisCall += numTokens;
      require(tokenContract.transfer(contributor, numTokens));
    }

    tokensTransferred += tokensTransferredThisCall;
    if (tokensTransferred == actualTotalTokens) {
      state = State.Done;
    }
  }

  function numTokensForContributor(uint256 contributorExpectedTokens)
      public view returns (uint256) {
    return _numTokensForContributor(contributorExpectedTokens, state);
  }

  function temporaryEscapeHatch(address to, uint256 value, bytes data) public {
    require(msg.sender == admin);
    require(to.call.value(value)(data));
  }

  function temporaryKill(address to) public {
    require(msg.sender == admin);
    require(tokenContract.balanceOf(this) == 0);
    selfdestruct(to);
  }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"start","type":"uint256"},{"name":"contributors","type":"address[]"},{"name":"contributorExpectedTokens","type":"uint256[]"}],"name":"doDistributionRange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"contributorExpectedTokens","type":"uint256"}],"name":"numTokensForContributor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"temporaryEscapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"temporaryKill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"contributorIndex","type":"uint256"},{"name":"contributor","type":"address"},{"name":"contributorExpectedTokens","type":"uint256"}],"name":"doDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"handleTokensReceived","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_admin","type":"address"},{"name":"_tokenContract","type":"address"},{"name":"_contributionHashes","type":"bytes32[]"},{"name":"_expectedTotalTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

6060604052341561000f57600080fd5b60405161099a38038061099a833981016040528080519190602001805191906020018051820191906020018051600581905591506004905082805161005892916020019061009c565b50506001805460008054600160a060020a0319908116600160a060020a039788161790915560a060020a60ff02199116939094169290921792909216905550610106565b8280548282559060005260206000209081019282156100d9579160200282015b828111156100d957825182556020909201916001909101906100bc565b506100e59291506100e9565b5090565b61010391905b808211156100e557600081556001016100ef565b90565b610885806101156000396000f30060606040526004361061005e5763ffffffff60e060020a6000350416634a0a7f2d811461006357806360808037146100f95780637832bbf714610121578063c3d68a8514610186578063c45849c2146101a5578063de7383e0146101ca575b600080fd5b341561006e57600080fd5b6100f760048035906044602480359081019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506101dd95505050505050565b005b341561010457600080fd5b61010f6004356103b7565b60405190815260200160405180910390f35b341561012c57600080fd5b6100f760048035600160a060020a03169060248035919060649060443590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506103d895505050505050565b341561019157600080fd5b6100f7600160a060020a036004351661047f565b34156101b057600080fd5b6100f7600435600160a060020a0360243516604435610524565b34156101d557600080fd5b6100f7610689565b600080600080600080600087518951146101f657600080fd5b600096508851600154908b01965060a060020a900460ff1694508993505b858410156103625788848151811061022857fe5b90602001906020020151925087848151811061024057fe5b9060200190602002015191508282604051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020600480548690811061028d57fe5b600091825260209091200154146102a357600080fd5b6004805460009190869081106102b557fe5b6000918252602090912001556102cb82866107a6565b60015497810197909150600160a060020a031663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033157600080fd5b6102c65a03f1151561034257600080fd5b50505060405180519050151561035757600080fd5b836001019350610214565b6003805488019081905560025414156103ab576001805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001790555b50505050505050505050565b60006103d282600160149054906101000a900460ff166107a6565b92915050565b60005433600160a060020a039081169116146103f357600080fd5b82600160a060020a0316828260405180828051906020019080838360005b83811015610429578082015183820152602001610411565b50505050905090810190601f1680156104565780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f192505050151561047a57600080fd5b505050565b60005433600160a060020a0390811691161461049a57600080fd5b600154600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156104f357600080fd5b6102c65a03f1151561050457600080fd5b505050604051805115905061051857600080fd5b80600160a060020a0316ff5b60008282604051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020600480548690811061056757fe5b6000918252602090912001541461057d57600080fd5b60015461059590839060a060020a900460ff166107a6565b60048054919250600091869081106105a957fe5b6000918252602090912001556003805482019081905560025414156105fe576001805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001790555b600154600160a060020a031663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065d57600080fd5b6102c65a03f1151561066e57600080fd5b50505060405180519050151561068357600080fd5b50505050565b60008060015460a060020a900460ff1660038111156106a457fe5b146106ae57600080fd5b600154600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561070757600080fd5b6102c65a03f1151561071857600080fd5b50505060405180519150506000811161073057600080fd5b6000600355600554811415610768576001805474ff0000000000000000000000000000000000000000191660a060020a1790556107a3565b60028190556001805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790555b50565b6000808060018460038111156107b857fe5b14156107c657849250610818565b60028460038111156107d457fe5b141561005e5760035460025460055491810393506107f8908763ffffffff61082016565b81151561080157fe5b0490508181101561081457809250610818565b8192505b505092915050565b6000808315156108335760009150610852565b5082820282848281151561084357fe5b041461084e57600080fd5b8091505b50929150505600a165627a7a72305820df50b619dba81d72314fd495ad0a55ce3179d0a34c561f0ab2b7098edadb3700002900000000000000000000000008ab0a7de69635082663a4450f1247b381dc6030000000000000000000000000558ec3152e2eb2174905cd19aea4e34a23de9ad60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000d581222e5e0259a20000000000000000000000000000000000000000000000000000000000000001283df079e7acca5514f1a7c39c018084a5fceed7813f7a21418e2f88b8042875

Deployed Bytecode

0x60606040526004361061005e5763ffffffff60e060020a6000350416634a0a7f2d811461006357806360808037146100f95780637832bbf714610121578063c3d68a8514610186578063c45849c2146101a5578063de7383e0146101ca575b600080fd5b341561006e57600080fd5b6100f760048035906044602480359081019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506101dd95505050505050565b005b341561010457600080fd5b61010f6004356103b7565b60405190815260200160405180910390f35b341561012c57600080fd5b6100f760048035600160a060020a03169060248035919060649060443590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506103d895505050505050565b341561019157600080fd5b6100f7600160a060020a036004351661047f565b34156101b057600080fd5b6100f7600435600160a060020a0360243516604435610524565b34156101d557600080fd5b6100f7610689565b600080600080600080600087518951146101f657600080fd5b600096508851600154908b01965060a060020a900460ff1694508993505b858410156103625788848151811061022857fe5b90602001906020020151925087848151811061024057fe5b9060200190602002015191508282604051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020600480548690811061028d57fe5b600091825260209091200154146102a357600080fd5b6004805460009190869081106102b557fe5b6000918252602090912001556102cb82866107a6565b60015497810197909150600160a060020a031663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033157600080fd5b6102c65a03f1151561034257600080fd5b50505060405180519050151561035757600080fd5b836001019350610214565b6003805488019081905560025414156103ab576001805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001790555b50505050505050505050565b60006103d282600160149054906101000a900460ff166107a6565b92915050565b60005433600160a060020a039081169116146103f357600080fd5b82600160a060020a0316828260405180828051906020019080838360005b83811015610429578082015183820152602001610411565b50505050905090810190601f1680156104565780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f192505050151561047a57600080fd5b505050565b60005433600160a060020a0390811691161461049a57600080fd5b600154600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156104f357600080fd5b6102c65a03f1151561050457600080fd5b505050604051805115905061051857600080fd5b80600160a060020a0316ff5b60008282604051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020600480548690811061056757fe5b6000918252602090912001541461057d57600080fd5b60015461059590839060a060020a900460ff166107a6565b60048054919250600091869081106105a957fe5b6000918252602090912001556003805482019081905560025414156105fe576001805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001790555b600154600160a060020a031663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065d57600080fd5b6102c65a03f1151561066e57600080fd5b50505060405180519050151561068357600080fd5b50505050565b60008060015460a060020a900460ff1660038111156106a457fe5b146106ae57600080fd5b600154600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561070757600080fd5b6102c65a03f1151561071857600080fd5b50505060405180519150506000811161073057600080fd5b6000600355600554811415610768576001805474ff0000000000000000000000000000000000000000191660a060020a1790556107a3565b60028190556001805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790555b50565b6000808060018460038111156107b857fe5b14156107c657849250610818565b60028460038111156107d457fe5b141561005e5760035460025460055491810393506107f8908763ffffffff61082016565b81151561080157fe5b0490508181101561081457809250610818565b8192505b505092915050565b6000808315156108335760009150610852565b5082820282848281151561084357fe5b041461084e57600080fd5b8091505b50929150505600a165627a7a72305820df50b619dba81d72314fd495ad0a55ce3179d0a34c561f0ab2b7098edadb37000029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000008ab0a7de69635082663a4450f1247b381dc6030000000000000000000000000558ec3152e2eb2174905cd19aea4e34a23de9ad60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000d581222e5e0259a20000000000000000000000000000000000000000000000000000000000000001283df079e7acca5514f1a7c39c018084a5fceed7813f7a21418e2f88b8042875

-----Decoded View---------------
Arg [0] : _admin (address): 0x08ab0a7DE69635082663A4450f1247B381DC6030
Arg [1] : _tokenContract (address): 0x558EC3152e2eb2174905cd19AeA4e34A23DE9aD6
Arg [2] : _contributionHashes (bytes32[]): System.Byte[]
Arg [3] : _expectedTotalTokens (uint256): 15384615384615377314

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000008ab0a7de69635082663a4450f1247b381dc6030
Arg [1] : 000000000000000000000000558ec3152e2eb2174905cd19aea4e34a23de9ad6
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 000000000000000000000000000000000000000000000000d581222e5e0259a2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 283df079e7acca5514f1a7c39c018084a5fceed7813f7a21418e2f88b8042875


Swarm Source

bzzr://df50b619dba81d72314fd495ad0a55ce3179d0a34c561f0ab2b7098edadb3700

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.