ETH Price: $2,666.62 (+0.28%)

Contract

0x439c0E0aB1A5DA0d26F3DCb8861eDC97fF005a66
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer63397622018-09-16 2:40:242340 days ago1537065624IN
0x439c0E0a...7fF005a66
0.00376291 ETH0.0009470745
Receive Air Drop63393602018-09-16 1:02:282340 days ago1537059748IN
0x439c0E0a...7fF005a66
0 ETH0.0012965549.5
Receive Air Drop63383782018-09-15 21:06:052340 days ago1537045565IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63382812018-09-15 20:41:352340 days ago1537044095IN
0x439c0E0a...7fF005a66
0 ETH0.0011524944
Receive Air Drop63375042018-09-15 17:35:342340 days ago1537032934IN
0x439c0E0a...7fF005a66
0 ETH0.0009219935.2
Receive Air Drop63375042018-09-15 17:35:342340 days ago1537032934IN
0x439c0E0a...7fF005a66
0 ETH0.0009219935.2
Transfer63369982018-09-15 15:33:182341 days ago1537025598IN
0x439c0E0a...7fF005a66
0 ETH0.000126276
Receive Air Drop63369772018-09-15 15:28:452341 days ago1537025325IN
0x439c0E0a...7fF005a66
0 ETH0.0007491128.6
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.000720327.5
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.0011524944
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.0011524944
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.0011524944
Receive Air Drop63368722018-09-15 15:02:352341 days ago1537023755IN
0x439c0E0a...7fF005a66
0 ETH0.0011524944
Receive Air Drop63367732018-09-15 14:38:582341 days ago1537022338IN
0x439c0E0a...7fF005a66
0 ETH0.000157156
Receive Air Drop63367642018-09-15 14:35:252341 days ago1537022125IN
0x439c0E0a...7fF005a66
0 ETH0.000157156
Receive Air Drop63367582018-09-15 14:33:252341 days ago1537022005IN
0x439c0E0a...7fF005a66
0 ETH0.000157156
Receive Air Drop63367562018-09-15 14:32:552341 days ago1537021975IN
0x439c0E0a...7fF005a66
0 ETH0.000474665
Receive Air Drop63367562018-09-15 14:32:552341 days ago1537021975IN
0x439c0E0a...7fF005a66
0 ETH0.000659596
Receive Air Drop63367472018-09-15 14:30:012341 days ago1537021801IN
0x439c0E0a...7fF005a66
0 ETH0.000549665
Receive Air Drop63367452018-09-15 14:29:352341 days ago1537021775IN
0x439c0E0a...7fF005a66
0 ETH0.000549665
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x66231ded...3A5589772
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
AirDropForERC223

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

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

pragma solidity ^0.4.23;

contract ERC223Interface {
    uint public totalSupply;
    uint8 public decimals;
    function balanceOf(address who) constant returns (uint);
    function transfer(address to, uint value);
    function transfer(address to, uint value, bytes data);
    event Transfer(address indexed from, address indexed to, uint value, bytes data);
}

contract ERC223ReceivingContract {
    
    /**
     * @dev Standard ERC223 function that will handle incoming token transfers.
     *
     * @param _from  Token sender address.
     * @param _value Amount of tokens.
     * @param _data  Transaction metadata.
     */
    function tokenFallback(address _from, uint _value, bytes _data);
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() 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 transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}



/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    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;
  }
}


/**
 * @title AirDropContract
 * Simply do the airdrop.
 */
