Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x315DD1718C52F68428A478FAe56fC04ec38B3FB0
Balance 0 ETH
Nonce 7
Code Size 24544 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

24544 bytes
0x608060405260043610620001465760003560e01c80637a5a760111620000bb578063d002462b1162000079578063d002462b1462000347578063d0f4fc02146200036c578063ddca3f4314620003a3578063ee639d8914620003bb578063f023e0ea14620003d3578063f2fde38b14620003f85762000146565b80637a5a760114620002a85780637d3f76e514620002cd5780638da5cb5b14620002f2578063aa177f3e146200030a578063c03a24ba146200032f5762000146565b806335546850116200010957806335546850146200021357806335ae0e1c146200023a5780633a9b70c0146200026157806346c549cc1462000278578063515ae31b14620002905762000146565b806308057418146200014b57806319260225146200017b5780632156a96c14620001a057806325b8b8cb14620001c757806331b31b8814620001ec575b600080fd5b3480156200015857600080fd5b50620001636200041d565b60405162000172919062001054565b60405180910390f35b3480156200018857600080fd5b50620001636200019a36600462000de1565b62000431565b348015620001ad57600080fd5b50620001b86200044c565b60405162000172919062001162565b348015620001d457600080fd5b5062000163620001e636600462000de1565b6200056a565b348015620001f957600080fd5b50620002116200020b36600462000f44565b62000588565b005b3480156200022057600080fd5b506200022b620005a5565b60405162000172919062001202565b3480156200024757600080fd5b5062000252620005ab565b604051620001729190620011f7565b620002116200027236600462000e00565b620005b4565b3480156200028557600080fd5b506200022b62000785565b3480156200029d57600080fd5b50620001636200078b565b348015620002b557600080fd5b5062000211620002c736600462000f22565b6200079f565b348015620002da57600080fd5b5062000211620002ec36600462000de1565b620007ca565b348015620002ff57600080fd5b50620001636200080a565b3480156200031757600080fd5b506200022b6200032936600462000de1565b62000819565b3480156200033c57600080fd5b506200022b6200082b565b3480156200035457600080fd5b50620002116200036636600462000f44565b62000831565b3480156200037957600080fd5b50620003916200038b36600462000f44565b6200084e565b60405162000172949392919062001068565b348015620003b057600080fd5b506200022b62000921565b348015620003c857600080fd5b506200025262000927565b348015620003e057600080fd5b5062000211620003f236600462000de1565b62000930565b3480156200040557600080fd5b50620002116200041736600462000de1565b62000a95565b60035461010090046001600160a01b031690565b6004602052600090815260409020546001600160a01b031681565b60606006805480602002602001604051908101604052809291908181526020016000905b8282101562000561576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002808301548585015260038301805485516101009482161594909402600019011691909104601f81018790048702830187019094528382529394919360608601939192909190830182828015620005485780601f106200051c5761010080835404028352916020019162000548565b820191906000526020600020905b8154815290600101906020018083116200052a57829003601f168201915b5050505050815250508152602001906001019062000470565b50505050905090565b6001600160a01b039081166000908152600460205260409020541690565b6000546001600160a01b03163314620005a057600080fd5b600255565b60025490565b60035460ff1690565b6000546001600160a01b03163314620005cc57600080fd5b6000868686868686604051620005e29062000b39565b620005f396959493929190620010a1565b604051809103906000f08015801562000610573d6000803e3d6000fd5b5090508060046000898960008181106200062657fe5b90506020020160208101906200063d919062000de1565b6001600160a01b0390811682526020808301939093526040918201600090812080546001600160a01b0319169583169590951790945560068054918616808652600585529483902091909155815160808101909252928152908101620006d0620006c8620151808a8a6008818110620006b257fe5b9050602002013562000af890919063ffffffff16565b429062000b29565b8152602001620006ef620006c8620151808a8a6009818110620006b257fe5b8152602001846005815181106200070257fe5b602090810291909101810151909152825460018082018555600094855293829020835160049092020180546001600160a01b0319166001600160a01b039092169190911781558282015193810193909355604082015160028401556060820151805192939262000779926003850192019062000b47565b50505050505050505050565b60015490565b60035461010090046001600160a01b031681565b6000546001600160a01b03163314620007b757600080fd5b6003805460ff1916911515919091179055565b6000546001600160a01b03163314620007e257600080fd5b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031681565b60056020526000908152604090205481565b60015481565b6000546001600160a01b031633146200084957600080fd5b600155565b600681815481106200085c57fe5b60009182526020918290206004919091020180546001808301546002808501546003860180546040805161010097831615979097026000190190911693909304601f81018990048902860189019093528285526001600160a01b039095169750919591949391830182828015620009175780601f10620008eb5761010080835404028352916020019162000917565b820191906000526020600020905b815481529060010190602001808311620008f957829003601f168201915b5050505050905084565b60025481565b60035460ff1681565b6000546001600160a01b031633146200094857600080fd5b6001600160a01b0381166000908152600560205260409020546006805460001981019081106200097457fe5b9060005260206000209060040201600682815481106200099057fe5b60009182526020909120825460049092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154818301556002808401548184015560038085018054620009f8949286019391928116156101000260001901160462000bcc565b505060068054839250600591600091600019810190811062000a1657fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600680548062000a4c57fe5b60008281526020812060046000199093019283020180546001600160a01b031916815560018101829055600281018290559062000a8d600383018262000c46565b505090555050565b6000546001600160a01b0316331462000aad57600080fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008262000b095750600062000b23565b8282028284828162000b1757fe5b041462000b2057fe5b90505b92915050565b60008282018381101562000b2057fe5b614d40806200126b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b8a57805160ff191683800117855562000bba565b8280016001018555821562000bba579182015b8281111562000bba57825182559160200191906001019062000b9d565b5062000bc892915062000c91565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c07578054855562000bba565b8280016001018555821562000bba57600052602060002091601f016020900482015b8281111562000bba57825482559160010191906001019062000c29565b50805460018160011615610100020316600290046000825580601f1062000c6e575062000c8e565b601f01602090049060005260206000209081019062000c8e919062000c91565b50565b5b8082111562000bc8576000815560010162000c92565b803562000b238162001254565b60008083601f84011262000cc7578182fd5b50813567ffffffffffffffff81111562000cdf578182fd5b602083019150836020808302850101111562000cfa57600080fd5b9250929050565b6000601f838184011262000d13578182fd5b823562000d2a62000d248262001233565b6200120b565b818152925060208084019085810160005b8481101562000dc4578135880189603f82011262000d5857600080fd5b8381013567ffffffffffffffff81111562000d7257600080fd5b62000d85818901601f191686016200120b565b81815260408c8184860101111562000d9c57600080fd5b8281850188840137506000918101860191909152855250928201929082019060010162000d3b565b50505050505092915050565b8035801515811462000b2357600080fd5b60006020828403121562000df3578081fd5b813562000b208162001254565b6000806000806000806080878903121562000e19578182fd5b863567ffffffffffffffff8082111562000e31578384fd5b62000e3f8a838b0162000cb5565b909850965060209150888201358181111562000e59578485fd5b62000e678b828c0162000cb5565b90975095505060408901358181111562000e7f578485fd5b8901601f81018b1362000e90578485fd5b803562000ea162000d248262001233565b81815284810190838601868402850187018f101562000ebe578889fd5b8894505b8385101562000eec5762000ed78f8262000dd0565b83526001949094019391860191860162000ec2565b509650505050606089013591508082111562000f06578283fd5b5062000f1589828a0162000d01565b9150509295509295509295565b60006020828403121562000f34578081fd5b8135801515811462000b20578182fd5b60006020828403121562000f56578081fd5b5035919050565b6001600160a01b0316815260200190565b6000815180845260208085019450808401835b8381101562000fa157815115158752958201959082019060010162000f81565b509495945050505050565b60008282518085526020808601955080818302840101818601855b8481101562000ff957601f1986840301895262000fe683835162001006565b9884019892509083019060010162000fc7565b5090979650505050505050565b60008151808452815b818110156200102d576020818501810151868301820152016200100f565b818111156200103f5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b600060018060a01b03861682528460208301528360408301526080606083015262001097608083018462001006565b9695505050505050565b6000608082016080835280620010b8898362001202565b9050899150825b89811015620010f15760208301620010e383620010dd838762000ca8565b62000f5d565b9093509150600101620010bf565b5083810360208501528681526001600160fb1b0387111562001111578283fd5b6020870291508188602083013701602081810183815284830390910160408501526200113e818762000f6e565b915050828103606084015262001155818562000fac565b9998505050505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015620011e957888303603f19018552815180516001600160a01b0316845287810151888501528681015187850152606090810151608091850182905290620011d48186018362001006565b96890196945050509086019060010162001186565b509098975050505050505050565b901515815260200190565b90815260200190565b60405181810167ffffffffffffffff811182821017156200122b57600080fd5b604052919050565b600067ffffffffffffffff8211156200124a578081fd5b5060209081020190565b6001600160a01b038116811462000c8e57600080fdfe60a060405260126002819055640df847580060055560646006556000600781905567016345785d8a0000600855678ac7230489e80000600955600e8190556202a300601155815462ffffff19169091556013819055601481905560158190556016819055601781905560188190556024553480156200007d57600080fd5b5060405162004d4038038062004d40833981016040819052620000a09162000faa565b60008054336001600160a01b03199182168117909255600a80549091169091179055815182906002908110620000d257fe5b6020908102919091010151601b805460ff60b01b1916600160b01b9215158302179081905560ff91900416620002f657836000815181106200011057fe5b602090810291909101810151600180546001600160a01b0319166001600160a01b0392831617908190556040805163313ce56760e01b81529051919092169263313ce5679260048082019391829003018186803b1580156200017157600080fd5b505afa15801562000186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ac919062001104565b600255600154604080516306fdde0360e01b815290516001600160a01b03909216916306fdde0391600480820192600092909190829003018186803b158015620001f557600080fd5b505afa1580156200020a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002349190810190620010c6565b80516200024a9160039160209091019062000cf3565b50600160009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200029a57600080fd5b505afa158015620002af573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002d99190810190620010c6565b8051620002ef9160049160209091019062000cf3565b5062000353565b806005815181106200030457fe5b6020026020010151600390805190602001906200032392919062000cf3565b50806006815181106200033257fe5b6020026020010151600490805190602001906200035192919062000cf3565b505b826000815181106200036157fe5b6020026020010151600881905550826001815181106200037d57fe5b6020026020010151600981905550826002815181106200039957fe5b602002602001015160058190555082600481518110620003b557fe5b602002602001015160138190555082600381518110620003d157fe5b602002602001015160148190555083600281518110620003ed57fe5b60200260200101516000806101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600a815181106200042857fe5b602002602001015160188190555082600b815181106200044457fe5b6020026020010151601781905550816001815181106200046057fe5b6020026020010151601b60156101000a81548160ff021916908315150217905550816000815181106200048f57fe5b6020026020010151601b60146101000a81548160ff02191690831515021790555081600381518110620004be57fe5b6020908102919091010151601280549115156101000261ff0019909216919091179055601b54600160b01b900460ff16156200054e576200054a62000515600254601262000c9660201b620010eb1790919060201c565b600a0a6200053660055460135462000cae60201b62002a841790919060201c565b62000cdd60201b62002aa81790919060201c565b6024555b6000846001815181106200055e57fe5b60200260200101519050601b60149054906101000a900460ff1680156200058f5750601b54600160b01b900460ff16155b15620008f0576000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620005d157600080fd5b505afa158015620005e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200060c919062000f8c565b6001600160a01b031663e6a43905600160009054906101000a90046001600160a01b0316846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200066a57600080fd5b505afa1580156200067f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006a5919062000f8c565b6040518363ffffffff1660e01b8152600401620006c49291906200111d565b60206040518083038186803b158015620006dd57600080fd5b505afa158015620006f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000718919062000f8c565b90506001600160a01b038116620008d257816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200076357600080fd5b505afa15801562000778573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200079e919062000f8c565b6001600160a01b031663c9c65396600160009054906101000a90046001600160a01b0316846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620007fc57600080fd5b505afa15801562000811573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000837919062000f8c565b6040518363ffffffff1660e01b8152600401620008569291906200111d565b602060405180830381600087803b1580156200087157600080fd5b505af115801562000886573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008ac919062000f8c565b601b80546001600160a01b0319166001600160a01b0392909216919091179055620008ee565b601b80546001600160a01b0319166001600160a01b0383161790555b505b6001600160601b0319606082901b166080528351849060059081106200091257fe5b60200260200101516006819055506200095262015180856006815181106200093657fe5b602002602001015162000cae60201b62002a841790919060201c565b601c558351849060089081106200096557fe5b6020026020010151601081905550836009815181106200098157fe5b60200260200101516011819055504260105411620009ad576000805460ff60a01b1916600160a01b1790555b83600781518110620009bb57fe5b6020026020010151601d81905550336001600160a01b03166346c549cc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562000a0557600080fd5b505af115801562000a1a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a40919062001104565b601981905550336001600160a01b031663355468506040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562000a8257600080fd5b505af115801562000a97573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000abd919062001104565b601a81905550336001600160a01b031663080574186040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562000aff57600080fd5b505af115801562000b14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b3a919062000f8c565b601f60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508160008151811062000b6e57fe5b6020026020010151600c908051906020019062000b8d92919062000cf3565b50600b8260018151811062000b9e57fe5b6020908102919091018101518254600181018455600093845292829020815162000bd2949190910192919091019062000cf3565b50600b8260028151811062000be357fe5b6020908102919091018101518254600181018455600093845292829020815162000c17949190910192919091019062000cf3565b50600b8260038151811062000c2857fe5b6020908102919091018101518254600181018455600093845292829020815162000c5c949190910192919091019062000cf3565b508160048151811062000c6b57fe5b6020026020010151600d908051906020019062000c8a92919062000cf3565b5050505050506200117e565b60008282111562000ca357fe5b508082035b92915050565b60008262000cbf5750600062000ca8565b8282028284828162000ccd57fe5b041462000cd657fe5b9392505050565b60008082848162000cea57fe5b04949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000d3657805160ff191683800117855562000d66565b8280016001018555821562000d66579182015b8281111562000d6657825182559160200191906001019062000d49565b5062000d7492915062000d78565b5090565b5b8082111562000d74576000815560010162000d79565b80516001600160a01b038116811462000ca857600080fd5b600082601f83011262000db8578081fd5b815162000dcf62000dc9826200115e565b62001137565b81815291506020808301908481018184028601820187101562000df157600080fd5b6000805b8581101562000e21578251801515811462000e0e578283fd5b8552938301939183019160010162000df5565b50505050505092915050565b600082601f83011262000e3e578081fd5b815162000e4f62000dc9826200115e565b818152915060208083019084810160005b8481101562000e8d5762000e7a888484518a010162000efd565b8452928201929082019060010162000e60565b505050505092915050565b600082601f83011262000ea9578081fd5b815162000eba62000dc9826200115e565b81815291506020808301908481018184028601820187101562000edc57600080fd5b60005b8481101562000e8d5781518452928201929082019060010162000edf565b600082601f83011262000f0e578081fd5b81516001600160401b0381111562000f24578182fd5b602062000f3a601f8301601f1916820162001137565b9250818352848183860101111562000f5157600080fd5b60005b8281101562000f7157848101820151848201830152810162000f54565b8281111562000f835760008284860101525b50505092915050565b60006020828403121562000f9e578081fd5b62000cd6838362000d8f565b6000806000806080858703121562000fc0578283fd5b84516001600160401b038082111562000fd7578485fd5b818701915087601f83011262000feb578485fd5b815162000ffc62000dc9826200115e565b80828252602080830192508086018c8283870289010111156200101d57898afd5b8996505b848710156200104b57620010368d8262000d8f565b84526001969096019592810192810162001021565b508a0151909850935050508082111562001063578485fd5b620010718883890162000e98565b9450604087015191508082111562001087578384fd5b620010958883890162000da7565b93506060870151915080821115620010ab578283fd5b50620010ba8782880162000e2d565b91505092959194509250565b600060208284031215620010d8578081fd5b81516001600160401b03811115620010ee578182fd5b620010fc8482850162000efd565b949350505050565b60006020828403121562001116578081fd5b5051919050565b6001600160a01b0392831681529116602082015260400190565b6040518181016001600160401b03811182821017156200115657600080fd5b604052919050565b60006001600160401b0382111562001174578081fd5b5060209081020190565b60805160601c613b9a620011a6600039806111d75280612e2e5280612ec55250613b9a6000f3fe6080604052600436106104405760003560e01c806378e9792511610234578063b8e50cab1161012e578063e868764c116100b6578063f2fde38b1161007a578063f2fde38b14611054578063f958a65714611074578063faa06d6f14611094578063fb7f21eb146110a9578063fb86a404146110be57610920565b8063e868764c14610fe0578063eb4f847b14610ff5578063ee639d891461100a578063f1cf257f1461101f578063f288dc101461103f57610920565b8063d403982a116100fd578063d403982a14610f5f578063db83694c14610f74578063dd55e1df14610f96578063ddca3f4314610fab578063e22d4f4a14610fc057610920565b8063b8e50cab14610ef5578063b97af2c814610f0a578063c03a24ba14610f2a578063c52c5c8814610f3f57610920565b806393e74ba4116101bc578063ab3dbbdc11610180578063ab3dbbdc14610e6b578063ada6b92d14610e8b578063b068375514610eab578063b2145feb14610ec0578063b35205ae14610ed557610920565b806393e74ba414610dec5780639d76ea5814610e0c578063a132aad114610e21578063a24c4ef014610e41578063a8c92d4814610e5657610920565b80638da5cb5b116102035780638da5cb5b14610d785780638db3b7d914610d8d5780638f84aa0914610dad578063906a26e014610dc25780639106d7ba14610dd757610920565b806378e9792514610d1957806379c78afe14610d2e5780637b61c32014610d4357806386f9f8eb14610d5857610920565b80634973a360116103455780635ed9ebfc116102cd5780636c4470fb116102915780636c4470fb14610ca55780636d00e50114610cba5780637284e41614610ccf57806374478bb314610ce457806375ec648414610cf957610920565b80635ed9ebfc14610c17578063611b409514610c2c5780636386c1c714610c4157806363cea45014610c6e5780636c02a93114610c8357610920565b8063536baf0f11610314578063536baf0f14610b8d57806356f0889c14610bad578063573a57fc14610bcd57806358a687ec14610be25780635bb2a52814610bf757610920565b80634973a36014610b2357806349bd5a5e14610b435780634b877a9314610b58578063530cd5ab14610b6d57610920565b80632044285e116103c85780633aeb6c71116103975780633aeb6c7114610aba5780633b97e85614610acf5780633be6755914610ae457806347d9943a14610af957806348c54b9d14610b0e57610920565b80632044285e14610a505780632243f3c514610a6557806326a4e8d214610a855780633197cbb614610aa557610920565b80631694505e1161040f5780631694505e146109b4578063183b151f146109d65780631959a002146109f65780631a3480b514610a265780631d111d1314610a3b57610920565b80630b3214aa146109255780630b6c754b14610947578063126714ac1461097257806313c4b16c1461099457610920565b36610920576010543490421080159061045b57506011544211155b6104805760405162461bcd60e51b81526004016104779061362f565b60405180910390fd5b6000805460ff60a01b1916600160a01b178155600954338252602080526040909120546104ad90836110d3565b111580156104d557506008543360009081526020805260409020546104d290836110d3565b10155b6104f15760405162461bcd60e51b815260040161047790613861565b33600090815260208052604090205461050e57601e805460010190555b60135460155461051e90836110d3565b111561053c5760405162461bcd60e51b8152600401610477906135bc565b601254610100900460ff161561067f576001546001600160a01b0316600090815260226020908152604080832033845290915290205461058e5760405162461bcd60e51b81526004016104779061378a565b6001546001600160a01b031660009081526022602090815260408083203384529091529020543411156105d35760405162461bcd60e51b815260040161047790613732565b6001546001600160a01b031660009081526022602090815260408083203384528252808320549180529091205461060a90346110d3565b11156106285760405162461bcd60e51b815260040161047790613802565b6001546001600160a01b0316600090815260226020908152604080832033845290915290205461065890346110eb565b6001546001600160a01b031660009081526022602090815260408083203384529091529020555b601b54600160b01b900460ff161561078c5760006106aa600e546024546110eb90919063ffffffff16565b116106c75760405162461bcd60e51b81526004016104779061375b565b60006106d2826110fd565b9050806106ec600e546024546110eb90919063ffffffff16565b101561070a5760405162461bcd60e51b81526004016104779061375b565b3360009081526023602052604090206001015461072790826110d3565b3360009081526023602052604090206001810182905555600e5461074b90826110d3565b600e5533600090815260208052604090205461076790836110d3565b33600090815260208052604090205560155461078390836110d3565b6015555061091d565b600e546001546040516370a0823160e01b815260009261081e9290916001600160a01b03909116906370a08231906107c890309060040161352f565b60206040518083038186803b1580156107e057600080fd5b505afa1580156107f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108189190613439565b906110eb565b1161083b5760405162461bcd60e51b81526004016104779061375b565b6000610846826110fd565b600e546001546040516370a0823160e01b8152929350839261088192916001600160a01b0316906370a08231906107c890309060040161352f565b101561089f5760405162461bcd60e51b81526004016104779061375b565b336000908152602360205260409020600101546108bc90826110d3565b3360009081526023602052604090206001810182905555600e546108e090826110d3565b600e553360009081526020805260409020546108fc90836110d3565b33600090815260208052604090205560155461091890836110d3565b601555505b50005b600080fd5b34801561093157600080fd5b506109456109403660046133b3565b611142565b005b34801561095357600080fd5b5061095c61117e565b6040516109699190613597565b60405180910390f35b34801561097e57600080fd5b5061098761118d565b6040516109699190613af6565b3480156109a057600080fd5b506109456109af3660046133e7565b611193565b3480156109c057600080fd5b506109c96111d5565b604051610969919061352f565b3480156109e257600080fd5b506109876109f13660046131dc565b6111f9565b348015610a0257600080fd5b50610a16610a113660046131dc565b6112a8565b6040516109699493929190613aff565b348015610a3257600080fd5b506109876112cf565b348015610a4757600080fd5b506109456112d5565b348015610a5c57600080fd5b50610987611349565b348015610a7157600080fd5b50610945610a80366004613421565b61134f565b348015610a9157600080fd5b50610945610aa03660046131dc565b61136b565b348015610ab157600080fd5b506109876113a4565b348015610ac657600080fd5b506109876113aa565b348015610adb57600080fd5b506109876113b0565b348015610af057600080fd5b506109876113b6565b348015610b0557600080fd5b50610987611419565b348015610b1a57600080fd5b506109456114fc565b348015610b2f57600080fd5b5061095c610b3e3660046131dc565b6115e2565b348015610b4f57600080fd5b506109c9611615565b348015610b6457600080fd5b5061095c611624565b348015610b7957600080fd5b50610945610b883660046131dc565b611634565b348015610b9957600080fd5b50610945610ba8366004613277565b611679565b348015610bb957600080fd5b50610987610bc8366004613421565b6110fd565b348015610bd957600080fd5b5061095c611727565b348015610bee57600080fd5b50610945611737565b348015610c0357600080fd5b50610945610c12366004613421565b611b55565b348015610c2357600080fd5b50610987611b71565b348015610c3857600080fd5b5061095c611b77565b348015610c4d57600080fd5b50610c61610c5c3660046131dc565b611b85565b6040516109699190613a9d565b348015610c7a57600080fd5b50610945611cd2565b348015610c8f57600080fd5b50610c98611d13565b60405161096991906135a2565b348015610cb157600080fd5b50610987611da1565b348015610cc657600080fd5b50610945611da7565b348015610cdb57600080fd5b50610c98611eeb565b348015610cf057600080fd5b5061095c611f46565b348015610d0557600080fd5b50610945610d14366004613421565b611f4f565b348015610d2557600080fd5b50610987611f6b565b348015610d3a57600080fd5b50610987611f71565b348015610d4f57600080fd5b50610c98611f77565b348015610d6457600080fd5b50610987610d73366004613214565b611fd2565b348015610d8457600080fd5b506109c9611fef565b348015610d9957600080fd5b50610945610da836600461324c565b611ffe565b348015610db957600080fd5b506109c9612044565b348015610dce57600080fd5b50610987612053565b348015610de357600080fd5b50610987612059565b348015610df857600080fd5b50610987610e073660046131dc565b61205f565b348015610e1857600080fd5b506109c9612070565b348015610e2d57600080fd5b50610945610e3c366004613421565b61207f565b348015610e4d57600080fd5b506109876120da565b348015610e6257600080fd5b506109c96120e0565b348015610e7757600080fd5b50610945610e863660046132e0565b6120ef565b348015610e9757600080fd5b50610945610ea63660046131dc565b61221e565b348015610eb757600080fd5b5061098761232f565b348015610ecc57600080fd5b50610945612335565b348015610ee157600080fd5b50610c98610ef0366004613421565b6123db565b348015610f0157600080fd5b5061098761244e565b348015610f1657600080fd5b50610945610f25366004613421565b612454565b348015610f3657600080fd5b50610987612470565b348015610f4b57600080fd5b50610987610f5a3660046131dc565b612476565b348015610f6b57600080fd5b50610987612490565b348015610f8057600080fd5b50610f89612496565b604051610969919061388f565b348015610fa257600080fd5b5061095c612915565b348015610fb757600080fd5b50610987612925565b348015610fcc57600080fd5b50610987610fdb3660046131dc565b61292b565b348015610fec57600080fd5b50610987612949565b34801561100157600080fd5b5061095c61294f565b34801561101657600080fd5b5061095c61295f565b34801561102b57600080fd5b5061094561103a366004613421565b612968565b34801561104b57600080fd5b50610987612984565b34801561106057600080fd5b5061094561106f3660046131dc565b61298a565b34801561108057600080fd5b5061094561108f36600461337b565b6129ec565b3480156110a057600080fd5b50610987612a1d565b3480156110b557600080fd5b50610c98612a23565b3480156110ca57600080fd5b50610987612a7e565b6000828201838110156110e257fe5b90505b92915050565b6000828211156110f757fe5b50900390565b60006110e561112460075461111e60025460126110eb90919063ffffffff16565b906110d3565b600a0a61113c60055485612a8490919063ffffffff16565b90612aa8565b6000546001600160a01b0316331461115957600080fd5b601b8054931515600160a81b0260ff60a81b1990941693909317909255601755601855565b60125462010000900460ff1681565b60065481565b6000546001600160a01b031633146111aa57600080fd5b601b8054941515600160a01b0260ff60a01b1990951694909417909355600691909155601d55601c55565b7f000000000000000000000000000000000000000000000000000000000000000081565b6018546001600160a01b0382166000908152602360205260408120549091829161122a916127109161113c91612a84565b6001600160a01b038416600090815260236020526040812060010154919250908211611271576001600160a01b038416600090815260236020526040902060010154611273565b815b6001600160a01b0385166000908152602360205260409020600101549091501561129d57806112a0565b60005b949350505050565b60236020526000908152604090208054600182015460028301546003909301549192909184565b60075481565b6000546001600160a01b031633146112ec57600080fd5b6000471161130c5760405162461bcd60e51b8152600401610477906136d4565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015611346573d6000803e3d6000fd5b50565b60155481565b6000546001600160a01b0316331461136657600080fd5b600755565b6000546001600160a01b0316331461138257600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b60185481565b60025481565b601b54600090600160b01b900460ff1661140557600e546001546040516370a0823160e01b815261140092916001600160a01b0316906370a08231906107c890309060040161352f565b611414565b600e54602454611414916110eb565b905090565b600080611466611436601654600e546110d390919063ffffffff16565b6001546040516370a0823160e01b81526001600160a01b03909116906370a08231906107c890309060040161352f565b90506000611486606461113c601d54601554612a8490919063ffffffff16565b9050600061149f60065483612a8490919063ffffffff16565b90506114ce6114c060075461111e60025460126110eb90919063ffffffff16565b600a0a61113c836001612a84565b90506114e8600254600a0a84612aa890919063ffffffff16565b92506114f481846110eb565b935050505090565b6010543390421080159061151257506011544211155b1561152f5760405162461bcd60e51b815260040161047790613839565b60125460ff166115515760405162461bcd60e51b81526004016104779061365b565b6001600160a01b0381166000908152602360205260409020600101546115895760405162461bcd60e51b8152600401610477906136aa565b60125462010000900460ff16156115a8576115a381612abd565b611346565b33600081815260208052604080822054905181156108fc0292818181858888f193505050501580156115de573d6000803e3d6000fd5b5050565b6017546001600160a01b038216600090815260236020526040812060020154909161160d91906110d3565b421192915050565b601b546001600160a01b031681565b601b54600160a81b900460ff1681565b6000546001600160a01b0316331461164b57600080fd5b6001546001600160a01b03908116600090815260226020908152604080832094909316825292909252812055565b6000546001600160a01b0316331461169057600080fd5b6012805461ff00191661010017905560005b83811015611720578282828181106116b657fe5b6001546001600160a01b03166000908152602260209081526040822092029390930135929091508787858181106116e957fe5b90506020020160208101906116fe91906131dc565b6001600160a01b031681526020810191909152604001600020556001016116a2565b5050505050565b601b54600160b01b900460ff1681565b6000546001600160a01b0316331461174e57600080fd5b601054421015801561176257506011544211155b1561177f5760405162461bcd60e51b815260040161047790613839565b600a60009054906101000a90046001600160a01b03166001600160a01b03166346c549cc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118079190613439565b601955600a5460408051630355468560e41b815290516001600160a01b03909216916335546850916004808201926020929091908290030181600087803b15801561185157600080fd5b505af1158015611865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118899190613439565b601a55600a5460408051630d6b838760e21b815290516001600160a01b03909216916335ae0e1c916004808201926020929091908290030181600087803b1580156118d357600080fd5b505af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190613397565b6021805460ff1916911515919091179055600a5460408051630100ae8360e31b815290516001600160a01b03909216916308057418916004808201926020929091908290030181600087803b15801561196357600080fd5b505af1158015611977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199b91906131f8565b601f80546001600160a01b0319166001600160a01b0392909216919091179055601b54600160b01b900460ff16611b41576014546015541015806119e1575060215460ff165b156119f8576012805462ff00001916620100001790555b60125462010000900460ff168015611a195750601b54600160a01b900460ff165b8015611a255750600047115b15611b4157611a32612d74565b601f54601a546015546001600160a01b03909216916108fc91611a5c9160649161113c9190612a84565b6040518115909202916000818181858888f19350505050158015611a84573d6000803e3d6000fd5b50600154601f54601a546016546001600160a01b039384169363a9059cbb931691611ab69160649161113c9190612a84565b6040518363ffffffff1660e01b8152600401611ad3929190613543565b602060405180830381600087803b158015611aed57600080fd5b505af1158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190613397565b611b415760405162461bcd60e51b8152600401610477906135e6565b6012805460ff19811660ff90911615179055565b6000546001600160a01b03163314611b6c57600080fd5b600555565b600e5481565b601254610100900460ff1681565b611b8d612f5a565b604051806101000160405280836001600160a01b0316318152602001611bb284612476565b8152602001611bc08461292b565b81526001546001600160a01b0390811660009081526022602090815260408083209388168352928152908290205490830152601b54910190600160b01b900460ff16611c8b576001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611c3690879060040161352f565b60206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c869190613439565b611c8e565b60005b8152602001611c9b6113b6565b81526001600160a01b0384166000818152602360208181526040808420600381015483880152949093525290549101529050919050565b6000546001600160a01b03163314611ce957600080fd5b600e54601654611cf8916110d3565b601655426011556000600e819055805460ff60a01b19169055565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d995780601f10611d6e57610100808354040283529160200191611d99565b820191906000526020600020905b815481529060010190602001808311611d7c57829003601f168201915b505050505081565b601e5481565b6000546001600160a01b03163314611dbe57600080fd5b6010544210158015611dd257506011544211155b15611def5760405162461bcd60e51b815260040161047790613839565b6001546000546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a0823190611e2c90309060040161352f565b60206040518083038186803b158015611e4457600080fd5b505afa158015611e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7c9190613439565b6040518363ffffffff1660e01b8152600401611e99929190613543565b602060405180830381600087803b158015611eb357600080fd5b505af1158015611ec7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113469190613397565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d995780601f10611d6e57610100808354040283529160200191611d99565b60125460ff1681565b6000546001600160a01b03163314611f6657600080fd5b600855565b60105481565b600f5481565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d995780601f10611d6e57610100808354040283529160200191611d99565b602260209081526000928352604080842090915290825290205481565b6000546001600160a01b031681565b6000546001600160a01b0316331461201557600080fd5b6001546001600160a01b0390811660009081526022602090815260408083209590931682529390935290912055565b601f546001600160a01b031681565b60145481565b60165481565b602080526000908152604090205481565b6001546001600160a01b031681565b6000546001600160a01b0316331461209657600080fd5b426010556120a78162015180612a84565b600f8190556120b79042906110d3565b601155506000805460ff60a01b1916600160a01b1790556012805460ff19169055565b60245481565b600a546001600160a01b031681565b6000546001600160a01b0316331461210657600080fd5b8060008151811061211357fe5b6020026020010151600c9080519060200190612130929190612f9f565b508060018151811061213e57fe5b6020026020010151600b60008154811061215457fe5b906000526020600020019080519060200190612171929190612f9f565b508060028151811061217f57fe5b6020026020010151600b60018154811061219557fe5b9060005260206000200190805190602001906121b2929190612f9f565b50806003815181106121c057fe5b6020026020010151600b6002815481106121d657fe5b9060005260206000200190805190602001906121f3929190612f9f565b508060048151811061220157fe5b6020026020010151600d90805190602001906115de929190612f9f565b6000546001600160a01b0316331461223557600080fd5b6000546040516370a0823160e01b81526001600160a01b038084169263a9059cbb9291169083906370a082319061227090309060040161352f565b60206040518083038186803b15801561228857600080fd5b505afa15801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c09190613439565b6040518363ffffffff1660e01b81526004016122dd929190613543565b602060405180830381600087803b1580156122f757600080fd5b505af115801561230b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115de9190613397565b601d5481565b6000546001600160a01b0316331461234c57600080fd5b601054421015801561236057506011544211155b1561237d5760405162461bcd60e51b815260040161047790613839565b601c54421161239e5760405162461bcd60e51b8152600401610477906136fb565b601b546000546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a0823190611e2c90309060040161352f565b600b81815481106123e857fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611d995780601f10611d6e57610100808354040283529160200191611d99565b60175481565b6000546001600160a01b0316331461246b57600080fd5b600255565b60195481565b6001600160a01b0316600090815260208052604090205490565b601c5481565b61249e61301d565b60408051600380546103a06020601f6002600019610100600187161502019094169390930492830181900402840181019094526103808301818152929384939291908401828280156125315780601f1061250657610100808354040283529160200191612531565b820191906000526020600020905b81548152906001019060200180831161251457829003601f168201915b50505091835250506004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156125c35780601f10612598576101008083540402835291602001916125c3565b820191906000526020600020905b8154815290600101906020018083116125a657829003601f168201915b505050505081526020016002548152602001600160009054906101000a90046001600160a01b03166001600160a01b03168152602001600b805480602002602001604051908101604052809291908181526020016000905b828210156126c65760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156126b25780601f10612687576101008083540402835291602001916126b2565b820191906000526020600020905b81548152906001019060200180831161269557829003601f168201915b50505050508152602001906001019061261b565b50505090825250600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156127575780601f1061272c57610100808354040283529160200191612757565b820191906000526020600020905b81548152906001019060200180831161273a57829003601f168201915b505050505081526020016005548152602001600654815260200160135481526020016014548152602001601260019054906101000a900460ff1615158152602001601b60169054906101000a900460ff16151581526020016015548152602001601e548152602001600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128555780601f1061282a57610100808354040283529160200191612855565b820191906000526020600020905b81548152906001019060200180831161283857829003601f168201915b5050509183525050601054602082018190526011546040830152601b5460ff600160a81b8204811615156060850152600160a01b90910481161515608084015260175460a084015260185460c084015260085460e08401526009546101008401526000546001600160a01b0316610120840152601c546101408401526012541615156101608301526101809091019042108015906128f557506011544211155b8015612905575060135460155411155b1515815230602090910152905090565b601b54600160a01b900460ff1681565b601a5481565b6001600160a01b031660009081526023602052604090206001015490565b60055481565b600054600160a01b900460ff1681565b60215460ff1681565b6000546001600160a01b0316331461297f57600080fd5b600955565b60085481565b6000546001600160a01b031633146129a157600080fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b03163314612a0357600080fd5b601280549115156101000261ff0019909216919091179055565b60095481565b600d805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d995780601f10611d6e57610100808354040283529160200191611d99565b60135481565b600082612a93575060006110e5565b82820282848281612aa057fe5b04146110e257fe5b600080828481612ab457fe5b04949350505050565b601b54600160a81b900460ff1615612ca3576017546001600160a01b038216600090815260236020526040902060020154612af7916110d3565b4211612b155760405162461bcd60e51b8152600401610477906137c1565b6018546001600160a01b0382166000908152602360205260408120549091612b45916127109161113c9190612a84565b6001600160a01b038316600090815260236020526040902060010154909150811115612b8957506001600160a01b0381166000908152602360205260409020600101545b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612bbb9085908590600401613543565b602060405180830381600087803b158015612bd557600080fd5b505af1158015612be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0d9190613397565b612c295760405162461bcd60e51b8152600401610477906135e6565b6001600160a01b038216600090815260236020526040902060010154612c4f90826110eb565b6001600160a01b0383166000908152602360205260409020600181019190915542600282015560030154612c9d576001600160a01b0382166000908152602360205260409020426003909101555b50611346565b600180546001600160a01b038381166000908152602360205260409081902090930154925163a9059cbb60e01b815291169163a9059cbb91612ce9918591600401613543565b602060405180830381600087803b158015612d0357600080fd5b505af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3b9190613397565b612d575760405162461bcd60e51b8152600401610477906135e6565b6001600160a01b0316600090815260236020526040812060010155565b6000612d92606461113c601d54601554612a8490919063ffffffff16565b90506000612dab60065483612a8490919063ffffffff16565b9050612db681612dd7565b9050612dc28183612e06565b601c54612dd09042906110d3565b601c555050565b60006110e5612df860075461111e60025460126110eb90919063ffffffff16565b600a0a61113c846001612a84565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612e58907f0000000000000000000000000000000000000000000000000000000000000000908690600401613543565b602060405180830381600087803b158015612e7257600080fd5b505af1158015612e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eaa9190613397565b5060015460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d719928592612f08921690879060009081903090429060040161355c565b6060604051808303818588803b158015612f2157600080fd5b505af1158015612f35573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117209190613451565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612fe057805160ff191683800117855561300d565b8280016001018555821561300d579182015b8281111561300d578251825591602001919060010190612ff2565b50613019929150613115565b5090565b60405180610380016040528060608152602001606081526020016000815260200160006001600160a01b0316815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160008152602001600081526020016060815260200160008152602001600081526020016000151581526020016000151581526020016000815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160001515815260200160001515815260200160006001600160a01b031681525090565b5b808211156130195760008155600101613116565b60008083601f84011261313b578182fd5b50813567ffffffffffffffff811115613152578182fd5b602083019150836020808302850101111561316c57600080fd5b9250929050565b600082601f830112613183578081fd5b813567ffffffffffffffff811115613199578182fd5b6131ac601f8201601f1916602001613b1a565b91508082528360208285010111156131c357600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156131ed578081fd5b81356110e281613b41565b600060208284031215613209578081fd5b81516110e281613b41565b60008060408385031215613226578081fd5b823561323181613b41565b9150602083013561324181613b41565b809150509250929050565b6000806040838503121561325e578182fd5b823561326981613b41565b946020939093013593505050565b6000806000806040858703121561328c578182fd5b843567ffffffffffffffff808211156132a3578384fd5b6132af8883890161312a565b909650945060208701359150808211156132c7578384fd5b506132d48782880161312a565b95989497509550505050565b600060208083850312156132f2578182fd5b823567ffffffffffffffff80821115613309578384fd5b818501915085601f83011261331c578384fd5b81358181111561332a578485fd5b6133378485830201613b1a565b8181528481019250838501865b8381101561336d5761335b8a888435890101613173565b85529386019390860190600101613344565b509098975050505050505050565b60006020828403121561338c578081fd5b81356110e281613b56565b6000602082840312156133a8578081fd5b81516110e281613b56565b6000806000606084860312156133c7578283fd5b83356133d281613b56565b95602085013595506040909401359392505050565b600080600080608085870312156133fc578384fd5b843561340781613b56565b966020860135965060408601359560600135945092505050565b600060208284031215613432578081fd5b5035919050565b60006020828403121561344a578081fd5b5051919050565b600080600060608486031215613465578081fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208085018081965082840281019150828601855b858110156134d15782840389526134bf8483516134e4565b988501989350908401906001016134a7565b5091979650505050505050565b15159052565b60008151808452815b81811015613509576020818501810151868301820152016134ed565b8181111561351a5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602082526135b560208301846134e4565b9392505050565b60208082526010908201526f4861726420436170204578636565647360801b604082015260600190565b60208082526029908201527f496e73756666696369656e742062616c616e6365206f662070726573616c6520604082015268636f6e74726163742160b81b606082015260800190565b60208082526012908201527153616c65206973206e6f742041637469766560701b604082015260600190565b6020808252602f908201527f596f752063616e6e6f7420636c61696d20746f6b656e7320756e74696c20746860408201526e32903334b730b634bd32a9b0b6329760891b606082015260800190565b60208082526010908201526f4e6f20546f6b656e73206c656674202160801b604082015260600190565b6020808252600d908201526c139bc8119d5b991cc81319599d609a1b604082015260600190565b60208082526019908201527f556e6c6f636b20506572696f64206973207374696c6c206f6e00000000000000604082015260600190565b6020808252600f908201526e0c2dadeeadce840e8dede40d0d2ced608b1b604082015260600190565b602080825260159082015274139bc8141c995cd85b1948119d5b991cc81b19599d605a1b604082015260600190565b60208082526017908201527f796f7520617265206e6f742077686974656c6973746564000000000000000000604082015260600190565b60208082526021908201527f56657374696e6720496e74657276616c206973206e6f742072656163686564206040820152602160f81b606082015260800190565b60208082526018908201527f4d6178696d756d20707572636861736520636170206869740000000000000000604082015260600190565b6020808252600e908201526d53616c652069732041637469766560901b604082015260600190565b60208082526014908201527324b739ba30b63636b2b73a1024b73b30b634b21760611b604082015260600190565b60006020825282516103808060208501526138ae6103a08501836134e4565b91506020850151601f19808685030160408701526138cc84836134e4565b935060408701516060870152606087015191506138ec608087018361347e565b60808701519150808685030160a0870152613907848361348b565b935060a08701519150808685030160c087015261392484836134e4565b60c088015160e0888101919091528801516101008089019190915288015161012080890191909152880151610140808901919091528801519094509150610160613970818801846134de565b8701519150610180613984878201846134de565b8701516101a0878101919091528701516101c08088019190915287015186850382016101e0808901919091529092506139bd85846134e4565b908801516102008881019190915288015161022080890191909152880151909450915061024090506139f1818701836134de565b8601519050610260613a05868201836134de565b860151610280868101919091528601516102a0808701919091528601516102c0808701919091528601516102e0808701919091528601519050610300613a4d8187018361347e565b860151610320868101919091528601519050610340613a6e818701836134de565b8601519050610360613a82868201836134de565b8601519050613a938583018261347e565b5090949350505050565b600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b90815260200190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715613b3957600080fd5b604052919050565b6001600160a01b038116811461134657600080fd5b801515811461134657600080fdfea264697066735822122039764e9c9ccf8188935a8ddb55b3ed03e19406210f03150b21a45847b6c316f164736f6c634300060c0033a264697066735822122022bd93efdcd6b8691a467de2cab3f8529e8db60488e6e0d19673d6f6a5a0565164736f6c634300060c0033

