Bootstrap Bootstrap
# Key Data
0 0x0000000000000000000000000000000000000000
{
   address: "0x0000000000000000000000000000000000000000",
   balance: "0",
   ens: "Null Address",
   "transactions": [],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: null,
   savedOnBlockNumber: "0"
}
1 0x0000000000000000000000000000000000000001
{
   address: "0x0000000000000000000000000000000000000001",
   balance: "-12750000000000000000000",
   ens: "Mint Address",
   "transactions": [],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "49"
}
2 0x0000000000000000000000000000000000000002
{
   address: "0x0000000000000000000000000000000000000002",
   balance: "0",
   ens: "Burn Address",
   "transactions": [],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: null,
   savedOnBlockNumber: "0"
}
3 0xccf8ba457dcad7ee6a0361c96846a0f79744b113
{
   address: "0xccf8ba457dcad7ee6a0361c96846a0f79744b113",
   balance: "12500000504073000000000",
   transactions: [
      "0x769cdbd9cf5e7f437df3a7f1b8020b66933d562fcec2b04982a6db364b7e4368",
      "0xc26da3a9c97df9c900dad01068900bbc283f53e191e45aa27e753452f5de4513",
      "0x30cba6a6848c69fe29d79a6eb059accf512d6021704f3b40f9108382a0f20090",
      "0xb32a63ebe1e1c60d471eeeedae9c86a0ff211736e7ccb84078c51da86d0dd2d8",
      "0x194cae77eda01be54da0d49a51846deb0b138797565b73b012900c782acd2daa",
      "0xf5ff4d07877270f43c650fc44c0b7f3746af8bc96b81c331232a8e546eddd118",
      "0x3f7a6a28c7cf9385da34dc150f359bbc079ac93b8730f3decfcaedd997097d87",
      "0x60334c2fbb9a0da329f6503562b6d3abb0f589f735490b6cb548804d357d9f32",
      "0x9fc68f8ad63e0e9e9d5804188cdb37ca0b390ace7e15679419c874049f93092c"
   ],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "49"
}
4 0x131a190fa22cb867abf58193bf9e7640e9fce682
{
   address: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
   balance: "999999508992000000000",
   transactions: [
      "0x1964b5ae0f32659b2cc50f7aa8e2f2d7cb213197adb64008206f1b32ba49aa2f",
      "0x5f688782a2de8e88327e6930d4133fd833252e1255a7595d619964a2f58bba67",
      "0x242f750a46ec75c386606f20ed7d4c2a1486cf0150919aef761010e89c5b43eb",
      "0x484d9c454cc34fc752903e492ce5c573118ba68824594a6fe0eabedd938361f6",
      "0x86764232071da39aafa015bef38b5a40f390b01afa54744d0e3965cca608b472",
      "0x2d9987bffd02b12a95167d157f4d345b1954b62f043e308b892e916e0b217308",
      "0xcef76138cfb3883fae36032061551ff0dcff8785795478380912e44318fe40bd",
      "0xfe576f241ed53b32a1748eb53e93838c2e60c2ffc866a993482590a854d9152e",
      "0xd242c8ffbe99682086ac93dfbdb2f83ce794ef8af244cc33bf59368aaf85b603",
      "0x15a7d8bf0c3ef7b0d877bd57e0410f1d73fe4bc4e3425a606f3dab8b44370584",
      "0xd35ada50d67fe104087551ffcc9b05db08902ced472e9d26982fce6f59b66cf1",
      "0x2294b753e054ffa64adcafc660939c2f9d40009cde3175a78eb57c6985399b65",
      "0xb3abc261f15cb3e4270615cc4c5f5a9bfab9ffbf6772c6361092d95732329b13",
      "0x08838c57c86c750b35a3c2318e39f2d9685225d4080c2c38d24b7ef5add02d9b",
      "0xe51decb9e38a2bb8630f947fcd3e45e61bcdeae36f8e92130c7f06d8d344ed9a",
      "0xf5a2934425fc3114cd64b383f3adfd9813f0c1b4bb2147a9bc37cb6bd6a72b2a",
      "0xe04941629d6246a16a45de1a024aaf9cc18110ef6c2e1dc4f38cbea4a81c2dd2",
      "0x121ccb7eaf7a50218653db6da441ce98ba31ac8ea2a56211ad512f786723d799",
      "0x6c731343fb71c49d30ba2ad776743a3ac994b55559f1a7cacb6d2edacc876b43",
      "0x270780dd570baa0939e878e62eff1a299b708a6a2a376cce05110c1efdc4dd7d",
      "0xf0862f9fa47e615ca5f7afd8ab3e70c109f5b7f9f86f2d686a919464a4f2149c",
      "0x67a182fd9147cc9a2160566428468b52b8880b7900f745d03074438fdbf953af",
      "0x64c30834336d117661c16a25ab6e47b2819a8518e3df66ac4c4e3b4b4974e42a",
      "0x2c32e99703210bdadc2bba260f770e7e8c790690c2149c9ce0255d3bc55cf0fe",
      "0x43d2e7922f2608ad4c091c265f857962698c79c4aa6385793ec39034004579ee",
      "0x83b887180a7347a09434575e16a0d50565c8b884367a1ca154b7e9325c0934ed",
      "0x8bd2e15463e7077c51933818c91b92287dc272f79db15ebd48cf6dc84ea0bae2",
      "0x08792b452d315a340f7f4ee093822b61c4386c80706e8e2c71d80ba12c9bdd9f",
      "0x72362ea00b8ea3be471e03529de92cc594e89e21ff907040dcb578d311c329ce",
      "0x5e413a2d19b593f8455e747d09b69e38a44712f9166cfe282bdbbdb5a0098e92",
      "0xc4d96a5b29be167f24d2d28ee4dc3791e81eb839a0ba92ab99d1392b595ed541",
      "0x9875bfede4e11ecf7234698a14ed497864c10f9ba1baf77b045fbca420c1bb00",
      "0x21a481eab803eba639e6dfae09491919c5cc637ae0d97c63a3c557a7fa316ded",
      "0x63a85145c4535cd1cb3b86206215a855e6d3102d03e87608e04019a635b84e96",
      "0x515a83ca0d5a12c7f1875c48446d1f1d8eb82a42781c153072d29be86fee41d0",
      "0x7c5e6c6cc0e0dcd1f9762f541913543cd006d5c3f97cba2d97f53959819053f4",
      "0xded491ff92f07cb14728354689cb16b1e5f3bb9b338776c1e96dd6bff9215e51",
      "0xacbccaadfc4e8ee297241ee3d53c50b6cca88acf446cf73223560b70b794669f",
      "0xdf8a85a40ae16d2ff22ae153a108e9c89cdc54bfb5ae0d9623a5540bc160b1e0",
      "0x433de861a571f823a73baf3c8f0e2ed8b26d3b36df57a9206b958e8788ff3c54",
      "0x333540a1c860d3a4a7293a1379658d2e98fa7fc7c20308db62c8b42dfe851334"
   ],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "49"
}
5 0x2347d36cf0d94b98bab6d6d41c6f94d7214830ad
{
   address: "0x2347d36cf0d94b98bab6d6d41c6f94d7214830ad",
   balance: "0",
   "transactions": [],
   code: "/*\nName: Wrapped BNB => Wrapped KARMA\nVersion: 0.0.3\nSource:\n    - WBNB: https://github.com/pancakeswap/pancake-farm/blob/master/contracts/libs/WBNB.sol\nDeploy: https://bscscan.com/address/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\n\n\n\nclass WKARMA extends ERC20Token {\n    name = 'Wrapped KARMA';\n    symbol = 'WKARMA';\n    \n    \n    deposit() {\n        if (! (msg.sender in this.balances)) {\n            this.balances[msg.sender] = number(0);\n        }\n\n        this.balances[msg.sender] = this.balances[msg.sender].add(msg.value);\n        this.totalSupply = this.totalSupply.add(msg.value);\n\n        require(this.totalSupply.eq(address(this).balance), 'TOTAL_SUPPLY_MISMATCH');\n        this.drain();\n        emit('Deposit', [msg.sender, msg.value]);\n    }\n\n\n    Deposit(sender, value) {} // event\n\n\n    withdraw(wad) {\n        require(msg.sender in this.balances && ! this.balances[msg.sender].lt(wad));\n        this.drain();\n\n        this.balances[msg.sender] = this.balances[msg.sender].sub(wad);\n        this.totalSupply = this.totalSupply.sub(wad);\n\n        address(msg.sender).transfer(wad);\n\n        require(this.totalSupply.eq(address(this).balance), 'TOTAL_SUPPLY_MISMATCH');\n        emit('Withdrawal', [msg.sender, wad]);\n    }\n\n\n    Withdrawal(sender, value) {} // event\n    \n\n    drain() {\n        if (address(this).balance.gt(this.totalSupply)) {\n            const overBalance = address(this).balance.sub(this.totalSupply);\n            address(this.owner).transfer(overBalance);\n            emit('Drain', [msg.sender, overBalance]);\n        }\n    }\n\n\n    Drain(sender, value) {} // event\n\n}\n\n\n// Events\nWKARMA.prototype.Deposit.event = true;\nWKARMA.prototype.Deposit.inputs = ['address indexed', 'uint256'];\n\nWKARMA.prototype.Withdrawal.event = true;\nWKARMA.prototype.Withdrawal.inputs = ['address indexed', 'uint256'];\n\nWKARMA.prototype.Drain.event = true;\nWKARMA.prototype.Drain.inputs = ['address indexed', 'uint256'];\n\n// Methods\nWKARMA.prototype.deposit.payable = true;\n\nWKARMA.prototype.withdraw.inputs = ['uint256'];\n\n\nreturn WKARMA;\n",
   codeHash: "0xb509231997a77b225178905db5d62a4a30c04d52130f2e59ce5b4206d6189d81",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xd0e30db0: {
         "inputs": [],
         name: "deposit",
         "outputs": [],
         stateMutability: "payable",
         type: "function"
      },
      0xe1fffcc4: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Deposit",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x2e1a7d4d: {
         inputs: [
            {
               name: "wad",
               type: "uint256"
            }
         ],
         name: "withdraw",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x7fcf532c: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Withdrawal",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x9890220b: {
         "inputs": [],
         name: "drain",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xf36f4d66: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Drain",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0f6798a5: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcc16f5db: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x40c10f19: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9dc29fac: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "WKARMA",
   storage: {
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "Wrapped KARMA",
      symbol: "WKARMA",
      decimals: 18,
      totalSupply: "0",
      "allowed": {},
      "balances": {},
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      prototype: {
         address: "0x2347d36cf0d94b98bab6d6d41c6f94d7214830ad"
      }
   },
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "0"
}
6 0x0da81b5da0e5b6a4615d3499d31bb34f0e35a74e
{
   address: "0x0da81b5da0e5b6a4615d3499d31bb34f0e35a74e",
   balance: "1000000000000000000",
   "transactions": [],
   code: "\n/*\nName: Faucet Contract\nVersion: 0.0.3\n*/\n\n\nclass Faucet {\n    allocations = {}; // liste de Allocation : {totalAmount, lastAmount, lastTimestamp} indexée par address\n    minAmountPerDay = number('10' + '000000000000000000'); // 10\n    maxAmountPerDay = number('50' + '000000000000000000'); // 50\n    totalAllocated = number(0);\n    allocationsDelay = 86400;\n\n\n    Faucet(recipient, amount) {} // event\n\n\n    getFreeMoney(recipient) {\n        const tokenAllocations = this.allocations || {};\n\n        require(address(this).balance.gt(0), "INSUFFICIENT_FAUCET_BALANCE");\n        \n        if (! recipient) {\n            _throw('MISSING_SENDER_ADDRESS');\n        }\n\n        if (recipient in tokenAllocations && tokenAllocations[recipient].lastTimestamp > Date.now() - this.allocationsDelay * 1000) {\n            _throw('TOO_SOON');\n        }\n\n        const diffMinMax = this.maxAmountPerDay.sub(this.minAmountPerDay);\n        const rnd = Math.round(Math.random() * 1000);\n        let amount = this.minAmountPerDay.add( diffMinMax.mul(rnd).div(1000) );\n        //const amount = number('2000000000000000000');\n\n        if (amount.lt(this.minAmountPerDay)) {\n            amount = this.minAmountPerDay;\n        }\n\n        if (amount.gt(address(this).balance)) {\n            amount = address(this).balance;\n        }\n\n        if (amount.gt(this.maxAmountPerDay)) {\n            amount = this.maxAmountPerDay;\n        }\n        \n        if (! (recipient in tokenAllocations)) {\n            tokenAllocations[recipient] = {\n                totalAmount: number(0),\n                lastAmount: number(0),\n                lastTimestamp: number(0),\n            };\n        }\n\n\n        tokenAllocations[recipient].totalAmount = tokenAllocations[recipient].totalAmount.add(amount);\n        tokenAllocations[recipient].lastAmount = amount;\n        tokenAllocations[recipient].lastTimestamp = Date.now();\n\n        address(recipient).transfer(amount); // send free money to recipient\n\n        address(msg.sender).transfer( number(1e18.toString()) ); // send money for gas payment thanks\n\n        this.totalAllocated = this.totalAllocated.add(amount);\n\n        emit('Faucet', [recipient, amount]);\n\n        return [amount];\n    }\n}\n\n// Events\nFaucet.prototype.Faucet.event = true;\nFaucet.prototype.Faucet.inputs = ['address indexed', 'uint256'];\n\n// Methods\nFaucet.prototype.getFreeMoney.inputs = ['address'];\nFaucet.prototype.getFreeMoney.outputs = ['uint256'];\n\n\nreturn Faucet;\n",
   codeHash: "0x9232aff080256517c36d3d05edd979e7b672e79abb412712af4c65bdf7d84919",
   codeAbi: {
      0xc358234b: {
         constant: true,
         "inputs": [],
         name: "allocations",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x88c53fe6: {
         constant: true,
         "inputs": [],
         name: "minAmountPerDay",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x381fc009: {
         constant: true,
         "inputs": [],
         name: "maxAmountPerDay",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x45f7f249: {
         constant: true,
         "inputs": [],
         name: "totalAllocated",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x2bd99c18: {
         constant: true,
         "inputs": [],
         name: "allocationsDelay",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x1c5347d1: {
         inputs: [
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Faucet",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x418083f9: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            }
         ],
         name: "getFreeMoney",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "Faucet",
   storage: {
      prototype: {
         address: "0x0da81b5da0e5b6a4615d3499d31bb34f0e35a74e"
      },
      "allocations": {},
      minAmountPerDay: "10000000000000000000",
      maxAmountPerDay: "50000000000000000000",
      totalAllocated: "0",
      allocationsDelay: 86400
   },
   storageHash: "0xacc567f8900448b11de837128c2b473b7aa4b1ff8532ea3084fb9fc1d64e1fdb",
   savedOnBlockNumber: "39"
}
7 0x92c8b8729d850d99c34c50ab2846ec36169e0024
{
   address: "0x92c8b8729d850d99c34c50ab2846ec36169e0024",
   balance: "0",
   "transactions": [],
   code: "/*\nName: YO Token\nVersion: 0.0.3\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\n\nclass YoToken extends ERC20Token {   \n    name = 'YO Token';\n    symbol = 'YO';\n\n    stackingService = '';\n\n\n    initialize(stackingServiceAddress) {\n        //require(this.stackingService == '', "ALREADY_INITIALIZED");\n        this.stackingService = stackingServiceAddress.toLowerCase();\n\n        const initAmount = number('42000000' + '000000000000000000'); // 42 000 000 YO\n        this._mint(msg.sender, initAmount);\n\n        emit('Initialize', [stackingServiceAddress]);\n    }\n\n\n    Initialize(stackingServiceAddress) {} // event\n\n\n    mint(recipient, amountToMint) {\n        require(this.stackingService != '', "NOT_INITIALIZED");\n        require(msg.sender == this.stackingService, "ONLY_STACKING_SERVICE");\n        this._mint(recipient, amountToMint);\n    }\n\n}\n\n\n// Events\nYoToken.prototype.Initialize.event = true;\nYoToken.prototype.Initialize.inputs = ['address indexed'];\n\n// Methods\nYoToken.prototype.initialize.inputs = ['address'];\n//YoToken.prototype.initialize.modifiers = ['_onlyOwner'];\n\nYoToken.prototype.mint.inputs = ['address', 'uint256'];\n\n\n\nreturn YoToken;\n",
   codeHash: "0x3f1e692fcf3e652e9a299c1ab9a9874d7376ba1c8e762d31739d3696c385768b",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa2e78faa: {
         constant: true,
         "inputs": [],
         name: "stackingService",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xc4d66de8: {
         inputs: [
            {
               name: "stackingServiceAddress",
               type: "address"
            }
         ],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x36b14535: {
         inputs: [
            {
               name: "stackingServiceAddress",
               type: "address",
               indexed: true
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0f6798a5: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcc16f5db: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x40c10f19: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amountToMint",
               type: "uint256"
            }
         ],
         name: "mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9dc29fac: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "YoToken",
   storage: {
      prototype: {
         address: "0x92c8b8729d850d99c34c50ab2846ec36169e0024"
      },
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "YO Token",
      symbol: "YO",
      decimals: 18,
      totalSupply: "42000000000000000000000000",
      "allowed": {},
      balances: {
         0xccf8ba457dcad7ee6a0361c96846a0f79744b113: "42000000000000000000000000"
      },
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      stackingService: "0xc3349025e73b4746d79a30ade1200e5dd2d8f754"
   },
   storageHash: "0xd81debac54db4b3e681b0e2db50d81e0c1be422f0bc8990dd52fb86cceba41bf",
   savedOnBlockNumber: "11"
}
8 0xc3349025e73b4746d79a30ade1200e5dd2d8f754
{
   address: "0xc3349025e73b4746d79a30ade1200e5dd2d8f754",
   balance: "0",
   "transactions": [],
   code: "/*\nName: StackingService\nVersion: 0.0.3\nSource:\n - CakeVault : https://github.com/pancakeswap/pancake-smart-contracts/blob/master/projects/cake-vault/contracts/CakeVault.sol\n - SmartChefInitializable : https://github.com/pancakeswap/pancake-smart-contracts/blob/master/projects/smartchef/v2/contracts/SmartChefInitializable.sol\n - MasterChef : https://github.com/pancakeswap/pancake-smart-contracts/blob/master/projects/farms-pools/contracts/MasterChef.sol\n*/\n\n\nfunction IERC20(tokenAddress) {\n    return address(tokenAddress).getContract();\n}\n\nfunction StackerInfo(stackedAmount, rewardDebt) {\n    this.stackedAmount = stackedAmount || number(0);\n    this.rewardDebt = rewardDebt || number(0);\n}\n\n\nclass StackingService {\n    owner = ''\n    stackedToken = '';\n    rewardToken = '';\n    totalStacked = number(0);\n    accRewardPerStackToken = number(0);\n    stackers = {}; // mapping(address => StackerInfo)\n    lastMint = number(0);\n    \n    mintPeriod = number(60 * 1000); // 60 seconds (1 minute)\n    rewardsPerPeriod = number('100' + '000000000000000000'); // 100 Token emitted per period (splitted on all stackers)\n\n\n\n    Initialize(stackedToken, rewardToken) {} // event\n    Reset() {} // event\n    Deposit(sender, amount) {} // event\n    Withdrawal(sender, amount, rewardAmount) {} // event\n    UpdatePool(pendingRewards, extraRewardPerStackToken) {} // event\n    UpdateStacker(stackerAddress, stackerRewardAmount) {} // event\n\n\n    initialize(stackedToken, rewardToken) {\n        require(this.stackedToken == '', "ALREADY_INITIALIZED");\n        this.stackedToken = stackedToken.toLowerCase();\n        this.rewardToken = rewardToken.toLowerCase();\n        this.owner = msg.sender;\n\n        emit('Initialize', [stackedToken, rewardToken]);\n    }\n\n\n    reset() {\n        require(msg.sender == this.owner, 'ONLY_OWNER');\n        require(this.stackedToken != '', 'NOT_INITIALIZED');\n        this.stackers = {};\n        this.totalStacked = number(0);\n        this.lastMint = number(0);\n        this.accRewardPerStackToken = number(0);\n\n        const [balance1,] = IERC20(this.stackedToken).balanceOf(address(this).address);\n        if (balance1.gt(0)) {\n            IERC20(this.stackedToken).transferFrom(address(this).address, msg.sender, balance1);\n        }\n\n        const [balance2,] = IERC20(this.rewardToken).balanceOf(address(this).address);\n        if (balance2.gt(0)) {\n            IERC20(this.rewardToken).transferFrom(address(this).address, msg.sender, balance2);\n        }\n\n        emit('Reset', []);\n    }\n\n    \n    balanceOf(stacker) {\n        stacker = stacker.toLowerCase();\n        let stackedAmount = number(0);\n        if (stacker in this.stackers) {\n            stackedAmount = this.stackers[stacker].stackedAmount;\n        }\n        return [stackedAmount];\n    }\n\n\n    deposit(_amount) {\n        // stacking\n        require(this.stackedToken != '', 'NOT_INITIALIZED');\n        require(_amount.gt(0), 'INVALID_AMOUNT');\n\n        if (this.totalStacked.eq(0)) {\n            this.lastMint = block.timestamp;\n        }\n\n        const _rewardAmount = this.payStackerRewards(msg.sender); // mise a jour de la pool + on encaisse les rewards potentiels, pour repartir sur des comptes à zero à partir de ce deposit\n\n        IERC20(this.stackedToken).transferFrom(msg.sender, address(this).address, _amount);\n\n        if (! (msg.sender in this.stackers)) {\n            this.stackers[msg.sender] = new StackerInfo;\n        }\n\n        const stacker = this.stackers[msg.sender];\n        stacker.stackedAmount = stacker.stackedAmount.add(_amount);\n\n        this.totalStacked = this.totalStacked.add(_amount);\n\n        stacker.rewardDebt = stacker.stackedAmount.mul(this.accRewardPerStackToken).div(1e12);\n\n        //this._earn();\n\n        emit('Deposit', [msg.sender, _amount]);\n    }\n\n    \n    withdraw(_amount) {\n        // unstacking => Withdraw staked tokens and collect reward tokens\n        require(this.stackedToken != '', 'NOT_INITIALIZED');\n        require(_amount.gt(0), 'Nothing to withdraw');\n        require(! _amount.gt(this.totalStacked), 'INSUFFICIENT_TOTAL');\n        require(msg.sender in this.stackers, 'INVALID_OWNER');\n        require(! _amount.gt(this.stackers[msg.sender].stackedAmount), 'Withdraw amount exceeds balance');\n\n        const _rewardAmount = this.payStackerRewards(msg.sender); // mise a jour de la pool + on encaisse les rewards potentiels, pour repartir sur des comptes à zero à partir de ce withdraw\n        \n        const stacker = this.stackers[msg.sender];\n        stacker.stackedAmount = stacker.stackedAmount.sub(_amount);\n        this.totalStacked = this.totalStacked.sub(_amount);\n\n        IERC20(this.stackedToken).transfer(msg.sender, _amount);\n\n        stacker.rewardDebt = stacker.stackedAmount.mul(this.accRewardPerStackToken).div(1e12);\n        \n        emit('Withdrawal', [msg.sender, _amount, _rewardAmount]);\n    }\n\n \n    getPendingRewards() {\n        // rewards à minter\n        let pendingRewards = number(0);\n\n        if (this.totalStacked.gt(0)) {\n            const duration = block.timestamp.sub(this.lastMint); // milliseconds depuis le dernier mint\n\n            if (duration.gt(0)) {\n                const periodsCount = duration.div(this.mintPeriod); // nbPeriods depuis le dernier mint\n                \n                if (periodsCount.gt(0)) {\n                    pendingRewards = periodsCount.mul(this.rewardsPerPeriod);\n                }\n            }\n        }\n\n        return [pendingRewards]; // retourne le nb de rewards POUVANT ÊTRE mintés\n    }\n\n\n    updatePool() {\n        const [pendingRewards,] = this.getPendingRewards();\n        if (pendingRewards.gt(0)) {\n            this.lastMint = block.timestamp;\n            IERC20(this.rewardToken).mint(address(this).address, pendingRewards); // on augmente la balance rewardToken (pour le present contract)\n            \n            const extraRewardPerStackToken = pendingRewards.mul(1e12).div(this.totalStacked);\n            this.accRewardPerStackToken = this.accRewardPerStackToken.add(extraRewardPerStackToken);\n\n            emit('UpdatePool', [pendingRewards, extraRewardPerStackToken]);\n        }\n    }\n\n\n    getStackerAvailableRewards(stackerAddress) {\n        stackerAddress = stackerAddress.toLowerCase();\n        let stackerRewardAmount = number(0);\n\n        const [pendingRewards,] = this.getPendingRewards();\n        \n        if (stackerAddress in this.stackers) {\n            const extraRewardPerStackToken = pendingRewards.mul(1e12).div(this.totalStacked);\n            const accRewardPerStackToken = this.accRewardPerStackToken.add(extraRewardPerStackToken);\n\n            const stacker = this.stackers[stackerAddress];\n            stackerRewardAmount = stacker.stackedAmount.mul(accRewardPerStackToken).div(1e12).sub(stacker.rewardDebt);\n        }\n\n        return [stackerRewardAmount];\n    }\n\n\n    payStackerRewards(stackerAddress) {\n        // harvest\n        stackerAddress = stackerAddress.toLowerCase();\n\n        this.updatePool();\n        const [stackerRewardAmount,] = this._updateStacker(stackerAddress);\n\n        return [stackerRewardAmount];\n    }\n\n\n    _updateStacker(stackerAddress) {\n        let stackerRewardAmount = number(0);\n        \n        if (stackerAddress in this.stackers) {\n            const stacker = this.stackers[stackerAddress];\n            [stackerRewardAmount, ] = this.getStackerAvailableRewards(stackerAddress);\n    \n            stacker.rewardDebt = stacker.stackedAmount.mul(this.accRewardPerStackToken).div(1e12);\n    \n            if (stackerRewardAmount.gt(0)) {\n                IERC20(this.rewardToken).transfer(stackerAddress, stackerRewardAmount);\n\n                emit('UpdateStacker', [stackerAddress, stackerRewardAmount]);\n            }\n        }\n\n        return [stackerRewardAmount];\n    }\n\n}\n\n// Events\nStackingService.prototype.Initialize.event = true;\nStackingService.prototype.Initialize.inputs = ['address indexed', 'address indexed'];\n\nStackingService.prototype.UpdateStacker.event = true;\nStackingService.prototype.UpdateStacker.inputs = ['address indexed', 'uint256'];\n\nStackingService.prototype.Reset.event = true;\n\nStackingService.prototype.Deposit.event = true;\nStackingService.prototype.Deposit.inputs = ['address indexed', 'uint256'];\n\nStackingService.prototype.Withdrawal.event = true;\nStackingService.prototype.Withdrawal.inputs = ['address indexed', 'uint256', 'uint256'];\n\nStackingService.prototype.UpdatePool.event = true;\nStackingService.prototype.UpdatePool.inputs = ['uint256', 'uint256'];\n\nStackingService.prototype.UpdateStacker.event = true;\nStackingService.prototype.UpdateStacker.inputs = ['address indexed', 'uint256'];\n\n// Methods\nStackingService.prototype.initialize.inputs = ['address', 'address'];\n\nStackingService.prototype.balanceOf.view = true;\nStackingService.prototype.balanceOf.inputs = ['address'];\nStackingService.prototype.balanceOf.outputs = ['uint256'];\n\nStackingService.prototype.deposit.inputs = ['uint256'];\n\nStackingService.prototype.withdraw.inputs = ['uint256'];\n\nStackingService.prototype.getPendingRewards.view = true;\nStackingService.prototype.getPendingRewards.outputs = ['uint256'];\n\nStackingService.prototype.getStackerAvailableRewards.view = true;\nStackingService.prototype.getStackerAvailableRewards.inputs = ['address'];\nStackingService.prototype.getStackerAvailableRewards.outputs = ['uint256'];\n\nStackingService.prototype.payStackerRewards.inputs = ['address'];\nStackingService.prototype.payStackerRewards.outputs = ['uint256'];\n\nStackingService.prototype._updateStacker.internal = true;\n\n\nreturn StackingService;\n\n",
   codeHash: "0x4abec54ff2c7059d3e4d3a9d0a2500599e6d19caac54fd3d2ee939560fb416e5",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x5b5c0f23: {
         constant: true,
         "inputs": [],
         name: "stackedToken",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xf7c618c1: {
         constant: true,
         "inputs": [],
         name: "rewardToken",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x29eae70d: {
         constant: true,
         "inputs": [],
         name: "totalStacked",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x585dd2e4: {
         constant: true,
         "inputs": [],
         name: "accRewardPerStackToken",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x834ea32d: {
         constant: true,
         "inputs": [],
         name: "stackers",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x586fc5b5: {
         constant: true,
         "inputs": [],
         name: "lastMint",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x4c498203: {
         constant: true,
         "inputs": [],
         name: "mintPeriod",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x978db419: {
         constant: true,
         "inputs": [],
         name: "rewardsPerPeriod",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xdc90fed0: {
         inputs: [
            {
               name: "stackedToken",
               type: "address",
               indexed: true
            },
            {
               name: "rewardToken",
               type: "address",
               indexed: true
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x6423db34: {
         "inputs": [],
         name: "Reset",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xe1fffcc4: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Deposit",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xdf273cb6: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            },
            {
               name: "rewardAmount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Withdrawal",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xb35b339e: {
         inputs: [
            {
               name: "pendingRewards",
               type: "uint256",
               indexed: false
            },
            {
               name: "extraRewardPerStackToken",
               type: "uint256",
               indexed: false
            }
         ],
         name: "UpdatePool",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xc063ef91: {
         inputs: [
            {
               name: "stackerAddress",
               type: "address",
               indexed: true
            },
            {
               name: "stackerRewardAmount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "UpdateStacker",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x485cc955: {
         inputs: [
            {
               name: "stackedToken",
               type: "address"
            },
            {
               name: "rewardToken",
               type: "address"
            }
         ],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xd826f88f: {
         "inputs": [],
         name: "reset",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x70a08231: {
         inputs: [
            {
               name: "stacker",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xb6b55f25: {
         inputs: [
            {
               name: "_amount",
               type: "uint256"
            }
         ],
         name: "deposit",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x2e1a7d4d: {
         inputs: [
            {
               name: "_amount",
               type: "uint256"
            }
         ],
         name: "withdraw",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xd9621f9e: {
         "inputs": [],
         name: "getPendingRewards",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xe3161ddd: {
         "inputs": [],
         name: "updatePool",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x6e4b5056: {
         inputs: [
            {
               name: "stackerAddress",
               type: "address"
            }
         ],
         name: "getStackerAvailableRewards",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x04c57c17: {
         inputs: [
            {
               name: "stackerAddress",
               type: "address"
            }
         ],
         name: "payStackerRewards",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "StackingService",
   storage: {
      prototype: {
         address: "0xc3349025e73b4746d79a30ade1200e5dd2d8f754"
      },
      owner: "0xccf8ba457dcad7ee6a0361c96846a0f79744b113",
      stackedToken: "0x2347d36cf0d94b98bab6d6d41c6f94d7214830ad",
      rewardToken: "0x92c8b8729d850d99c34c50ab2846ec36169e0024",
      totalStacked: "0",
      accRewardPerStackToken: "0",
      "stackers": {},
      lastMint: "0",
      mintPeriod: "60000",
      rewardsPerPeriod: "100000000000000000000"
   },
   storageHash: "0x5a50fe34cf2ae9d8f44abe7c1f52bd1095fe10415487b5143d6dcadad1774bb1",
   savedOnBlockNumber: "12"
}
9 0x0a4c2f3a68f3f43999ece62605d5743ab600fda9
{
   address: "0x0a4c2f3a68f3f43999ece62605d5743ab600fda9",
   balance: "0",
   "transactions": [],
   code: "\n/*\nName: YO NFT\nVersion: 0.0.3\n*/\n\n\nfunction IERC721Receiver(tokenAddress) {\n    return address(tokenAddress).getContract();\n}\n\n\nclass ERC721Receiver {\n    onERC721Received(operator, from, tokenId, data) {\n        const selector = '0xa8fcc417'; // onERC721Received\n        return [selector];\n    };\n}\n\nERC721Receiver.prototype.onERC721Received.inputs = ['address', 'address', 'uint256', 'bytes'];\nERC721Receiver.prototype.onERC721Received.outputs = ['bytes4'];\n\n\n\nclass ERC721 extends ERC721Receiver {   \n    name = '';\n    symbol = '';\n    decimals = number(0);\n\n    owners = {}; // mapping(uint256 => address)\n    balances = {}; // mapping(address => uint256)\n    tokenApprovals = {}; // mapping(uint256 => address)\n    operatorApprovals = {}; // mapping(address => mapping(address => bool))\n\n\n    Mint(minter, to, tokenId) {} // event\n    Burn() {owner, burner, tokenId} // event\n    Transfer(from, to, tokenId) {} // event\n    Approval(owner, approved, tokenId) {} // event\n    ApprovalForAll(owner, operator, approved) {} // event\n    \n\n    constructor(name, symbol) {\n        super();\n        this.name = name;\n        this.symbol = symbol;\n    }\n\n    \n    supportsInterface(interfaceId) {\n        //const result = interfaceId == '0x80ac58cd' || interfaceId == '0x5b5e139f' || super.supportsInterface(interfaceId);\n        const result = (interfaceId == '0x80ac58cd' || interfaceId == '0x5b5e139f');\n        return [result];\n    }\n\n\n    balanceOf(owner)  {\n        owner = owner.toLowerCase();\n        require(owner != address(0).address, "ERC721: address zero is not a valid owner");\n        if (owner in this.balances) {\n            return [this.balances[owner]];\n        }\n        return [Number(0)];\n    }\n\n\n    ownerOf(tokenId) {\n        require(tokenId in this.owners, "ERC721: owner query for nonexistent token");\n        const owner = this.owners[tokenId];\n        return [owner];\n    }\n\n\n    tokenURI(tokenId) {\n        require(this._exists(tokenId)[0], "ERC721Metadata: URI query for nonexistent token");\n\n        const baseURI = this.baseURI()[0];\n        const _tokenUri = baseURI.length > 0 ? (baseURI + tokenId.toString()) : "";\n        return [_tokenUri];\n    }\n\n\n    _baseURI() {\n        return [""];\n    }\n\n\n    approve(to, tokenId) {\n        to = to.toLowerCase();\n        require(this._exists(tokenId)[0], "ERC721: approval nonexistent token");\n        const owner = this.ownerOf(tokenId)[0];\n        require(to != owner, "ERC721: approval to current owner");\n\n        require(\n            msg.sender == owner || this.isApprovedForAll(owner, msg.sender)[0],\n            "ERC721: approve caller is not owner nor approved for all"\n        );\n\n        this._approve(to, tokenId);\n    }\n\n\n    getApproved(tokenId) {\n        require(this._exists(tokenId)[0], "ERC721: approved query for nonexistent token");\n\n        if (tokenId in this.tokenApprovals) {\n            return [ this.tokenApprovals[tokenId] ];\n        }\n\n        return [ number(0) ];\n    }\n\n\n    setApprovalForAll(operator, approved) {\n        operator = operator.toLowerCase();\n        this._setApprovalForAll(msg.sender, operator, approved);\n    }\n\n\n    isApprovedForAll(owner, operator) {\n        owner = owner.toLowerCase();\n        operator = operator.toLowerCase();\n        if (owner in this.operatorApprovals && operator in this.operatorApprovals[owner]) {\n            return [ this.operatorApprovals[owner][operator] ];\n        }\n        return [false];\n    }\n\n\n    transferFrom(from, to, tokenId) {\n        from = from.toLowerCase();\n        to = to.toLowerCase();\n        require(this._isApprovedOrOwner(msg.sender, tokenId)[0], "ERC721: transfer caller is not owner nor approved");\n        this._transfer(from, to, tokenId);\n    }\n\n\n    safeTransferFrom(from, to, tokenId, _data) {\n        from = from.toLowerCase();\n        to = to.toLowerCase();\n        require(this._isApprovedOrOwner(msg.sender, tokenId)[0], "ERC721: transfer caller is not owner nor approved");\n        this._safeTransfer(from, to, tokenId, _data);\n    }\n\n\n    _safeTransfer(from, to, tokenId, _data) {\n        from = from.toLowerCase();\n        to = to.toLowerCase();\n        this._transfer(from, to, tokenId);\n        require(this._checkOnERC721Received(from, to, tokenId, _data)[0], "ERC721: transfer to non ERC721Receiver implementer");\n    }\n\n\n    _exists(tokenId) {\n        return [ tokenId in this.owners ];\n    }\n\n\n    _isApprovedOrOwner(spender, tokenId)  {\n        spender = spender.toLowerCase();\n        require(_exists(tokenId), "ERC721: operator query for nonexistent token");\n        const owner = this.ownerOf(tokenId)[0];\n        const result = (spender == owner || this.isApprovedForAll(owner, spender)[0] || this.getApproved(tokenId)[0] == spender);\n        return [result];\n    }\n\n\n    _safeMint(to, tokenId, _data) {\n        to = to.toLowerCase();\n        this._mint(to, tokenId);\n        require(\n            this._checkOnERC721Received(address(0).address, to, tokenId, _data)[0],\n            "ERC721: transfer to non ERC721Receiver implementer"\n        );\n    }\n\n\n    _mint(to, tokenId) {\n        to = to.toLowerCase();\n        require(to != address(0).address, "ERC721: mint to the zero address");\n        require(!this._exists(tokenId)[0], "ERC721: token already minted");\n\n        this._beforeTokenTransfer(address(0).address, to, tokenId);\n\n        this.balances[to] = this.balances[to] || number(0);\n        this.balances[to] = this.balances[to].add(1);\n        this.owners[tokenId] = to;\n\n        emit('Mint', [address(0).address, to, tokenId]);\n\n        this._afterTokenTransfer(address(0).address, to, tokenId);\n    }\n\n\n    _burn(tokenId) {\n        const owner = this.ownerOf(tokenId)[0];\n\n        this._beforeTokenTransfer(owner, address(0).address, tokenId);\n\n        // Clear approvals\n        this._approve(address(0).address, tokenId);\n\n        this.balances[owner] = this.balances[owner].sub(1);\n        delete this.owners[tokenId];\n\n        emit('Burn', [owner, address(0).address, tokenId]);\n\n        _afterTokenTransfer(owner, address(0).address, tokenId);\n    }\n\n\n    _transfer(from, to, tokenId) {\n        from = from.toLowerCase();\n        to = to.toLowerCase();\n        require(this.ownerOf(tokenId)[0] == from, "ERC721: transfer from incorrect owner");\n        require(to != address(0).address, "ERC721: transfer to the zero address");\n\n        this._beforeTokenTransfer(from, to, tokenId);\n\n        // Clear approvals from the previous owner\n        this._approve(address(0).address, tokenId);\n\n        this.balances[from] = this.balances[from].sub(1);\n        this.balances[to] = this.balances[to] || number(0);\n        this.balances[to] = this.balances[to].add(1);\n        this.owners[tokenId] = to;\n\n        emit('Transfer', [from, to, tokenId]);\n\n        this._afterTokenTransfer(from, to, tokenId);\n    }\n\n\n    _approve(approved, tokenId) {\n        approved = approved.toLowerCase();\n        this.tokenApprovals[tokenId] = approved;\n        emit('Approval', [this.ownerOf(tokenId)[0], approved, tokenId]);\n    }\n\n\n    _setApprovalForAll(owner, operator, approved) {\n        owner = owner.toLowerCase();\n        operator = operator.toLowerCase();\n        require(owner != operator, "ERC721: approve to caller");\n        if (! (owner in this.operatorApprovals)) {\n            this.operatorApprovals[owner] = {};\n        }\n        this.operatorApprovals[owner][operator] = approved;\n        emit('ApprovalForAll', [owner, operator, approved]);\n    }\n\n\n    _checkOnERC721Received(from, to, tokenId, _data) {\n        from = from.toLowerCase();\n        to = to.toLowerCase();\n        if (address(to).isContract()) {\n            try {\n                const retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data)[0];\n                const selector = '0xa8fcc417'; // onERC721Received\n                return [retval == selector];\n\n            } catch (e) {\n                const reason = e.message;\n                if (reason.length == 0) {\n                    revert("ERC721: transfer to non ERC721Receiver implementer");\n\n                } else {\n                    revert(reason);\n                }\n            }\n\n        } else {\n            return [true];\n        }\n    }\n\n\n    _beforeTokenTransfer(from, to, tokenId) {\n    }\n\n    _afterTokenTransfer(from, to, tokenId) {\n    }\n    \n}\n\n// Events\nERC721.prototype.Mint.event = true;\nERC721.prototype.Mint.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC721.prototype.Burn.event = true;\nERC721.prototype.Burn.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC721.prototype.Transfer.event = true;\nERC721.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC721.prototype.Approval.event = true;\nERC721.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC721.prototype.ApprovalForAll.event = true;\nERC721.prototype.ApprovalForAll.inputs = ['address indexed', 'address indexed', 'uint256'];\n\n// Methods\nERC721.prototype.supportsInterface.view = true;\nERC721.prototype.supportsInterface.inputs = ['bytes4'];\nERC721.prototype.supportsInterface.outputs = ['bool'];\n\nERC721.prototype.balanceOf.view = true;\nERC721.prototype.balanceOf.inputs = ['address'];\nERC721.prototype.balanceOf.outputs = ['uint256'];\n\nERC721.prototype.ownerOf.view = true;\nERC721.prototype.ownerOf.inputs = ['uint256'];\nERC721.prototype.ownerOf.outputs = ['address'];\n\nERC721.prototype.tokenURI.view = true;\nERC721.prototype.tokenURI.inputs = ['uint256'];\nERC721.prototype.tokenURI.outputs = ['string'];\n\nERC721.prototype._baseURI.internal = true;\n\nERC721.prototype.approve.inputs = ['address', 'uint256'];\n\nERC721.prototype.getApproved.view = true;\nERC721.prototype.getApproved.outputs = ['address'];\n\nERC721.prototype.setApprovalForAll.inputs = ['address', 'bool'];\n\nERC721.prototype.isApprovedForAll.view = true;\nERC721.prototype.isApprovedForAll.inputs = ['address', 'address'];\n\nERC721.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\n\nERC721.prototype.safeTransferFrom.inputs = ['address', 'address', 'uint256', 'bytes'];\n\nERC721.prototype._safeTransfer.internal = true;\n\nERC721.prototype._exists.internal = true;\n\nERC721.prototype._isApprovedOrOwner.internal = true;\n\nERC721.prototype._safeMint.internal = true;\n\nERC721.prototype._mint.internal = true;\n\nERC721.prototype._burn.internal = true;\n\nERC721.prototype._transfer.internal = true;\n\nERC721.prototype._approve.internal = true;\n\nERC721.prototype._setApprovalForAll.internal = true;\n\nERC721.prototype._checkOnERC721Received.private = true;\n\nERC721.prototype._beforeTokenTransfer.internal = true;\n\nERC721.prototype._afterTokenTransfer.internal = true;\n\n\n\n\n\nclass YoNFT extends ERC721 {\n    name = 'YO NFT';\n    symbol = 'YoNFT';\n\n    _tokenIds = 0;\n    _MAX_SUPPLY = 10;\n\n    mintprice = number('1' + '000000000000000000'); // 1 ether\n\n\n    _baseURI() {\n        const baseURI = 'http://localhost:8545/collections/' + address(this).address + '/';\n        return [ baseURI ];\n    }\n\n    tokenURI(tokenId) {\n        require(this._exists(tokenId)[0], "ERC721Metadata: URI query for nonexistent token");\n\n        const baseURI = this.baseURI()[0];\n        const _tokenUri = baseURI.length > 0 ? (baseURI + tokenId.toString() + '.json') : "";\n        return [_tokenUri];\n    }\n\n    mint(receiver) {\n        require(this._tokenIds < this._MAX_SUPPLY, 'Max supply reached');\n        require(msg.value.eq(this.mintprice), 'Invalid price');\n        this._tokenIds++;\n\n        const newNftTokenId = this._tokenIds;\n        this._safeMint(receiver, newNftTokenId, '');\n\n        return [newNftTokenId];\n    }\n}\n\n// Methods\nYoNFT.prototype.tokenURI.inputs = ['uint256'];\nYoNFT.prototype.tokenURI.outputs = ['string'];\nYoNFT.prototype.tokenURI.view = true;\n\nYoNFT.prototype.mint.inputs = ['address'];\nYoNFT.prototype.mint.outputs = ['uint256'];\nYoNFT.prototype.mint.modifiers = ['onlyOwner'];\nYoNFT.prototype.mint.payable = true;\n\n\nreturn YoNFT;\n",
   codeHash: "0xe4a23e6b844c15d980c4a4510d94b4928d7a871db5358a6dd2b0f09cfdf61ef1",
   codeAbi: {
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xaffe39c1: {
         constant: true,
         "inputs": [],
         name: "owners",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x2369fde5: {
         constant: true,
         "inputs": [],
         name: "tokenApprovals",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x771149fc: {
         constant: true,
         "inputs": [],
         name: "operatorApprovals",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x88eab676: {
         constant: true,
         "inputs": [],
         name: "mintprice",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x6a627842: {
         inputs: [
            {
               name: "receiver",
               type: "address"
            }
         ],
         name: "mint",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "payable",
         type: "function"
      },
      0xab8530f8: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "to",
               type: "address",
               indexed: true
            },
            {
               name: "tokenId",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x396ed0ab: {
         "inputs": [],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "from",
               type: "address",
               indexed: true
            },
            {
               name: "to",
               type: "address",
               indexed: true
            },
            {
               name: "tokenId",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "approved",
               type: "address",
               indexed: true
            },
            {
               name: "tokenId",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x935230e6: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "operator",
               type: "address",
               indexed: true
            },
            {
               name: "approved",
               type: "uint256",
               indexed: false
            }
         ],
         name: "ApprovalForAll",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceId",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x70a08231: {
         inputs: [
            {
               name: "owner",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x6352211e: {
         inputs: [
            {
               name: "tokenId",
               type: "uint256"
            }
         ],
         name: "ownerOf",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xc87b56dd: {
         inputs: [
            {
               name: "tokenId",
               type: "uint256"
            }
         ],
         name: "tokenURI",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "to",
               type: "address"
            },
            {
               name: "tokenId",
               type: "uint256"
            }
         ],
         name: "approve",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x081812fc: {
         inputs: [
            {
               name: "tokenId",
               type: "uint256"
            }
         ],
         name: "getApproved",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa22cb465: {
         inputs: [
            {
               name: "operator",
               type: "address"
            },
            {
               name: "approved",
               type: "bool"
            }
         ],
         name: "setApprovalForAll",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xe985e9c5: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "operator",
               type: "address"
            }
         ],
         name: "isApprovedForAll",
         "outputs": [],
         stateMutability: "view",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "from",
               type: "address"
            },
            {
               name: "to",
               type: "address"
            },
            {
               name: "tokenId",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xb88d4fde: {
         inputs: [
            {
               name: "from",
               type: "address"
            },
            {
               name: "to",
               type: "address"
            },
            {
               name: "tokenId",
               type: "uint256"
            },
            {
               name: "_data",
               type: "bytes"
            }
         ],
         name: "safeTransferFrom",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x150b7a02: {
         inputs: [
            {
               name: "operator",
               type: "address"
            },
            {
               name: "from",
               type: "address"
            },
            {
               name: "tokenId",
               type: "uint256"
            },
            {
               name: "data",
               type: "bytes"
            }
         ],
         name: "onERC721Received",
         outputs: [
            {
               name: "",
               type: "bytes4"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "YoNFT",
   storage: {
      name: "YO NFT",
      symbol: "YoNFT",
      decimals: "0",
      "owners": {},
      "balances": {},
      "tokenApprovals": {},
      "operatorApprovals": {},
      _tokenIds: 0,
      _MAX_SUPPLY: 10,
      mintprice: "1000000000000000000",
      prototype: {
         address: "0x0a4c2f3a68f3f43999ece62605d5743ab600fda9"
      }
   },
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "4"
}
10 0x73f7dafa086d58aedd8146f40dd8a86fcf778b8f
{
   address: "0x73f7dafa086d58aedd8146f40dd8a86fcf778b8f",
   balance: "0",
   "transactions": [],
   code: "/*\nName: Hot Potatoe\nVersion: 0.0.3\n*/\n\n\nclass HotPotatoe {\n    name = 'HOT Potatoe';\n    symbol = 'POTATOE';\n\n    decimals = 0;\n    totalSupply = number('0');\n\n    initPrice = number('1' + '000000000000000000'); // 1 ether\n    admin = '';\n    \n    PotatoeType = {\n        idx: number(0),\n        minter: '',\n        owner: '',\n        debtor: '',\n        price: number(0),\n        parentIdx: number(-1),\n        initDate: number(0),\n        transfers: number(0),\n        cumulativePrice: number(0),\n    };\n\n    potatoes = []; // array of Potatoe\n    participants = {}; // mapping (address participant => mapping(uint256 potatoeIdx => string role))\n\n\n    Initialize(minterAddress) {} // event\n    Mint(potatoeIdx, minter) {} // event\n    Transfer(potatoeIdx, sender, to) {} // event\n    Steal(potatoeIdx, stealer) {} // event\n    Withdrawal(amount) {} // event\n\n\n    constructor() {\n        this.admin = msg.sender;\n    }\n\n    initialize() {\n        //require(msg.sender == this.admin, "ONLY_ADMIN");\n        require(this.potatoes.length == 0, "ONLY_ONCE");\n        this._mint(msg.sender, -1);\n\n        emit('Initialize', [msg.sender]);\n    }\n\n\n    potatoesCount() {\n        return [this.potatoes.length];\n    }\n\n    _mint(minter, parentIdx) {\n        minter = minter.toLowerCase();\n        const potatoeIdx = this.potatoes.length;\n\n        const potatoe = {\n            idx: potatoeIdx,\n            minter,\n            owner: address(this).address,\n            debtor: minter,\n            price: this.initPrice,\n            parentIdx,\n            initDate: number(block.timestamp),\n            transfers: number(0),\n            cumulativePrice: number(0),\n        };\n        this.potatoes.push(potatoe);\n        this._setHolding(minter, potatoeIdx, 'minter+debtor');\n        this.totalSupply = this.totalSupply.add(1);\n\n        emit('Mint', [potatoeIdx, minter]);\n    }\n\n    _nextPrice(currentPrice) {\n        const rewardPercent = number(150); // 150%\n        const price = currentPrice.mul(rewardPercent).div(100);\n        return [price];\n    }\n\n    price(potatoeIdx) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n        const price = potatoe.price;\n        return [price];\n    }\n\n    nextPrice(potatoeIdx) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n        const price = this._nextPrice(potatoe.price)[0];\n        return [price];\n    }\n\n    owner(potatoeIdx) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n        const owner = potatoe.owner;\n        return [owner];\n    }\n\n    debtor(potatoeIdx) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n        const debtor = potatoe.debtor;\n        return [debtor];\n    }\n\n    transfer(potatoeIdx, to) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n\n        const sender = msg.sender.toLowerCase();\n        require(potatoe.debtor == sender, "ONLY_DEBTOR");\n\n        require(address(this) != to, "INVALID_TARGET");\n        require(address(0) != to, "INVALID_TARGET");\n\n        to = to.toLowerCase();\n        require(potatoe.owner != to, "NO_BACKTRACK_TO_OWNER");\n        require(potatoe.minter != to, "NO_BACKTRACK_TO_MINTER");\n        \n        const price = potatoe.price;\n        require(price.eq(msg.value), "INVALID_POTATOE_PRICE");\n\n        const treasureFees = msg.value.mul(1).div(1000); // 0.1% fees for the treasure\n        const minterFees = msg.value.mul(9).div(1000);   // 0.9% fees for the minter\n        address(potatoe.minter).transfer(minterFees);\n        address(potatoe.owner).transfer(msg.value.sub(treasureFees).sub(minterFees)); // repay (+bonus-fees) the previous owner\n\n        if (potatoe.owner == potatoe.minter) {\n            this._setHolding(potatoe.owner, potatoeIdx, 'minter+retired');\n        } else if (potatoe.owner != address(this).address) {\n            this._setHolding(potatoe.owner, potatoeIdx, 'retired');\n        }\n\n        if (sender == potatoe.minter) {\n            this._setHolding(sender, potatoeIdx, 'minter+owner');\n        } else {\n            this._setHolding(sender, potatoeIdx, 'owner');\n        }\n\n        if (to == potatoe.minter) {\n            this._setHolding(to, potatoeIdx, 'minter+debtor');\n        } else {\n            this._setHolding(to, potatoeIdx, 'debtor');\n        }\n\n        potatoe.owner = sender; // new owner (old debtor)\n        potatoe.debtor = to; // new debtor\n        potatoe.transfers = potatoe.transfers.add(1);\n\n        if (sender != to) {\n            potatoe.cumulativePrice = potatoe.cumulativePrice.add(msg.value);\n        }\n\n        const newPrice = this._nextPrice(price)[0];\n        potatoe.price = newPrice; // new price\n\n        emit('Transfer', [potatoeIdx, sender, to]);\n        \n        this._mint(msg.sender, potatoe.idx);\n    }\n\n    holdings(participantAddress) {\n        participantAddress = participantAddress.toLowerCase();\n        require(participantAddress in this.participants, "INVALID_PARTICIPANT");\n\n        const result = Object.entries(this.participants[participantAddress]).map((entry => {\n            const [potatoeIdx, role] = entry;\n            return potatoeIdx + ':' + role;\n        })).join(' ');\n        return [result];\n    }\n\n    _setHolding(participantAddress, potatoeIdx, role) {\n        participantAddress = participantAddress.toLowerCase();\n        if (! (participantAddress in this.participants)) {\n            this.participants[participantAddress] = {};\n        }\n        this.participants[participantAddress][potatoeIdx] = role;\n    }\n\n    steal(potatoeIdx) {\n        require(potatoeIdx in this.potatoes, "INVALID_POTATOE_ID");\n        const potatoe = this.potatoes[potatoeIdx];\n\n        const stealer = msg.sender.toLowerCase();\n        require(potatoe.owner != stealer, "INVALID_STEALER_OWNER");\n        require(potatoe.debtor != stealer, "INVALID_STEALER_DEBTOR");\n\n        const _stealPrice = this.nextPrice(potatoeIdx)[0];\n        require(_stealPrice.eq(msg.value), "INVALID_POTATOE_STEAL_PRICE");\n\n        potatoe.owner = stealer; // stealer is now the owner => he will not pay the transfer (transfer to himself)\n        potatoe.debtor = stealer;\n        potatoe.price = _stealPrice;\n\n        potatoe.cumulativePrice = potatoe.cumulativePrice.add(msg.value);\n\n        this._setHolding(stealer, potatoeIdx, 'stealer');\n\n        emit('Steal', [potatoeIdx, stealer]);\n    }\n\n    withdraw(amount) {\n        require(msg.sender == this.admin, "ONLY_ADMIN");\n        address(this.admin).transfer(amount);\n        emit('Withdrawal', [amount]);\n    }\n\n}\n\n// Events\nHotPotatoe.prototype.Initialize.event = true;\nHotPotatoe.prototype.Initialize.inputs = ['address indexed'];\n\nHotPotatoe.prototype.Mint.event = true;\nHotPotatoe.prototype.Mint.inputs = ['uint256 indexed', 'address indexed'];\n\nHotPotatoe.prototype.Transfer.event = true;\nHotPotatoe.prototype.Transfer.inputs = ['uint256 indexed', 'address indexed', 'address indexed'];\n\nHotPotatoe.prototype.Steal.event = true;\nHotPotatoe.prototype.Steal.inputs = ['uint256 indexed', 'address indexed'];\n\nHotPotatoe.prototype.Withdrawal.event = true;\nHotPotatoe.prototype.Withdrawal.inputs = ['uint256'];\n\n\n// Methods\nHotPotatoe.prototype._mint.internal = true;\n\nHotPotatoe.prototype._nextPrice.internal = true;\n\nHotPotatoe.prototype.transfer.payable = true;\nHotPotatoe.prototype.transfer.inputs = ['uint256', 'address'];\n\nHotPotatoe.prototype.price.view = true;\nHotPotatoe.prototype.price.inputs = ['uint256'];\nHotPotatoe.prototype.price.outputs = ['uint256'];\n\nHotPotatoe.prototype.potatoesCount.view = true;\nHotPotatoe.prototype.potatoesCount.outputs = ['uint256'];\n\nHotPotatoe.prototype.nextPrice.view = true;\nHotPotatoe.prototype.nextPrice.inputs = ['uint256'];\nHotPotatoe.prototype.nextPrice.outputs = ['uint256'];\n\nHotPotatoe.prototype.owner.view = true;\nHotPotatoe.prototype.owner.inputs = ['uint256'];\nHotPotatoe.prototype.owner.outputs = ['address'];\n\nHotPotatoe.prototype.debtor.view = true;\nHotPotatoe.prototype.debtor.inputs = ['uint256'];\nHotPotatoe.prototype.debtor.outputs = ['address'];\n\nHotPotatoe.prototype.holdings.view = true;\nHotPotatoe.prototype.holdings.inputs = ['address'];\nHotPotatoe.prototype.holdings.outputs = ['string'];\n\nHotPotatoe.prototype._setHolding.internal = true;\n\nHotPotatoe.prototype.steal.payable = true;\nHotPotatoe.prototype.steal.inputs = ['uint256'];\n\nHotPotatoe.prototype.withdraw.inputs = ['uint256'];\n\nreturn HotPotatoe;\n",
   codeHash: "0x38bfd1abf92e59c02ef1cf580e5f0310eb66202c827d72430dda08a6f357d703",
   codeAbi: {
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xb6add0f4: {
         constant: true,
         "inputs": [],
         name: "initPrice",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xf851a440: {
         constant: true,
         "inputs": [],
         name: "admin",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xaa7b0928: {
         constant: true,
         "inputs": [],
         name: "PotatoeType",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x1b5b0f01: {
         constant: true,
         "inputs": [],
         name: "potatoes",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x6c4470fb: {
         constant: true,
         "inputs": [],
         name: "participants",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x36b14535: {
         inputs: [
            {
               name: "minterAddress",
               type: "address",
               indexed: true
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xf3cea549: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256",
               indexed: true
            },
            {
               name: "minter",
               type: "address",
               indexed: true
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0a429aba: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256",
               indexed: true
            },
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "to",
               type: "address",
               indexed: true
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xab64b03a: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256",
               indexed: true
            },
            {
               name: "stealer",
               type: "address",
               indexed: true
            }
         ],
         name: "Steal",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x4e70a604: {
         inputs: [
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Withdrawal",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8129fc1c: {
         "inputs": [],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xf469c89c: {
         "inputs": [],
         name: "potatoesCount",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x26a49e37: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            }
         ],
         name: "price",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x2821ca71: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            }
         ],
         name: "nextPrice",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa123c33e: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            }
         ],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x10361897: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            }
         ],
         name: "debtor",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xb7760c8f: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            },
            {
               name: "to",
               type: "address"
            }
         ],
         name: "transfer",
         "outputs": [],
         stateMutability: "payable",
         type: "function"
      },
      0xdd3ced63: {
         inputs: [
            {
               name: "participantAddress",
               type: "address"
            }
         ],
         name: "holdings",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x9bcf5f0c: {
         inputs: [
            {
               name: "potatoeIdx",
               type: "uint256"
            }
         ],
         name: "steal",
         "outputs": [],
         stateMutability: "payable",
         type: "function"
      },
      0x2e1a7d4d: {
         inputs: [
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "withdraw",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "HotPotatoe",
   storage: {
      prototype: {
         address: "0x73f7dafa086d58aedd8146f40dd8a86fcf778b8f"
      },
      name: "HOT Potatoe",
      symbol: "POTATOE",
      decimals: 0,
      totalSupply: "1",
      initPrice: "1000000000000000000",
      admin: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      PotatoeType: {
         idx: "0",
         minter: "",
         owner: "",
         debtor: "",
         price: "0",
         parentIdx: "-1",
         initDate: "0",
         transfers: "0",
         cumulativePrice: "0"
      },
      potatoes: [
         {
            idx: 0,
            minter: "0xccf8ba457dcad7ee6a0361c96846a0f79744b113",
            owner: "0x73f7dafa086d58aedd8146f40dd8a86fcf778b8f",
            debtor: "0xccf8ba457dcad7ee6a0361c96846a0f79744b113",
            price: "1000000000000000000",
            parentIdx: -1,
            initDate: "1651573347208",
            transfers: "0",
            cumulativePrice: "0"
         }
      ],
      participants: {
         0xccf8ba457dcad7ee6a0361c96846a0f79744b113: {
            0: "minter+debtor"
         }
      }
   },
   storageHash: "0xb5193f92ac3d5c5c6b4f34b77b9d11cc38fc5d8508236e345904b6556ba232b6",
   savedOnBlockNumber: "13"
}
11 0xce7e65b9cfadb8cb904b757f263297aa29988fe7
{
   address: "0xce7e65b9cfadb8cb904b757f263297aa29988fe7",
   balance: "0",
   "transactions": [],
   code: "/*\nName: DoubleOrQuits Token\nVersion: 0.0.3\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\n\n\nclass DoubleOrQuitsToken extends ERC20Token {\n    name = 'Double Or Quits';\n    symbol = 'DOQ';\n\n    doubleOrQuits() {\n        const userAddress = msg.sender.toLowerCase();\n        var tokenBalances = this.balances || {};\n        let win = false;\n\n        if (userAddress in tokenBalances && tokenBalances[userAddress].gt(0)) {\n            const balance = tokenBalances[userAddress];\n            const rand = Math.random() * 100;\n            win = (Math.round(rand) % 2 == 0);\n\n            if (win) {\n                this.mint(userAddress, balance);\n                emit('Win', [userAddress, balance]);\n\n            } else {\n                this.burn(userAddress, balance);\n                emit('Loose', [userAddress, balance]);\n            }\n\n        } else {\n            const mintAmount = number('1000000000000000000'); // 1 DOQ\n            this.mint(userAddress, mintAmount);\n            win = true;\n            emit('FreeToken', [userAddress, mintAmount]);\n        }\n\n        return [win];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            throw new Error('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            throw new Error('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        const burnAmount = amount.div(2);\n        this.burn(sender, burnAmount);\n\n        const recipientAmount = amount.sub(burnAmount);\n        this._decrementUserBalance.bind(this)(sender, recipientAmount);\n        this._incrementUserBalance.bind(this)(recipient, recipientAmount)\n        \n        emit('Transfer', [sender, recipient, recipientAmount]);\n\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) /* external returns (bool) */ {\n        sender = sender.toLowerCase(); // sender est celui dont les tokens vont etre dépensés par msg.sender\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        if (! (sender in tokenBalances)) {\n            throw new Error('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            throw new Error('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenAllowances[sender][msg.sender].lt(amount)) {\n            throw new Error('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        const burnAmount = number(0); //amount.div(2);\n        //this.burn(sender, burnAmount);\n\n        const recipientAmount = amount.sub(burnAmount);\n        this._decrementUserBalance.bind(this)(sender, recipientAmount);\n        this._incrementUserBalance.bind(this)(recipient, recipientAmount)\n\n        emit('Transfer', [sender, recipient, recipientAmount]);\n\n        return [true];\n    }\n}\n\n// Methods\nDoubleOrQuitsToken.prototype.doubleOrQuits.outputs = ['bool'];\n\nDoubleOrQuitsToken.prototype.transfer.inputs = ['address', 'uint256'];\nDoubleOrQuitsToken.prototype.transfer.outputs = ['bool'];\n\nDoubleOrQuitsToken.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nDoubleOrQuitsToken.prototype.transferFrom.outputs = ['bool'];\n\n\nreturn DoubleOrQuitsToken;",
   codeHash: "0x920104eb039bd57ed65888b1a91bd3d9cce69fe16b4b372fb2e36ebe647c7d0d",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x4aec70cb: {
         "inputs": [],
         name: "doubleOrQuits",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0f6798a5: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcc16f5db: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x40c10f19: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9dc29fac: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "DoubleOrQuitsToken",
   storage: {
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "Double Or Quits",
      symbol: "DOQ",
      decimals: 18,
      totalSupply: "0",
      "allowed": {},
      "balances": {},
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      prototype: {
         address: "0xce7e65b9cfadb8cb904b757f263297aa29988fe7"
      }
   },
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "6"
}
12 0xe58b9e60afe16e5707376e84372fa1dfbebf71f0
{
   address: "0xe58b9e60afe16e5707376e84372fa1dfbebf71f0",
   balance: "0",
   "transactions": [],
   code: "/*\nName: LiquidityPair (example: WKARMA-YO)\nVersion: 0.0.1\nSource: \n - PancakePair: https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/PancakePair.sol\n - PancakeERC20: https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/PancakeERC20.sol\n - PancakeRouter: https://github.com/pancakeswap/pancake-swap-periphery/blob/master/contracts/PancakeRouter.sol\n - PancakeFactory: https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/PancakeFactory.sol\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\n\n\n\nfunction IERC20(tokenAddress) {\n    return address(tokenAddress).getContract();\n}\n\n\nclass LiquidityPair extends ERC20Token {\n    name = 'LiquidityPair LPs';\n    symbol = 'LiquidityPair-LP';\n    decimals = 18;\n    totalSupply = number(0);\n    reserve0 = number(0);\n    reserve1 = number(0);\n    token0 = '0x0000000000000000000000000000000000000000';\n    token1 = '0x0000000000000000000000000000000000000000';\n\n    \n    Initialize(token0, token1) {} // event\n    AddLiquidity(amount0, amount1) {} // event\n    RemoveLiquidity(amount0, amount1) {} // event\n    Transfer(from, to, value) {} // event\n    Mint(minter, amount0, amount1) {} // event\n    Burn(burner, amount0, amount1, to) {} // event\n    Sync(reserve0, reserve1) {} // event\n    Swap(sender, amount0In, amount1In, amount0Out, amount1Out, to) {} // event\n\n    \n    constructor() {\n        super();\n        this.factory = msg.sender;\n    }\n\n\n    initialize(token0, token1) {\n        require(msg.sender == this.factory, 'Pancake: FORBIDDEN');\n        this.token0 = token0.toLowerCase();\n        this.token1 = token1.toLowerCase();\n\n        emit('Initialize', [token0, token1]);\n    }\n\n    getReserves() {\n        return [\n            this.reserve0,\n            this.reserve1,\n        ];\n    }\n\n    \n    _addLiquidity(amountADesired, amountBDesired) {\n        const [reserveA, reserveB] = this.getReserves();\n        let amountA, amountB;\n    \n        if (reserveA.eq(0) && reserveB.eq(0)) {\n            [amountA, amountB] = [amountADesired, amountBDesired];\n\n        } else {\n            const amountBOptimal = this._quote(amountADesired, reserveA, reserveB)[0];\n            // TODO: a retester/revoir\n            if (true || ! amountBOptimal.gt(amountBDesired)) {\n                //require(!amountBOptimal.lt(amountBMin), 'PancakeRouter: INSUFFICIENT_B_AMOUNT');\n                [amountA, amountB] = [amountADesired, amountBOptimal];\n\n            } else {\n                const amountAOptimal = this._quote(amountBDesired, reserveB, reserveA)[0];\n                assert(!amountAOptimal.gt(amountADesired));\n                //require(!amountAOptimal.lt(amountAMin), 'PancakeRouter: INSUFFICIENT_A_AMOUNT');\n                [amountA, amountB] = [amountAOptimal, amountBDesired];\n            }\n        }\n        return [amountA, amountB];\n    }\n\n\n    _quote(amountA, reserveB, reserveA) {\n        require(amountA.gt(0), 'PancakeLibrary: INSUFFICIENT_AMOUNT');\n        require(reserveA.gt(0) && reserveB.gt(0), 'PancakeLibrary: INSUFFICIENT_LIQUIDITY');\n        const amountB = amountA.mul(reserveB).div(reserveA);\n        return [amountB];\n    }\n\n\n    addLiquidity(amountADesired, amountBDesired) {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        const [amountA, amountB] = this._addLiquidity(amountADesired, amountBDesired);\n\n        const tokenA = this.token0;\n        const tokenB = this.token1;\n        IERC20(tokenA).transferFrom(msg.sender, address(this).address, amountA);\n        IERC20(tokenB).transferFrom(msg.sender, address(this).address, amountB);\n        \n        const liquidity = this.mint(msg.sender)[0];\n        \n        emit('AddLiquidity', [amountA, amountB]);\n\n        return [amountA, amountB, liquidity];\n    }\n\n\n    mint(to) {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        const [_reserve0, _reserve1] = this.getReserves();\n        const balance0 = IERC20(this.token0).balanceOf(address(this).address)[0];\n        const balance1 = IERC20(this.token1).balanceOf(address(this).address)[0];\n        const amount0 = balance0.sub(_reserve0);\n        const amount1 = balance1.sub(_reserve1);\n        const MINIMUM_LIQUIDITY = 10**3;\n\n        function _min(a, b) {\n            return a.gt(b) ? b : a;\n        }\n\n        function sqrtBigInt(value) {\n            if (value < 0n) {\n                throw 'square root of negative numbers is not supported'\n            }\n        \n            if (value < 2n) {\n                return value;\n            }\n        \n            function _iter(n, x0) {\n                const x1 = ((n / x0) + x0) >> 1n;\n                if (x0 === x1 || x0 === (x1 - 1n)) {\n                    return x0;\n                }\n                return _iter(n, x1);\n            }\n        \n            return _iter(value, 1n);\n        }\n        \n        function _sqrt(a) {\n            return number(sqrtBigInt(a.toBigInt()).toString());\n        }\n\n        let liquidity;\n        //const feeOn = _mintFee(_reserve0, _reserve1);\n\n        const _totalSupply = this.totalSupply;\n        if (_totalSupply == 0) {\n            liquidity = _sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);\n            this._mint(address(0).address, MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\n\n        } else {\n            liquidity = _min(amount0.mul(_totalSupply).div(_reserve0), amount1.mul(_totalSupply).div(_reserve1));\n        }\n        require(liquidity.gt(0), 'Pancake: INSUFFICIENT_LIQUIDITY_MINTED');\n        this._mint(to, liquidity);\n\n        this._update(balance0, balance1, _reserve0, _reserve1);\n        \n        //if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n        //emit('Mint', [msg.sender, amount0, amount1]);\n\n        return [\n            amount0,\n        ];\n    }\n\n\n    removeLiquidity(liquidity) {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        this.transferFrom(msg.sender, address(this).address, liquidity); // send liquidity to pair\n\n\n        const token0 = this.token0;\n\n        const [amountA, amountB] = this.burn(to);\n\n        //require(! amountA.lt(amountAMin), 'PancakeRouter: INSUFFICIENT_A_AMOUNT');\n        //require(! amountB.lt(amountBMin), 'PancakeRouter: INSUFFICIENT_B_AMOUNT');\n        require(amountA.gt(0), 'PancakeRouter: INSUFFICIENT_A_AMOUNT');\n        require(amountB.gt(0), 'PancakeRouter: INSUFFICIENT_B_AMOUNT');\n        \n        emit('RemoveLiquidity', [amountA, amountB]);\n\n        return [amountA, amountB];\n    }\n\n\n    burn(to) {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        const [_reserve0, _reserve1] = this.getReserves();\n        const _token0 = this.token0;\n        const _token1 = this.token1;\n        const balance0 = IERC20(_token0).balanceOf(address(this).address)[0];\n        const balance1 = IERC20(_token1).balanceOf(address(this).address)[0];\n        const liquidity = this.balanceOf[address(this).address];\n\n        //const feeOn = this._mintFee(_reserve0, _reserve1);\n        const _totalSupply = this.totalSupply;\n        \n        const amount0 = liquidity.mul(balance0).div(_totalSupply); // using balances ensures pro-rata distribution\n        const amount1 = liquidity.mul(balance1).div(_totalSupply); // using balances ensures pro-rata distribution\n        require(amount0.gt(0) && amount1.gt(0), 'Pancake: INSUFFICIENT_LIQUIDITY_BURNED');\n\n        this._burn(address(this).address, liquidity);\n        IERC20(_token0).transfer(to, amount0);\n        IERC20(_token1).transfer(to, amount1);\n        balance0 = IERC20(_token0).balanceOf(address(this).address);\n        balance1 = IERC20(_token1).balanceOf(address(this).address);\n\n        this._update(balance0, balance1, _reserve0, _reserve1);\n\n        //if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date\n        //emit('Burn', [msg.sender, amount0, amount1, to]);\n\n        return [\n            amount0,\n            amount1,\n        ]\n    }\n\n\n    _mint(to, value) {\n        this.totalSupply = this.totalSupply.add(value);\n        if (! (to in this.balances)) {\n            this.balances[to] = number(0);\n        }\n        this.balances[to] = this.balances[to].add(value);\n        emit('Transfer', [address(0).address, to, value]);\n    }\n\n    _burn(from, value) {\n        require(from in this.balances && ! this.balances[from].lt(this.balances[from]));\n        this.balances[from] = this.balances[from].sub(value);\n        this.totalSupply = this.totalSupply.sub(value);\n        emit('Transfer', [from, address(0).address, value]);\n    }\n    \n    _update(balance0, balance1) {\n        this.reserve0 = balance0;\n        this.reserve1 = balance1;\n        emit('Sync', [this.reserve0, this.reserve1]);\n    }\n\n\n    swapExactTokensForTokens(sourceToken, amountIn, amountOutMin) {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        sourceToken = sourceToken.toLowerCase();\n        const to = msg.sender;\n        const targetToken = (sourceToken == this.token0) ? this.token1 : this.token0;\n        \n        const amounts = this._getAmountsOut(amountIn, sourceToken)[0];\n        require(! amounts[amounts.length - 1].lt(amountOutMin), 'PancakeRouter: INSUFFICIENT_OUTPUT_AMOUNT');\n\n        IERC20(sourceToken).transferFrom(msg.sender, address(this).address, amounts[0]);\n\n        this._swap(amounts, sourceToken, to);\n\n        return [amounts];\n    }\n\n    _getAmountsOut(amountIn, sourceToken) {\n        const [_reserve0, _reserve1] = this.getReserves();\n        const [reserveIn, reserveOut] = (sourceToken == this.token0) ? [_reserve0, _reserve1] : [_reserve1, _reserve0];\n\n        const amounts = [];\n        amounts.push(amountIn);\n        \n        const _amount = this._getAmountOut(amounts[0], reserveIn, reserveOut)[0];\n        amounts.push(_amount);\n        return [amounts];\n    }\n\n    _getAmountOut(amountIn, reserveIn, reserveOut) {\n        require(amountIn.gt(0), 'PancakeLibrary: INSUFFICIENT_INPUT_AMOUNT');\n        require(reserveIn.gt(0) && reserveOut.gt(0), 'PancakeLibrary: INSUFFICIENT_LIQUIDITY');\n\n        const amountInWithFee = amountIn.mul(998);\n        const numerator = amountInWithFee.mul(reserveOut);\n        const denominator = reserveIn.mul(1000).add(amountInWithFee);\n        const amountOut = numerator.div(denominator);\n        return [amountOut];\n    }\n\n\n    swap(amount0Out, amount1Out, to, data)  {\n        require(this.token1 != '0x0000000000000000000000000000000000000000', "NOT_INITIALIZED");\n        require(amount0Out.gt(0) || amount1Out.gt(0), 'Pancake: INSUFFICIENT_OUTPUT_AMOUNT');\n        const [_reserve0, _reserve1,] = this.getReserves();\n        require(amount0Out.lt(_reserve0) && amount1Out.lt(_reserve1), 'Pancake: INSUFFICIENT_LIQUIDITY');\n\n        let balance0;\n        let balance1;\n        { // scope for _token{0,1}, avoids stack too deep errors\n            const _token0 = this.token0;\n            const _token1 = this.token1;\n            require(to != _token0 && to != _token1, 'Pancake: INVALID_TO');\n\n            if (amount0Out.gt(0)) IERC20(_token0).transfer(to, amount0Out);\n            if (amount1Out.gt(0)) IERC20(_token1).transfer(to, amount1Out);\n\n            if (data && data.length > 0) IERC20(to).pancakeCall(msg.sender, amount0Out, amount1Out, data);\n\n            balance0 = IERC20(_token0).balanceOf(address(this).address)[0];\n            balance1 = IERC20(_token1).balanceOf(address(this).address)[0];\n        }\n\n        const amount0In = (balance0.gt(_reserve0.sub(amount0Out))) ? balance0.sub((_reserve0.sub(amount0Out))) : number(0);\n        const amount1In = (balance1.gt(_reserve1.sub(amount1Out))) ? balance1.sub((_reserve1.sub(amount1Out))) : number(0);\n        require(amount0In.gt(0) || amount1In.gt(0), 'Pancake: INSUFFICIENT_INPUT_AMOUNT');\n\n        { // scope for reserve{0,1}Adjusted, avoids stack too deep errors\n            const balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(2));\n            const balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(2));\n            require(!balance0Adjusted.mul(balance1Adjusted).lt(_reserve0.mul(_reserve1).mul((1000**2).toString())), 'Pancake: K');\n        }\n\n        this._update(balance0, balance1, _reserve0, _reserve1);\n        \n        emit('Swap', [msg.sender, amount0In, amount1In, amount0Out, amount1Out, to]);\n    }\n\n\n    _swap(amounts, sourceToken, _to) {\n        const targetToken = (sourceToken == this.token0) ? this.token1 : this.token0;\n        const path = [sourceToken, targetToken];\n        for (let i=0; i < path.length - 1; i++) {\n            const [input, output] = [ path[i], path[i + 1] ];\n            //const [token0,] = PancakeLibrary.sortTokens(input, output);\n            const token0 = (input > output) ? output : input;\n            \n            const amountOut = amounts[i + 1];\n\n            const [amount0Out, amount1Out] = (input == token0) ? [number(0), amountOut] : [amountOut, number(0)];\n\n            const to = (i < path.length - 2) ? address(this).address : _to;\n\n            this.swap(amount0Out, amount1Out, to, '');\n        }\n    }\n\n}\n\n// Events\nLiquidityPair.prototype.Initialize.event = true;\nLiquidityPair.prototype.Initialize.inputs = ['address indexed', 'address indexed'];\n\nLiquidityPair.prototype.AddLiquidity.event = true;\nLiquidityPair.prototype.AddLiquidity.inputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype.RemoveLiquidity.event = true;\nLiquidityPair.prototype.RemoveLiquidity.inputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype.Transfer.event = true;\nLiquidityPair.prototype.Transfer.inputs = ['address indexed', 'uint256', 'uint256'];\n\nLiquidityPair.prototype.Mint.event = true;\nLiquidityPair.prototype.Mint.inputs = ['address indexed', 'uint256', 'uint256'];\n\nLiquidityPair.prototype.Burn.event = true;\nLiquidityPair.prototype.Burn.inputs = ['address indexed', 'uint256', 'uint256', 'address indexed'];\n\nLiquidityPair.prototype.Sync.event = true;\nLiquidityPair.prototype.Sync.inputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype.Swap.event = true;\nLiquidityPair.prototype.Swap.inputs = ['address indexed', 'uint256', 'uint256', 'uint256', 'uint256', 'address indexed'];\n\n// Methods\nLiquidityPair.prototype.initialize.inputs = ['address', 'address'];\n\nLiquidityPair.prototype.getReserves.view = true;\nLiquidityPair.prototype.getReserves.outputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype._addLiquidity.internal = true;\n\nLiquidityPair.prototype._quote.internal = true;\n\nLiquidityPair.prototype._mint.internal = true;\n\nLiquidityPair.prototype._burn.internal = true;\n\nLiquidityPair.prototype.addLiquidity.inputs = ['uint256', 'uint256'];\nLiquidityPair.prototype.addLiquidity.outputs = ['uint256', 'uint256', 'uint256'];\n\nLiquidityPair.prototype.mint.inputs = ['address'];\nLiquidityPair.prototype.mint.outputs = ['uint256'];\n\nLiquidityPair.prototype.removeLiquidity.inputs = ['uint256'];\nLiquidityPair.prototype.removeLiquidity.outputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype.burn.inputs = ['address'];\nLiquidityPair.prototype.burn.outputs = ['uint256', 'uint256'];\n\nLiquidityPair.prototype.swapExactTokensForTokens.inputs = ['address', 'uint256', 'uint256'];\nLiquidityPair.prototype.swapExactTokensForTokens.outputs = ['uint[]'];\n\nLiquidityPair.prototype._getAmountsOut.internal = true;\n\nLiquidityPair.prototype._getAmountOut.internal = true;\n\nLiquidityPair.prototype.swap.inputs = ['uint256', 'uint256', 'address', 'bytes'];\n\nLiquidityPair.prototype._swap.internal = true;\n\n\n\nreturn LiquidityPair;\n",
   codeHash: "0x1231c860aaa3133dc899eeee065a2689bae9b4f7ee838ec7f51a876726b57e15",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x443cb4bc: {
         constant: true,
         "inputs": [],
         name: "reserve0",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x5a76f25e: {
         constant: true,
         "inputs": [],
         name: "reserve1",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x0dfe1681: {
         constant: true,
         "inputs": [],
         name: "token0",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xd21220a7: {
         constant: true,
         "inputs": [],
         name: "token1",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xc45a0155: {
         constant: true,
         "inputs": [],
         name: "factory",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xdc90fed0: {
         inputs: [
            {
               name: "token0",
               type: "address",
               indexed: true
            },
            {
               name: "token1",
               type: "address",
               indexed: true
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcb1652de: {
         inputs: [
            {
               name: "amount0",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1",
               type: "uint256",
               indexed: false
            }
         ],
         name: "AddLiquidity",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x9101fb4c: {
         inputs: [
            {
               name: "amount0",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1",
               type: "uint256",
               indexed: false
            }
         ],
         name: "RemoveLiquidity",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcf2aa508: {
         inputs: [
            {
               name: "reserve0",
               type: "uint256",
               indexed: false
            },
            {
               name: "reserve1",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Sync",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xd78ad95f: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "amount0In",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1In",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount0Out",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1Out",
               type: "uint256",
               indexed: false
            },
            {
               name: "to",
               type: "address",
               indexed: true
            }
         ],
         name: "Swap",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x485cc955: {
         inputs: [
            {
               name: "token0",
               type: "address"
            },
            {
               name: "token1",
               type: "address"
            }
         ],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x0902f1ac: {
         "inputs": [],
         name: "getReserves",
         outputs: [
            {
               name: "",
               type: "uint256"
            },
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x9cd441da: {
         inputs: [
            {
               name: "amountADesired",
               type: "uint256"
            },
            {
               name: "amountBDesired",
               type: "uint256"
            }
         ],
         name: "addLiquidity",
         outputs: [
            {
               name: "",
               type: "uint256"
            },
            {
               name: "",
               type: "uint256"
            },
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9c8f9f23: {
         inputs: [
            {
               name: "liquidity",
               type: "uint256"
            }
         ],
         name: "removeLiquidity",
         outputs: [
            {
               name: "",
               type: "uint256"
            },
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x5152ac6f: {
         inputs: [
            {
               name: "sourceToken",
               type: "address"
            },
            {
               name: "amountIn",
               type: "uint256"
            },
            {
               name: "amountOutMin",
               type: "uint256"
            }
         ],
         name: "swapExactTokensForTokens",
         outputs: [
            {
               name: "",
               type: "uint[]"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x022c0d9f: {
         inputs: [
            {
               name: "amount0Out",
               type: "uint256"
            },
            {
               name: "amount1Out",
               type: "uint256"
            },
            {
               name: "to",
               type: "address"
            },
            {
               name: "data",
               type: "bytes"
            }
         ],
         name: "swap",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x7fa9aafe: {
         inputs: [
            {
               name: "from",
               type: "address",
               indexed: true
            },
            {
               name: "to",
               type: "uint256",
               indexed: false
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x4c209b5f: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount0",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xdccd412f: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount0",
               type: "uint256",
               indexed: false
            },
            {
               name: "amount1",
               type: "uint256",
               indexed: false
            },
            {
               name: "to",
               type: "address",
               indexed: true
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x6a627842: {
         inputs: [
            {
               name: "to",
               type: "address"
            }
         ],
         name: "mint",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x89afcb44: {
         inputs: [
            {
               name: "to",
               type: "address"
            }
         ],
         name: "burn",
         outputs: [
            {
               name: "",
               type: "uint256"
            },
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "LiquidityPair",
   storage: {
      prototype: {
         address: "0xe58b9e60afe16e5707376e84372fa1dfbebf71f0"
      },
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "LiquidityPair LPs",
      symbol: "LiquidityPair-LP",
      decimals: 18,
      totalSupply: "0",
      "allowed": {},
      "balances": {},
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      reserve0: "0",
      reserve1: "0",
      token0: "0x2347d36cf0d94b98bab6d6d41c6f94d7214830ad",
      token1: "0x92c8b8729d850d99c34c50ab2846ec36169e0024",
      factory: "0x131a190fa22cb867abf58193bf9e7640e9fce682"
   },
   storageHash: "0xe2f98512fc593b4092a8def6c5177dddf010328dbb0161c09d50ef3b7a612ea1",
   savedOnBlockNumber: "16"
}
13 0x76c2315b2e96876d0d3db8f036f74fee3b581785
{
   address: "0x76c2315b2e96876d0d3db8f036f74fee3b581785",
   balance: "0",
   "transactions": [],
   code: "/*\nName: Presale Token\nVersion: 0.0.3\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\n\n\nclass PresaleToken extends ERC20Token {\n    name = 'Presale Token';\n    symbol = 'PRE';\n\n    saleServiceAddress = '';\n    \n\n    Initialize(saleServiceAddress) {} // event\n\n\n    initialize(saleServiceAddress) {\n        this.saleServiceAddress = saleServiceAddress.toLowerCase();\n\n        emit('Initialize', [saleServiceAddress]);\n    }\n\n\n    mint(recipient, amountToMint) {\n        require(this.saleServiceAddress != '', "NOT_INITIALIZED");\n        require(msg.sender == this.saleServiceAddress, "ONLY_STACKING_SERVICE");\n        this._mint(recipient, amountToMint);\n    }\n\n}\n\n// Events\nPresaleToken.prototype.Initialize.event = true;\nPresaleToken.prototype.Initialize.inputs = ['address indexed'];\n\n// Methods\nPresaleToken.prototype.initialize.inputs = ['address'];\n\nPresaleToken.prototype.mint.inputs = ['address', 'uint256'];\n\n\n\nreturn PresaleToken;\n",
   codeHash: "0x98de11557ff983cdaec1fea066cd6c41c4b29974ade37d74ef5ae8733092e422",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xb1acb1e4: {
         constant: true,
         "inputs": [],
         name: "saleServiceAddress",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x36b14535: {
         inputs: [
            {
               name: "saleServiceAddress",
               type: "address",
               indexed: true
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xc4d66de8: {
         inputs: [
            {
               name: "saleServiceAddress",
               type: "address"
            }
         ],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0f6798a5: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcc16f5db: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x40c10f19: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amountToMint",
               type: "uint256"
            }
         ],
         name: "mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9dc29fac: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "PresaleToken",
   storage: {
      prototype: {
         address: "0x76c2315b2e96876d0d3db8f036f74fee3b581785"
      },
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "Presale Token",
      symbol: "PRE",
      decimals: 18,
      totalSupply: "0",
      "allowed": {},
      "balances": {},
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      saleServiceAddress: "0x0c3b429fa6cd44a96fcea3cc3fc085d1ddee8158"
   },
   storageHash: "0x6f9425544d8b66c2e06e1959a80b6781118fad1ca184b4374131021c1a18620f",
   savedOnBlockNumber: "14"
}
14 0x0c3b429fa6cd44a96fcea3cc3fc085d1ddee8158
{
   address: "0x0c3b429fa6cd44a96fcea3cc3fc085d1ddee8158",
   balance: "0",
   "transactions": [],
   code: "/*\nName: SaleService\nVersion: 0.0.3\n*/\n\n\nfunction IERC20(tokenAddress) {\n    return address(tokenAddress).getContract();\n}\n\n\nclass SaleService {   \n    name = 'Presale Service';\n    \n    tokenAddress = '0x0000000000000000000000000000000000000000';\n    maxSupply = number('0');\n    presaleDateStart = number(0);\n    presaleDateStop = number(0);\n    presalePrice = number(0);\n    presaleMaxSupply = number(0);\n    presaleWhilteListMerkleRoot = number('0');\n    publicPrice = number('0');\n\n\n    Initialize(tokenAddress, maxSupply, presaleDateStart, presaleDateStop, presalePrice, presaleMaxSupply, presaleWhilteListMerkleRoot, publicPrice) {} // event\n    BuyPresale(sender, value, amountOut) {} // event\n    Buy(sender, value, amountOut) {} // event\n    WithdrawSales(sender, amount) {} // event\n\n\n    initialize(tokenAddress, maxSupply, presaleDateStart, presaleDateStop, presalePrice, presaleMaxSupply, presaleWhilteListMerkleRoot, publicPrice) {\n        require(! maxSupply.lt(presaleMaxSupply)," INVALID_SUPPLY");\n        this.tokenAddress = tokenAddress;\n        this.maxSupply = maxSupply;\n        this.presaleDateStart = presaleDateStart;\n        this.presaleDateStop = presaleDateStop;\n        this.presalePrice = presalePrice;\n        this.presaleMaxSupply = presaleMaxSupply;\n        this.presaleWhilteListMerkleRoot = presaleWhilteListMerkleRoot;\n        this.publicPrice = publicPrice;\n\n        emit('Initialize', [tokenAddress, maxSupply, presaleDateStart, presaleDateStop, presalePrice, presaleMaxSupply, presaleWhilteListMerkleRoot, publicPrice]);\n    }\n\n\n    buyPresale() {\n        require(this.tokenAddress != '', "NOT_INITIALIZED");\n        require(! block.timestamp.lt(this.presaleDateStart), "PRESALE_NOT_STARTED");\n        require(! block.timestamp.gt(this.presaleDateStop), "PRESALE_FINISHED");\n        \n        const [amountOut,] = this._getAmountOut(msg.value, this.presalePrice);\n        require(amountOut.gt(0), "INVALID_AMOUNT_OUT");\n\n        const totalSupply = tokenOut.totalSupply;\n        require(! totalSupply.add(amountOut).gt(this.presaleMaxSupply), 'PRESALE_SUPPLY_EXCEEDED');\n        require(! totalSupply.add(amountOut).gt(this.maxSupply), 'TOTAL_SUPPLY_EXCEEDED');\n\n        this.presaleMaxSupply = this.presaleMaxSupply.add(amountOut);\n        IERC20(this.tokenAddress).mint(msg.sender, amountOut);\n\n        emit('BuyPresale', [msg.sender, msg.value, amountOut]);\n    }\n\n\n    buy() {\n        require(this.tokenAddress != '', "NOT_INITIALIZED");\n        require(block.timestamp.gt(this.presaleDateStop), "PRESALE_NOT_FINISHED");\n        \n        const [amountOut,] = this._getAmountOut(msg.value, this.publicPrice);\n        require(amountOut.gt(0), "INVALID_AMOUNT_OUT");\n\n        const totalSupply = tokenOut.totalSupply;\n        require(! totalSupply.add(amountOut).gt(this.maxSupply), 'TOTAL_SUPPLY_EXCEEDED');\n\n        IERC20(this.tokenAddress).mint(msg.sender, amountOut);\n\n        emit('Buy', [msg.sender, msg.value, amountOut]);\n    }\n\n\n    _getAmountOut(amountIn, price) {\n        const tokenOut = IERC20(this.tokenAddress);\n        const decimalsOut = tokenOut.decimals;\n        const amountOut = amountIn.div(price).mul(10 ** decimalsOut);\n        return [amountOut];\n    }\n\n\n    withdrawSales(amount) {\n        require(msg.sender == this.owner, 'ONLY_OWNER');\n        require(! amount.gt(address(this).balance));\n        address(this).transfer(msg.sender, amount);\n\n        emit('WithdrawSales', [msg.sender, amount]);\n    }\n\n}\n\n// Events\nSaleService.prototype.Initialize.event = true;\nSaleService.prototype.Initialize.inputs = ['address indexed', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'address', 'uint256'];\n\nSaleService.prototype.BuyPresale.event = true;\nSaleService.prototype.BuyPresale.inputs = ['address indexed', 'uint256', 'uint256']\n\nSaleService.prototype.Buy.event = true;\nSaleService.prototype.Buy.inputs = ['address indexed', 'uint256', 'uint256']\n\nSaleService.prototype.WithdrawSales.event = true;\nSaleService.prototype.WithdrawSales.inputs = ['address indexed', 'uint256']\n\n// Methods\nSaleService.prototype.initialize.inputs = ['address', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'address', 'uint256'];\n\nSaleService.prototype.buyPresale.payable = true;\n\nSaleService.prototype.withdrawSales.inputs = ['uint256'];\n\n\nreturn SaleService;\n",
   codeHash: "0xcaecd86c68df5f226652551a59315ea58ec7dd73f41ff92877654483799c10b9",
   codeAbi: {
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x9d76ea58: {
         constant: true,
         "inputs": [],
         name: "tokenAddress",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xd5abeb01: {
         constant: true,
         "inputs": [],
         name: "maxSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x48e37220: {
         constant: true,
         "inputs": [],
         name: "presaleDateStart",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x3c9ba63c: {
         constant: true,
         "inputs": [],
         name: "presaleDateStop",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x000e7fa8: {
         constant: true,
         "inputs": [],
         name: "presalePrice",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x08fc299b: {
         constant: true,
         "inputs": [],
         name: "presaleMaxSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xac716ec9: {
         constant: true,
         "inputs": [],
         name: "presaleWhilteListMerkleRoot",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa945bf80: {
         constant: true,
         "inputs": [],
         name: "publicPrice",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x6b67af55: {
         inputs: [
            {
               name: "tokenAddress",
               type: "address",
               indexed: true
            },
            {
               name: "maxSupply",
               type: "uint256",
               indexed: false
            },
            {
               name: "presaleDateStart",
               type: "uint256",
               indexed: false
            },
            {
               name: "presaleDateStop",
               type: "uint256",
               indexed: false
            },
            {
               name: "presalePrice",
               type: "uint256",
               indexed: false
            },
            {
               name: "presaleMaxSupply",
               type: "uint256",
               indexed: false
            },
            {
               name: "presaleWhilteListMerkleRoot",
               type: "address",
               indexed: false
            },
            {
               name: "publicPrice",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x6cbd15ae: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            },
            {
               name: "amountOut",
               type: "uint256",
               indexed: false
            }
         ],
         name: "BuyPresale",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x1cbc5ab1: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "value",
               type: "uint256",
               indexed: false
            },
            {
               name: "amountOut",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Buy",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x60e3475a: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "WithdrawSales",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xac9b697d: {
         inputs: [
            {
               name: "tokenAddress",
               type: "address"
            },
            {
               name: "maxSupply",
               type: "uint256"
            },
            {
               name: "presaleDateStart",
               type: "uint256"
            },
            {
               name: "presaleDateStop",
               type: "uint256"
            },
            {
               name: "presalePrice",
               type: "uint256"
            },
            {
               name: "presaleMaxSupply",
               type: "uint256"
            },
            {
               name: "presaleWhilteListMerkleRoot",
               type: "address"
            },
            {
               name: "publicPrice",
               type: "uint256"
            }
         ],
         name: "initialize",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9fcdec61: {
         "inputs": [],
         name: "buyPresale",
         "outputs": [],
         stateMutability: "payable",
         type: "function"
      },
      0xa6f2ae3a: {
         "inputs": [],
         name: "buy",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x93744494: {
         inputs: [
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "withdrawSales",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "SaleService",
   storage: {
      prototype: {
         address: "0x0c3b429fa6cd44a96fcea3cc3fc085d1ddee8158"
      },
      name: "Presale Service",
      tokenAddress: "0x76c2315B2E96876d0D3Db8f036F74fEe3b581785",
      maxSupply: "100000000000000000000000",
      presaleDateStart: "1651573951964",
      presaleDateStop: "1651581185674",
      presalePrice: "300000000000000000",
      presaleMaxSupply: "15000000000000000000000",
      presaleWhilteListMerkleRoot: "0x0000000000000000000000000000000000000000",
      publicPrice: "1000000000000000000"
   },
   storageHash: "0xe285f48642c31762dbad92dd5ce76aed1d803ef044e171980e6016fd44966108",
   savedOnBlockNumber: "17"
}
15 0xffafbe052c786154f7e85cbe67f1d118f5b55b25
{
   address: "0xffafbe052c786154f7e85cbe67f1d118f5b55b25",
   balance: "0",
   "transactions": [],
   code: "/*\nName: BASIC Token\nVersion: 0.0.3\n*/\n\n\nclass Ownable {\n    owner = '0x0000000000000000000000000000000000000000';\n\n    OwnershipTransferred(oldOwner, newOwner) {} // event\n    \n\n    constructor() {\n        this.owner = msg.sender;\n    }\n\n    getOwner() {\n        return [this.owner];\n    }\n    \n    transferOwnership(newOwner) {\n        require(newOwner != address(0), "Ownable: new owner is the zero address");\n        this._transferOwnership(newOwner);\n    }\n\n    _transferOwnership(newOwner) {\n        newOwner = newOwner.toLowerCase();\n        const oldOwner = this.owner;\n        this.owner = newOwner;\n        emit('OwnershipTransferred', [oldOwner, newOwner]);\n    }\n\n    _onlyOwner(next) {\n        require(msg.sender.toLowerCase() == this.owner, 'only owner can execute this');\n        next();\n    }\n}\n\n// Methods\nOwnable.prototype.OwnershipTransferred.event = true;\nOwnable.prototype.OwnershipTransferred.inputs = ['address indexed', 'address indexed'];\n\n// Methods\nOwnable.prototype.getOwner.view = true;\nOwnable.prototype.getOwner.outputs = ['address'];\n\nOwnable.prototype.transferOwnership.inputs = ['address'];\nOwnable.prototype.transferOwnership.modifiers = ['_onlyOwner'];\n\nOwnable.prototype._transferOwnership.internal = true;\n\nOwnable.prototype._onlyOwner.internal = true;\n\n\n\n\nclass ERC20Token extends Ownable {\n    name = 'ERC20 Token';\n    symbol = 'ERC20';\n    decimals = 18;\n    totalSupply = number('0');\n\n    allowed = {};\n    balances = {};\n\n    supportedInterfaces = {\n        '0x36372b07': true, // ERC20\n        '0x06fdde03': true, // ERC20 name\n        '0x95d89b41': true, // ERC20 symbol\n        '0x313ce567': true, // ERC20 decimals\n    };\n\n\n    Transfer(sender, recipient, amount) {} // event\n    Approval(owner, spender, amount) {} // event\n    Mint(minter, amount) {} // event\n    Burn(burner, amount) {} // event\n\n\n    balanceOf(holderAddress) {\n        holderAddress = holderAddress.toLowerCase();\n        var tokenBalances = this.balances || {};\n\n        if (holderAddress in tokenBalances) {\n            const balance = tokenBalances[holderAddress];\n            return [balance];\n        }\n        return [number(0)];\n    }\n\n    transfer(recipient, amount) {\n        recipient = recipient.toLowerCase();\n        const sender = msg.sender;\n        var tokenBalances = this.balances || {};\n\n        if (! (sender in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    transferFrom(sender, recipient, amount) {\n        sender = sender.toLowerCase();\n        recipient = recipient.toLowerCase();\n        \n        var tokenBalances = this.balances || {};\n        var tokenAllowances = this.allowed || {};\n\n        require(sender in tokenBalances, 'MISSING_TOKEN_BALANCE');\n        if (tokenBalances[sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        \n        require(sender == msg.sender || (sender in tokenAllowances && msg.sender in tokenAllowances[sender]), "MISSING_ALLOWANCE");\n        if (sender != msg.sender && tokenAllowances[sender][msg.sender].lt(amount)) {\n            _throw('INSUFFICIENT_TOKEN_ALLOWANCE');\n        }\n\n        tokenAllowances[sender][msg.sender] = tokenAllowances[sender][msg.sender].sub(amount);\n\n        if (this._decrementUserBalance.bind(this)(sender, amount)) {\n            this._incrementUserBalance.bind(this)(recipient, amount)\n        }\n        \n\n        emit('Transfer', [sender, recipient, amount]);\n        return [true];\n    }\n\n\n    allowance(owner, spender) {\n        owner = owner.toLowerCase();\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (owner in tokenAllowances && spender in tokenAllowances[owner]) {\n            return [tokenAllowances[owner][spender]];\n        }\n        return [number(0)];\n    }\n    \n    approve(spender, value) {\n        spender = spender.toLowerCase();\n        var tokenAllowances = this.allowed || {};\n        if (! (msg.sender in tokenAllowances)) {\n            tokenAllowances[msg.sender] = {};\n        }\n        tokenAllowances[msg.sender][spender] = value;\n        emit('Approval', [msg.sender, spender, value]);\n        return [true];\n    }\n\n    \n    mint(userAddress, amount) {\n        this._mint(userAddress, amount);\n    }\n\n    _mint(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: mint to the zero address');\n        }\n        \n        if (this._incrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.add(amount);\n        }\n\n        emit('Mint', [userAddress, amount]);\n    }\n\n    \n    burn(userAddress, amount) {\n        this._burn(userAddress, amount);\n    }\n\n    _burn(userAddress, amount) {\n        userAddress = userAddress.toLowerCase();\n        if (userAddress == address(0).address) {\n            _throw('ERC20: burn from the zero address');\n        }\n        \n        if (this._decrementUserBalance.bind(this)(userAddress, amount)) {\n            this.totalSupply = this.totalSupply.sub(amount);\n        }\n\n        emit('Burn', [userAddress, amount]);\n    }\n\n\n    supportsInterface(interfaceID) {\n        const _interfaces = this.supportedInterfaces || {};\n        return [\n            ((interfaceID in _interfaces)\n                ? _interfaces[interfaceID]\n                : false)\n        ];\n    }\n\n\n    _decrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        if (amount.gt(tokenBalances[holderAddress])) {\n            _throw('INSUFFICIENT_TOKEN_BALANCE');\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].sub(amount);\n        return true;\n    }\n\n\n    _incrementUserBalance(holderAddress, amount) {\n        var tokenBalances = this.balances || {};\n\n        if (! (holderAddress in tokenBalances)) {\n            tokenBalances[holderAddress] = number(0);\n        }\n        tokenBalances[holderAddress] = tokenBalances[holderAddress].add(amount);\n        return true;\n    }\n\n}\n\n// Events\nERC20Token.prototype.Transfer.event = true;\nERC20Token.prototype.Transfer.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Approval.event = true;\nERC20Token.prototype.Approval.inputs = ['address indexed', 'address indexed', 'uint256'];\n\nERC20Token.prototype.Mint.event = true;\nERC20Token.prototype.Mint.inputs = ['address indexed', 'uint256'];\n\nERC20Token.prototype.Burn.event = true;\nERC20Token.prototype.Burn.inputs = ['address indexed', 'uint256'];\n\n// Methods\nERC20Token.prototype.balanceOf.view = true;\nERC20Token.prototype.balanceOf.inputs = ['address'];\nERC20Token.prototype.balanceOf.outputs = ['uint256'];\n\nERC20Token.prototype.transfer.inputs = ['address', 'uint256'];\nERC20Token.prototype.transfer.outputs = ['bool'];\n\nERC20Token.prototype.transferFrom.inputs = ['address', 'address', 'uint256'];\nERC20Token.prototype.transferFrom.outputs = ['bool'];\n\nERC20Token.prototype.allowance.view = true;\nERC20Token.prototype.allowance.inputs = ['address', 'address'];\nERC20Token.prototype.allowance.outputs = ['uint256'];\n\nERC20Token.prototype.approve.inputs = ['address', 'uint256'];\nERC20Token.prototype.approve.outputs = ['bool'];\n\nERC20Token.prototype.mint.inputs = ['address', 'uint256'];\nERC20Token.prototype.mint.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._mint.internal = true;\n\nERC20Token.prototype.burn.inputs = ['address', 'uint256'];\nERC20Token.prototype.burn.modifiers = ['_onlyOwner'];\n\nERC20Token.prototype._burn.internal = true;\n\nERC20Token.prototype.supportsInterface.view = true;\nERC20Token.prototype.supportsInterface.inputs = ['bytes4'];\nERC20Token.prototype.supportsInterface.outputs = ['bool'];\n\nERC20Token.prototype._decrementUserBalance.internal = true;\n\nERC20Token.prototype._incrementUserBalance.internal = true;\n\n\n\nclass BasicToken extends ERC20Token {   \n    name = 'BASIC Token';\n    symbol = 'BASIC';\n\n    constructor() {\n        super();\n        this.totalSupply = number('42000000' + '000000000000000000'); // 42 000 000 BASIC\n        this.balances[msg.sender] = this.totalSupply;\n    }\n\n}\n\n\nreturn BasicToken;\n",
   codeHash: "0xc3882317a0d96b82310d94f886a4512c6586eb848541241c62f8d9a5b3f19a68",
   codeAbi: {
      0x8da5cb5b: {
         constant: true,
         "inputs": [],
         name: "owner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x06fdde03: {
         constant: true,
         "inputs": [],
         name: "name",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x95d89b41: {
         constant: true,
         "inputs": [],
         name: "symbol",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x313ce567: {
         constant: true,
         "inputs": [],
         name: "decimals",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x18160ddd: {
         constant: true,
         "inputs": [],
         name: "totalSupply",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x19e1fca4: {
         constant: true,
         "inputs": [],
         name: "allowed",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x7bb98a68: {
         constant: true,
         "inputs": [],
         name: "balances",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0x037cc0e6: {
         constant: true,
         "inputs": [],
         name: "supportedInterfaces",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xa8ac9b50: {
         constant: true,
         "inputs": [],
         name: "prototype",
         outputs: [
            {
               name: "",
               type: "string"
            }
         ],
         payable: false,
         stateMutability: "view",
         type: "function"
      },
      0xddf252ad: {
         inputs: [
            {
               name: "sender",
               type: "address",
               indexed: true
            },
            {
               name: "recipient",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Transfer",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x8c5be1e5: {
         inputs: [
            {
               name: "owner",
               type: "address",
               indexed: true
            },
            {
               name: "spender",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Approval",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x0f6798a5: {
         inputs: [
            {
               name: "minter",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0xcc16f5db: {
         inputs: [
            {
               name: "burner",
               type: "address",
               indexed: true
            },
            {
               name: "amount",
               type: "uint256",
               indexed: false
            }
         ],
         name: "Burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x70a08231: {
         inputs: [
            {
               name: "holderAddress",
               type: "address"
            }
         ],
         name: "balanceOf",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xa9059cbb: {
         inputs: [
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transfer",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x23b872dd: {
         inputs: [
            {
               name: "sender",
               type: "address"
            },
            {
               name: "recipient",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "transferFrom",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0xdd62ed3e: {
         inputs: [
            {
               name: "owner",
               type: "address"
            },
            {
               name: "spender",
               type: "address"
            }
         ],
         name: "allowance",
         outputs: [
            {
               name: "",
               type: "uint256"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x095ea7b3: {
         inputs: [
            {
               name: "spender",
               type: "address"
            },
            {
               name: "value",
               type: "uint256"
            }
         ],
         name: "approve",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x40c10f19: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "mint",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x9dc29fac: {
         inputs: [
            {
               name: "userAddress",
               type: "address"
            },
            {
               name: "amount",
               type: "uint256"
            }
         ],
         name: "burn",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      },
      0x01ffc9a7: {
         inputs: [
            {
               name: "interfaceID",
               type: "bytes4"
            }
         ],
         name: "supportsInterface",
         outputs: [
            {
               name: "",
               type: "bool"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0x8be0079c: {
         inputs: [
            {
               name: "oldOwner",
               type: "address",
               indexed: true
            },
            {
               name: "newOwner",
               type: "address",
               indexed: true
            }
         ],
         name: "OwnershipTransferred",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "event"
      },
      0x893d20e8: {
         "inputs": [],
         name: "getOwner",
         outputs: [
            {
               name: "",
               type: "address"
            }
         ],
         stateMutability: "view",
         type: "function"
      },
      0xf2fde38b: {
         inputs: [
            {
               name: "newOwner",
               type: "address"
            }
         ],
         name: "transferOwnership",
         "outputs": [],
         stateMutability: "nonpayable",
         type: "function"
      }
   },
   contractName: "BasicToken",
   storage: {
      owner: "0x131a190fa22cb867abf58193bf9e7640e9fce682",
      name: "BASIC Token",
      symbol: "BASIC",
      decimals: 18,
      totalSupply: "42000000000000000000000000",
      "allowed": {},
      balances: {
         0x131a190fa22cb867abf58193bf9e7640e9fce682: "42000000000000000000000000"
      },
      supportedInterfaces: {
         0x36372b07: true,
         0x06fdde03: true,
         0x95d89b41: true,
         0x313ce567: true
      },
      prototype: {
         address: "0xffafbe052c786154f7e85cbe67f1d118f5b55b25"
      }
   },
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "10"
}
16 0xff7cee092641a91e3a105bf0df0748bc11216973
{
   address: "0xff7cee092641a91e3a105bf0df0748bc11216973",
   balance: "1248999986935000000000",
   transactions: [
      "0x335f64d35e5c9b5879618554417d24c76622c5c22f37a4bfff710f2810af9352"
   ],
   code: null,
   codeHash: null,
   "codeAbi": [],
   contractName: null,
   "storage": {},
   storageHash: "0xb48d38f93eaa084033fc5970bf96e559c33c4cdc07d889ab00b4d63f9590739d",
   savedOnBlockNumber: "39"
}