Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Distribution
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
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.