Address Contract Partially Verified
Address
0x2AEC18c5500f21359CE1BEA5Dc1777344dF4C0Dc
Balance
0 ETH
Nonce
3
Code Size
13745 bytes
Creator
0xc3808Aa1...4158 at tx 0x85601a60...e6fbcc
Indexed Transactions
0
Contract Bytecode
13745 bytes
0x606060405260043610620001f2576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806267ba6914620001f757806303a5c8e7146200022357806306fdde03146200025357806309153f5714620002e7578063095ea7b3146200033f57806316ae4ec4146200039c57806318160ddd14620003c857806322b36d8814620003f457806323b872dd146200041c57806327e235e3146200049857806329784d9014620004e85780632b37d313146200050e5780632f54bf6e1462000566578063313ce56714620005ba5780633541fe9414620005ec5780633aa612b91462000644578063423592ce146200067057806344f0a4a814620006885780634a1fb24114620006b45780634bb278f314620006e05780634f93594514620006f857806366188463146200072857806370a082311462000785578063728b763c14620007d55780637508f14714620007fb5780638d4e408314620008375780638da5cb5b146200086757806395d89b4114620008bf578063972e61511462000953578063a327353514620009ab578063a9059cbb14620009d7578063c0f401631462000a34578063d73dd6231462000a91578063dd62ed3e1462000aee578063e1541bc31462000b5d578063f2fde38b1462000b99578063f6e7b7851462000bd5575b600080fd5b34156200020357600080fd5b6200020d62000c05565b6040518082815260200191505060405180910390f35b34156200022f57600080fd5b6200023962000c16565b604051808215151515815260200191505060405180910390f35b34156200025f57600080fd5b6200026962000c29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015620002ab5780820151818401526020810190506200028e565b50505050905090810190601f168015620002d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415620002f357600080fd5b620002fd62000c62565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156200034b57600080fd5b62000382600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505062000c88565b604051808215151515815260200191505060405180910390f35b3415620003a857600080fd5b620003b262000db6565b6040518082815260200191505060405180910390f35b3415620003d457600080fd5b620003de62000dbc565b6040518082815260200191505060405180910390f35b34156200040057600080fd5b6200041a6004808035151590602001909190505062000dc2565b005b34156200042857600080fd5b6200047e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505062000e3e565b604051808215151515815260200191505060405180910390f35b3415620004a457600080fd5b620004d2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505062001229565b6040518082815260200191505060405180910390f35b3415620004f457600080fd5b6200050c600480803590602001909190505062001241565b005b34156200051a57600080fd5b6200052462001278565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156200057257600080fd5b620005a0600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506200129e565b604051808215151515815260200191505060405180910390f35b3415620005c657600080fd5b620005d0620012f7565b604051808260ff1660ff16815260200191505060405180910390f35b3415620005f857600080fd5b62000602620012fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156200065057600080fd5b6200065a62001322565b6040518082815260200191505060405180910390f35b34156200067c57600080fd5b6200068662001328565b005b34156200069457600080fd5b6200069e620013e1565b6040518082815260200191505060405180910390f35b3415620006c057600080fd5b620006ca620013e7565b6040518082815260200191505060405180910390f35b3415620006ec57600080fd5b620006f6620013f1565b005b34156200070457600080fd5b6200070e620019ca565b604051808215151515815260200191505060405180910390f35b34156200073457600080fd5b6200076b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050620019dd565b604051808215151515815260200191505060405180910390f35b34156200079157600080fd5b620007bf600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505062001c72565b6040518082815260200191505060405180910390f35b3415620007e157600080fd5b620007f9600480803590602001909190505062001cbb565b005b34156200080757600080fd5b62000835600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505062001cf2565b005b34156200084357600080fd5b6200084d62001d7b565b604051808215151515815260200191505060405180910390f35b34156200087357600080fd5b6200087d62001d8e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415620008cb57600080fd5b620008d562001db3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000917578082015181840152602081019050620008fa565b50505050905090810190601f168015620009455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156200095f57600080fd5b6200096962001e55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415620009b757600080fd5b620009c162001e7b565b6040518082815260200191505060405180910390f35b3415620009e357600080fd5b62000a1a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505062001e81565b604051808215151515815260200191505060405180910390f35b341562000a4057600080fd5b62000a77600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050620020ce565b604051808215151515815260200191505060405180910390f35b341562000a9d57600080fd5b62000ad4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505062002344565b604051808215151515815260200191505060405180910390f35b341562000afa57600080fd5b62000b47600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505062002542565b6040518082815260200191505060405180910390f35b341562000b6957600080fd5b62000b97600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050620025c9565b005b341562000ba557600080fd5b62000bd3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505062002624565b005b341562000be157600080fd5b62000beb6200267e565b604051808215151515815260200191505060405180910390f35b601260ff16600a0a6323c346000281565b600b60149054906101000a900460ff1681565b6040805190810160405280601081526020017f4661726d61547275737420546f6b656e0000000000000000000000000000000081525081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151562000cc657600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60055481565b60015481565b62000dcd336200129e565b151562000dd957600080fd5b6000600b60146101000a81548160ff021916908315150217905550801562000e04576000600d819055505b7f2fc17e4003679a5c62a754326774a8d5859ca8b778a4fc76600eb55f42995288426040518082815260200191505060405180910390a150565b6000600b60169054906101000a900460ff16151562000e61576000905062001222565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151562000e9e57600080fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151562000eed57600080fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151562000f7957600080fd5b62000fcd82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200269190919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200106482600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620026ab90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200113882600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200269190919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b9392505050565b60036020528060005260406000206000915090505481565b6200124c336200129e565b15156200125857600080fd5b6200126f81600c546200269190919063ffffffff16565b600c8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b601281565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b62001333336200129e565b15156200133f57600080fd5b600b60169054906101000a900460ff161515156200135c57600080fd5b6001600b60146101000a81548160ff0219169083151502179055506001600b60156101000a81548160ff0219169083151502179055506000600d541415620013a65742600d819055505b7f4736b531619e035ffd67e6ab6f8f455e832f9b72ba4fd399a36c0ae737b784a7600d546040518082815260200191505060405180910390a1565b600d5481565b6000600754905090565b600080600080600080600b60149054906101000a900460ff161580156200141d5750600c54600d540142115b8015620014365750600b60159054906101000a900460ff165b806200144e5750600b60179054906101000a900460ff165b15156200145a57600080fd5b62001465336200129e565b15156200147157600080fd5b600b60169054906101000a900460ff161515156200148e57600080fd5b62f0c2ac95506301e1338094506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff164287876001620014cc620026ca565b808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018215151515815260200195505050505050604051809103906000f08015156200153957600080fd5b93508373ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515620015f757600080fd5b6102c65a03f115156200160957600080fd5b50505083600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065460036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60179054906101000a900460ff16151562001904576305a39a8092506312cc030091506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1642848460016200170b620026ca565b808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018215151515815260200195505050505050604051809103906000f08015156200177857600080fd5b90508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15156200183657600080fd5b6102c65a03f115156200184857600080fd5b50505080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600754601260ff16600a0a6323c34600020360036000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6006546005540360036000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600b60166101000a81548160ff0219169083151502179055507f3dfc42c8742b37f7302c02e189240dcda68f20c35b7b8a3158b4f056d6354e11426040518082815260200191505060405180910390a1505050505050565b600b60179054906101000a900460ff1681565b600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111562001af0576000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062001b86565b62001b0583826200269190919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b62001cc6336200129e565b151562001cd257600080fd5b62001ce981600c54620026ab90919063ffffffff16565b600c8190555050565b62001cfd336200129e565b151562001d0957600080fd5b600b60149054906101000a900460ff16801562001d2b5750600c54600d540142105b151562001d3757600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60169054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562001e4d5780601f1062001e215761010080835404028352916020019162001e4d565b820191906000526020600020905b81548152906001019060200180831162001e2f57829003601f168201915b505050505081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6000600b60169054906101000a900460ff16151562001ea45760009050620020c8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151562001ee157600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151562001f3057600080fd5b62001f8482600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200269190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200201b82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620026ab90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200212e57600080fd5b600b60149054906101000a900460ff168015620021505750600c54600d540142105b15156200215c57600080fd5b6200217383600754620026ab90919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515620021b257600080fd5b600083111515620021c257600080fd5b601260ff16600a0a6323c34600028111151515620021df57600080fd5b6200223383600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620026ab90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600781905550828473ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fa2f26fb27c0703469fd15b96714eda618ce4aced994b793ffb09396699057e03426040518082815260200191505060405180910390a4601260ff16600a0a6323c3460002600754141562002339576001600b60176101000a81548160ff0219169083151502179055505b600191505092915050565b6000620023d782600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620026ab90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b620025d4336200129e565b1515620025e057600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6200262f336200129e565b15156200263b57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60159054906101000a900460ff1681565b6000828211151515620026a057fe5b818303905092915050565b6000808284019050838110151515620026c057fe5b8091505092915050565b604051610eaa80620026dc8339019056006060604052341561000f57600080fd5b60405160a080610eaa83398101604052808051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156100cb57600080fd5b8183111515156100da57600080fd5b84600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548160ff0219169083151502179055508160048190555061015c838561017364010000000002610b97179091906401000000009004565b600281905550836003819055505050505050610191565b600080828401905083811015151561018757fe5b8091505092915050565b610d0a806101a06000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb5a6b4146100d557806313d033c0146100fe5780631726cbc81461012757806319165587146101745780632f54bf6e146101ad578063384711cc146101fe57806338af3eed1461024b57806374a8f103146102a0578063872a7810146102d95780638da5cb5b146103065780639852595c1461035b578063be9a6555146103a8578063f2fde38b146103d1578063fa01dc061461040a575b600080fd5b34156100e057600080fd5b6100e861045b565b6040518082815260200191505060405180910390f35b341561010957600080fd5b610111610461565b6040518082815260200191505060405180910390f35b341561013257600080fd5b61015e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610467565b6040518082815260200191505060405180910390f35b341561017f57600080fd5b6101ab600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104ca565b005b34156101b857600080fd5b6101e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610603565b604051808215151515815260200191505060405180910390f35b341561020957600080fd5b610235600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061065c565b6040518082815260200191505060405180910390f35b341561025657600080fd5b61025e610848565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b6102d7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061086e565b005b34156102e457600080fd5b6102ec610ab1565b604051808215151515815260200191505060405180910390f35b341561031157600080fd5b610319610ac4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561036657600080fd5b610392600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ae9565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103bb610b01565b6040518082815260200191505060405180910390f35b34156103dc57600080fd5b610408600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b07565b005b341561041557600080fd5b610441600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b5e565b604051808215151515815260200191505060405180910390f35b60045481565b60025481565b60006104c3600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546104b58461065c565b610b7e90919063ffffffff16565b9050919050565b60006104d582610467565b90506000811115156104e657600080fd5b61053881600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b9790919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506105c8600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16610bb59092919063ffffffff16565b7ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c565816040518082815260200191505060405180910390a15050565b60008173ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561070457600080fd5b6102c65a03f1151561071557600080fd5b505050604051805190509150610773600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610b9790919063ffffffff16565b90506002544210156107885760009250610841565b61079f600454600354610b9790919063ffffffff16565b421015806107f65750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561080357809250610841565b61083e60045461083061082160035442610b7e90919063ffffffff16565b84610c8890919063ffffffff16565b610cc390919063ffffffff16565b92505b5050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061087c33610603565b151561088757600080fd5b600560009054906101000a900460ff1615156108a257600080fd5b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156108fb57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561099e57600080fd5b6102c65a03f115156109af57600080fd5b5050506040518051905092506109c484610467565b91506109d98284610b7e90919063ffffffff16565b90506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a7f6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828673ffffffffffffffffffffffffffffffffffffffff16610bb59092919063ffffffff16565b7f44825a4b2df8acb19ce4e1afba9aa850c8b65cdb7942e2078f27d0b0960efee660405160405180910390a150505050565b600560009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915090505481565b60035481565b610b1033610603565b1515610b1b57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915054906101000a900460ff1681565b6000828211151515610b8c57fe5b818303905092915050565b6000808284019050838110151515610bab57fe5b8091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610c6057600080fd5b6102c65a03f11515610c7157600080fd5b505050604051805190501515610c8357fe5b505050565b6000806000841415610c9d5760009150610cbc565b8284029050828482811515610cae57fe5b04141515610cb857fe5b8091505b5092915050565b6000808284811515610cd157fe5b04905080915050929150505600a165627a7a723058200b95a5e1d768f393c33bb05b3e052b2eed63d57cd2dca6c050160c93cf5134c10029a165627a7a723058204b697d3aa64f916ecc42d2a9da9b72646beda153a58942612cd9cd6fca6f50040029
Verified Source Code Partial Match
Compiler: v0.4.18+commit.9cf6e910
Optimization: No
FTT.sol 538 lines
pragma solidity ^0.4.18;
contract ERC20Basic {
uint256 public totalSupply;
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
assert(token.transfer(to, value));
}
function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
assert(token.transferFrom(from, to, value));
}
function safeApprove(ERC20 token, address spender, uint256 value) internal {
assert(token.approve(spender, value));
}
}
contract Ownable {
address public owner;
modifier onlyOwner {
require(isOwner(msg.sender));
_;
}
function Ownable() public {
owner = msg.sender;
}
function transferOwnership(address _newOwner) public onlyOwner {
owner = _newOwner;
}
function isOwner(address _address) public constant returns (bool) {
return owner == _address;
}
}
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title TokenVesting
* @dev A token holder contract that can release its token balance gradually like a
* typical vesting scheme, with a cliff and vesting period. Optionally revocable by the
* owner.
*/
contract TokenVesting is Ownable {
using SafeMath for uint256;
using SafeERC20 for ERC20Basic;
event Released(uint256 amount);
event Revoked();
// beneficiary of tokens after they are released
address public beneficiary;
uint256 public cliff;
uint256 public start;
uint256 public duration;
bool public revocable;
mapping (address => uint256) public released;
mapping (address => bool) public revoked;
/**
* @dev Creates a vesting contract that vests its balance of any ERC20 token to the
* _beneficiary, gradually in a linear fashion until _start + _duration. By then all
* of the balance will have vested.
* @param _beneficiary address of the beneficiary to whom vested tokens are transferred
* @param _cliff duration in seconds of the cliff in which tokens will begin to vest
* @param _duration duration in seconds of the period in which the tokens will vest
* @param _revocable whether the vesting is revocable or not
*/
function TokenVesting(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, bool _revocable) public {
require(_beneficiary != address(0));
require(_cliff <= _duration);
beneficiary = _beneficiary;
revocable = _revocable;
duration = _duration;
cliff = _start.add(_cliff);
start = _start;
}
/**
* @notice Transfers vested tokens to beneficiary.
* @param token ERC20 token which is being vested
*/
function release(ERC20Basic token) public {
uint256 unreleased = releasableAmount(token);
require(unreleased > 0);
released[token] = released[token].add(unreleased);
token.safeTransfer(beneficiary, unreleased);
Released(unreleased);
}
/**
* @notice Allows the owner to revoke the vesting. Tokens already vested
* remain in the contract, the rest are returned to the owner.
* @param token ERC20 token which is being vested
*/
function revoke(ERC20Basic token) public onlyOwner {
require(revocable);
require(!revoked[token]);
uint256 balance = token.balanceOf(this);
uint256 unreleased = releasableAmount(token);
uint256 refund = balance.sub(unreleased);
revoked[token] = true;
token.safeTransfer(owner, refund);
Revoked();
}
/**
* @dev Calculates the amount that has already vested but hasn't been released yet.
* @param token ERC20 token which is being vested
*/
function releasableAmount(ERC20Basic token) public view returns (uint256) {
return vestedAmount(token).sub(released[token]);
}
/**
* @dev Calculates the amount that has already vested.
* @param token ERC20 token which is being vested
*/
function vestedAmount(ERC20Basic token) public view returns (uint256) {
uint256 currentBalance = token.balanceOf(this);
uint256 totalBalance = currentBalance.add(released[token]);
if (now < cliff) {
return 0;
} else if (now >= start.add(duration) || revoked[token]) {
return totalBalance;
} else {
return totalBalance.mul(now.sub(start)).div(duration);
}
}
}
contract FTT is Ownable {
using SafeMath for uint256;
uint256 public totalSupply = 1000000000 * 10**uint256(decimals);
string public constant name = "FarmaTrust Token";
string public symbol = "FTT";
uint8 public constant decimals = 18;
mapping(address => uint256) public balances;
mapping (address => mapping (address => uint256)) internal allowed;
event Approval(address indexed owner, address indexed spender, uint256 value);
event Transfer(address indexed from, address indexed to, uint256 value);
event FTTIssued(address indexed from, address indexed to, uint256 indexed amount, uint256 timestamp);
event TdeStarted(uint256 startTime);
event TdeStopped(uint256 stopTime);
event TdeFinalized(uint256 finalizeTime);
// Amount of FTT available during tok0x2Ec9F52A5e4E7B5e20C031C1870Fd952e1F01b3Een distribution event.
uint256 public constant FT_TOKEN_SALE_CAP = 600000000 * 10**uint256(decimals);
// Amount held for operational usage.
uint256 public FT_OPERATIONAL_FUND = totalSupply - FT_TOKEN_SALE_CAP;
// Amount held for team usage.
uint256 public FT_TEAM_FUND = FT_OPERATIONAL_FUND / 10;
// Amount of FTT issued.
uint256 public fttIssued = 0;
address public tdeIssuer = 0x2Ec9F52A5e4E7B5e20C031C1870Fd952e1F01b3E;
address public teamVestingAddress;
address public unsoldVestingAddress;
address public operationalReserveAddress;
bool public tdeActive;
bool public tdeStarted;
bool public isFinalized = false;
bool public capReached;
uint256 public tdeDuration = 60 days;
uint256 public tdeStartTime;
function FTT() public {
}
modifier onlyTdeIssuer {
require(msg.sender == tdeIssuer);
_;
}
modifier tdeRunning {
require(tdeActive && block.timestamp < tdeStartTime + tdeDuration);
_;
}
modifier tdeEnded {
require(((!tdeActive && block.timestamp > tdeStartTime + tdeDuration) && tdeStarted) || capReached);
_;
}
/**
* @dev Allows contract owner to start the TDE.
*/
function startTde()
public
onlyOwner
{
require(!isFinalized);
tdeActive = true;
tdeStarted = true;
if (tdeStartTime == 0) {
tdeStartTime = block.timestamp;
}
TdeStarted(tdeStartTime);
}
/**
* @dev Allows contract owner to stop and optionally restart the TDE.
* @param _restart Resets the tdeStartTime if true.
*/
function stopTde(bool _restart)
external
onlyOwner
{
tdeActive = false;
if (_restart) {
tdeStartTime = 0;
}
TdeStopped(block.timestamp);
}
/**
* @dev Allows contract owner to increase TDE period.
* @param _time amount of time to increase TDE period by.
*/
function extendTde(uint256 _time)
external
onlyOwner
{
tdeDuration = tdeDuration.add(_time);
}
/**
* @dev Allows contract owner to reduce TDE period.
* @param _time amount of time to reduce TDE period by.
*/
function shortenTde(uint256 _time)
external
onlyOwner
{
tdeDuration = tdeDuration.sub(_time);
}
/**
* @dev Allows contract owner to set the FTT issuing authority.
* @param _tdeIssuer address of FTT issuing authority.
*/
function setTdeIssuer(address _tdeIssuer)
external
onlyOwner
{
tdeIssuer = _tdeIssuer;
}
/**
* @dev Allows contract owner to set the beneficiary of the FT operational reserve amount of FTT.
* @param _operationalReserveAddress address of FT operational reserve beneficiary.
*/
function setOperationalReserveAddress(address _operationalReserveAddress)
external
onlyOwner
tdeRunning
{
operationalReserveAddress = _operationalReserveAddress;
}
/**
* @dev Issues FTT to entitled accounts.
* @param _user address to issue FTT to.
* @param _fttAmount amount of FTT to issue.
*/
function issueFTT(address _user, uint256 _fttAmount)
public
onlyTdeIssuer
tdeRunning
returns(bool)
{
uint256 newAmountIssued = fttIssued.add(_fttAmount);
require(_user != address(0));
require(_fttAmount > 0);
require(newAmountIssued <= FT_TOKEN_SALE_CAP);
balances[_user] = balances[_user].add(_fttAmount);
fttIssued = newAmountIssued;
FTTIssued(tdeIssuer, _user, _fttAmount, block.timestamp);
if (fttIssued == FT_TOKEN_SALE_CAP) {
capReached = true;
}
return true;
}
/**
* @dev Returns amount of FTT issued.
*/
function fttIssued()
external
view
returns (uint256)
{
return fttIssued;
}
/**
* @dev Allows the contract owner to finalize the TDE.
*/
function finalize()
external
tdeEnded
onlyOwner
{
require(!isFinalized);
// Deposit team fund amount into team vesting contract.
uint256 teamVestingCliff = 15778476; // 6 months
uint256 teamVestingDuration = 1 years;
TokenVesting teamVesting = new TokenVesting(owner, now, teamVestingCliff, teamVestingDuration, true);
teamVesting.transferOwnership(owner);
teamVestingAddress = address(teamVesting);
balances[teamVestingAddress] = FT_TEAM_FUND;
if (!capReached) {
// Deposit unsold FTT into unsold vesting contract.
uint256 unsoldVestingCliff = 3 years;
uint256 unsoldVestingDuration = 10 years;
TokenVesting unsoldVesting = new TokenVesting(owner, now, unsoldVestingCliff, unsoldVestingDuration, true);
unsoldVesting.transferOwnership(owner);
unsoldVestingAddress = address(unsoldVesting);
balances[unsoldVestingAddress] = FT_TOKEN_SALE_CAP - fttIssued;
}
// Allocate operational reserve of FTT.
balances[operationalReserveAddress] = FT_OPERATIONAL_FUND - FT_TEAM_FUND;
isFinalized = true;
TdeFinalized(block.timestamp);
}
/**
* @dev Transfer tokens from one address to another. Trading limited - requires the TDE to have ended.
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value)
public
returns (bool)
{
if (!isFinalized) return false;
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
Transfer(_from, _to, _value);
return true;
}
/**
* @dev Transfer token for a specified address. Trading limited - requires the TDE to have ended.
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value)
public
returns (bool)
{
if (!isFinalized) return false;
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value)
public
returns (bool)
{
require(_spender != address(0));
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner)
public
view
returns (uint256 balance)
{
return balances[_owner];
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender)
public
view
returns (uint256)
{
return allowed[_owner][_spender];
}
/**
* approve should be called when allowed[_spender] == 0. To increment
* allowed value, it is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
*/
function increaseApproval(address _spender, uint _addedValue)
public
returns (bool success)
{
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function decreaseApproval(address _spender, uint _subtractedValue)
public
returns (bool success)
{
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
Read Contract
FT_OPERATIONAL_FUND 0x16ae4ec4 → uint256
FT_TEAM_FUND 0x3aa612b9 → uint256
FT_TOKEN_SALE_CAP 0x0067ba69 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
balances 0x27e235e3 → uint256
capReached 0x4f935945 → bool
decimals 0x313ce567 → uint8
fttIssued 0x4a1fb241 → uint256
isFinalized 0x8d4e4083 → bool
isOwner 0x2f54bf6e → bool
name 0x06fdde03 → string
operationalReserveAddress 0x972e6151 → address
owner 0x8da5cb5b → address
symbol 0x95d89b41 → string
tdeActive 0x03a5c8e7 → bool
tdeDuration 0xa3273535 → uint256
tdeIssuer 0x2b37d313 → address
tdeStartTime 0x44f0a4a8 → uint256
tdeStarted 0xf6e7b785 → bool
teamVestingAddress 0x3541fe94 → address
totalSupply 0x18160ddd → uint256
unsoldVestingAddress 0x09153f57 → address
Write Contract 14 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address _spender
uint256 _value
returns: bool
decreaseApproval 0x66188463
address _spender
uint256 _subtractedValue
returns: bool
extendTde 0x728b763c
uint256 _time
finalize 0x4bb278f3
No parameters
increaseApproval 0xd73dd623
address _spender
uint256 _addedValue
returns: bool
issueFTT 0xc0f40163
address _user
uint256 _fttAmount
returns: bool
setOperationalReserveAddress 0x7508f147
address _operationalReserveAddress
setTdeIssuer 0xe1541bc3
address _tdeIssuer
shortenTde 0x29784d90
uint256 _time
startTde 0x423592ce
No parameters
stopTde 0x22b36d88
bool _restart
transfer 0xa9059cbb
address _to
uint256 _value
returns: bool
transferFrom 0x23b872dd
address _from
address _to
uint256 _value
returns: bool
transferOwnership 0xf2fde38b
address _newOwner
Recent Transactions
No transactions found for this address