Address Contract Partially Verified
Address
0x87C9Ea70F72aD55a12bC6155a30e047cF2ACd798
Balance
0 ETH
Nonce
1
Code Size
11723 bytes
Creator
0xec2022ad...e0b8 at tx 0xdf7c3a1a...3b6a5c
Indexed Transactions
0
Contract Bytecode
11723 bytes
0x6060604052600436106102b05763ffffffff60e060020a600035041663011847a281146102ba57806306fdde03146102df578063095ea7b3146103695780630ff8cf9b1461039f57806318160ddd146103b25780631ec7e345146103c55780631f2dc5ef146103d857806323b872dd146103eb57806327b4c1581461041357806327f498c914610432578063313ce567146104515780633341b4451461046457806336b6643a146104835780633b2f7bf1146104965780633ccfd60b146104ac5780633fa4f245146104bf57806342966c68146104d2578063502dadb0146104e8578063513de1d31461053757806352e973261461054d5780635353a2d81461056357806370a08231146105b4578063729ad39e146105d357806375c84db5146106225780637b10a1d9146106385780638da5cb5b1461064e5780638f4ffcb11461067d5780639254c2a8146106de57806392d44650146106f457806395d89b41146107075780639898e18c1461071a5780639b1cbccc1461072d5780639c09c83514610740578063a0712d681461078f578063a3895fff146107a5578063a8c310d5146107f6578063a9059cbb14610885578063aa6ca808146102b0578063afa5f45c146108a7578063b74f312e146108bd578063bca0cf1c146108d3578063be45fd62146108e6578063c108d5421461094b578063c489744b1461095e578063cae9ca5114610983578063d83623dd146109dd578063d8a54360146109f0578063daa0242a14610a03578063dd2594af14610a16578063dd62ed3e14610a2c578063e58fc54c14610a51578063ed144d5214610a70578063efca2eed14610a83578063f2fde38b14610a96578063f3e4877c14610ab5578063f6368f8a14610b06578063f965e32e14610bad578063f9f92be414610bc3578063fc73ec0014610be2578063fc765dd814610bf8575b6102b8610c0b565b005b34156102c557600080fd5b6102cd610d60565b60405190815260200160405180910390f35b34156102ea57600080fd5b6102f2610d66565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561032e578082015183820152602001610316565b50505050905090810190601f16801561035b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037457600080fd5b61038b600160a060020a0360043516602435610e04565b604051901515815260200160405180910390f35b34156103aa57600080fd5b6102cd610e71565b34156103bd57600080fd5b6102cd610e77565b34156103d057600080fd5b6102cd610e7d565b34156103e357600080fd5b6102cd610e83565b34156103f657600080fd5b61038b600160a060020a0360043581169060243516604435610e89565b341561041e57600080fd5b6102b8600160a060020a03600435166110b6565b341561043d57600080fd5b6102b8600160a060020a036004351661110c565b341561045c57600080fd5b6102cd611163565b341561046f57600080fd5b6102cd600160a060020a0360043516611169565b341561048e57600080fd5b6102cd61117b565b34156104a157600080fd5b6102b8600435611181565b34156104b757600080fd5b6102b86111a1565b34156104ca57600080fd5b6102cd6111f8565b34156104dd57600080fd5b6102b86004356111fe565b34156104f357600080fd5b6102b860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506112d695505050505050565b341561054257600080fd5b6102b8600435611351565b341561055857600080fd5b6102b8600435611371565b341561056e57600080fd5b6102b860046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061139195505050505050565b34156105bf57600080fd5b6102cd600160a060020a03600435166113bf565b34156105de57600080fd5b6102b860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506113d295505050505050565b341561062d57600080fd5b6102b8600435611484565b341561064357600080fd5b6102b86004356114a4565b341561065957600080fd5b6106616114c4565b604051600160a060020a03909116815260200160405180910390f35b61038b60048035600160a060020a0390811691602480359260443516919060849060643590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506114d395505050505050565b34156106e957600080fd5b6102b86004356115d6565b34156106ff57600080fd5b6102cd6115f6565b341561071257600080fd5b6102f26115fc565b341561072557600080fd5b610661611667565b341561073857600080fd5b61038b611676565b341561074b57600080fd5b6102b860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506116e495505050505050565b341561079a57600080fd5b6102b860043561175b565b34156107b057600080fd5b6102b860046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061180e95505050505050565b341561080157600080fd5b6102b860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061183c95505050505050565b341561089057600080fd5b61038b600160a060020a036004351660243561191f565b34156108b257600080fd5b6102b8600435611993565b34156108c857600080fd5b6102b86004356119b3565b34156108de57600080fd5b6106616119d3565b34156108f157600080fd5b61038b60048035600160a060020a03169060248035919060649060443590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506119e295505050505050565b341561095657600080fd5b61038b611a39565b341561096957600080fd5b6102cd600160a060020a0360043581169060243516611a42565b61038b60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650611abf95505050505050565b34156109e857600080fd5b61038b611c5f565b34156109fb57600080fd5b6102cd611cca565b3415610a0e57600080fd5b61038b611cd0565b3415610a2157600080fd5b6102b8600435611d44565b3415610a3757600080fd5b6102cd600160a060020a0360043581169060243516611d64565b3415610a5c57600080fd5b61038b600160a060020a0360043516611d8f565b3415610a7b57600080fd5b61038b611ead565b3415610a8e57600080fd5b6102cd611f1e565b3415610aa157600080fd5b6102b8600160a060020a0360043516611f24565b3415610ac057600080fd5b6102b860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496505093359350611f7b92505050565b3415610b1157600080fd5b61038b60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061202895505050505050565b3415610bb857600080fd5b6102b86004356122c3565b3415610bce57600080fd5b61038b600160a060020a03600435166122e3565b3415610bed57600080fd5b6102b86004356122f8565b3415610c0357600080fd5b61038b612318565b601554600090819060ff1615610c2057600080fd5b600160a060020a03331660009081526004602052604090205460ff161580610c9c5750600160a060020a03331660009081526004602052604090205460ff1615156001148015610c9c5750601454600160a060020a0333166000908152600560205260409020544291610c99919063ffffffff61232616565b11155b1515610ca757600080fd5b600f546010541115610cba57600f546010555b600f546010541115610ccb57600080fd5b50506010543390610cdc8282612340565b506000811115610d1757600160a060020a0382166000908152600460209081526040808320805460ff19166001179055600590915290204290555b600954600e5410610d30576015805460ff191660011790555b610d59601254610d4d60115460105461242f90919063ffffffff16565b9063ffffffff61244616565b6010555050565b60135481565b60068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dfc5780601f10610dd157610100808354040283529160200191610dfc565b820191906000526020600020905b815481529060010190602001808311610ddf57829003601f168201915b505050505081565b600160a060020a03338116600081815260036020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60115481565b60095481565b600d5481565b60125481565b6000610e93612cb5565b60606064361015610ea057fe5b600160a060020a0385161515610eb557600080fd5b600160a060020a038616600090815260026020526040902054841115610eda57600080fd5b600160a060020a0380871660009081526003602090815260408083203390941683529290522054841115610f0d57600080fd5b610f17868661246a565b1515610f2257600080fd5b600160a060020a038616600090815260026020526040902054610f4b908563ffffffff61250e16565b600160a060020a0380881660009081526002602090815260408083209490945560038152838220339093168252919091522054610f8e908563ffffffff61250e16565b600160a060020a0380881660009081526003602090815260408083203385168452825280832094909455918816815260029091522054610fd4908563ffffffff61232616565b600160a060020a0380871660008181526002602052604090819020939093559190881690600080516020612d808339815191529087905190815260200160405180910390a3816040518082805190602001908083835b602083106110495780518252601f19909201916020918201910161102a565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902085600160a060020a031687600160a060020a0316600080516020612d608339815191528760405190815260200160405180910390a450600195945050505050565b60015433600160a060020a039081169116146110d157600080fd5b600160a060020a0381161561110957600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60015433600160a060020a0390811691161461112757600080fd5b600160a060020a0381161561110957600b8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b60085481565b60056020526000908152604090205481565b60145481565b60015433600160a060020a0390811691161461119c57600080fd5b600d55565b60015460009033600160a060020a039081169116146111bf57600080fd5b50600154600160a060020a0330811631911681156108fc0282604051600060405180830381858888f19350505050151561110957600080fd5b60105481565b60015460009033600160a060020a0390811691161461121c57600080fd5b600160a060020a03331660009081526002602052604090205482111561124157600080fd5b5033600160a060020a038116600090815260026020526040902054611266908361250e565b600160a060020a038216600090815260026020526040902055600954611292908363ffffffff61250e16565b600955600160a060020a0381167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405190815260200160405180910390a25050565b60015460009033600160a060020a039081169116146112f457600080fd5b5060005b815181101561134d5760016004600084848151811061131357fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790556001016112f8565b5050565b60015433600160a060020a0390811691161461136c57600080fd5b601255565b60015433600160a060020a0390811691161461138c57600080fd5b600955565b60015433600160a060020a039081169116146113ac57600080fd5b600681805161134d929160200190612cc7565b60006113ca82612520565b90505b919050565b60015460009033600160a060020a039081169116146113f057600080fd5b60155460ff161561140057600080fd5b60ff8251111561140f57600080fd5b600f54601054111561142057600080fd5b5060005b815181101561146857600f54601054111561143e57600080fd5b61145f82828151811061144d57fe5b90602001906020020151601054612340565b50600101611424565b600954600e541061134d576015805460ff191660011790555050565b60015433600160a060020a0390811691161461149f57600080fd5b601455565b60015433600160a060020a039081169116146114bf57600080fd5b601355565b600154600160a060020a031681565b600a54600090600160a060020a038481169116146114f057600080fd5b600b54600160a060020a0386811691161461150a57600080fd5b600c8490557fe5c4855c90bbcd154482c5767e9f09a975c46f2b325931cad299c1fd0697ca7185858585604051600160a060020a038086168252602082018590528316604082015260806060820181815290820183818151815260200191508051906020019080838360005b8381101561158e578082015183820152602001611576565b50505050905090810190601f1680156115bb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1506001949350505050565b60015433600160a060020a039081169116146115f157600080fd5b600f55565b600c5481565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dfc5780601f10610dd157610100808354040283529160200191610dfc565b600b54600160a060020a031681565b60015460009033600160a060020a0390811691161461169457600080fd5b60155460ff16156116a457600080fd5b6015805460ff191660011790557f7f95d919e78bdebe8a285e6e33357c2fcb65ccf66e72d7573f9f8f6caad0c4cc60405160405180910390a15060015b90565b60015460009033600160a060020a0390811691161461170257600080fd5b5060005b815181101561134d5760006004600084848151811061172157fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff1916911515919091179055600101611706565b60015460009033600160a060020a0390811691161461177957600080fd5b5033600160a060020a03811660009081526002602052604090205461179e9083612326565b600160a060020a0382166000908152600260205260409020556009546117ca908363ffffffff61232616565b600955600160a060020a0381167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858360405190815260200160405180910390a25050565b60015433600160a060020a0390811691161461182957600080fd5b600781805161134d929160200190612cc7565b60015460009033600160a060020a0390811691161461185a57600080fd5b60155460ff161561186a57600080fd5b60ff8351111561187957600080fd5b815183511461188757600080fd5b5060005b82518160ff16101561191a57600f54828260ff16815181106118a957fe5b9060200190602002015111156118be57600080fd5b6118f8838260ff16815181106118d057fe5b90602001906020020151838360ff16815181106118e957fe5b90602001906020020151612340565b50600954600e5410611912576015805460ff191660011790555b60010161188b565b505050565b6000611929612cb5565b6040604436101561193657fe5b600160a060020a038516151561194b57600080fd5b611954856125c7565b1561196b576119648585846125cf565b925061198b565b611975338661246a565b151561198057600080fd5b6119648585846127f4565b505092915050565b60015433600160a060020a039081169116146119ae57600080fd5b600855565b60015433600160a060020a039081169116146119ce57600080fd5b600e55565b600a54600160a060020a031681565b6000604060443610156119f157fe5b600160a060020a0385161515611a0657600080fd5b611a0f856125c7565b15611a2657611a1f8585856125cf565b9150611a31565b611a1f8585856127f4565b509392505050565b60155460ff1681565b60008281600160a060020a0382166370a0823185836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611a9c57600080fd5b6102c65a03f11515611aad57600080fd5b50505060405180519695505050505050565b600160a060020a03338116600081815260036020908152604080832094881680845294909152808220869055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a383600160a060020a03166040517f72656365697665417070726f76616c28616464726573732c75696e743235362c81527f616464726573732c6279746573290000000000000000000000000000000000006020820152602e01604051809103902060e060020a9004338530866040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a03168152602001828051906020019080838360005b83811015611c00578082015183820152602001611be8565b50505050905090810190601f168015611c2d5780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038160008761646e5a03f1925050501515611c5557600080fd5b5060019392505050565b60015460009033600160a060020a03908116911614611c7d57600080fd5b60155460ff161515611c8e57600080fd5b6015805460ff191690557f159b30ae850d9e3bc5d4db2ee06d52111229dd7cf4b4def72f83d2724d7e4fc660405160405180910390a150600190565b600f5481565b60015460009033600160a060020a03908116911614611cee57600080fd5b601554610100900460ff1615611d0357600080fd5b6015805461ff0019166101001790557f84e6b8bcd57abf8fc139d6289b44bf63ed39012e9b104b57eeff40020d34679d60405160405180910390a150600190565b60015433600160a060020a03908116911614611d5f57600080fd5b600c55565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b6001546000908190819033600160a060020a03908116911614611db157600080fd5b83915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611e0b57600080fd5b6102c65a03f11515611e1c57600080fd5b5050506040518051600154909250600160a060020a03808516925063a9059cbb91168360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611e8b57600080fd5b6102c65a03f11515611e9c57600080fd5b505050604051805195945050505050565b60015460009033600160a060020a03908116911614611ecb57600080fd5b601554610100900460ff161515611ee157600080fd5b6015805461ff00191690557f9e59a9bcbe918167d9b1518ad873e263b1aa52a9c9a19398259c1a1ea929870360405160405180910390a150600190565b600e5481565b60015433600160a060020a03908116911614611f3f57600080fd5b600160a060020a038116156111095760018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b60015460009033600160a060020a03908116911614611f9957600080fd5b60155460ff1615611fa957600080fd5b60ff83511115611fb857600080fd5b600f54821115611fc757600080fd5b5060005b825181101561200b57600f54821115611fe357600080fd5b612002838281518110611ff257fe5b9060200190602002015183612340565b50600101611fcb565b600954600e541061191a576015805460ff19166001179055505050565b6000806040604436101561203857fe5b612041876125c7565b156122ab5785612050336113bf565b101561205b57600080fd5b61207486612068336113bf565b9063ffffffff61250e16565b600160a060020a0333166000908152600260205260409020556120a68661209a896113bf565b9063ffffffff61232616565b600160a060020a0388166000818152600260205260408082209390935589945090918690518082805190602001908083835b602083106120f75780518252601f1990920191602091820191016120d8565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902060e060020a9004903389896040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001828051906020019080838360005b83811015612188578082015183820152602001612170565b50505050905090810190601f1680156121b55780820380516001836020036101000a031916815260200191505b50935050505060006040518083038185886187965a03f1935050505015156121dc57600080fd5b86600160a060020a031633600160a060020a0316600080516020612d808339815191528860405190815260200160405180910390a3846040518082805190602001908083835b602083106122415780518252601f199092019160209182019101612222565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902087600160a060020a031633600160a060020a0316600080516020612d608339815191528960405190815260200160405180910390a4600192506122b9565b6122b68787876127f4565b92505b5050949350505050565b60015433600160a060020a039081169116146122de57600080fd5b601055565b60046020526000908152604090205460ff1681565b60015433600160a060020a0390811691161461231357600080fd5b601155565b601554610100900460ff1681565b60008282018381101561233557fe5b8091505b5092915050565b60155460009060ff161561235357600080fd5b600e54612366908363ffffffff61232616565b600e55600f5461237c908363ffffffff61250e16565b600f55600160a060020a0383166000908152600260205260409020546123a8908363ffffffff61232616565b600160a060020a0384166000818152600260205260409081902092909255907f8940c4b8e215f8822c5c8f0056c12652c746cbc57eedbd2a440b175971d47a779084905190815260200160405180910390a2600160a060020a0383166000600080516020612d808339815191528460405190815260200160405180910390a3506001610e6b565b600080828481151561243d57fe5b04949350505050565b6000828202831580612462575082848281151561245f57fe5b04145b151561233557fe5b600061247783600061291f565b1561250357601554610100900460ff1615156124ee5761249982600d54612b64565b15156124a457600080fd5b81600160a060020a031683600160a060020a03167fd283d26f4f6e458425a8bdf3599243a0a4443a0003c06afcc016a064bfd16cfb600d5460405190815260200160405180910390a35b6124f982600161291f565b5060019050610e6b565b611c5582600061291f565b60008282111561251a57fe5b50900390565b6000600160a060020a0382161580159061253d575060155460ff16155b80156125625750600160a060020a03821660009081526004602052604090205460ff16155b80156125715750600954600e54105b156125a857601054600160a060020a0383166000908152600260205260409020546125a19163ffffffff61232616565b90506113cd565b50600160a060020a0381166000908152600260205260409020546113cd565b6000903b1190565b600080836125dc336113bf565b10156125e757600080fd5b6125f484612068336113bf565b600160a060020a03331660009081526002602052604090205561261a8461209a876113bf565b600160a060020a03861660008181526002602052604080822093909355879350909163c0ee0b8a9133918891889151602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126ba5780820151838201526020016126a2565b50505050905090810190601f1680156126e75780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b151561270757600080fd5b6102c65a03f1151561271857600080fd5b505050604051805190505084600160a060020a031633600160a060020a0316600080516020612d808339815191528660405190815260200160405180910390a3826040518082805190602001908083835b602083106127885780518252601f199092019160209182019101612769565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902085600160a060020a031633600160a060020a0316600080516020612d608339815191528760405190815260200160405180910390a4506001949350505050565b600082612800336113bf565b101561280b57600080fd5b61281883612068336113bf565b600160a060020a03331660009081526002602052604090205561283e8361209a866113bf565b600160a060020a038086166000818152600260205260409081902093909355913390911690600080516020612d808339815191529086905190815260200160405180910390a3816040518082805190602001908083835b602083106128b45780518252601f199092019160209182019101612895565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902084600160a060020a031633600160a060020a0316600080516020612d608339815191528660405190815260200160405180910390a45060019392505050565b601554600090819060ff1615801561293a5750600954600e54105b15612b5a57821580156129655750600160a060020a03841660009081526004602052604090205460ff165b801561299c5750601454600160a060020a038516600090815260056020526040902054429161299a919063ffffffff61232616565b115b156129aa5760009150612339565b600f546013546010546129c29163ffffffff61244616565b11156129cf57600f546010555b600f546013546010546129e79163ffffffff61244616565b11156129f257600080fd5b601354601054612a079163ffffffff61244616565b600e54909150612a1d908263ffffffff61232616565b600e55600f54612a33908263ffffffff61250e16565b600f55600160a060020a038416600090815260026020526040902054612a5f908263ffffffff61232616565b600160a060020a0385166000818152600260205260409081902092909255907ffa5e01f08a8782fe53fd0751b65f3368753770420396986860c20126f1a799649083905190815260200160405180910390a2600160a060020a0384166000600080516020612d808339815191528360405190815260200160405180910390a36000811115612b1857600160a060020a0384166000908152600460209081526040808320805460ff19166001179055600590915290204290555b600954600e5410612b31576015805460ff191660011790555b612b4e601254610d4d60115460105461242f90919063ffffffff16565b60105560019150612339565b5060009392505050565b600b54600090600160a060020a03161515612b7e57600080fd5b600a54600160a060020a03166040517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020820152602501604051908190039020600b5460e060020a90910490600160a060020a0316858560405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152604481019190915260640160006040518083038160008761646e5a03f1925050501515612c5057600080fd5b600b547f3430e46e2df4f1583a566a675ee97937749fe2be666eeed1a3083fc83529eae390600160a060020a03168484604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a150600192915050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d0857805160ff1916838001178555612d35565b82800160010185558215612d35579182015b82811115612d35578251825591602001919060010190612d1a565b50612d41929150612d45565b5090565b6116e191905b80821115612d415760008155600101612d4b560052c0dd07fdf543ec6918baccf2b6895fff59b122727847159223bdb1b8525bbdddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582061b88260e296f2a90bfd27dc154b575b8456569c4ea1da84bc0c27e047b976830029
Verified Source Code Partial Match
Compiler: v0.4.18+commit.9cf6e910
Optimization: Yes (200 runs)
LearnChain.sol 585 lines
pragma solidity ^0.4.18;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a / b;
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract ForeignToken {
function balanceOf(address _owner) constant public returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool);
}
contract ContractReceiver {
function tokenFallback(address _from, uint _value, bytes _data) public returns (bool);
}
contract ERC223Basic {
uint256 public totalSupply;
function balanceOf(address who) public constant returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function transfer(address to, uint256 value, bytes data) public returns (bool);
function transfer(address to, uint256 value, bytes data, string custom_fallback) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract ERC223 is ERC223Basic {
function allowance(address owner, address spender) public constant returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface Token {
function distr(address _to, uint256 _value) public returns (bool);
function totalSupply() constant public returns (uint256 supply);
function balanceOf(address _owner) constant public returns (uint256 balance);
}
contract LearnChain is ERC223 {
using SafeMath for uint256;
address public owner;
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
mapping (address => bool) public blacklist;
mapping(address => uint256) public proposals;
string public name;
string public symbol;
uint256 public decimals;
uint256 public totalSupply;
address public otherTokenAddress;
address public tokenSender;
uint256 public tokenApproves;
uint256 public tokenValue;
uint256 public totalDistributed;
uint256 public totalRemaining;
uint256 public value;
uint256 public dividend;
uint256 public divisor;
uint256 public inviteReward = 2;
uint256 public proposalTimeout = 9999 days;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
event LOG_Transfer(address indexed from, address indexed to, uint256 value, bytes indexed data);
event Distr(address indexed to, uint256 amount);
event InviteInit(address indexed to, uint256 amount);
event Invite(address indexed from, address indexed to, uint256 other_amount);
event DistrFinished();
event DistrStarted();
event Other_DistrFinished();
event Other_DistrStarted();
event LOG_receiveApproval(address _sender,uint256 _tokenValue,address _otherTokenAddress,bytes _extraData);
event LOG_callTokenTransferFrom(address tokenSender,address _to,uint256 _value);
event Burn(address indexed burner, uint256 value);
event Mint(address indexed minter, uint256 value);
bool public distributionFinished = false;
bool public otherDistributionFinished = false;
modifier canDistr() {
require(!distributionFinished);
_;
}
modifier canNotDistr() {
require(distributionFinished);
_;
}
modifier canDistrOther() {
require(!otherDistributionFinished);
_;
}
modifier canNotDistrOther() {
require(otherDistributionFinished);
_;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyWhitelistOrTimeout() {
require(blacklist[msg.sender] == false || (blacklist[msg.sender] == true && proposals[msg.sender].add(proposalTimeout) <= now));
_;
}
function LearnChain (string _tokenName, string _tokenSymbol, uint256 _decimalUnits, uint256 _initialAmount, uint256 _totalDistributed, uint256 _value, uint256 _dividend, uint256 _divisor) public {
require(_decimalUnits != 0);
require(_initialAmount != 0);
require(_value != 0);
require(_dividend != 0);
require(_divisor != 0);
owner = msg.sender;
name = _tokenName;
symbol = _tokenSymbol;
decimals = _decimalUnits;
totalSupply = _initialAmount;
totalDistributed = _totalDistributed;
totalRemaining = totalSupply.sub(totalDistributed);
value = _value;
dividend = _dividend;
divisor = _divisor;
balances[owner] = totalDistributed;
Transfer(address(0), owner, totalDistributed);
}
function transferOwnership(address newOwner) onlyOwner public {
if (newOwner != address(0)) {
owner = newOwner;
}
}
function changeOtherTokenAddress(address newOtherTokenAddress) onlyOwner public {
if (newOtherTokenAddress != address(0)) {
otherTokenAddress = newOtherTokenAddress;
}
}
function changeTokenSender(address newTokenSender) onlyOwner public {
if (newTokenSender != address(0)) {
tokenSender = newTokenSender;
}
}
function changeTokenValue(uint256 newTokenValue) onlyOwner public {
tokenValue = newTokenValue;
}
function changeProposalTimeout(uint256 newProposalTimeout) onlyOwner public {
proposalTimeout = newProposalTimeout;
}
function changeTokenApproves(uint256 newTokenApproves) onlyOwner public {
tokenApproves = newTokenApproves;
}
function enableWhitelist(address[] addresses) onlyOwner public {
for (uint i = 0; i < addresses.length; i++) {
blacklist[addresses[i]] = false;
}
}
function disableWhitelist(address[] addresses) onlyOwner public {
for (uint i = 0; i < addresses.length; i++) {
blacklist[addresses[i]] = true;
}
}
function finishDistribution() onlyOwner canDistr public returns (bool) {
distributionFinished = true;
DistrFinished();
return true;
}
function startDistribution() onlyOwner canNotDistr public returns (bool) {
distributionFinished = false;
DistrStarted();
return true;
}
function finishOtherDistribution() onlyOwner canDistrOther public returns (bool) {
otherDistributionFinished = true;
Other_DistrFinished();
return true;
}
function startOtherDistribution() onlyOwner canNotDistrOther public returns (bool) {
otherDistributionFinished = false;
Other_DistrStarted();
return true;
}
function changeTotalDistributed(uint256 newTotalDistributed) onlyOwner public {
totalDistributed = newTotalDistributed;
}
function changeTotalRemaining(uint256 newTotalRemaining) onlyOwner public {
totalRemaining = newTotalRemaining;
}
function changeValue(uint256 newValue) onlyOwner public {
value = newValue;
}
function changeTotalSupply(uint256 newTotalSupply) onlyOwner public {
totalSupply = newTotalSupply;
}
function changeDecimals(uint256 newDecimals) onlyOwner public {
decimals = newDecimals;
}
function changeName(string newName) onlyOwner public {
name = newName;
}
function changeSymbol(string newSymbol) onlyOwner public {
symbol = newSymbol;
}
function changeDivisor(uint256 newDivisor) onlyOwner public {
divisor = newDivisor;
}
function changeDividend(uint256 newDividend) onlyOwner public {
dividend = newDividend;
}
function changeInviteReward(uint256 newInviteReward) onlyOwner public {
inviteReward = newInviteReward;
}
function distr(address _to, uint256 _amount) canDistr private returns (bool) {
totalDistributed = totalDistributed.add(_amount);
totalRemaining = totalRemaining.sub(_amount);
balances[_to] = balances[_to].add(_amount);
Distr(_to, _amount);
Transfer(address(0), _to, _amount);
return true;
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
}
function airdrop(address[] addresses) onlyOwner canDistr public {
require(addresses.length <= 255);
require(value <= totalRemaining);
for (uint i = 0; i < addresses.length; i++) {
require(value <= totalRemaining);
distr(addresses[i], value);
}
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
}
function distribution(address[] addresses, uint256 amount) onlyOwner canDistr public {
require(addresses.length <= 255);
require(amount <= totalRemaining);
for (uint i = 0; i < addresses.length; i++) {
require(amount <= totalRemaining);
distr(addresses[i], amount);
}
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
}
function distributeAmounts(address[] addresses, uint256[] amounts) onlyOwner canDistr public {
require(addresses.length <= 255);
require(addresses.length == amounts.length);
for (uint8 i = 0; i < addresses.length; i++) {
require(amounts[i] <= totalRemaining);
distr(addresses[i], amounts[i]);
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
}
}
function () external payable {
getTokens();
}
function getTokens() payable canDistr onlyWhitelistOrTimeout public {
if (value > totalRemaining) {
value = totalRemaining;
}
require(value <= totalRemaining);
address investor = msg.sender;
uint256 toGive = value;
distr(investor, toGive);
if (toGive > 0) {
blacklist[investor] = true;
proposals[investor] = now;
}
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
value = value.div(dividend).mul(divisor);
}
function balanceOf(address _owner) constant public returns (uint256) {
return getBalance(_owner);
}
function getBalance(address _address) constant internal returns (uint256) {
if (_address !=address(0) && !distributionFinished && !blacklist[_address] && totalDistributed < totalSupply) {
return balances[_address].add(value);
}
else {
return balances[_address];
}
}
// mitigates the ERC20 short address attack
modifier onlyPayloadSize(uint size) {
assert(msg.data.length >= size + 4);
_;
}
function transfer(address _to, uint256 _amount, bytes _data, string _custom_fallback) onlyPayloadSize(2 * 32) public returns (bool success) {
if(isContract(_to)) {
require(balanceOf(msg.sender) >= _amount);
balances[msg.sender] = balanceOf(msg.sender).sub(_amount);
balances[_to] = balanceOf(_to).add(_amount);
ContractReceiver receiver = ContractReceiver(_to);
require(receiver.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _amount, _data));
Transfer(msg.sender, _to, _amount);
LOG_Transfer(msg.sender, _to, _amount, _data);
return true;
}
else {
return transferToAddress(_to, _amount, _data);
}
}
function transfer(address _to, uint256 _amount, bytes _data) onlyPayloadSize(2 * 32) public returns (bool success) {
require(_to != address(0));
if(isContract(_to)) {
return transferToContract(_to, _amount, _data);
}
else {
return transferToAddress(_to, _amount, _data);
}
}
function transfer(address _to, uint256 _amount) onlyPayloadSize(2 * 32) public returns (bool success) {
require(_to != address(0));
bytes memory empty;
if(isContract(_to)) {
return transferToContract(_to, _amount, empty);
}
else {
require(invite(msg.sender, _to));
return transferToAddress(_to, _amount, empty);
}
}
function transferFrom(address _from, address _to, uint256 _amount) onlyPayloadSize(3 * 32) public returns (bool success) {
require(_to != address(0));
require(_amount <= balances[_from]);
require(_amount <= allowed[_from][msg.sender]);
require(invite(_from, _to));
bytes memory empty;
balances[_from] = balances[_from].sub(_amount);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);
balances[_to] = balances[_to].add(_amount);
Transfer(_from, _to, _amount);
LOG_Transfer(_from, _to, _amount, empty);
return true;
}
function invite(address _from, address _to) internal returns (bool success) {
if(inviteInit(_from, false)){
if(!otherDistributionFinished){
require(callTokenTransferFrom(_to, tokenValue));
Invite(_from, _to, tokenValue);
}
inviteInit(_to, true);
return true;
}
inviteInit(_to, false);
return true;
}
function inviteInit(address _address, bool _isInvitor) internal returns (bool success) {
if (!distributionFinished && totalDistributed < totalSupply) {
if(!_isInvitor && blacklist[_address] && proposals[_address].add(proposalTimeout) > now){
return false;
}
if (value.mul(inviteReward) > totalRemaining) {
value = totalRemaining;
}
require(value.mul(inviteReward) <= totalRemaining);
uint256 toGive = value.mul(inviteReward);
totalDistributed = totalDistributed.add(toGive);
totalRemaining = totalRemaining.sub(toGive);
balances[_address] = balances[_address].add(toGive);
InviteInit(_address, toGive);
Transfer(address(0), _address, toGive);
if (toGive > 0) {
blacklist[_address] = true;
proposals[_address] = now;
}
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
value = value.div(dividend).mul(divisor);
return true;
}
return false;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant public returns (uint256) {
return allowed[_owner][_spender];
}
function getTokenBalance(address tokenAddress, address who) constant public returns (uint){
ForeignToken t = ForeignToken(tokenAddress);
uint bal = t.balanceOf(who);
return bal;
}
function withdraw() onlyOwner public {
uint256 etherBalance = this.balance;
owner.transfer(etherBalance);
}
function mint(uint256 _value) onlyOwner public {
address minter = msg.sender;
balances[minter] = balances[minter].add(_value);
totalSupply = totalSupply.add(_value);
Mint(minter, _value);
}
function burn(uint256 _value) onlyOwner public {
require(_value <= balances[msg.sender]);
address burner = msg.sender;
balances[burner] = balances[burner].sub(_value);
totalSupply = totalSupply.sub(_value);
Burn(burner, _value);
}
function withdrawForeignTokens(address _tokenContract) onlyOwner public returns (bool) {
ForeignToken token = ForeignToken(_tokenContract);
uint256 amount = token.balanceOf(address(this));
return token.transfer(owner, amount);
}
function receiveApproval(address _sender,uint256 _tokenValue,address _otherTokenAddress,bytes _extraData) payable public returns (bool){
require(otherTokenAddress == _otherTokenAddress);
require(tokenSender == _sender);
tokenApproves = _tokenValue;
LOG_receiveApproval(_sender, _tokenValue ,_otherTokenAddress ,_extraData);
return true;
}
function callTokenTransferFrom(address _to,uint256 _value) private returns (bool){
require(tokenSender != address(0));
require(otherTokenAddress.call(bytes4(bytes32(keccak256("transferFrom(address,address,uint256)"))), tokenSender, _to, _value));
LOG_callTokenTransferFrom(tokenSender, _to, _value);
return true;
}
function approveAndCall(address _spender, uint256 _value, bytes _extraData) payable public returns (bool) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
require(_spender.call(bytes4(bytes32(keccak256("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData));
return true;
}
function isContract(address _addr) private constant returns (bool) {
uint length;
assembly {
length := extcodesize(_addr)
}
return (length>0);
}
function transferToAddress(address _to, uint _value, bytes _data) private returns (bool) {
require(balanceOf(msg.sender) >= _value);
balances[msg.sender] = balanceOf(msg.sender).sub(_value);
balances[_to] = balanceOf(_to).add(_value);
Transfer(msg.sender, _to, _value);
LOG_Transfer(msg.sender, _to, _value, _data);
return true;
}
function transferToContract(address _to, uint _value, bytes _data) private returns (bool) {
require(balanceOf(msg.sender) >= _value);
balances[msg.sender] = balanceOf(msg.sender).sub(_value);
balances[_to] = balanceOf(_to).add(_value);
ContractReceiver receiver = ContractReceiver(_to);
receiver.tokenFallback(msg.sender, _value, _data);
Transfer(msg.sender, _to, _value);
LOG_Transfer(msg.sender, _to, _value, _data);
return true;
}
}
Read Contract
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
blacklist 0xf9f92be4 → bool
decimals 0x313ce567 → uint256
distributionFinished 0xc108d542 → bool
dividend 0x0ff8cf9b → uint256
divisor 0x1f2dc5ef → uint256
getTokenBalance 0xc489744b → uint256
inviteReward 0x011847a2 → uint256
name 0x06fdde03 → string
otherDistributionFinished 0xfc765dd8 → bool
otherTokenAddress 0xbca0cf1c → address
owner 0x8da5cb5b → address
proposalTimeout 0x36b6643a → uint256
proposals 0x3341b445 → uint256
symbol 0x95d89b41 → string
tokenApproves 0x92d44650 → uint256
tokenSender 0x9898e18c → address
tokenValue 0x1ec7e345 → uint256
totalDistributed 0xefca2eed → uint256
totalRemaining 0xd8a54360 → uint256
totalSupply 0x18160ddd → uint256
value 0x3fa4f245 → uint256
Write Contract 37 functions
These functions modify contract state and require a wallet transaction to execute.
airdrop 0x729ad39e
address[] addresses
approve 0x095ea7b3
address _spender
uint256 _value
returns: bool
approveAndCall 0xcae9ca51
address _spender
uint256 _value
bytes _extraData
returns: bool
burn 0x42966c68
uint256 _value
changeDecimals 0xafa5f45c
uint256 newDecimals
changeDividend 0xfc73ec00
uint256 newDividend
changeDivisor 0x513de1d3
uint256 newDivisor
changeInviteReward 0x7b10a1d9
uint256 newInviteReward
changeName 0x5353a2d8
string newName
changeOtherTokenAddress 0x27b4c158
address newOtherTokenAddress
changeProposalTimeout 0x75c84db5
uint256 newProposalTimeout
changeSymbol 0xa3895fff
string newSymbol
changeTokenApproves 0xdd2594af
uint256 newTokenApproves
changeTokenSender 0x27f498c9
address newTokenSender
changeTokenValue 0x3b2f7bf1
uint256 newTokenValue
changeTotalDistributed 0xb74f312e
uint256 newTotalDistributed
changeTotalRemaining 0x9254c2a8
uint256 newTotalRemaining
changeTotalSupply 0x52e97326
uint256 newTotalSupply
changeValue 0xf965e32e
uint256 newValue
disableWhitelist 0x502dadb0
address[] addresses
distributeAmounts 0xa8c310d5
address[] addresses
uint256[] amounts
distribution 0xf3e4877c
address[] addresses
uint256 amount
enableWhitelist 0x9c09c835
address[] addresses
finishDistribution 0x9b1cbccc
No parameters
returns: bool
finishOtherDistribution 0xdaa0242a
No parameters
returns: bool
getTokens 0xaa6ca808
No parameters
mint 0xa0712d68
uint256 _value
receiveApproval 0x8f4ffcb1
address _sender
uint256 _tokenValue
address _otherTokenAddress
bytes _extraData
returns: bool
startDistribution 0xd83623dd
No parameters
returns: bool
startOtherDistribution 0xed144d52
No parameters
returns: bool
transfer 0xa9059cbb
address _to
uint256 _amount
returns: bool
transfer 0xbe45fd62
address _to
uint256 _amount
bytes _data
returns: bool
transfer 0xf6368f8a
address _to
uint256 _amount
bytes _data
string _custom_fallback
returns: bool
transferFrom 0x23b872dd
address _from
address _to
uint256 _amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
withdraw 0x3ccfd60b
No parameters
withdrawForeignTokens 0xe58fc54c
address _tokenContract
returns: bool
Recent Transactions
No transactions found for this address