ETH Price: $3,268.53 (+1.54%)

Contract

0xC1EF465527343f68Bb1841F99b9aDEb061cc7Ac9
 

Overview

ETH Balance

0.0507 ETH

Eth Value

$165.71 (@ $3,268.53/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy134211532021-10-15 6:59:011183 days ago1634281141IN
0xC1EF4655...061cc7Ac9
1 ETH0.0146742998.74364344
Buy132844782021-09-23 21:43:121205 days ago1632433392IN
0xC1EF4655...061cc7Ac9
0.69 ETH0.0121137681.51379545
Cancel132559902021-09-19 11:55:231209 days ago1632052523IN
0xC1EF4655...061cc7Ac9
0 ETH0.0062760948.57884019
Cancel132369962021-09-16 13:20:041212 days ago1631798404IN
0xC1EF4655...061cc7Ac9
0 ETH0.0079405361.46210149
Cancel132297422021-09-15 10:22:071213 days ago1631701327IN
0xC1EF4655...061cc7Ac9
0 ETH0.0046580936.05507474
Cancel132183732021-09-13 16:13:511215 days ago1631549631IN
0xC1EF4655...061cc7Ac9
0 ETH0.013249102.55125799
Cancel132182492021-09-13 15:46:241215 days ago1631547984IN
0xC1EF4655...061cc7Ac9
0 ETH0.0098067975.90753976
Cancel132181582021-09-13 15:26:401215 days ago1631546800IN
0xC1EF4655...061cc7Ac9
0 ETH0.0103379880.01906005
Cancel132175592021-09-13 13:13:471215 days ago1631538827IN
0xC1EF4655...061cc7Ac9
0 ETH0.0069607259.54731732
Cancel132106052021-09-12 11:13:481216 days ago1631445228IN
0xC1EF4655...061cc7Ac9
0 ETH0.0076244959.0158501
Withdraw132044852021-09-11 12:39:591217 days ago1631363999IN
0xC1EF4655...061cc7Ac9
0 ETH0.0020850463.86843281
Buy131942862021-09-09 22:30:541219 days ago1631226654IN
0xC1EF4655...061cc7Ac9
0.49 ETH0.0117208778.87002712
Cancel131936912021-09-09 20:22:441219 days ago1631218964IN
0xC1EF4655...061cc7Ac9
0 ETH0.01037406106.62597159
Cancel131773182021-09-07 7:30:091221 days ago1630999809IN
0xC1EF4655...061cc7Ac9
0 ETH0.0100541777.82227303
Cancel131743602021-09-06 20:35:371222 days ago1630960537IN
0xC1EF4655...061cc7Ac9
0 ETH0.01198891123.22353683
Cancel131743572021-09-06 20:35:021222 days ago1630960502IN
0xC1EF4655...061cc7Ac9
0 ETH0.01481514126.74002202
Cancel131743572021-09-06 20:35:021222 days ago1630960502IN
0xC1EF4655...061cc7Ac9
0 ETH0.01637405126.74002202
Buy131720292021-09-06 11:56:401222 days ago1630929400IN
0xC1EF4655...061cc7Ac9
0.69 ETH0.009030770
Buy131689932021-09-06 0:29:381222 days ago1630888178IN
0xC1EF4655...061cc7Ac9
2 ETH0.0108431472.96376325
Cancel131582282021-09-04 8:50:531224 days ago1630745453IN
0xC1EF4655...061cc7Ac9
0 ETH0.0093176795.76821543
Cancel131567822021-09-04 3:25:021224 days ago1630725902IN
0xC1EF4655...061cc7Ac9
0 ETH0.0150627128.85778941
Buy131558672021-09-03 23:54:221224 days ago1630713262IN
0xC1EF4655...061cc7Ac9
10 ETH0.01500961101
Buy131538962021-09-03 16:45:241225 days ago1630687524IN
0xC1EF4655...061cc7Ac9
3 ETH0.01953165131.42895808
Cancel131350552021-08-31 18:56:291228 days ago1630436189IN
0xC1EF4655...061cc7Ac9
0 ETH0.01378361106.68926804
Cancel131340382021-08-31 15:14:161228 days ago1630422856IN
0xC1EF4655...061cc7Ac9
0 ETH0.01727944147.82149233
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
134211532021-10-15 6:59:011183 days ago1634281141
0xC1EF4655...061cc7Ac9
0.97 ETH
132844782021-09-23 21:43:121205 days ago1632433392
0xC1EF4655...061cc7Ac9
0.6693 ETH
132044852021-09-11 12:39:591217 days ago1631363999
0xC1EF4655...061cc7Ac9
0.4854 ETH
131942862021-09-09 22:30:541219 days ago1631226654
0xC1EF4655...061cc7Ac9
0.4753 ETH
131720292021-09-06 11:56:401222 days ago1630929400
0xC1EF4655...061cc7Ac9
0.6693 ETH
131689932021-09-06 0:29:381222 days ago1630888178
0xC1EF4655...061cc7Ac9
1.94 ETH
131558672021-09-03 23:54:221224 days ago1630713262
0xC1EF4655...061cc7Ac9
9.7 ETH
131538962021-09-03 16:45:241225 days ago1630687524
0xC1EF4655...061cc7Ac9
2.91 ETH
131315322021-08-31 5:40:401228 days ago1630388440
0xC1EF4655...061cc7Ac9
1.70953756 ETH
131261582021-08-30 9:53:581229 days ago1630317238
0xC1EF4655...061cc7Ac9
32.01 ETH
131248542021-08-30 4:58:441229 days ago1630299524
0xC1EF4655...061cc7Ac9
2.425 ETH
131223932021-08-29 20:03:411230 days ago1630267421
0xC1EF4655...061cc7Ac9
8.73 ETH
131218152021-08-29 17:49:361230 days ago1630259376
0xC1EF4655...061cc7Ac9
2.91 ETH
131210882021-08-29 15:09:081230 days ago1630249748
0xC1EF4655...061cc7Ac9
0.97 ETH
131209812021-08-29 14:44:541230 days ago1630248294
0xC1EF4655...061cc7Ac9
0.97 ETH
131209672021-08-29 14:41:401230 days ago1630248100
0xC1EF4655...061cc7Ac9
0.97 ETH
131209082021-08-29 14:27:481230 days ago1630247268
0xC1EF4655...061cc7Ac9
0.97 ETH
131206502021-08-29 13:33:141230 days ago1630243994
0xC1EF4655...061cc7Ac9
0.97 ETH
131205982021-08-29 13:23:451230 days ago1630243425
0xC1EF4655...061cc7Ac9
0.7275 ETH
131204942021-08-29 12:59:531230 days ago1630241993
0xC1EF4655...061cc7Ac9
0.7275 ETH
131204802021-08-29 12:55:461230 days ago1630241746
0xC1EF4655...061cc7Ac9
0.485 ETH
131204572021-08-29 12:50:391230 days ago1630241439
0xC1EF4655...061cc7Ac9
0.2813 ETH
131204132021-08-29 12:38:571230 days ago1630240737
0xC1EF4655...061cc7Ac9
0.2425 ETH
131204062021-08-29 12:36:441230 days ago1630240604
0xC1EF4655...061cc7Ac9
0.0485 ETH
131203882021-08-29 12:31:241230 days ago1630240284
0xC1EF4655...061cc7Ac9
0.0485 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Marketplace

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-18
*/

pragma solidity ^0.4.18;

contract Ownable {
  address public owner;

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

  function Ownable() public {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

contract ERC721 {
    function implementsERC721() public pure returns (bool);
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) public view returns (address owner);
    function approve(address _to, uint256 _tokenId) public;
    function transferFrom(address _from, address _to, uint256 _tokenId) public;
    function transfer(address _to, uint256 _tokenId) public;
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
}

contract SampleStorage is Ownable {
    
    struct Sample {
        string ipfsHash;
        uint rarity;
    }
    
    mapping (uint32 => Sample) public sampleTypes;
    
    uint32 public numOfSampleTypes;
    
    uint32 public numOfCommon;
    uint32 public numOfRare;
    uint32 public numOfLegendary;

    // The mythical sample is a type common that appears only once in a 1000
    function addNewSampleType(string _ipfsHash, uint _rarityType) public onlyOwner {
        
        if (_rarityType == 0) {
            numOfCommon++;
        } else if (_rarityType == 1) {
            numOfRare++;
        } else if(_rarityType == 2) {
            numOfLegendary++;
        } else if(_rarityType == 3) {
            numOfCommon++;
        }
        
        sampleTypes[numOfSampleTypes] = Sample({
           ipfsHash: _ipfsHash,
           rarity: _rarityType
        });
        
        numOfSampleTypes++;
    }
    
    function getType(uint _randomNum) public view returns (uint32) {
        uint32 range = 0;
        
        if (_randomNum > 0 && _randomNum < 600) {
            range = 600 / numOfCommon;
            return uint32(_randomNum) / range;
            
        } else if(_randomNum >= 600 && _randomNum < 900) {
            range = 300 / numOfRare;
            return uint32(_randomNum) / range;
        } else {
            range = 100 / numOfLegendary;
            return uint32(_randomNum) / range;
        }
    }
    
}

contract Jingle is Ownable, ERC721 {
    
    struct MetaInfo {
        string name;
        string author;
    }
    
    mapping (uint => address) internal tokensForOwner;
    mapping (uint => address) internal tokensForApproved;
    mapping (address => uint[]) internal tokensOwned;
    mapping (uint => uint) internal tokenPosInArr;
    
    mapping(uint => uint[]) internal samplesInJingle;
    mapping(uint => MetaInfo) public jinglesInfo;
    
    mapping(bytes32 => bool) public uniqueJingles;
    
    mapping(uint => uint8[]) public soundEffects;
    mapping(uint => uint8[20]) public settings;
    
    uint public numOfJingles;
    
    address public cryptoJingles;
    Marketplace public marketplaceContract;
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event EffectAdded(uint indexed jingleId, uint8[] effectParams);
    event Composed(uint indexed jingleId, address indexed owner, uint32[5] samples, uint32[5] jingleTypes,
            string name, string author, uint8[20] settings);
    
    modifier onlyCryptoJingles() {
        require(msg.sender == cryptoJingles);
        _;
    }
    
    function transfer(address _to, uint256 _jingleId) public {
        require(tokensForOwner[_jingleId] != 0x0);
        require(tokensForOwner[_jingleId] == msg.sender);
        
        tokensForApproved[_jingleId] = 0x0;
        
        removeJingle(msg.sender, _jingleId);
        addJingle(_to, _jingleId);
        
        Approval(msg.sender, 0, _jingleId);
        Transfer(msg.sender, _to, _jingleId);
    }
    
    
    function approve(address _to, uint256 _jingleId) public {
        require(tokensForOwner[_jingleId] != 0x0);
        require(ownerOf(_jingleId) == msg.sender);
        require(_to != msg.sender);
        
        if (_getApproved(_jingleId) != 0x0 || _to != 0x0) {
            tokensForApproved[_jingleId] = _to;
            Approval(msg.sender, _to, _jingleId);
        }
    }
    
    function transferFrom(address _from, address _to, uint256 _jingleId) public {
        require(tokensForOwner[_jingleId] != 0x0);
        require(_getApproved(_jingleId) == msg.sender);
        require(ownerOf(_jingleId) == _from);
        require(_to != 0x0);
        
        tokensForApproved[_jingleId] = 0x0;
        
        removeJingle(_from, _jingleId);
        addJingle(_to, _jingleId);
        
        Approval(_from, 0, _jingleId);
        Transfer(_from, _to, _jingleId);
        
    }
    
    function approveAndSell(uint _jingleId, uint _amount) public {
        approve(address(marketplaceContract), _jingleId);
        
        marketplaceContract.sell(msg.sender, _jingleId, _amount);
    }
    
    function composeJingle(address _owner, uint32[5] jingles, 
    uint32[5] jingleTypes, string name, string author, uint8[20] _settings) public onlyCryptoJingles {
        
        uint _jingleId = numOfJingles;
        
        uniqueJingles[keccak256(jingles)] = true;
        
        tokensForOwner[_jingleId] = _owner;
        
        tokensOwned[_owner].push(_jingleId);
        
        samplesInJingle[_jingleId] = jingles;
        settings[_jingleId] = _settings;
        
        tokenPosInArr[_jingleId] = tokensOwned[_owner].length - 1;
        
        if (bytes(author).length == 0) {
            author = "Soundtoshi Nakajingles";
        }
        
        jinglesInfo[numOfJingles] = MetaInfo({
            name: name,
            author: author
        });
        
        Composed(numOfJingles, _owner, jingles, jingleTypes, 
        name, author, _settings);
        
        numOfJingles++;
    }
    
    function addSoundEffect(uint _jingleId, uint8[] _effectParams) external {
        require(msg.sender == ownerOf(_jingleId));
        
        soundEffects[_jingleId] = _effectParams;
        
        EffectAdded(_jingleId, _effectParams);
    }
    
    function implementsERC721() public pure returns (bool) {
        return true;
    }
    
    function totalSupply() public view returns (uint256) {
        return numOfJingles;
    }
    
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return tokensOwned[_owner].length;
    }
    
    function ownerOf(uint256 _jingleId) public view returns (address) {
        return tokensForOwner[_jingleId];
    }
    
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        return tokensOwned[_owner][_index];
    }
    
    function getSamplesForJingle(uint _jingleId) external view returns(uint[]) {
        return samplesInJingle[_jingleId];
    }
    
    function getAllJingles(address _owner) external view returns(uint[]) {
        return tokensOwned[_owner];
    }
    
    function getMetaInfo(uint _jingleId) external view returns(string, string) {
        return (jinglesInfo[_jingleId].name, jinglesInfo[_jingleId].author);
    }
    
    function _getApproved(uint _jingleId) internal view returns (address) {
        return tokensForApproved[_jingleId];
    }
    
     // Internal functions of the contract
    
    function addJingle(address _owner, uint _jingleId) internal {
        tokensForOwner[_jingleId] = _owner;
        
        tokensOwned[_owner].push(_jingleId);
        
        tokenPosInArr[_jingleId] = tokensOwned[_owner].length - 1;
    }
    
    // find who owns that jingle and at what position is it in the owners arr 
    // Swap that token with the last one in arr and delete the end of arr
    function removeJingle(address _owner, uint _jingleId) internal {
        uint length = tokensOwned[_owner].length;
        uint index = tokenPosInArr[_jingleId];
        uint swapToken = tokensOwned[_owner][length - 1];

        tokensOwned[_owner][index] = swapToken;
        tokenPosInArr[swapToken] = index;

        delete tokensOwned[_owner][length - 1];
        tokensOwned[_owner].length--;
    }
    
    // Owner functions 
    function setCryptoJinglesContract(address _cryptoJingles) public onlyOwner {
        require(cryptoJingles == 0x0);
        
        cryptoJingles = _cryptoJingles;
    }
    
    function setMarketplaceContract(address _marketplace) public onlyOwner {
        require(address(marketplaceContract) == 0x0);
        
        marketplaceContract = Marketplace(_marketplace);
    }
}