Verified Source Code Partial Match

Compiler: v0.6.12+commit.27d51765 EVM: istanbul Optimization: Yes (200 runs)
BSCMPresaleProxy.sol 939 lines
pragma solidity ^0.6.0;

pragma experimental ABIEncoderV2;
// SPDX-License-Identifier: MIT

library SafeMath {
  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;
  }

  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;
  }

  function ceil(uint a, uint m) internal pure returns (uint r) {
    return (a + m - 1) / m * m;
  }
}

contract Owned {
    address payable public owner;

    event OwnershipTransferred(address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

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

    function transferOwnership(address payable _newOwner) public onlyOwner {
        owner = _newOwner;
        emit OwnershipTransferred(msg.sender, _newOwner);
    }
}


interface IBEP20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint256 balance);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IPresaleProxy{
   function getDeploymentFee() external returns (uint256);
   function getTokenFee() external returns (uint256);
   function getfundReciever() external returns (address);
   function getCheckSuccess() external returns (bool);
}

contract BSCMPresale is Owned  {
    using SafeMath for uint256;
    
    bool public isPresaleOpen;
    
    address public tokenAddress;
    uint256 public tokenDecimals = 18;

    string public tokenName;
    string public tokenSymbol;
    
    uint256 public tokenRatePerEth = 60000000000;
    uint256 public tokenRatePerEthPancake = 100;
    uint256 public rateDecimals = 0;
    
    uint256 public minEthLimit = 1e17; // 0.1 BNB
    uint256 public maxEthLimit = 10e18; // 10 BNB

    address public PROXY;
    
   
    string[] public social;
    string public description;
    string public logo;
    
    uint256 public soldTokens=0;
    
    uint256 public intervalDays;
    
    uint256 public startTime;
    
    uint256 public endTime = 2 days;
    
    bool public isClaimable = false;
    
    bool public isWhitelisted = false;

   bool public isSuccess = false;

    uint256 public hardCap = 0;
    
    uint256 public softCap = 0;
    
    uint256 public earnedCap =0;
    
    uint256 public totalSold = 0;

    uint256 public vestingInterval = 0;
    uint256 public vestingPercent = 0;

    uint256 public depolymentFee;
    uint256 public fee;
    
    
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    
    bool public isautoAdd;
    bool public isVested;
    bool public isWithoutToken;
    
    uint256 public unlockOn;
    
    uint256 public liquidityPercent;

    uint256 public participants;
    
    address payable public ownerAddress;
    
    mapping(address => uint256) public usersInvestments;

    bool public checkForSuccess;

    mapping(address => mapping(address => uint256)) public whitelistedAddresses;
    
    struct User{
        uint256 actualBalance;
        uint256 balanceOf;
        uint256 lastClaimed;
        uint256 initialClaim;
    }


    mapping (address => User) public userInfo;

    uint256 public isWithoutTokenBalance = 0;
    
    constructor(address[] memory _addresses,uint256[] memory _values,bool[] memory _isSet,string[] memory _details) public {

        // _token 0
        //_router 1
        //owner 2

        //_min 0 
        //_max 1
        //_rate 2
        // _soft  3
        // _hard 4
        //_pancakeRate  5
        //_unlockon  6
        // _percent 7
        // _start 8
        //_end 9
        //_vestPercent 10
        //_vestInterval 11

        // isAuto 0
        //_isvested 1
        // isWithoutToken 2
        // isWhitelisted 3

        // description 0 
        // website,twitter,telegram 1,2,3
        // logo 4
        // name 5
        // symbol 6

        PROXY = msg.sender;
        isWithoutToken = _isSet[2];
        if(!isWithoutToken){
        tokenAddress = _addresses[0];
        tokenDecimals = IBEP20(tokenAddress).decimals();
        tokenName = IBEP20(tokenAddress).name();
        tokenSymbol =  IBEP20(tokenAddress).symbol();
        }else{
            tokenName = _details[5];
            tokenSymbol = _details[6];
        }
        minEthLimit = _values[0];
        maxEthLimit = _values[1];
        tokenRatePerEth = _values[2];
        hardCap = _values[4];
        softCap = _values[3];
        owner = payable(_addresses[2]);
        vestingPercent = _values[10];
        vestingInterval = _values[11];
        isVested = _isSet[1];
        isautoAdd = _isSet[0];
        isWhitelisted = _isSet[3];

        if(isWithoutToken)
            isWithoutTokenBalance = hardCap.mul(tokenRatePerEth).div(10**(uint256(18).sub(tokenDecimals)));
      
        // Pancake testnet Router : 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3
          IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_addresses[1]);
        // set the rest of the contract variables
        if(isautoAdd && !isWithoutToken){
            address pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(tokenAddress, _uniswapV2Router.WETH());
            if(pair==address(0)){
                uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(tokenAddress, _uniswapV2Router.WETH());
            }else{
                uniswapV2Pair = pair;
            }
        }
        
        uniswapV2Router = _uniswapV2Router;
        tokenRatePerEthPancake = _values[5];
        unlockOn = _values[6].mul(1 days);
        
        // if(_values[8] == 0){
        // startTime = block.timestamp;
        // intervalDays = _values[9].mul(1 days);
        // endTime = block.timestamp.add(intervalDays);
        // isPresaleOpen = true;
        // }else{
        // startTime = block.timestamp.add(_values[8].mul(1 days));
        // endTime = startTime.add(_values[9].add(1 days));
        // }
        startTime = _values[8];
        endTime = _values[9];
        if(startTime <= block.timestamp)
          isPresaleOpen = true;
        liquidityPercent = _values[7];
        depolymentFee = IPresaleProxy(msg.sender).getDeploymentFee();
        fee = IPresaleProxy(msg.sender).getTokenFee();
        ownerAddress = payable(IPresaleProxy(msg.sender).getfundReciever());
        description = _details[0];
        social.push(_details[1]);
        social.push(_details[2]);
        social.push(_details[3]);
        logo = _details[4];
        
    }
    
    function startPresale(uint256 numberOfdays) external onlyOwner{
        startTime = block.timestamp;
        intervalDays = numberOfdays.mul(1 days);
        endTime = block.timestamp.add(intervalDays);
        isPresaleOpen = true;
        isClaimable = false;
    }

    struct Project{
        string name;
        string symbol;
        uint256 decimals;
        address tokenAddress;
        string[] social;
        string description;
        uint256 presaleRate;
        uint256 pancakeRate;
        uint256 hardCap;
        uint256 softCap;
        bool isWhitelisted;
        bool isWithoutToken;
        uint256 earnedCap;
        uint256 participants;
        string logo;
        uint256 startTime;
        uint256 endTime;
        bool isVested;
        bool isPancake;
        uint256 vestingInterval;
        uint256 vestingPercent;
        uint256 minEthLimit;
        uint256 maxEthLimit;
        address owner;
        uint256 lpUnlockon;
        bool isClaimable;
        bool isPresaleOpen;
        address saleAddress;
    }


    function getSaleInfo() public view returns (Project memory){
        return Project({
            name : tokenName,
            symbol: tokenSymbol,
            decimals: tokenDecimals,
            tokenAddress: tokenAddress,
            social: social,
            description: description,
            presaleRate: tokenRatePerEth,
            pancakeRate: tokenRatePerEthPancake,
            hardCap: hardCap,
            softCap: softCap,
            isWhitelisted: isWhitelisted,
            isWithoutToken: isWithoutToken,
            earnedCap: earnedCap,
            participants: participants,
            logo: logo,
            startTime: startTime,
            endTime: endTime,
            isVested: isVested,
            isPancake: isautoAdd,
            vestingPercent: vestingPercent,
            vestingInterval: vestingInterval,
            minEthLimit: minEthLimit,
            maxEthLimit: maxEthLimit,
            owner: owner,
            lpUnlockon: unlockOn,
            isClaimable: isClaimable,
            isPresaleOpen: block.timestamp >= startTime && block.timestamp <= endTime && earnedCap <= hardCap,
            saleAddress: address(this)
        });
    }

    struct UserInfo{
        uint256 bnbBalance;
        uint256 userInvested;
        uint256 userClaimbale;
        uint256 userWhitelistedAmount;
        uint256 userTokenBalance;
        uint256 unSoldTokens;
        uint256 initialClaim;
        uint256 actualBalance;
    }

    function getUserInfo(address user) public view returns (UserInfo memory){
        return UserInfo({
            bnbBalance: address(user).balance,
            userInvested: getUserInvestments(user),
            userClaimbale: getUserClaimbale(user),
            userWhitelistedAmount: whitelistedAddresses[tokenAddress][user],
            userTokenBalance: isWithoutToken ? 0 : IBEP20(tokenAddress).balanceOf(user),
            unSoldTokens: getUnsoldTokensBalance(),
            initialClaim: userInfo[user].initialClaim,
            actualBalance: userInfo[user].actualBalance
        });
    }

    function setVestingInfo(bool _isVest,uint256 _vestingInterval,uint256 _vestPercentage) external onlyOwner {
        isVested = _isVest;
        vestingInterval = _vestingInterval;
        vestingPercent = _vestPercentage;
    }

    function setPancakeInfo(bool _isPancake,uint256 _pancakeRate,uint256 _liquidityPercentage,uint256 _isLockedon) external onlyOwner {
        isautoAdd = _isPancake;
        tokenRatePerEthPancake = _pancakeRate;
        liquidityPercent = _liquidityPercentage;
        unlockOn = _isLockedon;
    }

    function updateTokenInfo(string[] memory _info) external onlyOwner {
        description = _info[0];
        social[0]=(_info[1]);
        social[1]=(_info[2]);
        social[2]=(_info[3]);
        logo = _info[4];
    }
    
    function closePresale() external onlyOwner{
      
        totalSold = totalSold.add(soldTokens);
        endTime = block.timestamp;
        soldTokens = 0;
        isPresaleOpen = false;
    }
    
    function setTokenAddress(address token) external onlyOwner {
        tokenAddress = token;
    }
    
    function setTokenDecimals(uint256 decimals) external onlyOwner {
       tokenDecimals = decimals;
    }
    
    function setMinEthLimit(uint256 amount) external onlyOwner {
        minEthLimit = amount;    
    }
    
    function setMaxEthLimit(uint256 amount) external onlyOwner {
        maxEthLimit = amount;    
    }
    
    function setTokenRatePerEth(uint256 rate) external onlyOwner {
        tokenRatePerEth = rate;
    }
    
    function setRateDecimals(uint256 decimals) external onlyOwner {
        rateDecimals = decimals;
    }
    
    function getUserInvestments(address user) public view returns (uint256){
        return usersInvestments[user];
    }

    function addWhitelistedAddress(address _address, uint256 _allocation) external onlyOwner {
        whitelistedAddresses[tokenAddress][_address] = _allocation;
    }
            
    function addMultipleWhitelistedAddresses(address[] calldata _addresses, uint256[] calldata _allocation) external onlyOwner {
        isWhitelisted = true;
        for (uint i=0; i<_addresses.length; i++) {
            whitelistedAddresses[tokenAddress][_addresses[i]] = _allocation[i];
        }
    }

    function removeWhitelistedAddress(address _address) external onlyOwner {
        whitelistedAddresses[tokenAddress][_address] = 0;
    }    
    
    function getUserClaimbale(address user) public view returns (uint256){
        return userInfo[user].balanceOf;
    }
    
    receive() external payable{
        uint256 amount = msg.value;
        // if(block.timestamp > endTime || earnedCap.add(amount) > hardCap)
        // isPresaleOpen = false;
            
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Sale is not Active");
        isPresaleOpen = true;
            
        
        require(
                usersInvestments[msg.sender].add(amount) <= maxEthLimit
                && usersInvestments[msg.sender].add(amount) >= minEthLimit,
                "Installment Invalid."
            );
        if(usersInvestments[msg.sender] == 0)
        participants++;
         require(earnedCap.add(amount) <= hardCap,"Hard Cap Exceeds");

        if(isWhitelisted){
            require(whitelistedAddresses[tokenAddress][msg.sender] > 0, "you are not whitelisted");
            require(whitelistedAddresses[tokenAddress][msg.sender] >= msg.value, "amount too high");
            require(usersInvestments[msg.sender].add(msg.value) <= whitelistedAddresses[tokenAddress][msg.sender], "Maximum purchase cap hit");
            whitelistedAddresses[tokenAddress][msg.sender] = whitelistedAddresses[tokenAddress][msg.sender].sub(msg.value);
        }
       
        if(isWithoutToken){
        require((isWithoutTokenBalance).sub(soldTokens) > 0 ,"No Presale Funds left");
        uint256 tokenAmount = getTokensPerEth(amount);
        require( (isWithoutTokenBalance).sub(soldTokens) >= tokenAmount ,"No Presale Funds left");
        userInfo[msg.sender].balanceOf = userInfo[msg.sender].balanceOf.add(tokenAmount);
        userInfo[msg.sender].actualBalance = userInfo[msg.sender].balanceOf;
        soldTokens = soldTokens.add(tokenAmount);
        usersInvestments[msg.sender] = usersInvestments[msg.sender].add(amount);
        earnedCap = earnedCap.add(amount);
        }else{
        require( (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens) > 0 ,"No Presale Funds left");
        uint256 tokenAmount = getTokensPerEth(amount);
        require( (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens) >= tokenAmount ,"No Presale Funds left");
        userInfo[msg.sender].balanceOf = userInfo[msg.sender].balanceOf.add(tokenAmount);
        userInfo[msg.sender].actualBalance = userInfo[msg.sender].balanceOf;
        soldTokens = soldTokens.add(tokenAmount);
        usersInvestments[msg.sender] = usersInvestments[msg.sender].add(amount);
        earnedCap = earnedCap.add(amount);
        }
       
    }
    
    
  function claimTokens() public{
        address user = msg.sender;
        require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
       
        require(isClaimable, "You cannot claim tokens until the finalizeSale.");
        require(userInfo[user].balanceOf > 0 , "No Tokens left !");
        if(isSuccess){
        VestedClaim(user);
        }else{
        payable(msg.sender).transfer(usersInvestments[msg.sender]);
        }
       
    }

    function VestedClaim(address user) internal {
        if(isVested){
        require(block.timestamp > userInfo[user].lastClaimed.add(vestingInterval),"Vesting Interval is not reached !");
        uint256 toTransfer =  userInfo[user].actualBalance.mul(vestingPercent).div(10000);
        if(toTransfer > userInfo[user].balanceOf)
            toTransfer = userInfo[user].balanceOf;
        require(IBEP20(tokenAddress).transfer(user, toTransfer), "Insufficient balance of presale contract!");
        userInfo[user].balanceOf = userInfo[user].balanceOf.sub(toTransfer);
        userInfo[user].lastClaimed = block.timestamp;
        if(userInfo[user].initialClaim <= 0)
            userInfo[user].initialClaim = block.timestamp;
       }else{
        require(IBEP20(tokenAddress).transfer(user, userInfo[user].balanceOf), "Insufficient balance of presale contract!");
        userInfo[user].balanceOf = 0;
        }
    }

    function getVestedclaim(address user) public view returns (uint256) {
        uint256 toTransfer = userInfo[user].actualBalance.mul(vestingPercent).div(10000);
        uint256 vestedClaim = userInfo[user].balanceOf < toTransfer ? toTransfer : userInfo[user].balanceOf;
        return (userInfo[user].balanceOf == 0) ? 0 : vestedClaim ;
    }

    function isEligibletoVestedClaim(address _user) public view returns (bool) {
        return (block.timestamp > userInfo[_user].lastClaimed.add(vestingInterval));
    }
    
    function finalizeSale() public onlyOwner{
        require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        depolymentFee = IPresaleProxy(PROXY).getDeploymentFee();
        fee = IPresaleProxy(PROXY).getTokenFee();
        checkForSuccess = IPresaleProxy(PROXY).getCheckSuccess();
        ownerAddress = payable(IPresaleProxy(PROXY).getfundReciever());

        if(!isWithoutToken){
            if(earnedCap >= softCap || checkForSuccess)
                isSuccess = true;
        
            if(isSuccess && isautoAdd && address(this).balance > 0){
                _addLiquidityToken();
                ownerAddress.transfer(earnedCap.mul(fee).div(100));
                require(IBEP20(tokenAddress).transfer(address(ownerAddress),totalSold.mul(fee).div(100)), "Insufficient balance of presale contract!");
            }
        }
        isClaimable = !(isClaimable);
    }
    
    function _addLiquidityToken() internal{
     uint256 amountInEth = earnedCap.mul(liquidityPercent).div(100);
     uint256 tokenAmount = amountInEth.mul(tokenRatePerEthPancake);
     tokenAmount = getEqualTokensDecimals(tokenAmount);
     addLiquidity(tokenAmount,amountInEth);
     unlockOn = block.timestamp.add(unlockOn);
    }
    
    function checkTokentoAddLiquidty() public view returns(uint256) {
    uint256 contractBalance = IBEP20(tokenAddress).balanceOf(address(this)).sub(soldTokens.add(totalSold));
    uint256 amountInEth = earnedCap.mul(liquidityPercent).div(100);
    uint256 tokenAmount = amountInEth.mul(tokenRatePerEthPancake);
     tokenAmount =  tokenAmount.mul(uint256(1)).div(10**(uint256(18).sub(tokenDecimals).add(rateDecimals)));
         contractBalance = contractBalance.div(10 ** tokenDecimals);
            return (tokenAmount).sub(contractBalance);
    }
    
    function getTokensPerEth(uint256 amount) public view returns(uint256) {
        return amount.mul(tokenRatePerEth).div(
            10**(uint256(18).sub(tokenDecimals).add(rateDecimals))
            );
    }

    function setWhitelist(bool _value) external onlyOwner {
        isWhitelisted = _value;
    }
    
    function getEqualTokensDecimals(uint256 amount) internal view returns (uint256){
        return amount.mul(uint256(1)).div(
            10**(uint256(18).sub(tokenDecimals).add(rateDecimals))
            );
    }
    
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        // approve token transfer to cover all possible scenarios
         IBEP20(tokenAddress).approve(address(uniswapV2Router), tokenAmount);
        // add the liquidity
          uniswapV2Router.addLiquidityETH{value: ethAmount}(
           tokenAddress,
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }
    
    
    function withdrawBNB() public onlyOwner{
        require(address(this).balance > 0 , "No Funds Left");
         owner.transfer(address(this).balance);
    }
    
    function getUnsoldTokensBalance() public view returns(uint256) {
        return isWithoutToken? isWithoutTokenBalance.sub(soldTokens) : (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens);
    }

    function pullOutUnknown(IBEP20 _token) external onlyOwner{
        _token.transfer(owner,_token.balanceOf(address(this)));
    }

    
    function getLPtokens() external onlyOwner {
       require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        require (block.timestamp > unlockOn,"Unlock Period is still on");
        IBEP20(uniswapV2Pair).transfer(owner, (IBEP20(uniswapV2Pair).balanceOf(address(this))));
    }
    
    function getUnsoldTokens() external onlyOwner {
       require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        IBEP20(tokenAddress).transfer(owner, (IBEP20(tokenAddress).balanceOf(address(this))));
    }
}