contract AirDropForERC223 is Ownable {
    using SafeMath for uint256;

    // the amount that owner wants to send each time
    uint public airDropAmount;

    // the mapping to judge whether each address has already received airDropped
    mapping ( address => bool ) public invalidAirDrop;

    // the mapping of testAccount
    mapping ( address => bool ) public isTestAccount;

    // the array of addresses which received airDrop
    address[] public arrayAirDropReceivers;

    // flag to stop airdrop
    bool public stop = false;

    ERC223Interface public token;

    uint256 public startTime;
    uint256 public endTime;

    // event
    event LogAirDrop(address indexed receiver, uint amount);
    event LogStop();
    event LogStart();
    event LogWithdrawal(address indexed receiver, uint amount);
    event LogInfoUpdate(uint256 startTime, uint256 endTime, uint256 airDropAmount);

    /**
     * @dev Constructor to set _airDropAmount and _tokenAddresss.
     * @param _airDropAmount The amount of token that is sent for doing airDrop.
     * @param _tokenAddress The address of token.
     */
    constructor(uint256 _startTime, uint256 _endTime, uint _airDropAmount, address _tokenAddress, address[] _testAccounts) public {
        require(
            _startTime >= now &&
            _endTime >= _startTime &&
            _airDropAmount > 0 &&
            _tokenAddress != address(0)
        );
        startTime = _startTime;
        endTime = _endTime;
        token = ERC223Interface(_tokenAddress);
        uint tokenDecimals = token.decimals();
        airDropAmount = _airDropAmount.mul(10 ** tokenDecimals);

        for (uint i = 0; i < _testAccounts.length; i++ ) {
            isTestAccount[_testAccounts[i]] = true;
        }
    }

    /**
     * @dev Standard ERC223 function that will handle incoming token transfers.
     *
     * @param _from  Token sender address.
     * @param _value Amount of tokens.
     * @param _data  Transaction metadata.
     */
    function tokenFallback(address _from, uint _value, bytes _data) {}

    /**
     * @dev Confirm that airDrop is available.
     * @return A bool to confirm that airDrop is available.
     */
    function isValidAirDropForAll() public view returns (bool) {
        bool validNotStop = !stop;
        bool validAmount = getRemainingToken() >= airDropAmount;
        bool validPeriod = now >= startTime && now <= endTime;
        return validNotStop && validAmount && validPeriod;
    }

    /**
     * @dev Confirm that airDrop is available for msg.sender.
     * @return A bool to confirm that airDrop is available for msg.sender.
     */
    function isValidAirDropForIndividual() public view returns (bool) {
        bool validNotStop = !stop;
        bool validAmount = getRemainingToken() >= airDropAmount;
        bool validPeriod = now >= startTime && now <= endTime;
        bool validReceiveAirDropForIndividual = !invalidAirDrop[msg.sender];
        return validNotStop && validAmount && validPeriod && validReceiveAirDropForIndividual;
    }

    /**
     * @dev Do the airDrop to msg.sender
     */
    function receiveAirDrop() public {
        if (isTestAccount[msg.sender]) {
            // execute transfer
            token.transfer(msg.sender, airDropAmount);
        } else {
            require(isValidAirDropForIndividual());

            // set invalidAirDrop of msg.sender to true
            invalidAirDrop[msg.sender] = true;

            // set msg.sender to the array of the airDropReceiver
            arrayAirDropReceivers.push(msg.sender);

            // execute transfer
            token.transfer(msg.sender, airDropAmount);

            emit LogAirDrop(msg.sender, airDropAmount);
        }
    }

    /**
     * @dev Change the state of stop flag
     */
    function toggle() public onlyOwner {
        stop = !stop;

        if (stop) {
            emit LogStop();
        } else {
            emit LogStart();
        }
    }

    /**
     * @dev Withdraw the amount of token that is remaining in this contract.
     * @param _address The address of EOA that can receive token from this contract.
     */
    function withdraw(address _address) public onlyOwner {
        require(
            stop ||
            now > endTime
        );
        require(_address != address(0));
        uint tokenBalanceOfContract = getRemainingToken();
        token.transfer(_address, tokenBalanceOfContract);
        emit LogWithdrawal(_address, tokenBalanceOfContract);
    }

    /**
     * @dev Update the information regarding to period and amount.
     * @param _startTime The start time this airdrop starts.
     * @param _endTime The end time this sirdrop ends.
     * @param _airDropAmount The airDrop Amount that user can get via airdrop.
     */
    function updateInfo(uint256 _startTime, uint256 _endTime, uint256 _airDropAmount) public onlyOwner {
        require(
            stop ||
            now > endTime
        );
        require(
            _startTime >= now &&
            _endTime >= _startTime &&
            _airDropAmount > 0
        );

        startTime = _startTime;
        endTime = _endTime;
        uint tokenDecimals = token.decimals();
        airDropAmount = _airDropAmount.mul(10 ** tokenDecimals);

        emit LogInfoUpdate(startTime, endTime, airDropAmount);
    }

    /**
     * @dev Get the total number of addresses which received airDrop.
     * @return Uint256 the total number of addresses which received airDrop.
     */
    function getTotalNumberOfAddressesReceivedAirDrop() public view returns (uint256) {
        return arrayAirDropReceivers.length;
    }

    /**
     * @dev Get the remaining amount of token user can receive.
     * @return Uint256 the amount of token that user can reveive.
     */
    function getRemainingToken() public view returns (uint256) {
        return token.balanceOf(this);
    }

    /**
     * @dev Return the total amount of token user received.
     * @return Uint256 total amount of token user received.
     */
    function getTotalAirDroppedAmount() public view returns (uint256) {
        return airDropAmount.mul(arrayAirDropReceivers.length);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"stop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isTestAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_airDropAmount","type":"uint256"}],"name":"updateInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRemainingToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"arrayAirDropReceivers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalAirDroppedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"toggle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"invalidAirDrop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isValidAirDropForIndividual","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isValidAirDropForAll","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":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"receiveAirDrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalNumberOfAddressesReceivedAirDrop","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"},{"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_airDropAmount","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_testAccounts","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogAirDrop","type":"event"},{"anonymous":false,"inputs":[],"name":"LogStop","type":"event"},{"anonymous":false,"inputs":[],"name":"LogStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"startTime","type":"uint256"},{"indexed":false,"name":"endTime","type":"uint256"},{"indexed":false,"name":"airDropAmount","type":"uint256"}],"name":"LogInfoUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Deployed Bytecode