contract Sample is Ownable {
    
    mapping (uint => address) internal tokensForOwner;
    mapping (address => uint[]) internal tokensOwned;
    mapping (uint => uint) internal tokenPosInArr;
    
    mapping (uint => uint32) public tokenType;
    
    uint public numOfSamples;
    
    address public cryptoJingles;
    address public sampleRegistry;


    SampleStorage public sampleStorage;
    
    event Mint(address indexed _to, uint256 indexed _tokenId);
    
    modifier onlyCryptoJingles() {
        require(msg.sender == cryptoJingles);
        _;
    }
    
    function Sample(address _sampleStorage) public {
        sampleStorage = SampleStorage(_sampleStorage);
    }
    
    function mint(address _owner, uint _randomNum) public onlyCryptoJingles {
        
        uint32 sampleType = sampleStorage.getType(_randomNum);
        
        addSample(_owner, sampleType, numOfSamples);
        
        Mint(_owner, numOfSamples);
        
        numOfSamples++;
    }
    
    function mintForSampleRegitry(address _owner, uint32 _type) public {
        require(msg.sender == sampleRegistry);
        
        addSample(_owner, _type, numOfSamples);
        
        Mint(_owner, numOfSamples);
        
        numOfSamples++;
    }
    
    function removeSample(address _owner, uint _sampleId) public onlyCryptoJingles {
        uint length = tokensOwned[_owner].length;
        uint index = tokenPosInArr[_sampleId];
        uint swapToken = tokensOwned[_owner][length - 1];

        tokensOwned[_owner][index] = swapToken;
        tokenPosInArr[swapToken] = index;

        delete tokensOwned[_owner][length - 1];
        tokensOwned[_owner].length--;
        
        tokensForOwner[_sampleId] = 0x0;
        
    }
    
    function getSamplesForOwner(address _owner) public constant returns (uint[]) {
        return tokensOwned[_owner];
    }
    
    function getTokenType(uint _sampleId) public constant returns (uint) {
        return tokenType[_sampleId];
    }
    
    function isTokenOwner(uint _tokenId, address _user) public constant returns(bool) {
        return tokensForOwner[_tokenId] == _user;
    }
    
    function getAllSamplesForOwner(address _owner) public constant returns(uint[]) {
        uint[] memory samples = tokensOwned[_owner];
        
        uint[] memory usersSamples = new uint[](samples.length * 2);
        
        uint j = 0;
        
        for(uint i = 0; i < samples.length; ++i) {
            usersSamples[j] = samples[i];
            usersSamples[j + 1] = tokenType[samples[i]];
            j += 2;
        }
        
        return usersSamples;
    }
    
    // Internal functions of the contract
    
    function addSample(address _owner, uint32 _sampleType, uint _sampleId) internal {
        tokensForOwner[_sampleId] = _owner;
        
        tokensOwned[_owner].push(_sampleId);
        
        tokenType[_sampleId] = _sampleType;
        
        tokenPosInArr[_sampleId] = tokensOwned[_owner].length - 1;
    }
    
     // Owner functions 
    // Set the crypto jingles contract can 
    function setCryptoJinglesContract(address _cryptoJingles) public onlyOwner {
        require(cryptoJingles == 0x0);
        
        cryptoJingles = _cryptoJingles;
    }
    
    function setSampleRegistry(address _sampleRegistry) public onlyOwner {
        sampleRegistry = _sampleRegistry;
    }
}