contract BSCMPresaleProxy is Owned {
    using SafeMath for uint256;

    struct Sale{
        address _sale;
        uint256 _start;
        uint256 _end;
        string _name;
    }

    uint256 public depolymentFee = 0;
    uint256 public fee = 0;
    bool public checkForSuccess = true;  // Make False to Sale reaches soft cap to make it success

    address public fundReciever;
   

    mapping(address => address) public _preSale;
    mapping(address => uint256) public saleId;
    Sale[] public _sales;

    constructor() public{

    }

    function getSale(address _token) public view returns (address) {
        return _preSale[_token];
    }

    function setDeploymentFee(uint256 _fee) external onlyOwner {
        depolymentFee = _fee;
    }

    function setForSuccess(bool _value) external onlyOwner {
       checkForSuccess = _value;
    }

    function setTokenFee(uint256 _fee) external onlyOwner {
        fee = _fee;
    }

    function getDeploymentFee() public view returns(uint256){
        return depolymentFee;
    }

    function getfundReciever() public view returns (address){
        return fundReciever;
    }

    function setfundReciever(address _reciever) external onlyOwner {
        fundReciever = _reciever;
    }

    function getTokenFee() public view returns(uint256){
        return fee;
    }

    function getTotalSales() public view returns (Sale[] memory){
        return _sales;
    }

    function getCheckSuccess() public view returns (bool){
        return checkForSuccess;
    }


    function deleteSalePresale(address _saleAddress) public onlyOwner {
        uint256 _saleId = saleId[_saleAddress];
        _sales[_saleId] = _sales[_sales.length - 1];
        saleId[_sales[_sales.length - 1]._sale] = _saleId;
        _sales.pop();
    }

    function createPresale(address[] calldata _addresses,uint256[] calldata _values,bool[] memory _isSet,string[] memory _details) public payable onlyOwner {
          // _token 0
        //_router 1
        //owner 2

        //_min 0 
        //_max 1
        //_rate 2
        // _soft  3
        // _hard 4
        //_pancakeRate  5
        //_unlockon  6
        // _percent 7
        // _start 8
        //_end 9
        //_vestPercent 10
        //_vestInterval 11

        // isAuto 0
        //_isvested 1
        // isWithoutToken 2
        // isWhitelisted 3

        // description 0 
        // website,twitter,telegram 1,2,3
        // logo 4
        // name 5
        // symbol 6

         // require(depolymentFee == msg.value,"Insufficient fee");
         // payable(fundReciever).transfer(msg.value);
         address _saleAddress = address(new BSCMPresale(_addresses,_values,_isSet,_details));
           _preSale[_addresses[0]] = _saleAddress;
           saleId[_saleAddress] = _sales.length;
            _sales.push(
                Sale({
                    _sale: _saleAddress,
                    _start: block.timestamp.add((_values[8]).mul(1 days)),
                    _end: block.timestamp.add((_values[9]).mul(1 days)),
                    _name: _details[5]
                })
            );   
    }
}

Read Contract

_preSale 0x19260225 → address
_sales 0xd0f4fc02 → address, uint256, uint256, string
checkForSuccess 0xee639d89 → bool
depolymentFee 0xc03a24ba → uint256
fee 0xddca3f43 → uint256
fundReciever 0x515ae31b → address
getCheckSuccess 0x35ae0e1c → bool
getDeploymentFee 0x46c549cc → uint256
getSale 0x25b8b8cb → address
getTokenFee 0x35546850 → uint256
getTotalSales 0x2156a96c → tuple[]
getfundReciever 0x08057418 → address
owner 0x8da5cb5b → address
saleId 0xaa177f3e → uint256

Write Contract 7 functions

These functions modify contract state and require a wallet transaction to execute.

createPresale 0x3a9b70c0
address[] _addresses
uint256[] _values
bool[] _isSet
string[] _details
deleteSalePresale 0xf023e0ea
address _saleAddress
setDeploymentFee 0xd002462b
uint256 _fee
setForSuccess 0x7a5a7601
bool _value
setTokenFee 0x31b31b88
uint256 _fee
setfundReciever 0x7d3f76e5
address _reciever
transferOwnership 0xf2fde38b
address _newOwner

Recent Transactions

No transactions found for this address