Contract Overview
Transactions:
110 txns
TokenTracker:
Latest 25 transactions from a total of 110 transactions
[ Download CSV Export ]
Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name: | JavvyCrowdsale |
Compiler Version: | v0.4.25+commit.59dbf8f1 |
Optimization Enabled: | Yes |
Runs (Optimizer): | 200 |
Contract Source Code
pragma solidity ^0.4.24; library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure 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 _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } contract Config { uint256 public constant jvySupply = 333333333333333; uint256 public constant bonusSupply = 83333333333333; uint256 public constant saleSupply = 250000000000000; uint256 public constant hardCapUSD = 8000000; uint256 public constant preIcoBonus = 25; uint256 public constant minimalContributionAmount = 0.4 ether; function getStartPreIco() public view returns (uint256) { // solium-disable-next-line security/no-block-members uint256 nowTime = block.timestamp; uint256 _preIcoStartTime = nowTime + 1 minutes; return _preIcoStartTime; } function getStartIco() public view returns (uint256) { uint256 _icoStartTime = 1543554000; return _icoStartTime; } function getEndIco() public view returns (uint256) { uint256 _icoEndTime = 1551416400; return _icoEndTime; } } contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } contract DetailedERC20 is ERC20 { string public name; string public symbol; uint8 public decimals; constructor(string _name, string _symbol, uint8 _decimals) public { name = _name; symbol = _symbol; decimals = _decimals; } } contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) internal balances; uint256 internal totalSupply_; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @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) public returns (bool) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit 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) public view returns (uint256) { return balances[_owner]; } } contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal 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 ) public returns (bool) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit 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 ) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a 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 * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } contract Escrow is Ownable { using SafeMath for uint256; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private deposits; function depositsOf(address _payee) public view returns (uint256) { return deposits[_payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param _payee The destination address of the funds. */ function deposit(address _payee) public onlyOwner payable { uint256 amount = msg.value; deposits[_payee] = deposits[_payee].add(amount); emit Deposited(_payee, amount); } /** * @dev Withdraw accumulated balance for a payee. * @param _payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address _payee) public onlyOwner { uint256 payment = deposits[_payee]; assert(address(this).balance >= payment); deposits[_payee] = 0; _payee.transfer(payment); emit Withdrawn(_payee, payment); } } contract Crowdsale { using SafeMath for uint256; using SafeERC20 for ERC20; // The token being sold ERC20 public token; // Address where funds are collected address public wallet; // How many token units a buyer gets per wei. // The rate is the conversion between wei and the smallest and indivisible token unit. // So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK // 1 wei will give you 1 unit, or 0.001 TOK. uint256 public rate; // Amount of wei raised uint256 public weiRaised; /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokenPurchase( address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount ); /** * @param _rate Number of token units a buyer gets per wei * @param _wallet Address where collected funds will be forwarded to * @param _token Address of the token being sold */ constructor(uint256 _rate, address _wallet, ERC20 _token) public { require(_rate > 0); require(_wallet != address(0)); require(_token != address(0)); rate = _rate; wallet = _wallet; token = _token; } // ----------------------------------------- // Crowdsale external interface // ----------------------------------------- /** * @dev fallback function ***DO NOT OVERRIDE*** */ function () external payable { buyTokens(msg.sender); } /** * @dev low level token purchase ***DO NOT OVERRIDE*** * @param _beneficiary Address performing the token purchase */ function buyTokens(address _beneficiary) public payable { uint256 weiAmount = msg.value; _preValidatePurchase(_beneficiary, weiAmount); // calculate token amount to be created uint256 tokens = _getTokenAmount(weiAmount); // update state weiRaised = weiRaised.add(weiAmount); _processPurchase(_beneficiary, tokens); emit TokenPurchase( msg.sender, _beneficiary, weiAmount, tokens ); _updatePurchasingState(_beneficiary, weiAmount); _forwardFunds(); _postValidatePurchase(_beneficiary, weiAmount); } // ----------------------------------------- // Internal interface (extensible) // ----------------------------------------- /** * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. Use `super` in contracts that inherit from Crowdsale to extend their validations. * Example from CappedCrowdsale.sol's _preValidatePurchase method: * super._preValidatePurchase(_beneficiary, _weiAmount); * require(weiRaised.add(_weiAmount) <= cap); * @param _beneficiary Address performing the token purchase * @param _weiAmount Value in wei involved in the purchase */ function _preValidatePurchase( address _beneficiary, uint256 _weiAmount ) internal { require(_beneficiary != address(0)); require(_weiAmount != 0); } /** * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met. * @param _beneficiary Address performing the token purchase * @param _weiAmount Value in wei involved in the purchase */ function _postValidatePurchase( address _beneficiary, uint256 _weiAmount ) internal { // optional override } /** * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens. * @param _beneficiary Address performing the token purchase * @param _tokenAmount Number of tokens to be emitted */ function _deliverTokens( address _beneficiary, uint256 _tokenAmount ) internal { token.safeTransfer(_beneficiary, _tokenAmount); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens. * @param _beneficiary Address receiving the tokens * @param _tokenAmount Number of tokens to be purchased */ function _processPurchase( address _beneficiary, uint256 _tokenAmount ) internal { _deliverTokens(_beneficiary, _tokenAmount); } /** * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.) * @param _beneficiary Address receiving the tokens * @param _weiAmount Value in wei involved in the purchase */ function _updatePurchasingState( address _beneficiary, uint256 _weiAmount ) internal { // optional override } /** * @dev Override to extend the way in which ether is converted to tokens. * @param _weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) { return _weiAmount.mul(rate); } /** * @dev Determines how ETH is stored/forwarded on purchases. */ function _forwardFunds() internal { wallet.transfer(msg.value); } } contract ConditionalEscrow is Escrow { /** * @dev Returns whether an address is allowed to withdraw their funds. To be * implemented by derived contracts. * @param _payee The destination address of the funds. */ function withdrawalAllowed(address _payee) public view returns (bool); function withdraw(address _payee) public { require(withdrawalAllowed(_payee)); super.withdraw(_payee); } } contract RefundEscrow is Ownable, ConditionalEscrow { enum State { Active, Refunding, Closed } event Closed(); event RefundsEnabled(); State public state; address public beneficiary; /** * @dev Constructor. * @param _beneficiary The beneficiary of the deposits. */ constructor(address _beneficiary) public { require(_beneficiary != address(0)); beneficiary = _beneficiary; state = State.Active; } /** * @dev Stores funds that may later be refunded. * @param _refundee The address funds will be sent to if a refund occurs. */ function deposit(address _refundee) public payable { require(state == State.Active); super.deposit(_refundee); } /** * @dev Allows for the beneficiary to withdraw their funds, rejecting * further deposits. */ function close() public onlyOwner { require(state == State.Active); state = State.Closed; emit Closed(); } /** * @dev Allows for refunds to take place, rejecting further deposits. */ function enableRefunds() public onlyOwner { require(state == State.Active); state = State.Refunding; emit RefundsEnabled(); } /** * @dev Withdraws the beneficiary's funds. */ function beneficiaryWithdraw() public { require(state == State.Closed); beneficiary.transfer(address(this).balance); } /** * @dev Returns whether refundees can withdraw their deposits (be refunded). */ function withdrawalAllowed(address _payee) public view returns (bool) { return state == State.Refunding; } } library SafeERC20 { function safeTransfer( ERC20Basic _token, address _to, uint256 _value ) internal { require(_token.transfer(_to, _value)); } function safeTransferFrom( ERC20 _token, address _from, address _to, uint256 _value ) internal { require(_token.transferFrom(_from, _to, _value)); } function safeApprove( ERC20 _token, address _spender, uint256 _value ) internal { require(_token.approve(_spender, _value)); } } contract CappedCrowdsale is Crowdsale { using SafeMath for uint256; uint256 public cap; /** * @dev Constructor, takes maximum amount of wei accepted in the crowdsale. * @param _cap Max amount of wei to be contributed */ constructor(uint256 _cap) public { require(_cap > 0); cap = _cap; } /** * @dev Checks whether the cap has been reached. * @return Whether the cap was reached */ function capReached() public view returns (bool) { return weiRaised >= cap; } /** * @dev Extend parent behavior requiring purchase to respect the funding cap. * @param _beneficiary Token purchaser * @param _weiAmount Amount of wei contributed */ function _preValidatePurchase( address _beneficiary, uint256 _weiAmount ) internal { super._preValidatePurchase(_beneficiary, _weiAmount); require(weiRaised.add(_weiAmount) <= cap); } } contract TimedCrowdsale is Crowdsale { using SafeMath for uint256; uint256 public openingTime; uint256 public closingTime; /** * @dev Reverts if not in crowdsale time range. */ modifier onlyWhileOpen { // solium-disable-next-line security/no-block-members require(block.timestamp >= openingTime && block.timestamp <= closingTime); _; } /** * @dev Constructor, takes crowdsale opening and closing times. * @param _openingTime Crowdsale opening time * @param _closingTime Crowdsale closing time */ constructor(uint256 _openingTime, uint256 _closingTime) public { // solium-disable-next-line security/no-block-members require(_openingTime >= block.timestamp); require(_closingTime >= _openingTime); openingTime = _openingTime; closingTime = _closingTime; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view returns (bool) { // solium-disable-next-line security/no-block-members return block.timestamp > closingTime; } /** * @dev Extend parent behavior requiring to be within contributing period * @param _beneficiary Token purchaser * @param _weiAmount Amount of wei contributed */ function _preValidatePurchase( address _beneficiary, uint256 _weiAmount ) internal onlyWhileOpen { super._preValidatePurchase(_beneficiary, _weiAmount); } } contract FinalizableCrowdsale is Ownable, TimedCrowdsale { using SafeMath for uint256; bool public isFinalized = false; event Finalized(); /** * @dev Must be called after crowdsale ends, to do some extra finalization * work. Calls the contract's finalization function. */ function finalize() public onlyOwner { require(!isFinalized); require(hasClosed()); finalization(); emit Finalized(); isFinalized = true; } /** * @dev Can be overridden to add finalization logic. The overriding function * should call super.finalization() to ensure the chain of finalization is * executed entirely. */ function finalization() internal { } } contract RefundableCrowdsale is FinalizableCrowdsale { using SafeMath for uint256; // minimum amount of funds to be raised in weis uint256 public goal; // refund escrow used to hold funds while crowdsale is running RefundEscrow private escrow; /** * @dev Constructor, creates RefundEscrow. * @param _goal Funding goal */ constructor(uint256 _goal) public { require(_goal > 0); escrow = new RefundEscrow(wallet); goal = _goal; } /** * @dev Investors can claim refunds here if crowdsale is unsuccessful */ function claimRefund() public { require(isFinalized); require(!goalReached()); escrow.withdraw(msg.sender); } /** * @dev Checks whether funding goal was reached. * @return Whether funding goal was reached */ function goalReached() public view returns (bool) { return weiRaised >= goal; } /** * @dev escrow finalization task, called when owner calls finalize() */ function finalization() internal { if (goalReached()) { escrow.close(); escrow.beneficiaryWithdraw(); } else { escrow.enableRefunds(); } super.finalization(); } /** * @dev Overrides Crowdsale fund forwarding, sending funds to escrow. */ function _forwardFunds() internal { escrow.deposit.value(msg.value)(msg.sender); } } contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } contract MultiSigWallet { uint constant public MAX_OWNER_COUNT = 50; event Confirmation(address indexed sender, uint indexed transactionId); event Revocation(address indexed sender, uint indexed transactionId); event Submission(uint indexed transactionId); event Execution(uint indexed transactionId); event ExecutionFailure(uint indexed transactionId); event Deposit(address indexed sender, uint value); event OwnerAddition(address indexed owner); event OwnerRemoval(address indexed owner); event RequirementChange(uint required); mapping (uint => Transaction) public transactions; mapping (uint => mapping (address => bool)) public confirmations; mapping (address => bool) public isOwner; address[] public owners; uint public required; uint public transactionCount; struct Transaction { address destination; uint value; bytes data; bool executed; } modifier onlyWallet() { require(msg.sender == address(this)); _; } modifier ownerDoesNotExist(address owner) { require(!isOwner[owner]); _; } modifier ownerExists(address owner) { require(isOwner[owner]); _; } modifier transactionExists(uint transactionId) { require(transactions[transactionId].destination != 0); _; } modifier confirmed(uint transactionId, address owner) { require(confirmations[transactionId][owner]); _; } modifier notConfirmed(uint transactionId, address owner) { require(!confirmations[transactionId][owner]); _; } modifier notExecuted(uint transactionId) { require(!transactions[transactionId].executed); _; } modifier notNull(address _address) { require(_address != address(0)); _; } modifier validRequirement(uint ownerCount, uint _required) { bool ownerValid = ownerCount <= MAX_OWNER_COUNT; bool ownerNotZero = ownerCount != 0; bool requiredValid = _required <= ownerCount; bool requiredNotZero = _required != 0; require(ownerValid && ownerNotZero && requiredValid && requiredNotZero); _; } /// @dev Fallback function allows to deposit ether. function() payable public { fallback(); } function fallback() payable public { if (msg.value > 0) { emit Deposit(msg.sender, msg.value); } } /* * Public functions */ /// @dev Contract constructor sets initial owners and required number of confirmations. /// @param _owners List of initial owners. /// @param _required Number of required confirmations. constructor( address[] _owners, uint _required ) public validRequirement(_owners.length, _required) { for (uint i = 0; i<_owners.length; i++) { require(!isOwner[_owners[i]] && _owners[i] != 0); isOwner[_owners[i]] = true; } owners = _owners; required = _required; } /// @dev Allows to add a new owner. Transaction has to be sent by wallet. /// @param owner Address of new owner. function addOwner(address owner) public onlyWallet ownerDoesNotExist(owner) notNull(owner) validRequirement(owners.length + 1, required) { isOwner[owner] = true; owners.push(owner); emit OwnerAddition(owner); } /// @dev Allows to remove an owner. Transaction has to be sent by wallet. /// @param owner Address of owner. function removeOwner(address owner) public onlyWallet ownerExists(owner) { isOwner[owner] = false; for (uint i = 0; i < owners.length - 1; i++) if (owners[i] == owner) { owners[i] = owners[owners.length - 1]; break; } owners.length -= 1; if (required > owners.length) changeRequirement(owners.length); emit OwnerRemoval(owner); } /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet. /// @param owner Address of owner to be replaced. /// @param newOwner Address of new owner. function replaceOwner(address owner, address newOwner) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { for (uint i = 0; i < owners.length; i++) if (owners[i] == owner) { owners[i] = newOwner; break; } isOwner[owner] = false; isOwner[newOwner] = true; emit OwnerRemoval(owner); emit OwnerAddition(newOwner); } /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet. /// @param _required Number of required confirmations. function changeRequirement(uint _required) public onlyWallet validRequirement(owners.length, _required) { required = _required; emit RequirementChange(_required); } /// @dev Allows an owner to submit and confirm a transaction. /// @param destination Transaction target address. /// @param value Transaction ether value. /// @param data Transaction data payload. /// @return Returns transaction ID. function submitTransaction(address destination, uint value, bytes data) public returns (uint transactionId) { transactionId = addTransaction(destination, value, data); confirmTransaction(transactionId); } /// @dev Allows an owner to confirm a transaction. /// @param transactionId Transaction ID. function confirmTransaction(uint transactionId) public ownerExists(msg.sender) transactionExists(transactionId) notConfirmed(transactionId, msg.sender) { confirmations[transactionId][msg.sender] = true; emit Confirmation(msg.sender, transactionId); executeTransaction(transactionId); } /// @dev Allows an owner to revoke a confirmation for a transaction. /// @param transactionId Transaction ID. function revokeConfirmation(uint transactionId) public ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { confirmations[transactionId][msg.sender] = false; emit Revocation(msg.sender, transactionId); } /// @dev Allows anyone to execute a confirmed transaction. /// @param transactionId Transaction ID. function executeTransaction(uint transactionId) public ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { if (isConfirmed(transactionId)) { Transaction storage txn = transactions[transactionId]; txn.executed = true; if (txn.destination.call.value(txn.value)(txn.data)) emit Execution(transactionId); else { emit ExecutionFailure(transactionId); txn.executed = false; } } } /// @dev Returns the confirmation status of a transaction. /// @param transactionId Transaction ID. /// @return Confirmation status. function isConfirmed(uint transactionId) public view returns (bool) { uint count = 0; for (uint i = 0; i < owners.length; i++) { if (confirmations[transactionId][owners[i]]) count += 1; if (count == required) return true; } } /* * Internal functions */ /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet. /// @param destination Transaction target address. /// @param value Transaction ether value. /// @param data Transaction data payload. /// @return Returns transaction ID. function addTransaction(address destination, uint value, bytes data) internal notNull(destination) returns (uint transactionId) { transactionId = transactionCount; transactions[transactionId] = Transaction({ destination: destination, value: value, data: data, executed: false }); transactionCount += 1; emit Submission(transactionId); } /* * Web3 call functions */ /// @dev Returns number of confirmations of a transaction. /// @param transactionId Transaction ID. /// @return Number of confirmations. function getConfirmationCount(uint transactionId) public view returns (uint count) { for (uint i = 0; i < owners.length; i++) { if (confirmations[transactionId][owners[i]]) { count += 1; } } } /// @dev Returns total number of transactions after filers are applied. /// @param pending Include pending transactions. /// @param executed Include executed transactions. /// @return Total number of transactions after filters are applied. function getTransactionCount( bool pending, bool executed ) public view returns (uint count) { for (uint i = 0; i < transactionCount; i++) { if (pending && !transactions[i].executed || executed && transactions[i].executed ) { count += 1; } } } /// @dev Returns list of owners. /// @return List of owner addresses. function getOwners() public view returns (address[]) { return owners; } /// @dev Returns array with owner addresses, which confirmed transaction. /// @param transactionId Transaction ID. /// @return Returns array of owner addresses. function getConfirmations( uint transactionId ) public view returns (address[] _confirmations) { address[] memory confirmationsTemp = new address[](owners.length); uint count = 0; uint i; for (i = 0; i < owners.length; i++) if (confirmations[transactionId][owners[i]]) { confirmationsTemp[count] = owners[i]; count += 1; } _confirmations = new address[](count); for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; } /// @dev Returns list of transaction IDs in defined range. /// @param from Index start position of transaction array. /// @param to Index end position of transaction array. /// @param pending Include pending transactions. /// @param executed Include executed transactions. /// @return Returns array of transaction IDs. function getTransactionIds( uint from, uint to, bool pending, bool executed ) public view returns (uint[] _transactionIds) { uint[] memory transactionIdsTemp = new uint[](transactionCount); uint count = 0; uint i; for (i = 0; i < transactionCount; i++) if (pending && !transactions[i].executed || executed && transactions[i].executed ) { transactionIdsTemp[count] = i; count += 1; } _transactionIds = new uint[](to - from); for (i = from; i < to; i++) _transactionIds[i - from] = transactionIdsTemp[i]; } } contract JavvyMultiSig is MultiSigWallet { constructor( address[] _owners, uint _required ) MultiSigWallet(_owners, _required) public {} } contract JavvyToken is DetailedERC20, StandardToken, Ownable, Config { address public crowdsaleAddress; address public bonusAddress; address public multiSigAddress; constructor( string _name, string _symbol, uint8 _decimals ) public DetailedERC20(_name, _symbol, _decimals) { require( jvySupply == saleSupply + bonusSupply, "Sum of provided supplies is not equal to declared total Javvy supply. Check config!" ); totalSupply_ = tokenToDecimals(jvySupply); } function initializeBalances( address _crowdsaleAddress, address _bonusAddress, address _multiSigAddress ) public onlyOwner() { crowdsaleAddress = _crowdsaleAddress; bonusAddress = _bonusAddress; multiSigAddress = _multiSigAddress; _initializeBalance(_crowdsaleAddress, saleSupply); _initializeBalance(_bonusAddress, bonusSupply); } function _initializeBalance(address _address, uint256 _supply) private { require(_address != address(0), "Address cannot be equal to 0x0!"); require(_supply != 0, "Supply cannot be equal to 0!"); balances[_address] = tokenToDecimals(_supply); emit Transfer(address(0), _address, _supply); } function tokenToDecimals(uint256 _amount) private view returns (uint256){ // NOTE for additional accuracy, we're using 6 decimal places in supply return _amount * (10 ** 12); } function getRemainingSaleTokens() external view returns (uint256) { return balanceOf(crowdsaleAddress); } } contract JavvyCrowdsale is RefundableCrowdsale, CappedCrowdsale, Pausable, Config { uint256 public icoStartTime; address public transminingAddress; address public bonusAddress; uint256 private USDETHRate; mapping (address => bool) public blacklisted; JavvyToken token; enum Stage { NotStarted, PreICO, ICO, AfterICO } function getStage() public view returns (Stage) { // solium-disable-next-line security/no-block-members uint256 blockTime = block.timestamp; if (blockTime < openingTime) return Stage.NotStarted; if (blockTime < icoStartTime) return Stage.PreICO; if (blockTime < closingTime) return Stage.ICO; else return Stage.AfterICO; } constructor( uint256 _rate, JavvyMultiSig _wallet, JavvyToken _token, uint256 _cap, // Should be in USD! uint256 _goal, address _bonusAddress, address[] _blacklistAddresses, uint256 _USDETHRate ) Crowdsale(_rate, _wallet, _token) CappedCrowdsale(_cap) TimedCrowdsale(getStartPreIco(), getEndIco()) RefundableCrowdsale(_goal) public { require(getStartIco() > block.timestamp, "ICO has to begin in the future"); require(getEndIco() > block.timestamp, "ICO has to end in the future"); require(_goal <= _cap, "Soft cap should be equal or smaller than hard cap"); icoStartTime = getStartIco(); bonusAddress = _bonusAddress; token = _token; for (uint256 i = 0; i < _blacklistAddresses.length; i++) { blacklisted[_blacklistAddresses[i]] = true; } setUSDETHRate(_USDETHRate); } function buyTokens(address _beneficiary) public payable { bool preallocated = false; uint256 preallocatedTokens = 0; _buyTokens( _beneficiary, msg.sender, msg.value, preallocated, preallocatedTokens ); } function bulkPreallocate(address[] _owners, uint256[] _tokens, uint256[] _paid) public onlyOwner() { require( _owners.length == _tokens.length, "Lengths of parameter lists have to be equal" ); require( _owners.length == _paid.length, "Lengths of parameter lists have to be equal" ); for (uint256 i=0; i< _owners.length; i++) { preallocate(_owners[i], _tokens[i], _paid[i]); } } function preallocate(address _owner, uint256 _tokens, uint256 _paid) public onlyOwner() { require(!blacklisted[_owner], "Address where tokens will be sent is blacklisted"); bool preallocated = true; uint256 preallocatedTokens = _tokens; _buyTokens( _owner, _owner, _paid, preallocated, preallocatedTokens ); } function setTransminingAddress(address _transminingAddress) public onlyOwner() { transminingAddress = _transminingAddress; } // Created for moving funds later to transmining address function moveTokensToTransmining(uint256 _amount) public onlyOwner() { uint256 remainingTokens = token.getRemainingSaleTokens(); require( transminingAddress != address(0), "Transmining address must be set!" ); require( remainingTokens >= _amount, "Balance of remaining tokens for sale is smaller than requested amount for trans-mining" ); uint256 weiNeeded = cap - weiRaised; uint256 tokensNeeded = weiNeeded * rate; if (getStage() != Stage.AfterICO){ require(remainingTokens - _amount > tokensNeeded, "You need to leave enough tokens to reach hard cap"); } _deliverTokens(transminingAddress, _amount, this); } function _buyTokens( address _beneficiary, address _sender, uint256 _value, bool _preallocated, uint256 _tokens ) internal whenNotPaused() { require(!blacklisted[_beneficiary], "Beneficiary is blacklisted"); uint256 tokens; if (!_preallocated) { // pre validate params require( _value >= minimalContributionAmount, "Amount contributed should be greater than required minimal contribution" ); require(_tokens == 0, "Not preallocated tokens should be zero"); _preValidatePurchase(_beneficiary, _value); } else { require(_tokens != 0, "Preallocated tokens should be greater than zero"); require(weiRaised.add(_value) <= cap, "Raised tokens should not exceed hard cap"); } // calculate tokens if (!_preallocated) { tokens = _getTokenAmount(_value); } else { tokens = _tokens; } // increase wei weiRaised = weiRaised.add(_value); _processPurchase(_beneficiary, tokens, this); emit TokenPurchase( _sender, _beneficiary, _value, tokens ); // transfer payment _updatePurchasingState(_beneficiary, _value); _forwardFunds(); // post validate if (!_preallocated) { _postValidatePurchase(_beneficiary, _value); } } function _getBaseTokens(uint256 _value) internal view returns (uint256) { return _value.mul(rate); } function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) { uint256 baseTokens = _getBaseTokens(_weiAmount); if (getStage() == Stage.PreICO) { return baseTokens.mul(100 + preIcoBonus).div(100); } else { return baseTokens; } } function _processPurchase( address _beneficiary, uint256 _tokenAmount, address _sourceAddress ) internal { _deliverTokens(_beneficiary, _tokenAmount, _sourceAddress); } function _deliverTokens( address _beneficiary, uint256 _tokenAmount, address _sourceAddress ) internal { if (_sourceAddress == address(this)) { token.transfer(_beneficiary, _tokenAmount); } else { token.transferFrom(_sourceAddress, _beneficiary, _tokenAmount); } } function finalization() internal { require( transminingAddress != address(0), "Transmining address must be set!" ); super.finalization(); _deliverTokens(transminingAddress, token.getRemainingSaleTokens(), this); } function setUSDETHRate(uint256 _USDETHRate) public onlyOwner(){ require(_USDETHRate > 0, "USDETH rate should not be zero"); USDETHRate = _USDETHRate; cap = hardCapUSD * USDETHRate; } }
Contract ABI
[{"constant":true,"inputs":[],"name":"getStartIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_tokens","type":"uint256[]"},{"name":"_paid","type":"uint256[]"}],"name":"bulkPreallocate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_paid","type":"uint256"}],"name":"preallocate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimalContributionAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"moveTokensToTransmining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"preIcoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goalReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_USDETHRate","type":"uint256"}],"name":"setUSDETHRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transminingAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEndIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jvySupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"icoStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transminingAddress","type":"address"}],"name":"setTransminingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blacklisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardCapUSD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getStartPreIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_rate","type":"uint256"},{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_cap","type":"uint256"},{"name":"_goal","type":"uint256"},{"name":"_bonusAddress","type":"address"},{"name":"_blacklistAddresses","type":"address[]"},{"name":"_USDETHRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040526007805460ff19908116909155600b805490911690553480156200002757600080fd5b50604051620025ae380380620025ae83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151959794959394929391920190600085856200008664010000000062000426810204565b620000996401000000006200042d810204565b60008054600160a060020a031916331781558d908d908d908311620000bd57600080fd5b600160a060020a0382161515620000d357600080fd5b600160a060020a0381161515620000e957600080fd5b60039290925560028054600160a060020a03928316600160a060020a03199182161790915560018054929093169116179055428210156200012957600080fd5b818110156200013757600080fd5b600591909155600655600081116200014e57600080fd5b600254600160a060020a031662000164620004d4565b600160a060020a03909116815260405190819003602001906000f08015801562000192573d6000803e3d6000fd5b5060098054600160a060020a031916600160a060020a039290921691909117905560085560008111620001c457600080fd5b600a5542620001db64010000000062000435810204565b116200024857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f49434f2068617320746f20626567696e20696e20746865206675747572650000604482015290519081900360640190fd5b426200025c6401000000006200042d810204565b11620002c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f49434f2068617320746f20656e6420696e207468652066757475726500000000604482015290519081900360640190fd5b858511156200035f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f536f6674206361702073686f756c6420626520657175616c206f7220736d616c60448201527f6c6572207468616e206861726420636170000000000000000000000000000000606482015290519081900360840190fd5b6200037264010000000062000435810204565b600c5550600e8054600160a060020a03808616600160a060020a031992831617909255601180549289169290911691909117905560005b825181101562000403576001601060008584815181101515620003c857fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff1916911515919091179055600101620003a9565b62000417826401000000006200043d810204565b505050505050505050620004e5565b42603c0190565b635c78bc5090565b635c00c3d090565b600054600160a060020a031633146200045557600080fd5b60008111620004c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f55534445544820726174652073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600f819055627a120002600a55565b6040516107578062001e5783390190565b61196280620004f56000396000f3006080604052600436106101d45763ffffffff60e060020a6000350416630d950a0281146101df5780631515bc2b146102065780632c4e722e1461022f5780633056df7f1461024457806332013ac31461030b578063355274ea146103325780633f4ba83a14610347578063401938831461035c5780634042b66f1461037157806348ef200f146103865780634b6753bc1461039b5780634bb278f3146103b05780634f935945146103c5578063521eb273146103da5780635c975abb1461040b578063622ed15f1461042057806362492e9d14610438578063715018a61461044d5780637d3d652214610462578063825e35c2146104775780638456cb591461048f5780638506eecb146104a4578063863843bc146104b95780638d4e4083146104ce5780638da5cb5b146104e357806392417064146104f8578063a381de541461050d578063a4c2001d14610522578063a7c3d71b14610537578063a96af0f41461054c578063b5545a3c14610561578063b7a8807c14610576578063d03eef521461058b578063dbac26e9146105ac578063de81aaaa146105cd578063ec8ac4d8146105e2578063f073e3ef146105f6578063f2fde38b1461060b578063fc0c546a1461062c578063fcaa766414610641575b6101dd3361067a565b005b3480156101eb57600080fd5b506101f461068f565b60408051918252519081900360200190f35b34801561021257600080fd5b5061021b61069a565b604080519115158252519081900360200190f35b34801561023b57600080fd5b506101f46106a2565b34801561025057600080fd5b50604080516020600480358082013583810280860185019096528085526101dd95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506106a89650505050505050565b34801561031757600080fd5b506101dd600160a060020a0360043516602435604435610829565b34801561033e57600080fd5b506101f46108f4565b34801561035357600080fd5b506101dd6108fa565b34801561036857600080fd5b506101f4610957565b34801561037d57600080fd5b506101f461095d565b34801561039257600080fd5b506101f4610963565b3480156103a757600080fd5b506101f461096f565b3480156103bc57600080fd5b506101dd610975565b3480156103d157600080fd5b5061021b6109ef565b3480156103e657600080fd5b506103ef6109fa565b60408051600160a060020a039092168252519081900360200190f35b34801561041757600080fd5b5061021b610a09565b34801561042c57600080fd5b506101dd600435610a12565b34801561044457600080fd5b506101f4610c78565b34801561045957600080fd5b506101dd610c7d565b34801561046e57600080fd5b5061021b610ce9565b34801561048357600080fd5b506101dd600435610cf4565b34801561049b57600080fd5b506101dd610d72565b3480156104b057600080fd5b506103ef610dd1565b3480156104c557600080fd5b506101f4610de0565b3480156104da57600080fd5b5061021b610dea565b3480156104ef57600080fd5b506103ef610df3565b34801561050457600080fd5b506101f4610e02565b34801561051957600080fd5b506103ef610e0a565b34801561052e57600080fd5b506101f4610e19565b34801561054357600080fd5b506101f4610e24565b34801561055857600080fd5b506101f4610e2a565b34801561056d57600080fd5b506101dd610e34565b34801561058257600080fd5b506101f4610ed0565b34801561059757600080fd5b506101dd600160a060020a0360043516610ed6565b3480156105b857600080fd5b5061021b600160a060020a0360043516610f1c565b3480156105d957600080fd5b506101f4610f31565b6101dd600160a060020a036004351661067a565b34801561060257600080fd5b506101f4610f38565b34801561061757600080fd5b506101dd600160a060020a0360043516610f3f565b34801561063857600080fd5b506103ef610f62565b34801561064d57600080fd5b50610656610f71565b6040518082600381111561066657fe5b60ff16815260200191505060405180910390f35b60008061068a8333348480610fb8565b505050565b635c00c3d0805b5090565b600654421190565b60035481565b60008054600160a060020a031633146106c057600080fd5b825184511461073f576040805160e560020a62461bcd02815260206004820152602b60248201527f4c656e67746873206f6620706172616d65746572206c6973747320686176652060448201527f746f20626520657175616c000000000000000000000000000000000000000000606482015290519081900360840190fd5b81518451146107be576040805160e560020a62461bcd02815260206004820152602b60248201527f4c656e67746873206f6620706172616d65746572206c6973747320686176652060448201527f746f20626520657175616c000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060005b83518110156108235761081b84828151811015156107dc57fe5b9060200190602002015184838151811015156107f457fe5b90602001906020020151848481518110151561080c57fe5b90602001906020020151610829565b6001016107c2565b50505050565b600080548190600160a060020a0316331461084357600080fd5b600160a060020a03851660009081526010602052604090205460ff16156108da576040805160e560020a62461bcd02815260206004820152603060248201527f4164647265737320776865726520746f6b656e732077696c6c2062652073656e60448201527f7420697320626c61636b6c697374656400000000000000000000000000000000606482015290519081900360840190fd5b5060019050826108ed8580858585610fb8565b5050505050565b600a5481565b600054600160a060020a0316331461091157600080fd5b600b5460ff16151561092257600080fd5b600b805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60085481565b60045481565b67058d15e17628000081565b60065481565b600054600160a060020a0316331461098c57600080fd5b60075460ff161561099c57600080fd5b6109a461069a565b15156109af57600080fd5b6109b7611342565b6040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a16007805460ff19166001179055565b600a54600454101590565b600254600160a060020a031681565b600b5460ff1681565b6000805481908190600160a060020a03163314610a2e57600080fd5b601160009054906101000a9004600160a060020a0316600160a060020a031663a55df3f96040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b505050506040513d6020811015610aab57600080fd5b5051600d54909350600160a060020a03161515610b12576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e736d696e696e672061646472657373206d7573742062652073657421604482015290519081900360640190fd5b83831015610bb6576040805160e560020a62461bcd02815260206004820152605660248201527f42616c616e6365206f662072656d61696e696e6720746f6b656e7320666f722060448201527f73616c6520697320736d616c6c6572207468616e20726571756573746564206160648201527f6d6f756e7420666f72207472616e732d6d696e696e6700000000000000000000608482015290519081900360a40190fd5b5050600454600a54600380549290910391820290610bd2610f71565b6003811115610bdd57fe5b14610c61578383038110610c61576040805160e560020a62461bcd02815260206004820152603160248201527f596f75206e65656420746f206c6561766520656e6f75676820746f6b656e732060448201527f746f207265616368206861726420636170000000000000000000000000000000606482015290519081900360840190fd5b600d5461082390600160a060020a03168530611448565b601981565b600054600160a060020a03163314610c9457600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600854600454101590565b600054600160a060020a03163314610d0b57600080fd5b60008111610d63576040805160e560020a62461bcd02815260206004820152601e60248201527f55534445544820726174652073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600f819055627a120002600a55565b600054600160a060020a03163314610d8957600080fd5b600b5460ff1615610d9957600080fd5b600b805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600d54600160a060020a031681565b654bca8dbb355581565b60075460ff1681565b600054600160a060020a031681565b635c78bc5090565b600e54600160a060020a031681565b66012f2a36ecd55581565b600c5481565b65e35fa931a00081565b60075460ff161515610e4557600080fd5b610e4d610ce9565b15610e5757600080fd5b600954604080517f51cff8d90000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916351cff8d99160248082019260009290919082900301818387803b158015610ebc57600080fd5b505af1158015610823573d6000803e3d6000fd5b60055481565b600054600160a060020a03163314610eed57600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60106020526000908152604090205460ff1681565b627a120081565b42603c0190565b600054600160a060020a03163314610f5657600080fd5b610f5f8161159b565b50565b600154600160a060020a031681565b6005546000904290811015610f895760009150610696565b600c54811015610f9c5760019150610696565b600654811015610faf5760029150610696565b60039150610696565b600b5460009060ff1615610fcb57600080fd5b600160a060020a03861660009081526010602052604090205460ff161561103c576040805160e560020a62461bcd02815260206004820152601a60248201527f42656e656669636961727920697320626c61636b6c6973746564000000000000604482015290519081900360640190fd5b82151561117a5767058d15e1762800008410156110ef576040805160e560020a62461bcd02815260206004820152604760248201527f416d6f756e7420636f6e74726962757465642073686f756c642062652067726560448201527f61746572207468616e207265717569726564206d696e696d616c20636f6e747260648201527f69627574696f6e00000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b811561116b576040805160e560020a62461bcd02815260206004820152602660248201527f4e6f7420707265616c6c6f636174656420746f6b656e732073686f756c64206260448201527f65207a65726f0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6111758685611618565b611289565b8115156111f7576040805160e560020a62461bcd02815260206004820152602f60248201527f507265616c6c6f636174656420746f6b656e732073686f756c6420626520677260448201527f6561746572207468616e207a65726f0000000000000000000000000000000000606482015290519081900360840190fd5b600a5460045461120d908663ffffffff61164716565b1115611289576040805160e560020a62461bcd02815260206004820152602860248201527f52616973656420746f6b656e732073686f756c64206e6f74206578636565642060448201527f6861726420636170000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8215156112a0576112998461165a565b90506112a3565b50805b6004546112b6908563ffffffff61164716565b6004556112c48682306116b6565b85600160a060020a031685600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188684604051808381526020018281526020019250505060405180910390a36113218685611643565b6113296116c1565b82151561133a5761133a8685611643565b505050505050565b600d54600160a060020a031615156113a4576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e736d696e696e672061646472657373206d7573742062652073657421604482015290519081900360640190fd5b6113ac61173b565b600d54601154604080517fa55df3f9000000000000000000000000000000000000000000000000000000008152905161144693600160a060020a0390811693169163a55df3f99160048083019260209291908290030181600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506040513d602081101561143e57600080fd5b505130611448565b565b600160a060020a0381163014156114fa57601154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b5061068a9050565b601154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152868116602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561157157600080fd5b505af1158015611585573d6000803e3d6000fd5b505050506040513d60208110156108ed57600080fd5b600160a060020a03811615156115b057600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6116228282611897565b600a54600454611638908363ffffffff61164716565b111561164357600080fd5b5050565b8181018281101561165457fe5b92915050565b600080611666836118c0565b90506001611672610f71565b600381111561167d57fe5b14156116ac576116a5606461169983607d63ffffffff6118d716565b9063ffffffff61190016565b91506116b0565b8091505b50919050565b61068a838383611448565b600954604080517ff340fa010000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163f340fa01913491602480830192600092919082900301818588803b15801561172757600080fd5b505af11580156108ed573d6000803e3d6000fd5b611743610ce9565b1561182357600960009054906101000a9004600160a060020a0316600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561179b57600080fd5b505af11580156117af573d6000803e3d6000fd5b50505050600960009054906101000a9004600160a060020a0316600160a060020a0316639af6549a6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561180657600080fd5b505af115801561181a573d6000803e3d6000fd5b5050505061188f565b600960009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561187657600080fd5b505af115801561188a573d6000803e3d6000fd5b505050505b611446611446565b60055442101580156118ab57506006544211155b15156118b657600080fd5b6116438282611915565b6000611654600354836118d790919063ffffffff16565b60008215156118e857506000611654565b508181028183828115156118f857fe5b041461165457fe5b6000818381151561190d57fe5b049392505050565b600160a060020a038216151561192a57600080fd5b80151561164357600080fd00a165627a7a72305820d964823f3880d915ea0299a4f3df6fa7a48bb6ea8a8970125128ca3dac5f6e0a0029608060405234801561001057600080fd5b50604051602080610757833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b6002805460ff19600160a060020a03939093166101000261010060a860020a0319909116179190911690556106d4806100836000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166338af3eed81146100be57806343d726d6146100ef57806351cff8d914610106578063685ca19414610127578063715018a61461015c5780638c52dc41146101715780638da5cb5b146101865780639af6549a1461019b578063c19d93fb146101b0578063e3a9db1a146101e9578063f2fde38b1461021c578063f340fa011461023d575b600080fd5b3480156100ca57600080fd5b506100d3610251565b60408051600160a060020a039092168252519081900360200190f35b3480156100fb57600080fd5b50610104610265565b005b34801561011257600080fd5b50610104600160a060020a03600435166102d0565b34801561013357600080fd5b50610148600160a060020a03600435166102f0565b604080519115158252519081900360200190f35b34801561016857600080fd5b5061010461030c565b34801561017d57600080fd5b50610104610378565b34801561019257600080fd5b506100d36103e4565b3480156101a757600080fd5b506101046103f3565b3480156101bc57600080fd5b506101c561044f565b604051808260028111156101d557fe5b60ff16815260200191505060405180910390f35b3480156101f557600080fd5b5061020a600160a060020a0360043516610458565b60408051918252519081900360200190f35b34801561022857600080fd5b50610104600160a060020a0360043516610473565b610104600160a060020a0360043516610493565b6002546101009004600160a060020a031681565b600054600160a060020a0316331461027c57600080fd5b60006002805460ff169081111561028f57fe5b1461029957600080fd5b6002805460ff1916811790556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a1565b6102d9816102f0565b15156102e457600080fd5b6102ed816104b9565b50565b600060016002805460ff169081111561030557fe5b1492915050565b600054600160a060020a0316331461032357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a0316331461038f57600080fd5b60006002805460ff16908111156103a257fe5b146103ac57600080fd5b6002805460ff191660011790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b600054600160a060020a031681565b6002805460ff168181111561040457fe5b1461040e57600080fd5b600254604051600160a060020a036101009092049190911690303180156108fc02916000818181858888f193505050501580156102ed573d6000803e3d6000fd5b60025460ff1681565b600160a060020a031660009081526001602052604090205490565b600054600160a060020a0316331461048a57600080fd5b6102ed8161057e565b60006002805460ff16908111156104a657fe5b146104b057600080fd5b6102ed816105fb565b60008054600160a060020a031633146104d157600080fd5b50600160a060020a03811660009081526001602052604090205430318111156104f657fe5b600160a060020a0382166000818152600160205260408082208290555183156108fc0291849190818181858888f1935050505015801561053a573d6000803e3d6000fd5b50604080518281529051600160a060020a038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b600160a060020a038116151561059357600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461061357600080fd5b50600160a060020a038116600090815260016020526040902054349061063f908263ffffffff61069516565b600160a060020a038316600081815260016020908152604091829020939093558051848152905191927f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c492918290030190a25050565b818101828110156106a257fe5b929150505600a165627a7a72305820b917c1614efb173a42981326ce81c37b6da70726da504fcb3f1d8e85a2ed2647002900000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb5218700000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000ea89108712f87282b33b246defc28990029532d000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c203260000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab76650000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef800000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f6189200000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b97800000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb5218700000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000ea89108712f87282b33b246defc28990029532d000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c203260000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab76650000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef800000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f6189200000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b97800000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5
-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [1] : 000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d
Arg [2] : 0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb52187
Arg [3] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [4] : 00000000000000000000000000000000000000000000003635c9adc5dea00000
Arg [5] : 000000000000000000000000ea89108712f87282b33b246defc28990029532d0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [7] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [9] : 0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c20326
Arg [10] : 0000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab7665
Arg [11] : 0000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb
Arg [12] : 0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd
Arg [13] : 0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef8
Arg [14] : 00000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e
Arg [15] : 000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1
Arg [16] : 000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f61892
Arg [17] : 00000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b978
Arg [18] : 00000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda
Arg [19] : 000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc
Arg [20] : 0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557
Arg [21] : 000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5
Swarm Source:
bzzr://b917c1614efb173a42981326ce81c37b6da70726da504fcb3f1d8e85a2ed2647
Block | Age | transaction | Difficulty | GasUsed | Reward |
---|
Block | Age | Uncle Number | Difficulty | GasUsed | Reward |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.