contract CryptoJingles is Ownable {
    
    struct Purchase {
        address user;
        uint blockNumber;
        bool revealed;
        uint numSamples;
        bool exists;
    }
    
    event Purchased(address indexed user, uint blockNumber, uint numJingles, uint numOfPurchases);
    event JinglesOpened(address byWhom, address jingleOwner, uint currBlockNumber);
    
    mapping (uint => bool) public isAlreadyUsed;
    
    mapping(address => string) public authors;

    uint numOfPurchases;
    
    uint MAX_SAMPLES_PER_PURCHASE = 15;
    uint SAMPLE_PRICE = 10 ** 15;
    uint SAMPLES_PER_JINGLE = 5;
    uint NUM_SAMPLE_RANGE = 1000;
    
    Sample public sampleContract;
    Jingle public jingleContract;
    
    function CryptoJingles(address _sample, address _jingle) public {
        numOfPurchases = 0;
        sampleContract = Sample(_sample);
        jingleContract = Jingle(_jingle);
    }
    
    function buySamples(uint _numSamples, address _to) public payable {
        require(_numSamples <= MAX_SAMPLES_PER_PURCHASE);
        require(msg.value >= (SAMPLE_PRICE * _numSamples));
        require(_to != 0x0);
        
         for (uint i = 0; i < _numSamples; ++i) {
            
            bytes32 blockHash = block.blockhash(block.number - 1);
            
            uint randomNum = randomGen(blockHash, i);
            sampleContract.mint(_to, randomNum);
        }
        
        Purchased(_to, block.number, _numSamples, numOfPurchases);
        
        numOfPurchases++;
    }
    
    function composeJingle(string name, uint32[5] samples, uint8[20] settings) public {
        require(jingleContract.uniqueJingles(keccak256(samples)) == false);
        
        uint32[5] memory sampleTypes;
        
        //check if you own all the 5 samples 
        for (uint i = 0; i < SAMPLES_PER_JINGLE; ++i) {
            bool isOwner = sampleContract.isTokenOwner(samples[i], msg.sender);
            
            require(isOwner == true && isAlreadyUsed[samples[i]] == false);
            
            isAlreadyUsed[samples[i]] = true;
            
            sampleTypes[i] = sampleContract.tokenType(samples[i]);
            sampleContract.removeSample(msg.sender, samples[i]);
        }
        
        //create a new jingle containing those 5 samples
        jingleContract.composeJingle(msg.sender, samples, sampleTypes, name,
                            authors[msg.sender], settings);
    }
    
    // Addresses can set their name when composing jingles
    function setAuthorName(string _name) public {
        authors[msg.sender] = _name;
    }
    
    function randomGen(bytes32 blockHash, uint seed) constant public returns (uint randomNumber) {
        return (uint(keccak256(blockHash, block.timestamp, numOfPurchases, seed )) % NUM_SAMPLE_RANGE);
    }
    
    // The only ether kept on this contract are owner money for samples
    function withdraw(uint _amount) public onlyOwner {
        require(_amount <= this.balance);
        
        msg.sender.transfer(_amount);
    }
    
}

