Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 42 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Buy TDE Tokens W... | 6229149 | 2760 days ago | IN | 0 ETH | 0.00024825 | ||||
| Buy PRETDE Token... | 6229143 | 2760 days ago | IN | 0 ETH | 0.00024709 | ||||
| Finalize TDE | 6217236 | 2762 days ago | IN | 0 ETH | 0.00009005 | ||||
| Finalize PRETDE | 6217208 | 2762 days ago | IN | 0 ETH | 0.00009769 | ||||
| Transfer | 6202715 | 2764 days ago | IN | 0 ETH | 0.00004624 | ||||
| Buy PRETDE Token... | 6197609 | 2765 days ago | IN | 0 ETH | 0.00007431 | ||||
| Buy PRETDE Token... | 6188418 | 2767 days ago | IN | 0 ETH | 0.0006094 | ||||
| Buy PRETDE Token... | 6188412 | 2767 days ago | IN | 0 ETH | 0.0006094 | ||||
| Buy PRETDE Token... | 6188399 | 2767 days ago | IN | 0 ETH | 0.0006094 | ||||
| Buy PRETDE Token... | 6188393 | 2767 days ago | IN | 0 ETH | 0.0006094 | ||||
| 0x32353030 | 6173771 | 2769 days ago | IN | 5 ETH | 0.00026615 | ||||
| Transfer | 6170970 | 2769 days ago | IN | 5 ETH | 0.0003 | ||||
| Buy PRETDE Token... | 6102931 | 2781 days ago | IN | 0 ETH | 0.00036564 | ||||
| Buy PRETDE Token... | 6102919 | 2781 days ago | IN | 0 ETH | 0.00036564 | ||||
| Buy PRETDE Token... | 6102906 | 2781 days ago | IN | 0 ETH | 0.00036564 | ||||
| Buy PRETDE Token... | 6078347 | 2785 days ago | IN | 0 ETH | 0.00027545 | ||||
| Buy PRETDE Token... | 6078338 | 2785 days ago | IN | 0 ETH | 0.00027545 | ||||
| Buy PRETDE Token... | 6078277 | 2785 days ago | IN | 0 ETH | 0.00036545 | ||||
| Buy TDE Tokens W... | 6071141 | 2786 days ago | IN | 0 ETH | 0.00035798 | ||||
| Transfer | 6038464 | 2792 days ago | IN | 1.3 ETH | 0.00037735 | ||||
| Transfer | 6037018 | 2792 days ago | IN | 0.25 ETH | 0.00018867 | ||||
| Transfer | 6036880 | 2792 days ago | IN | 0.25 ETH | 0.000105 | ||||
| Transfer | 6036845 | 2792 days ago | IN | 0.25 ETH | 0.0000441 | ||||
| Transfer | 6036840 | 2792 days ago | IN | 0.25 ETH | 0.0000441 | ||||
| Transfer | 6035386 | 2792 days ago | IN | 0.3 ETH | 0.00018867 |
Latest 13 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 6173771 | 2769 days ago | 5 ETH | ||||
| Transfer | 6038464 | 2792 days ago | 1.3 ETH | ||||
| Transfer | 6037018 | 2792 days ago | 0.25 ETH | ||||
| Transfer | 6035386 | 2792 days ago | 0.3 ETH | ||||
| Transfer | 6034941 | 2792 days ago | 0.03 ETH | ||||
| Transfer | 6026339 | 2794 days ago | 0.01 ETH | ||||
| Transfer | 6026262 | 2794 days ago | 0.11378962 ETH | ||||
| Transfer | 6025553 | 2794 days ago | 0.3 ETH | ||||
| Transfer | 6024959 | 2794 days ago | 0.1486 ETH | ||||
| Transfer | 6024597 | 2794 days ago | 1 ETH | ||||
| Transfer | 6024560 | 2794 days ago | 0.33715828 ETH | ||||
| Transfer | 6024529 | 2794 days ago | 1 ETH | ||||
| Transfer | 6024527 | 2794 days ago | 1.29619812 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DNNTDE
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 2018-05-11
*/
pragma solidity ^0.4.15;
library SafeMath {
function mul(uint256 a, uint256 b) internal constant returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal constant returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal constant returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal constant returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract ERC20Basic {
uint256 public totalSupply;
function balanceOf(address who) constant returns (uint256);
function transfer(address to, uint256 value) returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value) returns (bool) {
require(_to != address(0));
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
}
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) constant returns (uint256);
function transferFrom(address from, address to, uint256 value) returns (bool);
function approve(address spender, uint256 value) returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value) returns (bool) {
require(_to != address(0));
var _allowance = allowed[_from][msg.sender];
// Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
// require (_value <= _allowance);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = _allowance.sub(_value);
Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) returns (bool) {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender, 0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
require((_value == 0) || (allowed[msg.sender][_spender] == 0));
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
/**
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
*/
function increaseApproval (address _spender, uint _addedValue)
returns (bool success) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function decreaseApproval (address _spender, uint _subtractedValue)
returns (bool success) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/// @title Token contract - Implements Standard Token Interface with DNN features.
/// @author Dondrey Taylor - <dondrey@dnn.media>
contract DNNToken is StandardToken {
using SafeMath for uint256;
////////////////////////////////////////////////////////////
// Used to indicate which allocation we issue tokens from //
////////////////////////////////////////////////////////////
enum DNNSupplyAllocations {
EarlyBackerSupplyAllocation,
PRETDESupplyAllocation,
TDESupplyAllocation,
BountySupplyAllocation,
WriterAccountSupplyAllocation,
AdvisorySupplyAllocation,
PlatformSupplyAllocation
}
/////////////////////////////////////////////////////////////////////
// Smart-Contract with permission to allocate tokens from supplies //
/////////////////////////////////////////////////////////////////////
address public allocatorAddress;
address public crowdfundContract;
/////////////////////
// Token Meta Data //
/////////////////////
string constant public name = "DNN";
string constant public symbol = "DNN";
uint8 constant public decimals = 18; // 1 DNN = 1 * 10^18 atto-DNN
/////////////////////////////////////////
// Addresses of the co-founders of DNN //
/////////////////////////////////////////
address public cofounderA;
address public cofounderB;
/////////////////////////
// Address of Platform //
/////////////////////////
address public platform;
/////////////////////////////////////////////
// Token Distributions (% of total supply) //
/////////////////////////////////////////////
uint256 public earlyBackerSupply; // 10%
uint256 public PRETDESupply; // 10%
uint256 public TDESupply; // 40%
uint256 public bountySupply; // 1%
uint256 public writerAccountSupply; // 4%
uint256 public advisorySupply; // 14%
uint256 public cofoundersSupply; // 10%
uint256 public platformSupply; // 11%
uint256 public earlyBackerSupplyRemaining; // 10%
uint256 public PRETDESupplyRemaining; // 10%
uint256 public TDESupplyRemaining; // 40%
uint256 public bountySupplyRemaining; // 1%
uint256 public writerAccountSupplyRemaining; // 4%
uint256 public advisorySupplyRemaining; // 14%
uint256 public cofoundersSupplyRemaining; // 10%
uint256 public platformSupplyRemaining; // 11%
////////////////////////////////////////////////////////////////////////////////////
// Amount of CoFounder Supply that has been distributed based on vesting schedule //
////////////////////////////////////////////////////////////////////////////////////
uint256 public cofoundersSupplyVestingTranches = 10;
uint256 public cofoundersSupplyVestingTranchesIssued = 0;
uint256 public cofoundersSupplyVestingStartDate; // Epoch
uint256 public cofoundersSupplyDistributed = 0; // # of atto-DNN distributed to founders
//////////////////////////////////////////////
// Prevents tokens from being transferrable //
//////////////////////////////////////////////
bool public tokensLocked = true;
/////////////////////////////////////////////////////////////////////////////
// Event triggered when tokens are transferred from one address to another //
/////////////////////////////////////////////////////////////////////////////
event Transfer(address indexed from, address indexed to, uint256 value);
////////////////////////////////////////////////////////////
// Checks if tokens can be issued to founder at this time //
////////////////////////////////////////////////////////////
modifier CofoundersTokensVested()
{
// Make sure that a starting vesting date has been set and 4 weeks have passed since vesting date
require (cofoundersSupplyVestingStartDate != 0 && (now-cofoundersSupplyVestingStartDate) >= 4 weeks);
// Get current tranche based on the amount of time that has passed since vesting start date
uint256 currentTranche = now.sub(cofoundersSupplyVestingStartDate) / 4 weeks;
// Amount of tranches that have been issued so far
uint256 issuedTranches = cofoundersSupplyVestingTranchesIssued;
// Amount of tranches that cofounders are entitled to
uint256 maxTranches = cofoundersSupplyVestingTranches;
// Make sure that we still have unvested tokens and that
// the tokens for the current tranche have not been issued.
require (issuedTranches != maxTranches && currentTranche > issuedTranches);
_;
}
///////////////////////////////////
// Checks if tokens are unlocked //
///////////////////////////////////
modifier TokensUnlocked()
{
require (tokensLocked == false);
_;
}
/////////////////////////////////
// Checks if tokens are locked //
/////////////////////////////////
modifier TokensLocked()
{
require (tokensLocked == true);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounders are performing the action //
////////////////////////////////////////////////////
modifier onlyCofounders()
{
require (msg.sender == cofounderA || msg.sender == cofounderB);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounder A is performing the action //
////////////////////////////////////////////////////
modifier onlyCofounderA()
{
require (msg.sender == cofounderA);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounder B is performing the action //
////////////////////////////////////////////////////
modifier onlyCofounderB()
{
require (msg.sender == cofounderB);
_;
}
//////////////////////////////////////////////////
// Checks if Allocator is performing the action //
//////////////////////////////////////////////////
modifier onlyAllocator()
{
require (msg.sender == allocatorAddress);
_;
}
///////////////////////////////////////////////////////////
// Checks if Crowdfund Contract is performing the action //
///////////////////////////////////////////////////////////
modifier onlyCrowdfundContract()
{
require (msg.sender == crowdfundContract);
_;
}
///////////////////////////////////////////////////////////////////////////////////
// Checks if Crowdfund Contract, Platform, or Allocator is performing the action //
///////////////////////////////////////////////////////////////////////////////////
modifier onlyAllocatorOrCrowdfundContractOrPlatform()
{
require (msg.sender == allocatorAddress || msg.sender == crowdfundContract || msg.sender == platform);
_;
}
///////////////////////////////////////////////////////////////////////
// @des Function to change address that is manage platform holding //
// @param newAddress Address of new issuance contract. //
///////////////////////////////////////////////////////////////////////
function changePlatform(address newAddress)
onlyCofounders
{
platform = newAddress;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// @des Function to change address that is allowed to do token issuance. Crowdfund contract can only be set once. //
// @param newAddress Address of new issuance contract. //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function changeCrowdfundContract(address newAddress)
onlyCofounders
{
crowdfundContract = newAddress;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// @des Function to change address that is allowed to do token issuance. Allocator can only be set once. //
// @param newAddress Address of new issuance contract. //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
function changeAllocator(address newAddress)
onlyCofounders
{
allocatorAddress = newAddress;
}
///////////////////////////////////////////////////////
// @des Function to change founder A address. //
// @param newAddress Address of new founder A. //
///////////////////////////////////////////////////////
function changeCofounderA(address newAddress)
onlyCofounderA
{
cofounderA = newAddress;
}
//////////////////////////////////////////////////////
// @des Function to change founder B address. //
// @param newAddress Address of new founder B. //
//////////////////////////////////////////////////////
function changeCofounderB(address newAddress)
onlyCofounderB
{
cofounderB = newAddress;
}
//////////////////////////////////////////////////////////////
// Transfers tokens from senders address to another address //
//////////////////////////////////////////////////////////////
function transfer(address _to, uint256 _value)
TokensUnlocked
returns (bool)
{
Transfer(msg.sender, _to, _value);
return BasicToken.transfer(_to, _value);
}
//////////////////////////////////////////////////////////
// Transfers tokens from one address to another address //
//////////////////////////////////////////////////////////
function transferFrom(address _from, address _to, uint256 _value)
TokensUnlocked
returns (bool)
{
Transfer(_from, _to, _value);
return StandardToken.transferFrom(_from, _to, _value);
}
///////////////////////////////////////////////////////////////////////////////////////////////
// @des Cofounders issue tokens to themsleves if within vesting period. Returns success. //
// @param beneficiary Address of receiver. //
// @param tokenCount Number of tokens to issue. //
///////////////////////////////////////////////////////////////////////////////////////////////
function issueCofoundersTokensIfPossible()
onlyCofounders
CofoundersTokensVested
returns (bool)
{
// Compute total amount of vested tokens to issue
uint256 tokenCount = cofoundersSupply.div(cofoundersSupplyVestingTranches);
// Make sure that there are cofounder tokens left
if (tokenCount > cofoundersSupplyRemaining) {
return false;
}
// Decrease cofounders supply
cofoundersSupplyRemaining = cofoundersSupplyRemaining.sub(tokenCount);
// Update how many tokens have been distributed to cofounders
cofoundersSupplyDistributed = cofoundersSupplyDistributed.add(tokenCount);
// Split tokens between both founders
balances[cofounderA] = balances[cofounderA].add(tokenCount.div(2));
balances[cofounderB] = balances[cofounderB].add(tokenCount.div(2));
// Update that a tranche has been issued
cofoundersSupplyVestingTranchesIssued += 1;
return true;
}
//////////////////
// Issue tokens //
//////////////////
function issueTokens(address beneficiary, uint256 tokenCount, DNNSupplyAllocations allocationType)
onlyAllocatorOrCrowdfundContractOrPlatform
returns (bool)
{
// We'll use the following to determine whether the allocator, platform,
// or the crowdfunding contract can allocate specified supply
bool canAllocatorPerform = msg.sender == allocatorAddress;
bool canCrowdfundContractPerform = msg.sender == crowdfundContract;
bool canPlatformPerform = msg.sender == platform;
// Early Backers
if (canAllocatorPerform && allocationType == DNNSupplyAllocations.EarlyBackerSupplyAllocation && tokenCount <= earlyBackerSupplyRemaining) {
earlyBackerSupplyRemaining = earlyBackerSupplyRemaining.sub(tokenCount);
}
// PRE-TDE
else if (canCrowdfundContractPerform && msg.sender == crowdfundContract && allocationType == DNNSupplyAllocations.PRETDESupplyAllocation) {
// Check to see if we have enough tokens to satisfy this purchase
// using just the pre-tde.
if (PRETDESupplyRemaining >= tokenCount) {
// Decrease pre-tde supply
PRETDESupplyRemaining = PRETDESupplyRemaining.sub(tokenCount);
}
// Check to see if we can satisfy this using pre-tde and tde supply combined
else if (PRETDESupplyRemaining+TDESupplyRemaining >= tokenCount) {
// Decrease tde supply
TDESupplyRemaining = TDESupplyRemaining.sub(tokenCount-PRETDESupplyRemaining);
// Decrease pre-tde supply by its' remaining tokens
PRETDESupplyRemaining = 0;
}
// Otherwise, we can't satisfy this sale because we don't have enough tokens.
else {
return false;
}
}
// TDE
else if (canCrowdfundContractPerform && allocationType == DNNSupplyAllocations.TDESupplyAllocation && tokenCount <= TDESupplyRemaining) {
TDESupplyRemaining = TDESupplyRemaining.sub(tokenCount);
}
// Bounty
else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.BountySupplyAllocation && tokenCount <= bountySupplyRemaining) {
bountySupplyRemaining = bountySupplyRemaining.sub(tokenCount);
}
// Writer Accounts
else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.WriterAccountSupplyAllocation && tokenCount <= writerAccountSupplyRemaining) {
writerAccountSupplyRemaining = writerAccountSupplyRemaining.sub(tokenCount);
}
// Advisory
else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.AdvisorySupplyAllocation && tokenCount <= advisorySupplyRemaining) {
advisorySupplyRemaining = advisorySupplyRemaining.sub(tokenCount);
}
// Platform (Also makes sure that the beneficiary is the platform address specified in this contract)
else if (canPlatformPerform && allocationType == DNNSupplyAllocations.PlatformSupplyAllocation && tokenCount <= platformSupplyRemaining) {
platformSupplyRemaining = platformSupplyRemaining.sub(tokenCount);
}
else {
return false;
}
// Transfer tokens
Transfer(address(this), beneficiary, tokenCount);
// Credit tokens to the address specified
balances[beneficiary] = balances[beneficiary].add(tokenCount);
return true;
}
/////////////////////////////////////////////////
// Transfer Unsold tokens from TDE to Platform //
/////////////////////////////////////////////////
function sendUnsoldTDETokensToPlatform()
external
onlyCrowdfundContract
{
// Make sure we have tokens to send from TDE
if (TDESupplyRemaining > 0) {
// Add remaining tde tokens to platform remaining tokens
platformSupplyRemaining = platformSupplyRemaining.add(TDESupplyRemaining);
// Clear remaining tde token count
TDESupplyRemaining = 0;
}
}
/////////////////////////////////////////////////////
// Transfer Unsold tokens from pre-TDE to Platform //
/////////////////////////////////////////////////////
function sendUnsoldPRETDETokensToTDE()
external
onlyCrowdfundContract
{
// Make sure we have tokens to send from pre-TDE
if (PRETDESupplyRemaining > 0) {
// Add remaining pre-tde tokens to tde remaining tokens
TDESupplyRemaining = TDESupplyRemaining.add(PRETDESupplyRemaining);
// Clear remaining pre-tde token count
PRETDESupplyRemaining = 0;
}
}
////////////////////////////////////////////////////////////////
// @des Allows tokens to be transferrable. Returns lock state //
////////////////////////////////////////////////////////////////
function unlockTokens()
external
onlyCrowdfundContract
{
// Make sure tokens are currently locked before proceeding to unlock them
require(tokensLocked == true);
tokensLocked = false;
}
///////////////////////////////////////////////////////////////////////
// @des Contract constructor function sets initial token balances. //
///////////////////////////////////////////////////////////////////////
function DNNToken()
{
// Start date
uint256 vestingStartDate = 1526072145;
// Set cofounder addresses
cofounderA = 0x3Cf26a9FE33C219dB87c2e50572e50803eFb2981;
cofounderB = 0x9FFE2aD5D76954C7C25be0cEE30795279c4Cab9f;
// Sets platform address
platform = address(this);
// Set total supply - 1 Billion DNN Tokens = (1,000,000,000 * 10^18) atto-DNN
// 1 DNN = 10^18 atto-DNN
totalSupply = uint256(1000000000).mul(uint256(10)**decimals);
// Set Token Distributions (% of total supply)
earlyBackerSupply = totalSupply.mul(10).div(100); // 10%
PRETDESupply = totalSupply.mul(10).div(100); // 10%
TDESupply = totalSupply.mul(40).div(100); // 40%
bountySupply = totalSupply.mul(1).div(100); // 1%
writerAccountSupply = totalSupply.mul(4).div(100); // 4%
advisorySupply = totalSupply.mul(14).div(100); // 14%
cofoundersSupply = totalSupply.mul(10).div(100); // 10%
platformSupply = totalSupply.mul(11).div(100); // 11%
// Set each remaining token count equal to its' respective supply
earlyBackerSupplyRemaining = earlyBackerSupply;
PRETDESupplyRemaining = PRETDESupply;
TDESupplyRemaining = TDESupply;
bountySupplyRemaining = bountySupply;
writerAccountSupplyRemaining = writerAccountSupply;
advisorySupplyRemaining = advisorySupply;
cofoundersSupplyRemaining = cofoundersSupply;
platformSupplyRemaining = platformSupply;
// Sets cofounder vesting start date (Ensures that it is a date in the future, otherwise it will default to now)
cofoundersSupplyVestingStartDate = vestingStartDate >= now ? vestingStartDate : now;
}
}
/// @title DNNTDE contract - Takes funds from users and issues tokens.
/// @author Dondrey Taylor - <dondrey@dnn.media>
contract DNNTDE {
using SafeMath for uint256;
/////////////////////////
// DNN Token Contract //
/////////////////////////
DNNToken public dnnToken;
//////////////////////////////////////////
// Addresses of the co-founders of DNN. //
//////////////////////////////////////////
address public cofounderA;
address public cofounderB;
///////////////////////////
// DNN Holding Multisig //
//////////////////////////
address public dnnHoldingMultisig;
///////////////////////////
// Start date of the TDE //
///////////////////////////
uint256 public TDEStartDate; // Epoch
/////////////////////////
// End date of the TDE //
/////////////////////////
uint256 public TDEEndDate; // Epoch
/////////////////////////////////
// Amount of atto-DNN per wei //
/////////////////////////////////
uint256 public tokenExchangeRateBase = 3000; // 1 Wei = 3000 atto-DNN
/////////////////////////////////////////////////
// Number of tokens distributed (in atto-DNN) //
/////////////////////////////////////////////////
uint256 public tokensDistributed = 0;
///////////////////////////////////////////////
// Minumum Contributions for pre-TDE and TDE //
///////////////////////////////////////////////
uint256 public minimumTDEContributionInWei = 0.001 ether;
uint256 public minimumPRETDEContributionInWei = 5 ether;
//////////////////////
// Funding Hard cap //
//////////////////////
uint256 public maximumFundingGoalInETH;
//////////////////
// Funds Raised //
//////////////////
uint256 public fundsRaisedInWei = 0;
uint256 public presaleFundsRaisedInWei = 0;
uint256 public tdeFundsRaisedInWei = 0;
////////////////////////////////////////////
// Keep track of Wei contributed per user //
////////////////////////////////////////////
mapping(address => uint256) ETHContributions;
////////////////////////////////////////////////
// Keeps track of tokens per eth contribution //
////////////////////////////////////////////////
mapping(address => uint256) ETHContributorTokens;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Keeps track of pre-tde contributors and how many tokens they are entitled to get based on their contribution //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
mapping(address => uint256) PRETDEContributorTokensPendingRelease;
uint256 PRETDEContributorsTokensPendingCount = 0; // keep track of contributors waiting for tokens
uint256 TokensPurchasedDuringPRETDE = 0; // keep track of how many tokens need to be issued to presale contributors
//////////////////
// Bonus ranges //
//////////////////
bool public trickleDownBonusesReleased = false;
uint256 public rangeETHAmount = 0;
uint256 public bonusRangeCount = 4;
uint256 public TDEContributorCount = 0;
mapping(uint256 => address) public TDEContributorAddresses;
mapping(address => uint256) public TDEContributorInitialBonusByAddress;
uint256 public tokensIssuedForBonusRangeOne = 0;
uint256 public tokensIssuedForBonusRangeTwo = 0;
uint256 public tokensIssuedForBonusRangeThree = 0;
uint256 public tokensIssuedForBonusRangeFour = 0;
//////////////////////////////////////////////////////
// Checks if trickle down bonuses not been released //
//////////////////////////////////////////////////////
modifier HasTrickleDownBonusesNotBeenReleased() {
require (trickleDownBonusesReleased == false);
_;
}
///////////////////////////////////////////////////////////////////
// Checks if all pre-tde contributors have received their tokens //
///////////////////////////////////////////////////////////////////
modifier NoPRETDEContributorsAwaitingTokens() {
// Determine if all pre-tde contributors have received tokens
require(PRETDEContributorsTokensPendingCount == 0);
_;
}
///////////////////////////////////////////////////////////////////////////////////////
// Checks if there are any pre-tde contributors that have not recieved their tokens //
///////////////////////////////////////////////////////////////////////////////////////
modifier PRETDEContributorsAwaitingTokens() {
// Determine if there pre-tde contributors that have not received tokens
require(PRETDEContributorsTokensPendingCount > 0);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounders are performing the action //
////////////////////////////////////////////////////
modifier onlyCofounders() {
require (msg.sender == cofounderA || msg.sender == cofounderB);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounder A is performing the action //
////////////////////////////////////////////////////
modifier onlyCofounderA() {
require (msg.sender == cofounderA);
_;
}
////////////////////////////////////////////////////
// Checks if CoFounder B is performing the action //
////////////////////////////////////////////////////
modifier onlyCofounderB() {
require (msg.sender == cofounderB);
_;
}
////////////////////////////////s
// Check if the tde has ended //
////////////////////////////////
modifier TDEHasEnded() {
require (now >= TDEEndDate || fundsRaisedInWei >= maximumFundingGoalInETH);
_;
}
//////////////////////////////////////////////////////////////////////////////
// Checksto see if the contribution is at least the minimum allowed for tde //
//////////////////////////////////////////////////////////////////////////////
modifier ContributionIsAtLeastMinimum() {
require (msg.value >= minimumTDEContributionInWei);
_;
}
///////////////////////////////////////////////////////////////
// Make sure max cap is not exceeded with added contribution //
///////////////////////////////////////////////////////////////
modifier ContributionDoesNotCauseGoalExceedance() {
uint256 newFundsRaised = msg.value+fundsRaisedInWei;
require (newFundsRaised <= maximumFundingGoalInETH);
_;
}
///////////////////////////////////////////////////////////////
// Make sure max tokens is not exceeded with added contribution //
///////////////////////////////////////////////////////////////
modifier TDEBonusesDoesNotCauseTokenExceedance() {
uint256 tokensDistributedPlusBonuses = getTokensDistributedPlusTrickleDownBonuses();
require (tokensDistributedPlusBonuses < dnnToken.TDESupplyRemaining());
_;
}
/////////////////////////////////////////////////////////////////
// Check if the specified beneficiary has sent us funds before //
/////////////////////////////////////////////////////////////////
modifier HasPendingPRETDETokens(address _contributor) {
require (PRETDEContributorTokensPendingRelease[_contributor] != 0);
_;
}
/////////////////////////////////////////////////////////////
// Check if pre-tde contributors is not waiting for tokens //
/////////////////////////////////////////////////////////////
modifier IsNotAwaitingPRETDETokens(address _contributor) {
require (PRETDEContributorTokensPendingRelease[_contributor] == 0);
_;
}
///////////////////////////////////////////////////////
// @des Function to change founder A address. //
// @param newAddress Address of new founder A. //
///////////////////////////////////////////////////////
function changeCofounderA(address newAddress)
onlyCofounderA
{
cofounderA = newAddress;
}
//////////////////////////////////////////////////////
// @des Function to change founder B address. //
// @param newAddress Address of new founder B. //
//////////////////////////////////////////////////////
function changeCofounderB(address newAddress)
onlyCofounderB
{
cofounderB = newAddress;
}
/////////////////////////////////////////////////////////
// @des Tokens distributed plus trickle down bonuses. //
/////////////////////////////////////////////////////////
function getTokensDistributedPlusTrickleDownBonuses()
constant
returns (uint256)
{
return tokensIssuedForBonusRangeOne.mul(220).div(100) + tokensIssuedForBonusRangeTwo.mul(190).div(100) + tokensIssuedForBonusRangeThree.mul(150).div(100) + tokensIssuedForBonusRangeFour.mul(100).div(100);
}
////////////////////////////////////////
// @des Function to extend tde //
// @param new crowdsale start date //
////////////////////////////////////////
function extendTDE(uint256 endDate)
onlyCofounders
returns (bool)
{
// Make sure that the new date is past the existing date and
// is not in the past.
if (endDate > now && endDate > TDEEndDate) {
TDEEndDate = endDate;
return true;
}
return false;
}
////////////////////////////////////////
// @des Function to extend pre-tde //
// @param new crowdsale start date //
////////////////////////////////////////
function extendPRETDE(uint256 startDate)
onlyCofounders
returns (bool)
{
// Make sure that the new date is past the existing date and
// is not in the past.
if (startDate > now && startDate > TDEStartDate) {
TDEEndDate = TDEEndDate + (startDate-TDEStartDate); // Move end date the same amount of days as start date
TDEStartDate = startDate; // set new start date
return true;
}
return false;
}
//////////////////////////////////////////////////////
// @des Function to change multisig address. //
// @param newAddress Address of new multisig. //
//////////////////////////////////////////////////////
function changeDNNHoldingMultisig(address newAddress)
onlyCofounders
{
dnnHoldingMultisig = newAddress;
}
//////////////////////////////////////////
// @des ETH balance of each contributor //
//////////////////////////////////////////
function contributorETHBalance(address _owner)
constant
returns (uint256 balance)
{
return ETHContributions[_owner];
}
////////////////////////////////////////////////////////////
// @des Determines if an address is a pre-TDE contributor //
////////////////////////////////////////////////////////////
function isAwaitingPRETDETokens(address _contributorAddress)
internal
returns (bool)
{
return PRETDEContributorTokensPendingRelease[_contributorAddress] > 0;
}
/////////////////////////////////////////////////////////////
// @des Returns pending presale tokens for a given address //
/////////////////////////////////////////////////////////////
function getPendingPresaleTokens(address _contributor)
constant
returns (uint256)
{
return PRETDEContributorTokensPendingRelease[_contributor];
}
////////////////////////////////
// @des Returns current bonus //
////////////////////////////////
function getCurrentTDEBonus()
constant
returns (uint256)
{
return getTDETokenExchangeRate(now);
}
////////////////////////////////
// @des Returns current bonus //
////////////////////////////////
function getCurrentPRETDEBonus()
constant
returns (uint256)
{
return getPRETDETokenExchangeRate(now);
}
///////////////////////////////////////////////////////////////////////
// @des Returns bonus (in atto-DNN) per wei for the specific moment //
// @param timestamp Time of purchase (in seconds) //
///////////////////////////////////////////////////////////////////////
function getTDETokenExchangeRate(uint256 timestamp)
constant
returns (uint256)
{
// No bonus - TDE ended
if (timestamp > TDEEndDate) {
return uint256(0);
}
// No bonus - TDE has not started
if (TDEStartDate > timestamp) {
return uint256(0);
}
// Bonus One --> 0 - 25% of raise
if (tdeFundsRaisedInWei <= rangeETHAmount) {
return tokenExchangeRateBase.mul(120).div(100);
}
// Bonus Two --> 25% - 50% of raise
else if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {
return tokenExchangeRateBase.mul(130).div(100);
}
// Bonus Three --> 50% - 75% of raise
else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {
return tokenExchangeRateBase.mul(140).div(100);
}
// Bonus Four --> 75% - 100% of raise
else if (tdeFundsRaisedInWei > rangeETHAmount.mul(3) && tdeFundsRaisedInWei <= maximumFundingGoalInETH) {
return tokenExchangeRateBase.mul(150).div(100);
}
else {
return tokenExchangeRateBase;
}
}
////////////////////////////////////////////////////////////////////////////////////
// @des Returns bonus (in atto-DNN) per wei for the specific contribution amount //
// @param weiamount The amount of wei being contributed //
////////////////////////////////////////////////////////////////////////////////////
function getPRETDETokenExchangeRate(uint256 weiamount)
constant
returns (uint256)
{
// Presale will only accept contributions above minimum
if (weiamount < minimumPRETDEContributionInWei) {
return uint256(0);
}
// Minimum Contribution - 199 ETH (25% Bonus)
if (weiamount >= minimumPRETDEContributionInWei && weiamount <= 199 ether) {
return tokenExchangeRateBase + tokenExchangeRateBase.mul(25).div(100);
// 200 ETH - 300 ETH Bonus (30% Bonus)
} else if (weiamount >= 200 ether && weiamount <= 300 ether) {
return tokenExchangeRateBase + tokenExchangeRateBase.mul(30).div(100);
// 301 ETH - 2665 ETH Bonus (35% Bonus)
} else if (weiamount >= 301 ether && weiamount <= 2665 ether) {
return tokenExchangeRateBase + tokenExchangeRateBase.mul(35).div(100);
// 2666+ ETH Bonus (50% Bonus)
} else {
return tokenExchangeRateBase + tokenExchangeRateBase.mul(50).div(100);
}
}
//////////////////////////////////////////////////////////////////////////////////////////
// @des Computes how many tokens a buyer is entitled to based on contribution and time. //
//////////////////////////////////////////////////////////////////////////////////////////
function calculateTokens(uint256 weiamount, uint256 timestamp)
constant
returns (uint256)
{
// Compute how many atto-DNN user is entitled to.
uint256 computedTokensForPurchase = weiamount.mul(timestamp >= TDEStartDate ? getTDETokenExchangeRate(timestamp) : getPRETDETokenExchangeRate(weiamount));
// Amount of atto-DNN to issue
return computedTokensForPurchase;
}
///////////////////////////////////////////////////////////////
// @des Issues tokens for users who made purchase with ETH //
// @param beneficiary Address the tokens will be issued to. //
// @param weiamount ETH amount (in Wei) //
// @param timestamp Time of purchase (in seconds) //
///////////////////////////////////////////////////////////////
function buyTokens()
internal
ContributionIsAtLeastMinimum
ContributionDoesNotCauseGoalExceedance
TDEBonusesDoesNotCauseTokenExceedance
returns (bool)
{
// Determine how many tokens should be issued
uint256 tokenCount = calculateTokens(msg.value, now);
// Bonus Four
if (tdeFundsRaisedInWei > rangeETHAmount.mul(3) && tdeFundsRaisedInWei <= maximumFundingGoalInETH) {
if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
TDEContributorInitialBonusByAddress[msg.sender] = tdeFundsRaisedInWei;
TDEContributorAddresses[TDEContributorCount] = msg.sender;
TDEContributorCount++;
}
}
// Bonus Three
else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {
if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount.mul(3);
TDEContributorAddresses[TDEContributorCount] = msg.sender;
TDEContributorCount++;
}
}
// Bonus Two
else if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {
if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount.mul(2);
TDEContributorAddresses[TDEContributorCount] = msg.sender;
TDEContributorCount++;
}
}
// Bonus One
else if (tdeFundsRaisedInWei <= rangeETHAmount) {
if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount;
TDEContributorAddresses[TDEContributorCount] = msg.sender;
TDEContributorCount++;
}
}
// Keep track of tokens issued within each range
// Bonus Four
if (TDEContributorInitialBonusByAddress[msg.sender] == tdeFundsRaisedInWei) {
tokensIssuedForBonusRangeFour = tokensIssuedForBonusRangeFour.add(tokenCount);
}
// Bonus Three
else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount.mul(3)) {
tokensIssuedForBonusRangeThree = tokensIssuedForBonusRangeThree.add(tokenCount);
}
// Bonus Two
else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount.mul(2)) {
tokensIssuedForBonusRangeTwo = tokensIssuedForBonusRangeTwo.add(tokenCount);
}
// Bonus One
else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount) {
tokensIssuedForBonusRangeOne = tokensIssuedForBonusRangeOne.add(tokenCount);
}
// Get total tokens distributed plus bonuses
uint256 tokensDistributedPlusBonuses = getTokensDistributedPlusTrickleDownBonuses();
// Make sure we have enough tokens to satisfy the transaction
if (tokensDistributedPlusBonuses > dnnToken.TDESupplyRemaining()) {
revert();
}
// Update total amount of tokens distributed (in atto-DNN)
tokensDistributed = tokensDistributed.add(tokenCount);
// Keep track of contributions (in Wei)
ETHContributions[msg.sender] = ETHContributions[msg.sender].add(msg.value);
// Keep track of how much tokens are issued to each contributor
ETHContributorTokens[msg.sender] = ETHContributorTokens[msg.sender].add(tokenCount);
// Increase total funds raised by contribution
fundsRaisedInWei = fundsRaisedInWei.add(msg.value);
// Increase tde total funds raised by contribution
tdeFundsRaisedInWei = tdeFundsRaisedInWei.add(msg.value);
// Determine which token allocation we should be deducting from
DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;
// Attempt to issue tokens to contributor
if (!dnnToken.issueTokens(msg.sender, tokenCount, allocationType)) {
revert();
}
// Transfer funds to multisig
dnnHoldingMultisig.transfer(msg.value);
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// @des Issues tokens for users who made purchase without using ETH during presale. //
// @param beneficiary Address the tokens will be issued to. //
// @param weiamount ETH amount (in Wei) //
////////////////////////////////////////////////////////////////////////////////////////
function buyPRETDETokensWithoutETH(address beneficiary, uint256 weiamount, uint256 tokenCount)
onlyCofounders
IsNotAwaitingPRETDETokens(beneficiary)
returns (bool)
{
// Keep track of how much tokens are issued to each contributor
ETHContributorTokens[beneficiary] = ETHContributorTokens[beneficiary].add(tokenCount);
// Keep track of contributions (in Wei)
ETHContributions[beneficiary] = ETHContributions[beneficiary].add(weiamount);
// Increase total funds raised by contribution
fundsRaisedInWei = fundsRaisedInWei.add(weiamount);
// Keep track of presale funds in addition, separately
presaleFundsRaisedInWei = presaleFundsRaisedInWei.add(weiamount);
// Add these tokens to the total amount of tokens this contributor is entitled to
PRETDEContributorTokensPendingRelease[beneficiary] = PRETDEContributorTokensPendingRelease[beneficiary].add(tokenCount);
// Incrment number of pre-tde contributors waiting for tokens
PRETDEContributorsTokensPendingCount += 1;
// Send tokens to contibutor
return issuePRETDETokens(beneficiary);
}
////////////////////////////////////////////////////////////////////////////////////////////
// @des Issues tokens for users who made purchase without using ETH during public sale. //
// @param beneficiary Address the tokens will be issued to. //
// @param weiamount ETH amount (in Wei) //
////////////////////////////////////////////////////////////////////////////////////////////
function buyTDETokensWithoutETH(address beneficiary, uint256 weiamount, uint256 tokenCount)
onlyCofounders
returns (bool)
{
// Get total tokens distributed plus bonuses
uint256 tokensDistributedPlusBonuses = tokenCount.add(getTokensDistributedPlusTrickleDownBonuses());
// Make sure we have enough tokens to satisfy the transaction
if (tokensDistributedPlusBonuses > dnnToken.TDESupplyRemaining()) {
revert();
}
// Keep track of how much tokens are issued to each contributor
ETHContributorTokens[beneficiary] = ETHContributorTokens[beneficiary].add(tokenCount);
// Keep track of contributions (in Wei)
ETHContributions[beneficiary] = ETHContributions[beneficiary].add(weiamount);
// Increase total funds raised by contribution
fundsRaisedInWei = fundsRaisedInWei.add(weiamount);
// Keep track of tde funds in addition, separately
tdeFundsRaisedInWei = tdeFundsRaisedInWei.add(weiamount);
// Send tokens to contibutor
return issueTDETokens(beneficiary, tokenCount);
}
///////////////////////////////////////////////////////////////
// @des Issues bulk token purchases //
// @param beneficiary Address the tokens will be issued to. //
///////////////////////////////////////////////////////////////
function issueTDETokens(address beneficiary, uint256 tokenCount)
internal
returns (bool)
{
// Update total amount of tokens distributed (in atto-DNN)
tokensDistributed = tokensDistributed.add(tokenCount);
// Allocation type will be PRETDESupplyAllocation
DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;
// Attempt to issue tokens
if (!dnnToken.issueTokens(beneficiary, tokenCount, allocationType)) {
revert();
}
return true;
}
///////////////////////////////////////////////////////////////
// @des Issues pending tokens to pre-tde contributor //
// @param beneficiary Address the tokens will be issued to. //
///////////////////////////////////////////////////////////////
function issuePRETDETokens(address beneficiary)
onlyCofounders
PRETDEContributorsAwaitingTokens
HasPendingPRETDETokens(beneficiary)
returns (bool)
{
// Amount of tokens to credit pre-tde contributor
uint256 tokenCount = PRETDEContributorTokensPendingRelease[beneficiary];
// Update total amount of tokens distributed (in atto-DNN)
tokensDistributed = tokensDistributed.add(tokenCount);
// Allocation type will be PRETDESupplyAllocation
DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.PRETDESupplyAllocation;
// Attempt to issue tokens
if (!dnnToken.issueTokens(beneficiary, tokenCount, allocationType)) {
revert();
}
// Reduce number of pre-tde contributors waiting for tokens
PRETDEContributorsTokensPendingCount -= 1;
// Denote that tokens have been issued for this pre-tde contributor
PRETDEContributorTokensPendingRelease[beneficiary] = 0;
return true;
}
/////////////////////////////////////
// @des Issue trickle down bonuses //
/////////////////////////////////////
function releaseTrickleDownBonuses()
onlyCofounders
{
// Issue trickle down bonuses if we have not already done so
if (trickleDownBonusesReleased == false) {
// Determine which token allocation we should be deducting from
DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;
// Temporary reference to contribution
address contributorAddress;
// Temporary reference to contributor bonus tokens
uint256 bonusTokens;
// Iterate through contributors
for (uint256 iteration=0; iteration < TDEContributorCount; iteration++) {
// No bonus tokens to issue until contribute range and funds raised
// are determined.
bonusTokens = 0;
// If we have at least reached the bonus 2 range, issue bonuses to everyone in bonus 1
if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {
// Contributor address to send tokens to
contributorAddress = TDEContributorAddresses[iteration];
// Issue a range 2 bonus if the contributor was in range 1
if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(130).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue tokens to contributor address if bonus applies
if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
revert();
}
}
// If we have at least reached the bonus 3 range, issue bonuses to everyone in bonus 1 & 2
else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {
// Contributor address to send tokens to
contributorAddress = TDEContributorAddresses[iteration];
// Issue a range 2 and range 3 bonus if the contributor was in range 1
if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(170).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue a range 3 bonus if the contributor was in range 2
else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(2)) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(140).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue tokens to contributor address if bonus applies
if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
revert();
}
}
// If we have at least reached the bonus 4 range, issue bonuses to everyone in bonus 1, 2, & 3
else if (tdeFundsRaisedInWei > rangeETHAmount.mul(3)) {
// Contributor address to send tokens to
contributorAddress = TDEContributorAddresses[iteration];
// Issue a range 2 and range 3 bonus if the contributor was in range 1
if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(220).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue a range 3 bonus if the contributor was in range 2
else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(2)) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(190).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue a range 3 bonus if the contributor was in range 2
else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(3)) {
bonusTokens = ETHContributorTokens[contributorAddress].mul(150).div(100).sub(ETHContributorTokens[contributorAddress]);
}
// Issue tokens to contributor address if bonus applies
if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
revert();
}
}
}
// Mark down that bonuses have been released
trickleDownBonusesReleased = true;
}
}
/////////////////////////////////
// @des Marks TDE as completed //
/////////////////////////////////
function finalizeTDE()
onlyCofounders
TDEHasEnded
{
// Check if the tokens are locked and all pre-sale tokens have been
// transferred to the TDE Supply before unlocking tokens.
require(dnnToken.tokensLocked() == true && dnnToken.PRETDESupplyRemaining() == 0);
// Release Bonuses
releaseTrickleDownBonuses();
// Unlock tokens
dnnToken.unlockTokens();
// Update tokens distributed
tokensDistributed += dnnToken.TDESupplyRemaining();
// Transfer unsold TDE tokens to platform
dnnToken.sendUnsoldTDETokensToPlatform();
}
////////////////////////////////////////////////////////////////////////////////
// @des Marks pre-TDE as completed by moving remaining tokens into TDE supply //
////////////////////////////////////////////////////////////////////////////////
function finalizePRETDE()
onlyCofounders
NoPRETDEContributorsAwaitingTokens
{
// Check if we have tokens to transfer to TDE
require(dnnToken.PRETDESupplyRemaining() > 0);
// Transfer unsold TDE tokens to platform
dnnToken.sendUnsoldPRETDETokensToTDE();
}
///////////////////////////////
// @des Contract constructor /xw/
///////////////////////////////
function DNNTDE()
{
// Hard Cap
uint256 hardCap = 35000;
// Set token address
dnnToken = DNNToken(0x9D9832d1beb29CC949d75D61415FD00279f84Dc2);
// Set cofounder addresses
cofounderA = 0x3Cf26a9FE33C219dB87c2e50572e50803eFb2981;
cofounderB = 0x9FFE2aD5D76954C7C25be0cEE30795279c4Cab9f;
// Set DNN holding address
dnnHoldingMultisig = 0x5980a47514a0Af79a8d2F6276f8673a006ec9929;
// Set hard cap
maximumFundingGoalInETH = hardCap * 1 ether;
// Range ETH
rangeETHAmount = hardCap.div(bonusRangeCount) * 1 ether;
// Set Start Date
TDEStartDate = 1529020801;
// Set End date (Make sure the end date is at least 30 days from start date)
// Will default to a date that is exactly 30 days from start date.
TDEEndDate = (TDEStartDate + 35 days);
}
/////////////////////////////////////////////////////////
// @des Handle's ETH sent directly to contract address //
/////////////////////////////////////////////////////////
function () payable {
// Handle pre-sale contribution (tokens held, until tx confirmation from contributor)
// Makes sure the user sends minimum PRE-TDE contribution, and that pre-tde contributors
// are unable to send subsequent ETH contributors before being issued tokens.
if (now < TDEStartDate && msg.value >= minimumPRETDEContributionInWei && PRETDEContributorTokensPendingRelease[msg.sender] == 0) {
// Keep track of contributions (in Wei)
ETHContributions[msg.sender] = ETHContributions[msg.sender].add(msg.value);
// Increase total funds raised by contribution
fundsRaisedInWei = fundsRaisedInWei.add(msg.value);
// Keep track of presale funds in addition, separately
presaleFundsRaisedInWei = presaleFundsRaisedInWei.add(msg.value);
/// Make a note of how many tokens this user should get for their contribution to the presale
PRETDEContributorTokensPendingRelease[msg.sender] = PRETDEContributorTokensPendingRelease[msg.sender].add(calculateTokens(msg.value, now));
// Keep track of pending tokens
TokensPurchasedDuringPRETDE += calculateTokens(msg.value, now);
// Increment number of pre-tde contributors waiting for tokens
PRETDEContributorsTokensPendingCount += 1;
// Prevent contributions that will cause us to have a shortage of tokens during the pre-sale
if (TokensPurchasedDuringPRETDE > dnnToken.TDESupplyRemaining()+dnnToken.PRETDESupplyRemaining()) {
revert();
}
// Transfer contribution directly to multisig
dnnHoldingMultisig.transfer(msg.value);
}
// Handle public-sale contribution (tokens issued immediately)
else if (now >= TDEStartDate && now < TDEEndDate) buyTokens();
// Otherwise, reject the contribution
else revert();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeFour","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"endDate","type":"uint256"}],"name":"extendTDE","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"TDEContributorAddresses","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalizeTDE","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensDistributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"bonusRangeCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPRETDEBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeTwo","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"TDEContributorInitialBonusByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tdeFundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTDEBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEEndDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"releaseTrickleDownBonuses","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"cofounderB","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_contributor","type":"address"}],"name":"getPendingPresaleTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"trickleDownBonusesReleased","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"weiamount","type":"uint256"},{"name":"tokenCount","type":"uint256"}],"name":"buyPRETDETokensWithoutETH","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeCofounderA","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalizePRETDE","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenExchangeRateBase","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeDNNHoldingMultisig","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"weiamount","type":"uint256"},{"name":"tokenCount","type":"uint256"}],"name":"buyTDETokensWithoutETH","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEContributorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"contributorETHBalance","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"weiamount","type":"uint256"}],"name":"getPRETDETokenExchangeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"weiamount","type":"uint256"},{"name":"timestamp","type":"uint256"}],"name":"calculateTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dnnHoldingMultisig","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeCofounderB","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeOne","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"startDate","type":"uint256"}],"name":"extendPRETDE","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEStartDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maximumFundingGoalInETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"issuePRETDETokens","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"rangeETHAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumTDEContributionInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeThree","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumPRETDEContributionInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"presaleFundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getTokensDistributedPlusTrickleDownBonuses","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"cofounderA","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dnnToken","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getTDETokenExchangeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"}]Contract Creation Code
6060604052610bb86006556000600781905566038d7ea4c68000600855674563918244f40000600955600b819055600c819055600d819055601181905560128190556013805460ff191690556014819055600460155560168190556019819055601a819055601b819055601c5534156200007857600080fd5b5b60008054600160a060020a0319908116739d9832d1beb29cc949d75d61415fd00279f84dc217909155600180548216733cf26a9fe33c219db87c2e50572e50803efb2981179055600280548216739ffe2ad5d76954c7c25be0cee30795279c4cab9f17905560038054909116735980a47514a0af79a8d2f6276f8673a006ec99291790556907695a92c20d6fe00000600a556015546188b8906200012d9082906401000000006200266f6200015282021704565b670de0b6b3a764000002601455635b230181600455635b5126016005555b506200016f565b60008082848115156200016157fe5b0490508091505b5092915050565b6127a8806200017f6000396000f300606060405236156101f35763ffffffff60e060020a60003504166307df3fa481146104455780630b1aff481461046a5780630c6c9036146104945780631485ffc4146104c6578063152e84a7146104db5780631c054b141461050057806324c4c9e4146105255780632a2729741461054a5780633cc0048f1461056f57806343581c80146105a057806347c8cc69146105c55780634bfa0d11146105ea5780634e77a38e1461060f57806351290d0614610624578063540cf75e146106535780635a32d0701461068457806365e16933146106ab5780636b0f182e146106e45780636d156add146107055780636eaefc871461071a57806371f115521461073f5780637374b013146107605780637e569e661461079957806385d51d19146107be5780638efa00e2146107ef578063903cc583146108175780639199a8bb14610842578063941993f814610871578063949eabff146108925780639e90ce6c146108b7578063a1bc76d1146108dc578063a785b96a14610906578063af20b9641461092b578063cd9679dd14610950578063d1b1b65a14610983578063d903c5ae146109a8578063d951d39a146109cd578063e0f4a1a2146109f2578063e380575a14610a17578063ee73c11714610a3c578063f05aa33414610a61578063fa508d3e14610a90578063fed0311814610abf575b5b6004544210801561020757506009543410155b80156102295750600160a060020a033316600090815260106020526040902054155b1561041657600160a060020a0333166000908152600e6020526040902054610257903463ffffffff610ae716565b600160a060020a0333166000908152600e6020526040902055600b54610283903463ffffffff610ae716565b600b55600c54610299903463ffffffff610ae716565b600c556102ce6102a93442610b01565b600160a060020a0333166000908152601060205260409020549063ffffffff610ae716565b600160a060020a0333166000908152601060205260409020556102f13442610b01565b60128054909101905560118054600101905560008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561034c57600080fd5b6102c65a03f1151561035d57600080fd5b505050604051805160008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103b357600080fd5b6102c65a03f115156103c457600080fd5b505050604051805190500160125411156103dd57600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561041157600080fd5b610441565b6004544210158015610429575060055442105b1561043c57610436610b43565b50610441565b600080fd5b5b5b005b341561045057600080fd5b6104586111b4565b60405190815260200160405180910390f35b341561047557600080fd5b6104806004356111ba565b604051901515815260200160405180910390f35b341561049f57600080fd5b6104aa60043561121f565b604051600160a060020a03909116815260200160405180910390f35b34156104d157600080fd5b61044161123a565b005b34156104e657600080fd5b610458611490565b60405190815260200160405180910390f35b341561050b57600080fd5b610458611496565b60405190815260200160405180910390f35b341561053057600080fd5b61045861149c565b60405190815260200160405180910390f35b341561055557600080fd5b6104586114ad565b60405190815260200160405180910390f35b341561057a57600080fd5b610458600160a060020a03600435166114b3565b60405190815260200160405180910390f35b34156105ab57600080fd5b6104586114c5565b60405190815260200160405180910390f35b34156105d057600080fd5b6104586114cb565b60405190815260200160405180910390f35b34156105f557600080fd5b6104586114dc565b60405190815260200160405180910390f35b341561061a57600080fd5b6104416114e2565b005b341561062f57600080fd5b6104aa611b3a565b604051600160a060020a03909116815260200160405180910390f35b341561065e57600080fd5b610458600160a060020a0360043516611b49565b60405190815260200160405180910390f35b341561068f57600080fd5b610480611b68565b604051901515815260200160405180910390f35b34156106b657600080fd5b610480600160a060020a0360043516602435604435611b71565b604051901515815260200160405180910390f35b34156106ef57600080fd5b610441600160a060020a0360043516611cd3565b005b341561071057600080fd5b610441611d0e565b005b341561072557600080fd5b610458611e18565b60405190815260200160405180910390f35b341561074a57600080fd5b610441600160a060020a0360043516611e1e565b005b341561076b57600080fd5b610480600160a060020a0360043516602435604435611e74565b604051901515815260200160405180910390f35b34156107a457600080fd5b610458611ff5565b60405190815260200160405180910390f35b34156107c957600080fd5b610458600160a060020a0360043516611ffb565b60405190815260200160405180910390f35b34156107fa57600080fd5b61045860043561201a565b60405190815260200160405180910390f35b341561082257600080fd5b610458600435602435610b01565b60405190815260200160405180910390f35b341561084d57600080fd5b6104aa61216c565b604051600160a060020a03909116815260200160405180910390f35b341561087c57600080fd5b610441600160a060020a036004351661217b565b005b341561089d57600080fd5b6104586121b6565b60405190815260200160405180910390f35b34156108c257600080fd5b6104586121bc565b60405190815260200160405180910390f35b34156108e757600080fd5b6104806004356121c2565b604051901515815260200160405180910390f35b341561091157600080fd5b610458612235565b60405190815260200160405180910390f35b341561093657600080fd5b61045861223b565b60405190815260200160405180910390f35b341561095b57600080fd5b610480600160a060020a0360043516612241565b604051901515815260200160405180910390f35b341561098e57600080fd5b6104586123ca565b60405190815260200160405180910390f35b34156109b357600080fd5b6104586123d0565b60405190815260200160405180910390f35b34156109d857600080fd5b6104586123d6565b60405190815260200160405180910390f35b34156109fd57600080fd5b6104586123dc565b60405190815260200160405180910390f35b3415610a2257600080fd5b6104586123e2565b60405190815260200160405180910390f35b3415610a4757600080fd5b6104586123e8565b60405190815260200160405180910390f35b3415610a6c57600080fd5b6104aa61248f565b604051600160a060020a03909116815260200160405180910390f35b3415610a9b57600080fd5b6104aa61249e565b604051600160a060020a03909116815260200160405180910390f35b3415610aca57600080fd5b6104586004356124ad565b60405190815260200160405180910390f35b600082820183811015610af657fe5b8091505b5092915050565b600080610b36600454841015610b1f57610b1a8561201a565b610b28565b610b28846124ad565b5b859063ffffffff61264016565b90508091505b5092915050565b6000806000806008543410151515610b5a57600080fd5b600b54600a543490910190811115610b7157600080fd5b6000610b7b6123e8565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bc957600080fd5b6102c65a03f11515610bda57600080fd5b505050604051805182109050610bef57600080fd5b610bf93442610b01565b601454909550610c1090600363ffffffff61264016565b600d54118015610c245750600a54600d5411155b15610c9657600160a060020a0333166000908152601860205260409020541515610c9157600d54600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454610caa90600263ffffffff61264016565b600d54118015610ccf5750601454610cc990600363ffffffff61264016565b600d5411155b15610d5257600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600363ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d54118015610d7a5750601454610d7490600263ffffffff61264016565b600d5411155b15610dfd57600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600263ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d5411610e7057600160a060020a0333166000908152601860205260409020541515610e7057601454600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b5b5b5b5b600d54600160a060020a0333166000908152601860205260409020541415610eb157601c54610ea9908663ffffffff610ae716565b601c55610f86565b601454610ec590600363ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610eff57601b54610ef7908663ffffffff610ae716565b601b55610f86565b601454610f1390600263ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610f4d57601a54610f45908663ffffffff610ae716565b601a55610f86565b601454600160a060020a0333166000908152601860205260409020541415610f8657601954610f82908663ffffffff610ae716565b6019555b5b5b5b610f916123e8565b60008054919550600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fdf57600080fd5b6102c65a03f11515610ff057600080fd5b5050506040518051905084111561100657600080fd5b600754611019908663ffffffff610ae716565b600755600160a060020a0333166000908152600e6020526040902054611045903463ffffffff610ae716565b600160a060020a0333166000908152600e6020908152604080832093909355600f9052205461107a908663ffffffff610ae716565b600160a060020a0333166000908152600f6020526040902055600b546110a6903463ffffffff610ae716565b600b55600d546110bc903463ffffffff610ae716565b600d556000805460029450600160a060020a03169063237d262890339088908790604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561112457fe5b60ff1681526020019350505050602060405180830381600087803b151561114a57600080fd5b6102c65a03f1151561115b57600080fd5b50505060405180519050151561117057600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f1935050505015156111a457600080fd5b600195505b5b505b505b50505090565b601c5481565b60015460009033600160a060020a03908116911614806111e8575060025433600160a060020a039081169116145b15156111f357600080fd5b4282118015611203575060055482115b15611215575060058190556001611219565b5060005b5b919050565b601760205260009081526040902054600160a060020a031681565b60015433600160a060020a0390811691161480611265575060025433600160a060020a039081169116145b151561127057600080fd5b600554421015806112855750600a54600b5410155b151561129057600080fd5b60008054600160a060020a03169063a1feba4290604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112d957600080fd5b6102c65a03f115156112ea57600080fd5b5050506040518051151560011490508015611366575060008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561134957600080fd5b6102c65a03f1151561135a57600080fd5b50505060405180511590505b151561137157600080fd5b6113796114e2565b600054600160a060020a031663f968f4936040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b857600080fd5b6102c65a03f115156113c957600080fd5b505060008054600160a060020a031691506356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561141557600080fd5b6102c65a03f1151561142657600080fd5b505050604051805160078054909101905550600054600160a060020a03166359b796106040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60075481565b60155481565b60006114a74261201a565b90505b90565b601a5481565b60186020526000908152604090205481565b600d5481565b60006114a7426124ad565b90505b90565b60055481565b60015460009081908190819033600160a060020a0390811691161480611516575060025433600160a060020a039081169116145b151561152157600080fd5b60135460ff161515611b3257506002925060005b601654811015611b245760009150601454600d5411801561156b575060145461156590600263ffffffff61264016565b600d5411155b156116b057600081815260176020908152604080832054601454600160a060020a03909116808552601890935292205490945014156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608263ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546116c490600263ffffffff61264016565b600d541180156116e957506014546116e390600363ffffffff61264016565b600d5411155b156118b457600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561177457600160a060020a0383166000908152600f602052604090205461176d906115e360646115d78360aa63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91506115f2565b60145461178890600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608c63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546118c890600363ffffffff61264016565b600d541115611b1857600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561195757600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360dc63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b60145461196b90600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156119dc57600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360be63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b6014546119f090600363ffffffff61264016565b600160a060020a0384166000908152601860205260409020541415611a5d57600160a060020a0383166000908152600f6020526040902054611a5a906115e360646115d783609663ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b5b600082118015611b0e575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001826006811115611acb57fe5b60ff1681526020019350505050602060405180830381600087803b1515611af157600080fd5b6102c65a03f11515611b0257600080fd5b50505060405180519050155b15611b1857600080fd5b5b5b5b5b600101611535565b6013805460ff191660011790555b5b5b50505050565b600254600160a060020a031681565b600160a060020a0381166000908152601060205260409020545b919050565b60135460ff1681565b60015460009033600160a060020a0390811691161480611b9f575060025433600160a060020a039081169116145b1515611baa57600080fd5b600160a060020a038416600090815260106020526040902054849015611bcf57600080fd5b600160a060020a0385166000908152600f6020526040902054611bf8908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611c2d908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611c59908563ffffffff610ae716565b600b55600c54611c6f908563ffffffff610ae716565b600c55600160a060020a038516600090815260106020526040902054611c9b908463ffffffff610ae716565b600160a060020a038616600090815260106020526040902055601180546001019055611cc685612241565b91505b5b505b9392505050565b60015433600160a060020a03908116911614611cee57600080fd5b60018054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a0390811691161480611d39575060025433600160a060020a039081169116145b1515611d4457600080fd5b60115415611d5157600080fd5b60008054600160a060020a031663c269f26382604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b50505060405180519050111515611dc057600080fd5b600054600160a060020a031663ce21abf36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60065481565b60015433600160a060020a0390811691161480611e49575060025433600160a060020a039081169116145b1515611e5457600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600154600090819033600160a060020a0390811691161480611ea4575060025433600160a060020a039081169116145b1515611eaf57600080fd5b611ec7611eba6123e8565b849063ffffffff610ae716565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611f1557600080fd5b6102c65a03f11515611f2657600080fd5b50505060405180519050811115611f3c57600080fd5b600160a060020a0385166000908152600f6020526040902054611f65908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611f9a908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611fc6908563ffffffff610ae716565b600b55600d54611fdc908563ffffffff610ae716565b600d55611cc685846126a2565b91505b5b509392505050565b60165481565b600160a060020a0381166000908152600e60205260409020545b919050565b600060095482101561202e57506000611219565b60095482101580156120495750680ac9ae05a71ebc00008211155b156120805761207560646115d7601960065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b680ad78ebc5ac620000082101580156120a25750681043561a88293000008211155b156120d95761207560646115d7601e60065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b68105136d13bd094000082101580156120fb57506890784df439900400008211155b156121325761207560646115d7602360065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b61207560646115d7603260065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b5b5b5b919050565b600354600160a060020a031681565b60025433600160a060020a0390811691161461219657600080fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b600b5481565b60195481565b60015460009033600160a060020a03908116911614806121f0575060025433600160a060020a039081169116145b15156121fb57600080fd5b428211801561220b575060045482115b156112155750600480546005805491840390910190558190556001611219565b5060005b5b919050565b60045481565b600a5481565b6001546000908190819033600160a060020a0390811691161480612273575060025433600160a060020a039081169116145b151561227e57600080fd5b6011546000901161228e57600080fd5b600160a060020a038416600090815260106020526040902054849015156122b457600080fd5b600160a060020a0385166000908152601060205260409020546007549093506122e3908463ffffffff610ae716565b6007556000805460019350600160a060020a03169063237d262890879086908690604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561234b57fe5b60ff1681526020019350505050602060405180830381600087803b151561237157600080fd5b6102c65a03f1151561238257600080fd5b50505060405180519050151561239757600080fd5b60118054600019019055600160a060020a038516600090815260106020526040812055600193505b5b505b5b5050919050565b60145481565b60085481565b601b5481565b60095481565b600c5481565b600061241160646115d76064601c5461264090919063ffffffff16565b9063ffffffff61266f16565b61243860646115d76096601b5461264090919063ffffffff16565b9063ffffffff61266f16565b61245f60646115d760be601a5461264090919063ffffffff16565b9063ffffffff61266f16565b61248660646115d760dc60195461264090919063ffffffff16565b9063ffffffff61266f16565b01010190505b90565b600154600160a060020a031681565b600054600160a060020a031681565b60006005548211156124c157506000611219565b8160045411156124d357506000611219565b601454600d541161250c5761250560646115d7607860065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b601454600d54118015612534575060145461252e90600263ffffffff61264016565b600d5411155b156125675761250560646115d7608260065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b60145461257b90600263ffffffff61264016565b600d541180156125a0575060145461259a90600363ffffffff61264016565b600d5411155b156125d35761250560646115d7608c60065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b6014546125e790600363ffffffff61264016565b600d541180156125fb5750600a54600d5411155b1561262e5761250560646115d7609660065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b50600654611219565b5b5b5b5b919050565b600082820283158061265c575082848281151561265957fe5b04145b1515610af657fe5b8091505b5092915050565b600080828481151561267d57fe5b0490508091505b5092915050565b60008282111561269757fe5b508082035b92915050565b6000806126ba83600754610ae790919063ffffffff16565b6007555060008054600291600160a060020a039091169063237d262890869086908590604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561272457fe5b60ff1681526020019350505050602060405180830381600087803b151561274a57600080fd5b6102c65a03f1151561275b57600080fd5b50505060405180519050151561277057600080fd5b600191505b50929150505600a165627a7a723058203a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f4380029
Deployed Bytecode
0x606060405236156101f35763ffffffff60e060020a60003504166307df3fa481146104455780630b1aff481461046a5780630c6c9036146104945780631485ffc4146104c6578063152e84a7146104db5780631c054b141461050057806324c4c9e4146105255780632a2729741461054a5780633cc0048f1461056f57806343581c80146105a057806347c8cc69146105c55780634bfa0d11146105ea5780634e77a38e1461060f57806351290d0614610624578063540cf75e146106535780635a32d0701461068457806365e16933146106ab5780636b0f182e146106e45780636d156add146107055780636eaefc871461071a57806371f115521461073f5780637374b013146107605780637e569e661461079957806385d51d19146107be5780638efa00e2146107ef578063903cc583146108175780639199a8bb14610842578063941993f814610871578063949eabff146108925780639e90ce6c146108b7578063a1bc76d1146108dc578063a785b96a14610906578063af20b9641461092b578063cd9679dd14610950578063d1b1b65a14610983578063d903c5ae146109a8578063d951d39a146109cd578063e0f4a1a2146109f2578063e380575a14610a17578063ee73c11714610a3c578063f05aa33414610a61578063fa508d3e14610a90578063fed0311814610abf575b5b6004544210801561020757506009543410155b80156102295750600160a060020a033316600090815260106020526040902054155b1561041657600160a060020a0333166000908152600e6020526040902054610257903463ffffffff610ae716565b600160a060020a0333166000908152600e6020526040902055600b54610283903463ffffffff610ae716565b600b55600c54610299903463ffffffff610ae716565b600c556102ce6102a93442610b01565b600160a060020a0333166000908152601060205260409020549063ffffffff610ae716565b600160a060020a0333166000908152601060205260409020556102f13442610b01565b60128054909101905560118054600101905560008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561034c57600080fd5b6102c65a03f1151561035d57600080fd5b505050604051805160008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103b357600080fd5b6102c65a03f115156103c457600080fd5b505050604051805190500160125411156103dd57600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561041157600080fd5b610441565b6004544210158015610429575060055442105b1561043c57610436610b43565b50610441565b600080fd5b5b5b005b341561045057600080fd5b6104586111b4565b60405190815260200160405180910390f35b341561047557600080fd5b6104806004356111ba565b604051901515815260200160405180910390f35b341561049f57600080fd5b6104aa60043561121f565b604051600160a060020a03909116815260200160405180910390f35b34156104d157600080fd5b61044161123a565b005b34156104e657600080fd5b610458611490565b60405190815260200160405180910390f35b341561050b57600080fd5b610458611496565b60405190815260200160405180910390f35b341561053057600080fd5b61045861149c565b60405190815260200160405180910390f35b341561055557600080fd5b6104586114ad565b60405190815260200160405180910390f35b341561057a57600080fd5b610458600160a060020a03600435166114b3565b60405190815260200160405180910390f35b34156105ab57600080fd5b6104586114c5565b60405190815260200160405180910390f35b34156105d057600080fd5b6104586114cb565b60405190815260200160405180910390f35b34156105f557600080fd5b6104586114dc565b60405190815260200160405180910390f35b341561061a57600080fd5b6104416114e2565b005b341561062f57600080fd5b6104aa611b3a565b604051600160a060020a03909116815260200160405180910390f35b341561065e57600080fd5b610458600160a060020a0360043516611b49565b60405190815260200160405180910390f35b341561068f57600080fd5b610480611b68565b604051901515815260200160405180910390f35b34156106b657600080fd5b610480600160a060020a0360043516602435604435611b71565b604051901515815260200160405180910390f35b34156106ef57600080fd5b610441600160a060020a0360043516611cd3565b005b341561071057600080fd5b610441611d0e565b005b341561072557600080fd5b610458611e18565b60405190815260200160405180910390f35b341561074a57600080fd5b610441600160a060020a0360043516611e1e565b005b341561076b57600080fd5b610480600160a060020a0360043516602435604435611e74565b604051901515815260200160405180910390f35b34156107a457600080fd5b610458611ff5565b60405190815260200160405180910390f35b34156107c957600080fd5b610458600160a060020a0360043516611ffb565b60405190815260200160405180910390f35b34156107fa57600080fd5b61045860043561201a565b60405190815260200160405180910390f35b341561082257600080fd5b610458600435602435610b01565b60405190815260200160405180910390f35b341561084d57600080fd5b6104aa61216c565b604051600160a060020a03909116815260200160405180910390f35b341561087c57600080fd5b610441600160a060020a036004351661217b565b005b341561089d57600080fd5b6104586121b6565b60405190815260200160405180910390f35b34156108c257600080fd5b6104586121bc565b60405190815260200160405180910390f35b34156108e757600080fd5b6104806004356121c2565b604051901515815260200160405180910390f35b341561091157600080fd5b610458612235565b60405190815260200160405180910390f35b341561093657600080fd5b61045861223b565b60405190815260200160405180910390f35b341561095b57600080fd5b610480600160a060020a0360043516612241565b604051901515815260200160405180910390f35b341561098e57600080fd5b6104586123ca565b60405190815260200160405180910390f35b34156109b357600080fd5b6104586123d0565b60405190815260200160405180910390f35b34156109d857600080fd5b6104586123d6565b60405190815260200160405180910390f35b34156109fd57600080fd5b6104586123dc565b60405190815260200160405180910390f35b3415610a2257600080fd5b6104586123e2565b60405190815260200160405180910390f35b3415610a4757600080fd5b6104586123e8565b60405190815260200160405180910390f35b3415610a6c57600080fd5b6104aa61248f565b604051600160a060020a03909116815260200160405180910390f35b3415610a9b57600080fd5b6104aa61249e565b604051600160a060020a03909116815260200160405180910390f35b3415610aca57600080fd5b6104586004356124ad565b60405190815260200160405180910390f35b600082820183811015610af657fe5b8091505b5092915050565b600080610b36600454841015610b1f57610b1a8561201a565b610b28565b610b28846124ad565b5b859063ffffffff61264016565b90508091505b5092915050565b6000806000806008543410151515610b5a57600080fd5b600b54600a543490910190811115610b7157600080fd5b6000610b7b6123e8565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bc957600080fd5b6102c65a03f11515610bda57600080fd5b505050604051805182109050610bef57600080fd5b610bf93442610b01565b601454909550610c1090600363ffffffff61264016565b600d54118015610c245750600a54600d5411155b15610c9657600160a060020a0333166000908152601860205260409020541515610c9157600d54600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454610caa90600263ffffffff61264016565b600d54118015610ccf5750601454610cc990600363ffffffff61264016565b600d5411155b15610d5257600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600363ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d54118015610d7a5750601454610d7490600263ffffffff61264016565b600d5411155b15610dfd57600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600263ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d5411610e7057600160a060020a0333166000908152601860205260409020541515610e7057601454600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b5b5b5b5b600d54600160a060020a0333166000908152601860205260409020541415610eb157601c54610ea9908663ffffffff610ae716565b601c55610f86565b601454610ec590600363ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610eff57601b54610ef7908663ffffffff610ae716565b601b55610f86565b601454610f1390600263ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610f4d57601a54610f45908663ffffffff610ae716565b601a55610f86565b601454600160a060020a0333166000908152601860205260409020541415610f8657601954610f82908663ffffffff610ae716565b6019555b5b5b5b610f916123e8565b60008054919550600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fdf57600080fd5b6102c65a03f11515610ff057600080fd5b5050506040518051905084111561100657600080fd5b600754611019908663ffffffff610ae716565b600755600160a060020a0333166000908152600e6020526040902054611045903463ffffffff610ae716565b600160a060020a0333166000908152600e6020908152604080832093909355600f9052205461107a908663ffffffff610ae716565b600160a060020a0333166000908152600f6020526040902055600b546110a6903463ffffffff610ae716565b600b55600d546110bc903463ffffffff610ae716565b600d556000805460029450600160a060020a03169063237d262890339088908790604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561112457fe5b60ff1681526020019350505050602060405180830381600087803b151561114a57600080fd5b6102c65a03f1151561115b57600080fd5b50505060405180519050151561117057600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f1935050505015156111a457600080fd5b600195505b5b505b505b50505090565b601c5481565b60015460009033600160a060020a03908116911614806111e8575060025433600160a060020a039081169116145b15156111f357600080fd5b4282118015611203575060055482115b15611215575060058190556001611219565b5060005b5b919050565b601760205260009081526040902054600160a060020a031681565b60015433600160a060020a0390811691161480611265575060025433600160a060020a039081169116145b151561127057600080fd5b600554421015806112855750600a54600b5410155b151561129057600080fd5b60008054600160a060020a03169063a1feba4290604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112d957600080fd5b6102c65a03f115156112ea57600080fd5b5050506040518051151560011490508015611366575060008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561134957600080fd5b6102c65a03f1151561135a57600080fd5b50505060405180511590505b151561137157600080fd5b6113796114e2565b600054600160a060020a031663f968f4936040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b857600080fd5b6102c65a03f115156113c957600080fd5b505060008054600160a060020a031691506356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561141557600080fd5b6102c65a03f1151561142657600080fd5b505050604051805160078054909101905550600054600160a060020a03166359b796106040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60075481565b60155481565b60006114a74261201a565b90505b90565b601a5481565b60186020526000908152604090205481565b600d5481565b60006114a7426124ad565b90505b90565b60055481565b60015460009081908190819033600160a060020a0390811691161480611516575060025433600160a060020a039081169116145b151561152157600080fd5b60135460ff161515611b3257506002925060005b601654811015611b245760009150601454600d5411801561156b575060145461156590600263ffffffff61264016565b600d5411155b156116b057600081815260176020908152604080832054601454600160a060020a03909116808552601890935292205490945014156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608263ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546116c490600263ffffffff61264016565b600d541180156116e957506014546116e390600363ffffffff61264016565b600d5411155b156118b457600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561177457600160a060020a0383166000908152600f602052604090205461176d906115e360646115d78360aa63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91506115f2565b60145461178890600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608c63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546118c890600363ffffffff61264016565b600d541115611b1857600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561195757600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360dc63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b60145461196b90600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156119dc57600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360be63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b6014546119f090600363ffffffff61264016565b600160a060020a0384166000908152601860205260409020541415611a5d57600160a060020a0383166000908152600f6020526040902054611a5a906115e360646115d783609663ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b5b600082118015611b0e575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001826006811115611acb57fe5b60ff1681526020019350505050602060405180830381600087803b1515611af157600080fd5b6102c65a03f11515611b0257600080fd5b50505060405180519050155b15611b1857600080fd5b5b5b5b5b600101611535565b6013805460ff191660011790555b5b5b50505050565b600254600160a060020a031681565b600160a060020a0381166000908152601060205260409020545b919050565b60135460ff1681565b60015460009033600160a060020a0390811691161480611b9f575060025433600160a060020a039081169116145b1515611baa57600080fd5b600160a060020a038416600090815260106020526040902054849015611bcf57600080fd5b600160a060020a0385166000908152600f6020526040902054611bf8908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611c2d908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611c59908563ffffffff610ae716565b600b55600c54611c6f908563ffffffff610ae716565b600c55600160a060020a038516600090815260106020526040902054611c9b908463ffffffff610ae716565b600160a060020a038616600090815260106020526040902055601180546001019055611cc685612241565b91505b5b505b9392505050565b60015433600160a060020a03908116911614611cee57600080fd5b60018054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a0390811691161480611d39575060025433600160a060020a039081169116145b1515611d4457600080fd5b60115415611d5157600080fd5b60008054600160a060020a031663c269f26382604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b50505060405180519050111515611dc057600080fd5b600054600160a060020a031663ce21abf36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60065481565b60015433600160a060020a0390811691161480611e49575060025433600160a060020a039081169116145b1515611e5457600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600154600090819033600160a060020a0390811691161480611ea4575060025433600160a060020a039081169116145b1515611eaf57600080fd5b611ec7611eba6123e8565b849063ffffffff610ae716565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611f1557600080fd5b6102c65a03f11515611f2657600080fd5b50505060405180519050811115611f3c57600080fd5b600160a060020a0385166000908152600f6020526040902054611f65908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611f9a908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611fc6908563ffffffff610ae716565b600b55600d54611fdc908563ffffffff610ae716565b600d55611cc685846126a2565b91505b5b509392505050565b60165481565b600160a060020a0381166000908152600e60205260409020545b919050565b600060095482101561202e57506000611219565b60095482101580156120495750680ac9ae05a71ebc00008211155b156120805761207560646115d7601960065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b680ad78ebc5ac620000082101580156120a25750681043561a88293000008211155b156120d95761207560646115d7601e60065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b68105136d13bd094000082101580156120fb57506890784df439900400008211155b156121325761207560646115d7602360065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b61207560646115d7603260065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b5b5b5b919050565b600354600160a060020a031681565b60025433600160a060020a0390811691161461219657600080fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b600b5481565b60195481565b60015460009033600160a060020a03908116911614806121f0575060025433600160a060020a039081169116145b15156121fb57600080fd5b428211801561220b575060045482115b156112155750600480546005805491840390910190558190556001611219565b5060005b5b919050565b60045481565b600a5481565b6001546000908190819033600160a060020a0390811691161480612273575060025433600160a060020a039081169116145b151561227e57600080fd5b6011546000901161228e57600080fd5b600160a060020a038416600090815260106020526040902054849015156122b457600080fd5b600160a060020a0385166000908152601060205260409020546007549093506122e3908463ffffffff610ae716565b6007556000805460019350600160a060020a03169063237d262890879086908690604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561234b57fe5b60ff1681526020019350505050602060405180830381600087803b151561237157600080fd5b6102c65a03f1151561238257600080fd5b50505060405180519050151561239757600080fd5b60118054600019019055600160a060020a038516600090815260106020526040812055600193505b5b505b5b5050919050565b60145481565b60085481565b601b5481565b60095481565b600c5481565b600061241160646115d76064601c5461264090919063ffffffff16565b9063ffffffff61266f16565b61243860646115d76096601b5461264090919063ffffffff16565b9063ffffffff61266f16565b61245f60646115d760be601a5461264090919063ffffffff16565b9063ffffffff61266f16565b61248660646115d760dc60195461264090919063ffffffff16565b9063ffffffff61266f16565b01010190505b90565b600154600160a060020a031681565b600054600160a060020a031681565b60006005548211156124c157506000611219565b8160045411156124d357506000611219565b601454600d541161250c5761250560646115d7607860065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b601454600d54118015612534575060145461252e90600263ffffffff61264016565b600d5411155b156125675761250560646115d7608260065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b60145461257b90600263ffffffff61264016565b600d541180156125a0575060145461259a90600363ffffffff61264016565b600d5411155b156125d35761250560646115d7608c60065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b6014546125e790600363ffffffff61264016565b600d541180156125fb5750600a54600d5411155b1561262e5761250560646115d7609660065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b50600654611219565b5b5b5b5b919050565b600082820283158061265c575082848281151561265957fe5b04145b1515610af657fe5b8091505b5092915050565b600080828481151561267d57fe5b0490508091505b5092915050565b60008282111561269757fe5b508082035b92915050565b6000806126ba83600754610ae790919063ffffffff16565b6007555060008054600291600160a060020a039091169063237d262890869086908590604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561272457fe5b60ff1681526020019350505050602060405180830381600087803b151561274a57600080fd5b6102c65a03f1151561275b57600080fd5b50505060405180519050151561277057600080fd5b600191505b50929150505600a165627a7a723058203a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f4380029
Swarm Source
bzzr://3a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f438
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 ]
[ 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.