0x6080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166307da68f5811461011657806308e9988b1461013f57806310665519146101665780632aec9466146101875780633197cbb6146101a75780633efe6441146101bc5780633f4039ba146101d157806340992e9d1461020557806340a3d2461461021a57806351cff8d91461022f5780636a3350c81461025057806370cf75081461027157806378e97925146102865780638b08292d1461029b5780638da5cb5b146102b0578063c0ee0b8a146102c5578063c1fae25b1461032e578063c7b160db14610343578063f2fde38b14610358578063fc0c546a14610379575b600080fd5b34801561012257600080fd5b5061012b61038e565b604080519115158252519081900360200190f35b34801561014b57600080fd5b50610154610397565b60408051918252519081900360200190f35b34801561017257600080fd5b5061012b600160a060020a036004351661039d565b34801561019357600080fd5b506101a56004356024356044356103b2565b005b3480156101b357600080fd5b50610154610520565b3480156101c857600080fd5b50610154610526565b3480156101dd57600080fd5b506101e96004356105c1565b60408051600160a060020a039092168252519081900360200190f35b34801561021157600080fd5b506101546105e9565b34801561022657600080fd5b506101a5610607565b34801561023b57600080fd5b506101a5600160a060020a0360043516610692565b34801561025c57600080fd5b5061012b600160a060020a03600435166107b4565b34801561027d57600080fd5b5061012b6107c9565b34801561029257600080fd5b5061015461083b565b3480156102a757600080fd5b5061012b610841565b3480156102bc57600080fd5b506101e9610890565b3480156102d157600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526101a5948235600160a060020a031694602480359536959460649492019190819084018382808284375094975061089f9650505050505050565b34801561033a57600080fd5b506101a56108a4565b34801561034f57600080fd5b50610154610a88565b34801561036457600080fd5b506101a5600160a060020a0360043516610a8e565b34801561038557600080fd5b506101e9610b22565b60055460ff1681565b60015481565b60036020526000908152604090205460ff1681565b60008054600160a060020a031633146103ca57600080fd5b60055460ff16806103dc575060075442115b15156103e757600080fd5b4284101580156103f75750838310155b80156104035750600082115b151561040e57600080fd5b8360068190555082600781905550600560019054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561048857600080fd5b505af115801561049c573d6000803e3d6000fd5b505050506040513d60208110156104b257600080fd5b505160ff1690506104cd82600a83900a63ffffffff610b3616565b60018190556006546007546040805192835260208301919091528181019290925290517f20efc62a7a9ebf73bc01c79415ebe8e96ae9a94a0c0efed186caef56a71d5dcf9181900360600190a150505050565b60075481565b600554604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926101009004600160a060020a0316916370a0823191602480830192602092919082900301818787803b15801561059057600080fd5b505af11580156105a4573d6000803e3d6000fd5b505050506040513d60208110156105ba57600080fd5b5051905090565b60048054829081106105cf57fe5b600091825260209091200154600160a060020a0316905081565b600454600154600091610602919063ffffffff610b3616565b905090565b600054600160a060020a0316331461061e57600080fd5b6005805460ff19811660ff9182161517918290551615610666576040517f407235ba9d50c9ec9294457c137c94dd310f8658f7c03e9061c50ac66751af1290600090a1610690565b6040517fddd1002e99df5d98b17a9b830ba8e5a4f8d618d5df9ccc99c5faea5b4abdbad890600090a15b565b60008054600160a060020a031633146106aa57600080fd5b60055460ff16806106bc575060075442115b15156106c757600080fd5b600160a060020a03821615156106dc57600080fd5b6106e4610526565b600554604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018590529151939450610100909204169163a9059cbb9160448082019260009290919082900301818387803b15801561075957600080fd5b505af115801561076d573d6000803e3d6000fd5b5050604080518481529051600160a060020a03861693507fb4214c8c54fc7442f36d3682f59aebaf09358a4431835b30efb29d52cf9e1e9192509081900360200190a25050565b60026020526000908152604090205460ff1681565b60055460015460009160ff1615908290819081906107e5610526565b1015925060065442101580156107fd57506007544211155b3360009081526002602052604090205490925060ff161590508380156108205750825b80156108295750815b80156108325750805b94505050505090565b60065481565b60055460015460009160ff1615908290819061085b610526565b10159150600654421015801561087357506007544211155b905082801561087f5750815b80156108885750805b935050505090565b600054600160a060020a031681565b505050565b3360009081526003602052604090205460ff161561094c57600554600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019290925251610100909204600160a060020a03169163a9059cbb9160448082019260009290919082900301818387803b15801561092f57600080fd5b505af1158015610943573d6000803e3d6000fd5b50505050610690565b6109546107c9565b151561095f57600080fd5b33600081815260026020526040808220805460ff191660019081179091556004805480830182558185527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff191686179055600554915483517fa9059cbb0000000000000000000000000000000000000000000000000000000081529182019590955260248101949094529051610100909104600160a060020a03169263a9059cbb92604480830193919282900301818387803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b505060015460408051918252513393507f41097886570f9a869fa2411d79ffeeeaf139da10f9050e7797b948f14ff4256992509081900360200190a2565b60045490565b600054600160a060020a03163314610aa557600080fd5b600160a060020a0381161515610aba57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6005546101009004600160a060020a031681565b6000821515610b4757506000610b5f565b50818102818382811515610b5757fe5b0414610b5f57fe5b929150505600a165627a7a723058200284e563939e0d158e5940c94c46ff693da43f78a67566815dd90c943f4a67cb0029

Swarm Source

bzzr://0284e563939e0d158e5940c94c46ff693da43f78a67566815dd90c943f4a67cb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.