contract Marketplace is Ownable {
    
    modifier onlyJingle() {
        require(msg.sender == address(jingleContract));
        _;
    }
    
    struct Order {
        uint price;
        address seller;
        uint timestamp;
        bool exists;
    }
    
    event SellOrder(address owner, uint jingleId, uint price);
    event Bought(uint jingleId, address buyer, uint price);
    event Canceled(address owner, uint jingleId);
    
    uint public numOrders;
    uint public ownerBalance;
    
    uint OWNERS_CUT = 3; // 3 percent of every sale goes to owner
    
    mapping (uint => Order) public sellOrders;
    mapping(uint => uint) public positionOfJingle;
    
    uint[] public jinglesOnSale;
    
    Jingle public jingleContract;
    
    function Marketplace(address _jingle) public {
        jingleContract = Jingle(_jingle);
        ownerBalance = 0;
    }

    function sell(address _owner, uint _jingleId, uint _amount) public onlyJingle {
        require(_amount > 100);
        require(sellOrders[_jingleId].exists == false);
        
        sellOrders[_jingleId] = Order({
           price: _amount,
           seller: _owner,
           timestamp: now,
           exists: true
        });
        
        numOrders++;
        
        // set for iterating
        jinglesOnSale.push(_jingleId);
        positionOfJingle[_jingleId] = jinglesOnSale.length - 1;
        
        //transfer ownership 
        jingleContract.transferFrom(_owner, this, _jingleId);
        
        //Fire an sell event
        SellOrder(_owner, _jingleId, _amount);
    }
    
    function buy(uint _jingleId) public payable {
        require(sellOrders[_jingleId].exists == true);
        require(msg.value >= sellOrders[_jingleId].price);
        
        sellOrders[_jingleId].exists = false;
        
        numOrders--;
        
        //delete stuff for iterating 
        removeOrder(_jingleId);
        
        //transfer ownership 
        jingleContract.transfer(msg.sender, _jingleId);
        
        // transfer money to seller
        uint price = sellOrders[_jingleId].price;
        
        uint threePercent = (price / 100) * OWNERS_CUT;
        
        sellOrders[_jingleId].seller.transfer(price - threePercent);
        
        ownerBalance += threePercent;
        
        //fire and event
        Bought(_jingleId, msg.sender, msg.value);
    }
    
    function cancel(uint _jingleId) public {
        require(sellOrders[_jingleId].exists == true);
        require(sellOrders[_jingleId].seller == msg.sender);
        
        sellOrders[_jingleId].exists = false;
        
        numOrders--;
        
        //delete stuff for iterating 
        removeOrder(_jingleId);
        
        jingleContract.transfer(msg.sender, _jingleId);
        
        //fire and event
        Canceled(msg.sender, _jingleId);
    }
    
    function removeOrder(uint _jingleId) internal {
        uint length = jinglesOnSale.length;
        uint index = positionOfJingle[_jingleId];
        uint lastOne = jinglesOnSale[length - 1];

        jinglesOnSale[index] = lastOne;
        positionOfJingle[lastOne] = index;

        delete jinglesOnSale[length - 1];
        jinglesOnSale.length--;
    }
    
    function getAllJinglesOnSale() public view returns(uint[]) {
        return jinglesOnSale;
    }
    
    //Owners functions 
    function withdraw(uint _amount) public onlyOwner {
        require(_amount <= ownerBalance);
        
        msg.sender.transfer(_amount);
    }
    
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_jingleId","type":"uint256"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numOrders","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sellOrders","outputs":[{"name":"price","type":"uint256"},{"name":"seller","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"positionOfJingle","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_jingleId","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jingleContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllJinglesOnSale","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_jingleId","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"jinglesOnSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_jingle","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"jingleId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"SellOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"jingleId","type":"uint256"},{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"jingleId","type":"uint256"}],"name":"Canceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405260038055341561001357600080fd5b6040516020806111ba83398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600281905550506110f2806100c86000396000f3006060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146100ca57806340e58ee5146100ed57806345d53788146101105780634a8393f31461013957806366417115146101b55780636a272462146101ec5780638da5cb5b14610237578063a82e31791461028c578063bedcf003146102e1578063c591c8a31461030a578063d96a094a14610374578063f2fde38b1461038c578063fc76687c146103c5575b600080fd5b34156100d557600080fd5b6100eb60048080359060200190919050506103fc565b005b34156100f857600080fd5b61010e60048080359060200190919050506104ab565b005b341561011b57600080fd5b6101236106e2565b6040518082815260200191505060405180910390f35b341561014457600080fd5b61015a60048080359060200190919050506106e8565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200194505050505060405180910390f35b34156101c057600080fd5b6101d66004808035906020019091905050610745565b6040518082815260200191505060405180910390f35b34156101f757600080fd5b610235600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061075d565b005b341561024257600080fd5b61024a610aa9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561029757600080fd5b61029f610ace565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ec57600080fd5b6102f4610af4565b6040518082815260200191505060405180910390f35b341561031557600080fd5b61031d610afa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610360578082015181840152602081019050610345565b505050509050019250505060405180910390f35b61038a6004808035906020019091905050610b58565b005b341561039757600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e05565b005b34156103d057600080fd5b6103e66004808035906020019091905050610f5a565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561045757600080fd5b600254811115151561046857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156104a857600080fd5b50565b600115156004600083815260200190815260200160002060030160009054906101000a900460ff1615151415156104e157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561055157600080fd5b60006004600083815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506001600081548092919060019003919050555061059c81610f7e565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561066057600080fd5b6102c65a03f1151561067157600080fd5b5050507ff3a6ef5718c05d9183af076f5753197b68b04552a763c34796637d6134bdd0f23382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b60015481565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16905084565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107b957600080fd5b6064811115156107c857600080fd5b600015156004600084815260200190815260200160002060030160009054906101000a900460ff1615151415156107fe57600080fd5b6080604051908101604052808281526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200160011515815250600460008481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550905050600160008154809291906001019190505550600680548060010182816108f09190611035565b9160005260206000209001600084909190915055506001600680549050036005600084815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610a1d57600080fd5b6102c65a03f11515610a2e57600080fd5b5050507fcbc0df49dd88ec0ba5b87a3c77ed66af6480b175df0f21649805ed6201c56145838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b610b02611061565b6006805480602002602001604051908101604052809291908181526020018280548015610b4e57602002820191906000526020600020905b815481526020019060010190808311610b3a575b5050505050905090565b600080600115156004600085815260200190815260200160002060030160009054906101000a900460ff161515141515610b9157600080fd5b60046000848152602001908152602001600020600001543410151515610bb657600080fd5b60006004600085815260200190815260200160002060030160006101000a81548160ff02191690831515021790555060016000815480929190600190039190505550610c0183610f7e565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610cc557600080fd5b6102c65a03f11515610cd657600080fd5b50505060046000848152602001908152602001600020600001549150600354606483811515610d0157fe5b040290506004600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f193505050501515610d7d57600080fd5b806002600082825401925050819055507fd2728f908c7e0feb83c6278798370fcb86b62f236c9dbf1a3f541096c2159040833334604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610e9c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600681815481101515610f6957fe5b90600052602060002090016000915090505481565b6000806000600680549050925060056000858152602001908152602001600020549150600660018403815481101515610fb357fe5b906000526020600020900154905080600683815481101515610fd157fe5b90600052602060002090018190555081600560008381526020019081526020016000208190555060066001840381548110151561100a57fe5b906000526020600020900160009055600680548091906001900361102e9190611075565b5050505050565b81548183558181151161105c5781836000526020600020918201910161105b91906110a1565b5b505050565b602060405190810160405280600081525090565b81548183558181151161109c5781836000526020600020918201910161109b91906110a1565b5b505050565b6110c391905b808211156110bf5760008160009055506001016110a7565b5090565b905600a165627a7a7230582085673e787fe669197b1d40ed7eacb154af01c530b00da2f25847837b9226e9e700290000000000000000000000005b6660ca047cc351bfedca4fc864d0a88f551485

Deployed Bytecode

0x6060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146100ca57806340e58ee5146100ed57806345d53788146101105780634a8393f31461013957806366417115146101b55780636a272462146101ec5780638da5cb5b14610237578063a82e31791461028c578063bedcf003146102e1578063c591c8a31461030a578063d96a094a14610374578063f2fde38b1461038c578063fc76687c146103c5575b600080fd5b34156100d557600080fd5b6100eb60048080359060200190919050506103fc565b005b34156100f857600080fd5b61010e60048080359060200190919050506104ab565b005b341561011b57600080fd5b6101236106e2565b6040518082815260200191505060405180910390f35b341561014457600080fd5b61015a60048080359060200190919050506106e8565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200194505050505060405180910390f35b34156101c057600080fd5b6101d66004808035906020019091905050610745565b6040518082815260200191505060405180910390f35b34156101f757600080fd5b610235600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061075d565b005b341561024257600080fd5b61024a610aa9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561029757600080fd5b61029f610ace565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ec57600080fd5b6102f4610af4565b6040518082815260200191505060405180910390f35b341561031557600080fd5b61031d610afa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610360578082015181840152602081019050610345565b505050509050019250505060405180910390f35b61038a6004808035906020019091905050610b58565b005b341561039757600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e05565b005b34156103d057600080fd5b6103e66004808035906020019091905050610f5a565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561045757600080fd5b600254811115151561046857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156104a857600080fd5b50565b600115156004600083815260200190815260200160002060030160009054906101000a900460ff1615151415156104e157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561055157600080fd5b60006004600083815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506001600081548092919060019003919050555061059c81610f7e565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561066057600080fd5b6102c65a03f1151561067157600080fd5b5050507ff3a6ef5718c05d9183af076f5753197b68b04552a763c34796637d6134bdd0f23382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b60015481565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16905084565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107b957600080fd5b6064811115156107c857600080fd5b600015156004600084815260200190815260200160002060030160009054906101000a900460ff1615151415156107fe57600080fd5b6080604051908101604052808281526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200160011515815250600460008481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550905050600160008154809291906001019190505550600680548060010182816108f09190611035565b9160005260206000209001600084909190915055506001600680549050036005600084815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610a1d57600080fd5b6102c65a03f11515610a2e57600080fd5b5050507fcbc0df49dd88ec0ba5b87a3c77ed66af6480b175df0f21649805ed6201c56145838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b610b02611061565b6006805480602002602001604051908101604052809291908181526020018280548015610b4e57602002820191906000526020600020905b815481526020019060010190808311610b3a575b5050505050905090565b600080600115156004600085815260200190815260200160002060030160009054906101000a900460ff161515141515610b9157600080fd5b60046000848152602001908152602001600020600001543410151515610bb657600080fd5b60006004600085815260200190815260200160002060030160006101000a81548160ff02191690831515021790555060016000815480929190600190039190505550610c0183610f7e565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610cc557600080fd5b6102c65a03f11515610cd657600080fd5b50505060046000848152602001908152602001600020600001549150600354606483811515610d0157fe5b040290506004600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f193505050501515610d7d57600080fd5b806002600082825401925050819055507fd2728f908c7e0feb83c6278798370fcb86b62f236c9dbf1a3f541096c2159040833334604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610e9c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600681815481101515610f6957fe5b90600052602060002090016000915090505481565b6000806000600680549050925060056000858152602001908152602001600020549150600660018403815481101515610fb357fe5b906000526020600020900154905080600683815481101515610fd157fe5b90600052602060002090018190555081600560008381526020019081526020016000208190555060066001840381548110151561100a57fe5b906000526020600020900160009055600680548091906001900361102e9190611075565b5050505050565b81548183558181151161105c5781836000526020600020918201910161105b91906110a1565b5b505050565b602060405190810160405280600081525090565b81548183558181151161109c5781836000526020600020918201910161109b91906110a1565b5b505050565b6110c391905b808211156110bf5760008160009055506001016110a7565b5090565b905600a165627a7a7230582085673e787fe669197b1d40ed7eacb154af01c530b00da2f25847837b9226e9e70029

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

0000000000000000000000005b6660ca047cc351bfedca4fc864d0a88f551485

-----Decoded View---------------
Arg [0] : _jingle (address): 0x5B6660ca047Cc351BFEdCA4Fc864d0A88F551485

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b6660ca047cc351bfedca4fc864d0a88f551485


Swarm Source

bzzr://85673e787fe669197b1d40ed7eacb154af01c530b00da2f25847837b9226e9e7

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  ]
[ 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.