Address Contract Partially Verified
Address
0x0c02439D2d83148E289871835D18C6300FBE8800
Balance
0 ETH
Nonce
1
Code Size
23708 bytes
Creator
0x86Af27d0...2378 at tx 0x756826e6...354067
Indexed Transactions
0
Contract Bytecode
23708 bytes
0x6080604052600436106105025760003560e01c80638dcf67ca11610297578063d1690fec11610165578063f0120ff8116100cc578063f851a44011610085578063f851a44014610f8b578063f885838614610fab578063f8b91abe14610fcb578063fe21a94f14610fe0578063fe575a8714610ff3578063ff14ca111461102357600080fd5b8063f0120ff814610ed5578063f04d688f14610ef5578063f056633414610f0b578063f0ff892314610f2b578063f2fde38b14610f4b578063f597573f14610f6b57600080fd5b8063e985e3671161011e578063e985e36714610e1f578063eac0d11514610e3f578063eadd94ec14610e5f578063eb66e2ef14610e75578063ec571c6a14610e95578063efc8647814610eb557600080fd5b8063d1690fec14610d69578063d258919614610d89578063e19648db14610da9578063e32204dd14610dc9578063e6da921314610de9578063e6e78d0614610e0957600080fd5b8063b4d94f4411610209578063c6cc2672116101c2578063c6cc267214610cd9578063c8adff0114610cef578063ca1600b614610d04578063cad0055614610d1e578063cb1a4fc014610d3e578063cff805ab14610d5357600080fd5b8063b4d94f4414610bf6578063b8d612ec14610c2c578063ba166a3914610c4c578063bb695f2a14610c79578063c23326f314610c99578063c49cc64514610cb957600080fd5b8063a29f481c1161025b578063a29f481c14610b36578063a2db641614610b56578063a3fbbaae14610b76578063a6d42e4e14610b96578063ae10426514610bb6578063b00bba6a14610bd657600080fd5b80638dcf67ca14610aac5780638e15f47314610acb5780639a89c1fb14610ae05780639cfa0f7c14610b00578063a1fe1dee14610b1657600080fd5b80634e71d92d116103d45780636ddcca29116103465780637ad71f72116102ff5780637ad71f7214610a0d5780637f6fb25314610a2d5780638456cb5914610a4357806386fc6ea814610a5857806388c3e45814610a785780638da5cb5b14610a8e57600080fd5b80636ddcca29146109525780636e6973dd14610972578063704b6c0214610992578063715018a6146109b257806373b2e80e146109c757806378e97925146109f757600080fd5b80635df4f353116103985780635df4f3531461089757806361ad0b7c146108c757806363b20117146108e757806363e40879146108fd578063641046f41461091d57806368cdafe61461093257600080fd5b80634e71d92d1461080d57806350429ee4146108225780635bc34f71146108425780635c975abb146108585780635ddc56881461087757600080fd5b80632dc358e8116104785780633f4ba83a116104315780633f4ba83a146107795780634151848f1461078e578063415eed46146107a157806343568eae146107c1578063481c6a75146107d75780634bc6191a146107f757600080fd5b80632dc358e8146106bc57806330e74f08146106dc57806333f76178146106fd57806337ba50941461071357806338646608146107295780633af32abf1461074957600080fd5b8063232e95be116104ca578063232e95be146105e357806323a8f1c01461060457806325312e5414610624578063278c278b1461065c57806329a5a0b61461067c5780632c73304d1461069c57600080fd5b8063032bd1f71461050757806307f180821461054c5780630a200fc71461056c5780630ba36dcd1461058e5780631fa2bc92146105c9575b600080fd5b34801561051357600080fd5b50610537610522366004615212565b60296020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561055857600080fd5b5061053761056736600461522d565b611043565b34801561057857600080fd5b5061058c610587366004615254565b61109d565b005b34801561059a57600080fd5b506105bb6105a9366004615212565b60246020526000908152604090205481565b604051908152602001610543565b3480156105d557600080fd5b506006546105379060ff1681565b3480156105ef57600080fd5b50601c5461053790600160a81b900460ff1681565b34801561061057600080fd5b5061058c61061f36600461522d565b6110b8565b34801561063057600080fd5b50601954610644906001600160a01b031681565b6040516001600160a01b039091168152602001610543565b34801561066857600080fd5b5061058c61067736600461522d565b6110c5565b34801561068857600080fd5b506105bb61069736600461522d565b611127565b3480156106a857600080fd5b5061058c6106b7366004615271565b61115b565b3480156106c857600080fd5b5061058c6106d73660046153a7565b6111a3565b3480156106e857600080fd5b50601c5461053790600160a01b900460ff1681565b34801561070957600080fd5b506105bb60055481565b34801561071f57600080fd5b506105bb60225481565b34801561073557600080fd5b50601b54610644906001600160a01b031681565b34801561075557600080fd5b50610537610764366004615212565b60276020526000908152604090205460ff1681565b34801561078557600080fd5b5061058c611299565b61053761079c3660046153dc565b6112ab565b3480156107ad57600080fd5b506105376107bc36600461541a565b6117b9565b3480156107cd57600080fd5b506105bb60075481565b3480156107e357600080fd5b50600e54610644906001600160a01b031681565b34801561080357600080fd5b506105bb601e5481565b34801561081957600080fd5b506105376117f1565b34801561082e57600080fd5b50601d54610644906001600160a01b031681565b34801561084e57600080fd5b506105bb600f5481565b34801561086457600080fd5b50600154600160a01b900460ff16610537565b34801561088357600080fd5b5061058c6108923660046154b5565b611ad9565b3480156108a357600080fd5b506105376108b2366004615212565b60286020526000908152604090205460ff1681565b3480156108d357600080fd5b5061058c6108e2366004615254565b611cd4565b3480156108f357600080fd5b506105bb60085481565b34801561090957600080fd5b506105bb61091836600461522d565b611cef565b34801561092957600080fd5b5061058c611d11565b34801561093e57600080fd5b5061058c61094d366004615575565b611e6c565b34801561095e57600080fd5b5061058c61096d3660046155eb565b611f16565b34801561097e57600080fd5b5061058c61098d3660046155eb565b611f95565b34801561099e57600080fd5b5061058c6109ad366004615212565b61200e565b3480156109be57600080fd5b5061058c612038565b3480156109d357600080fd5b506105376109e2366004615212565b60256020526000908152604090205460ff1681565b348015610a0357600080fd5b506105bb60025481565b348015610a1957600080fd5b50610644610a2836600461522d565b61204a565b348015610a3957600080fd5b506105bb60095481565b348015610a4f57600080fd5b5061058c612074565b348015610a6457600080fd5b5061058c610a73366004615254565b612084565b348015610a8457600080fd5b506105bb601f5481565b348015610a9a57600080fd5b506001546001600160a01b0316610644565b348015610ab857600080fd5b5060215461053790610100900460ff1681565b348015610ad757600080fd5b506105bb6120a6565b348015610aec57600080fd5b5061058c610afb366004615640565b612146565b348015610b0c57600080fd5b506105bb60045481565b348015610b2257600080fd5b5061058c610b31366004615662565b612159565b348015610b4257600080fd5b5061058c610b51366004615212565b61229a565b348015610b6257600080fd5b5061058c610b713660046156ce565b612341565b348015610b8257600080fd5b5061058c610b91366004615212565b6123bc565b348015610ba257600080fd5b5061058c610bb136600461541a565b6123e6565b348015610bc257600080fd5b506105bb610bd136600461522d565b6123fb565b348015610be257600080fd5b5061058c610bf1366004615212565b612731565b348015610c0257600080fd5b50610644610c11366004615212565b602a602052600090815260409020546001600160a01b031681565b348015610c3857600080fd5b5061058c610c47366004615640565b612853565b348015610c5857600080fd5b50610c6c610c6736600461522d565b612866565b6040516105439190615710565b348015610c8557600080fd5b50610537610c94366004615212565b6128d2565b348015610ca557600080fd5b506105bb610cb436600461522d565b612952565b348015610cc557600080fd5b50601a54610644906001600160a01b031681565b348015610ce557600080fd5b506105bb60235481565b348015610cfb57600080fd5b50610c6c612973565b348015610d1057600080fd5b506021546105379060ff1681565b348015610d2a57600080fd5b5061058c610d39366004615212565b6129cb565b348015610d4a57600080fd5b50610537612a44565b348015610d5f57600080fd5b506105bb60105481565b348015610d7557600080fd5b50610537610d843660046153dc565b612c9e565b348015610d9557600080fd5b5061058c610da43660046156ce565b613219565b348015610db557600080fd5b506105bb610dc436600461522d565b613294565b348015610dd557600080fd5b50600c54610644906001600160a01b031681565b348015610df557600080fd5b506105bb610e04366004615640565b6132a4565b348015610e1557600080fd5b506105bb60205481565b348015610e2b57600080fd5b50600b54610644906001600160a01b031681565b348015610e4b57600080fd5b5061058c610e5a366004615254565b6132d8565b348015610e6b57600080fd5b506105bb600a5481565b348015610e8157600080fd5b5061058c610e903660046155eb565b6132fe565b348015610ea157600080fd5b50601c54610644906001600160a01b031681565b348015610ec157600080fd5b50610537610ed0366004615754565b613377565b348015610ee157600080fd5b50610537610ef03660046153dc565b613567565b348015610f0157600080fd5b506105bb60035481565b348015610f1757600080fd5b5061058c610f2636600461522d565b613ad2565b348015610f3757600080fd5b5061058c610f46366004615575565b613bb8565b348015610f5757600080fd5b5061058c610f66366004615212565b613be6565b348015610f7757600080fd5b50601854610644906001600160a01b031681565b348015610f9757600080fd5b50600d54610644906001600160a01b031681565b348015610fb757600080fd5b506105bb610fc636600461522d565b613c5c565b348015610fd757600080fd5b5061058c613c6c565b610537610fee366004615779565b613c86565b348015610fff57600080fd5b5061053761100e366004615212565b60266020526000908152604090205460ff1681565b34801561102f57600080fd5b5061058c61103e3660046157c8565b61421e565b600061104d61427d565b60038054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a150600192915050565b6110a561427d565b6006805460ff1916911515919091179055565b6110c061427d565b600755565b6110cd61427d565b600081116111225760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c75650000000060448201526064015b60405180910390fd5b600455565b600080611133836123fb565b905061113d6120a6565b60055461114a9083615843565b6111549190615862565b9392505050565b61116361427d565b6001600160a01b03821661117657600080fd5b601c8054911515600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6111ab6142ec565b80516111f95760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f742075706461746520696e76616c69642076616c756573000000006044820152606401611119565b8051600114801561122457508060008151811061121857611218615884565b60200260200101516000145b15611238576112356015600061510f565b50565b6112446015600061510f565b60005b815181101561129557601582828151811061126457611264615884565b602090810291909101810151825460018101845560009384529190922001558061128d8161589a565b915050611247565b5050565b6112a161427d565b6112a961437b565b565b6000836002544210156112d05760405162461bcd60e51b8152600401611119906158b5565b600081116112f05760405162461bcd60e51b8152600401611119906158ec565b33601c54600160a01b900460ff161561139d57601c5460405163df592f7d60e01b81526001600160a01b0383811660048301529091169063df592f7d9060240160206040518083038186803b15801561134857600080fd5b505afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190615919565b1561139d5760405162461bcd60e51b815260040161111990615936565b6113a56143d0565b6113ad61441d565b60006113b8876123fb565b905060006113c46120a6565b6005546113d19084615843565b6113db9190615862565b90508034101561141c5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401611119565b6000611428823461596b565b9050886008600082825461143c9190615982565b90915550506010541561146157886010600082825461145b9190615982565b90915550505b6000601054600854116114765760105461147a565b6008545b90506011600001600f548154811061149457611494615884565b90600052602060002001548111806114ce57506011600201600f54815481106114bf576114bf615884565b90600052602060002001544210155b156115ef576011600201600f54815481106114eb576114eb615884565b9060005260206000200154421061152e57896011600001600f548154811061151557611515615884565b906000526020600020015461152a9190615982565b6010555b60065460ff161561154157611541614477565b600060118101600f548154811061155a5761155a615884565b906000526020600020015482116115a9578a826011600001600f548154811061158557611585615884565b906000526020600020015461159a919061596b565b6115a4919061596b565b6115ac565b60005b60158054600181810183556000928352600080516020615c27833981519152909101839055600f805493945090929091906115e8908490615982565b9091555050505b881561170457601c54600160a81b900460ff1615611636573360009081526027602052604090205460ff166116365760405162461bcd60e51b81526004016111199061599a565b601b546001600160a01b03166391c6196633600554611655908e615843565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561169b57600080fd5b505af11580156116af573d6000803e3d6000fd5b5050505089600960008282546116c59190615982565b90915550506040805184815260208101869052428183015290516000918c913391600080516020615c07833981519152919081900360600190a461176b565b600554611711908b615843565b3360009081526024602052604081208054909190611730908490615982565b90915550506040805184815260208101869052428183015290516000918c913391600080516020615c47833981519152919081900360600190a45b83600a600082825461177d9190615982565b9091555061178e90508389336144e7565b811561179e5761179e338361468e565b60019650505050506117b06001600055565b50509392505050565b60006117c361427d565b6117d0601183600361512d565b506000600f81905560108190556117e99060159061510f565b506001919050565b60006117fb6143d0565b600b546001600160a01b031661184a5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401611119565b3360009081526026602052604090205460ff16156118aa5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401611119565b60006003541180156118be57506003544210155b806118d857503360009081526027602052604090205460ff165b6119245760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401611119565b3360009081526025602052604090205460ff16156119765760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401611119565b336000908152602560209081526040808320805460ff191660011790556024909152902054806119db5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401611119565b336000818152602460208181526040808420849055600b54815163a9059cbb60e01b815260048101969096529285018690525192936001600160a01b039092169263a9059cbb92604480820193929182900301818787803b158015611a3f57600080fd5b505af1158015611a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a779190615919565b905080611a965760405162461bcd60e51b8152600401611119906159d1565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b611ae1614764565b8051825114611b265760405162461bcd60e51b81526020600482015260116024820152704d69736d6174636865642061727261797360781b6044820152606401611119565b611b326017600061510f565b611b3e6016600061510f565b6000805b8351811015611c7c576000838281518110611b5f57611b5f615884565b602002602001015111611bbe5760405162461bcd60e51b815260206004820152602160248201527f50657263656e74616765206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401611119565b828181518110611bd057611bd0615884565b602002602001015182611be39190615982565b91506017848281518110611bf957611bf9615884565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251601690849083908110611c4b57611c4b615884565b6020908102919091018101518254600181018455600093845291909220015580611c748161589a565b915050611b42565b5080620186a014611ccf5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c2070657263656e74616765206d75737420657175616c20313030006044820152606401611119565b505050565b611cdc61427d565b6021805460ff1916911515919091179055565b6000611cfa826123fb565b9050611d0b64e8d4a5100082615862565b92915050565b611d196142ec565b601054601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec015560065460ff1615611d6257611d62614477565b6011600001600f5481548110611d7a57611d7a615884565b90600052602060002001546010541015611e5557600f54611de3576008546015906011600001600f5481548110611db357611db3615884565b9060005260206000200154611dc8919061596b565b81546001810183556000928352602090922090910155611e2d565b6010546015906011600001600f5481548110611e0157611e01615884565b9060005260206000200154611e16919061596b565b815460018101835560009283526020909220909101555b6011600001600f5481548110611e4557611e45615884565b6000918252602090912001546010555b600f8054906000611e658361589a565b9190505550565b611e7461427d565b60405163a9059cbb60e01b8152336004820152602481018290526000906001600160a01b0384169063a9059cbb90604401602060405180830381600087803b158015611ebf57600080fd5b505af1158015611ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef79190615919565b905080611ccf5760405162461bcd60e51b8152600401611119906159d1565b611f1e61427d565b60005b81811015611f8f578360286000858585818110611f4057611f40615884565b9050602002016020810190611f559190615212565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611f878161589a565b915050611f21565b50505050565b611f9d61427d565b60005b81811015611f8f578360266000858585818110611fbf57611fbf615884565b9050602002016020810190611fd49190615212565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806120068161589a565b915050611fa0565b61201661427d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6120406147b3565b6112a9600061480d565b6017818154811061205a57600080fd5b6000918252602090912001546001600160a01b0316905081565b61207c61427d565b6112a961485f565b61208c61427d565b602180549115156101000261ff0019909216919091179055565b600080601a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156120f757600080fd5b505afa15801561210b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212f9190615a1a565b505050915050806402540be400611d0b9190615a6a565b61214e61427d565b600f91909155601055565b61216161427d565b8281146121a25760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401611119565b6000805b8481101561225f578383828181106121c0576121c0615884565b90506020020135602460008888858181106121dd576121dd615884565b90506020020160208101906121f29190615212565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546122219190615982565b90915550849050838281811061223957612239615884565b905060200201358261224b9190615982565b9150806122578161589a565b9150506121a6565b5084849050602360008282546122759190615982565b92505081905550806022600082825461228e9190615982565b90915550505050505050565b6122a261427d565b6001600160a01b0381166122ed5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401611119565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f9197d4b7790c1ef2cbc99e6139e49173e9f34ff565c8df71a9f37acafde4d7159060200160405180910390a150565b61234961427d565b8060005b81811015611f8f5760016029600086868581811061236d5761236d615884565b90506020020160208101906123829190615212565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806123b48161589a565b91505061234d565b6123c4614764565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6123ee61427d565b611295601182600361512d565b600080600060105460001461241257601054612416565b6008545b905060045484111561246a5760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401611119565b6011600001600f548154811061248257612482615884565b906000526020600020015481856124999190615982565b11806124c757506011600201600f54815481106124b8576124b8615884565b90600052602060002001544210155b156126f9576011546124db9060019061596b565b600f541061251a5760405162461bcd60e51b815260206004820152600c60248201526b57726f6e6720706172616d7360a01b6044820152606401611119565b6011600201600f548154811061253257612532615884565b9060005260206000200154421061264557600f54601190612554906001615982565b8154811061256457612564615884565b906000526020600020015484601160006003811061258457612584615884565b01600f548154811061259857612598615884565b90600052602060002001546125ad9190615982565b11156126075760405162461bcd60e51b815260206004820152602360248201527f43616e74205075726368617365204d6f726520696e20696e646976696475616c604482015262040e8f60eb1b6064820152608401611119565b600f54601290612618906001615982565b8154811061262857612628615884565b90600052602060002001548461263e9190615843565b915061272a565b60008160118201600f548154811061265f5761265f615884565b9060005260206000200154612674919061596b565b600f54909150601290612688906001615982565b8154811061269857612698615884565b906000526020600020015481866126af919061596b565b6126b99190615843565b6011600101600f54815481106126d1576126d1615884565b9060005260206000200154826126e79190615843565b6126f19190615982565b92505061272a565b6011600101600f548154811061271157612711615884565b9060005260206000200154846127279190615843565b91505b5092915050565b61273961427d565b6001600160a01b0381166127b55760405162461bcd60e51b815260206004820152603760248201527f7374616b696e67206d616e616765722063616e6e6f7420626520696e6974696160448201527f6c697a65642077697468207a65726f20616464726573730000000000000000006064820152608401611119565b601b80546001600160a01b0319166001600160a01b03838116918217909255600b5460405163095ea7b360e01b8152600481019290925260001960248301529091169063095ea7b390604401602060405180830381600087803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190615919565b61285b61427d565b601f91909155602055565b60606011826003811061287b5761287b615884565b018054806020026020016040519081016040528092919081815260200182805480156128c657602002820191906000526020600020905b8154815260200190600101908083116128b2575b50505050509050919050565b60006001600160a01b038216158061290257506001600160a01b03821660009081526029602052604090205460ff165b8061291557506001600160a01b03821633145b1561292257506000919050565b60215460ff1661293457506001919050565b506001600160a01b0316600090815260246020526040902054151590565b6015818154811061296257600080fd5b600091825260209091200154905081565b606060158054806020026020016040519081016040528092919081815260200182805480156129c157602002820191906000526020600020905b8154815260200190600101908083116129ad575b5050505050905090565b6129d361427d565b6001600160a01b038116612a225760405162461bcd60e51b8152602060048201526016602482015275616464726573732063616e6e6f74206265207a65726f60501b6044820152606401611119565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a4e6143d0565b600b546001600160a01b0316612a9d5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401611119565b3360009081526026602052604090205460ff1615612afd5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401611119565b601c54600160a81b900460ff1615612b3e573360009081526027602052604090205460ff16612b3e5760405162461bcd60e51b81526004016111199061599a565b3360009081526024602052604090205480612b8e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b6044820152606401611119565b600554612b9b9082615862565b60096000828254612bac9190615982565b9091555050601b546001600160a01b03166391c61966336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015612c0b57600080fd5b505af1158015612c1f573d6000803e3d6000fd5b5050505060246000612c2e3390565b6001600160a01b031681526020810191909152604001600090812055336001600160a01b03167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b8242604051612c8e929190918252602082015260400190565b60405180910390a2600191505090565b600083600254421015612cc35760405162461bcd60e51b8152600401611119906158b5565b60008111612ce35760405162461bcd60e51b8152600401611119906158ec565b33601c54600160a01b900460ff1615612d9057601c5460405163df592f7d60e01b81526001600160a01b0383811660048301529091169063df592f7d9060240160206040518083038186803b158015612d3b57600080fd5b505afa158015612d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d739190615919565b15612d905760405162461bcd60e51b815260040161111990615936565b612d986143d0565b6000612da3876123fb565b90508660086000828254612db79190615982565b9091555060009050612dce64e8d4a5100083615862565b9050601054600014612df2578760106000828254612dec9190615982565b90915550505b600060105460085411612e0757601054612e0b565b6008545b90506011600001600f5481548110612e2557612e25615884565b9060005260206000200154811180612e5f57506011600201600f5481548110612e5057612e50615884565b90600052602060002001544210155b15612f80576011600201600f5481548110612e7c57612e7c615884565b90600052602060002001544210612ebf57886011600001600f5481548110612ea657612ea6615884565b9060005260206000200154612ebb9190615982565b6010555b60065460ff1615612ed257612ed2614477565b600060118101600f5481548110612eeb57612eeb615884565b90600052602060002001548211612f3a5789826011600001600f5481548110612f1657612f16615884565b9060005260206000200154612f2b919061596b565b612f35919061596b565b612f3d565b60005b60158054600181810183556000928352600080516020615c27833981519152909101839055600f80549394509092909190612f79908490615982565b9091555050505b87156130b157601c54600160a81b900460ff1615612fc7573360009081526027602052604090205460ff16612fc75760405162461bcd60e51b81526004016111199061599a565b601b546001600160a01b03166391c6196633600554612fe6908d615843565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561302c57600080fd5b505af1158015613040573d6000803e3d6000fd5b5050505088600960008282546130569190615982565b90915550506018546001600160a01b031689336001600160a01b0316600080516020615c078339815191528587426040516130a4939291909283526020830191909152604082015260600190565b60405180910390a4613134565b6005546130be908a615843565b33600090815260246020526040812080549091906130dd908490615982565b90915550506018546001600160a01b031689336001600160a01b0316600080516020615c4783398151915285874260405161312b939291909283526020830191909152604082015260600190565b60405180910390a45b82600a60008282546131469190615982565b90915550506018546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156131a557600080fd5b505afa1580156131b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131dd9190615aef565b9050808311156131ff5760405162461bcd60e51b815260040161111990615b08565b61320983896148a2565b5060019998505050505050505050565b61322161427d565b8060005b81811015611f8f5760006029600086868581811061324557613245615884565b905060200201602081019061325a9190615212565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061328c8161589a565b915050613225565b6014818154811061296257600080fd5b601182600381106132b457600080fd5b0181815481106132c357600080fd5b90600052602060002001600091509150505481565b6132e061427d565b601c8054911515600160a81b0260ff60a81b19909216919091179055565b61330661427d565b60005b81811015611f8f57836027600085858581811061332857613328615884565b905060200201602081019061333d9190615212565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061336f8161589a565b915050613309565b600061338161427d565b6001600160a01b0383166133cc5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401611119565b600b80546001600160a01b038581166001600160a01b03199283168117909355601b805491861691909216811790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b15801561343c57600080fd5b505af1158015613450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134749190615919565b506040516323b872dd60e01b81526000906001600160a01b038516906323b872dd906134a890339030908a90600401615b49565b602060405180830381600087803b1580156134c257600080fd5b505af11580156134d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fa9190615919565b9050806135195760405162461bcd60e51b8152600401611119906159d1565b604080518681524260208201526001600160a01b038616917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a2506001949350505050565b60008360025442101561358c5760405162461bcd60e51b8152600401611119906158b5565b600081116135ac5760405162461bcd60e51b8152600401611119906158ec565b33601c54600160a01b900460ff161561365957601c5460405163df592f7d60e01b81526001600160a01b0383811660048301529091169063df592f7d9060240160206040518083038186803b15801561360457600080fd5b505afa158015613618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363c9190615919565b156136595760405162461bcd60e51b815260040161111990615936565b6136616143d0565b600061366c876123fb565b905086600860008282546136809190615982565b909155506000905061369764e8d4a5100083615862565b90506010546000146136bb5787601060008282546136b59190615982565b90915550505b6000601054600854116136d0576010546136d4565b6008545b90506011600001600f54815481106136ee576136ee615884565b906000526020600020015481118061372857506011600201600f548154811061371957613719615884565b90600052602060002001544210155b15613849576011600201600f548154811061374557613745615884565b9060005260206000200154421061378857886011600001600f548154811061376f5761376f615884565b90600052602060002001546137849190615982565b6010555b60065460ff161561379b5761379b614477565b600060118101600f54815481106137b4576137b4615884565b906000526020600020015482116138035789826011600001600f54815481106137df576137df615884565b90600052602060002001546137f4919061596b565b6137fe919061596b565b613806565b60005b60158054600181810183556000928352600080516020615c27833981519152909101839055600f80549394509092909190613842908490615982565b9091555050505b871561397a57601c54600160a81b900460ff1615613890573360009081526027602052604090205460ff166138905760405162461bcd60e51b81526004016111199061599a565b601b546001600160a01b03166391c61966336005546138af908d615843565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156138f557600080fd5b505af1158015613909573d6000803e3d6000fd5b50505050886009600082825461391f9190615982565b90915550506019546001600160a01b031689336001600160a01b0316600080516020615c0783398151915285874260405161396d939291909283526020830191909152604082015260600190565b60405180910390a46139fd565b600554613987908a615843565b33600090815260246020526040812080549091906139a6908490615982565b90915550506019546001600160a01b031689336001600160a01b0316600080516020615c478339815191528587426040516139f4939291909283526020830191909152604082015260600190565b60405180910390a45b82600a6000828254613a0f9190615982565b90915550506019546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015613a6e57600080fd5b505afa158015613a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa69190615aef565b905080831115613ac85760405162461bcd60e51b815260040161111990615b08565b6132098389614c67565b613ada61427d565b60008111613b1f5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401611119565b804210613b625760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401611119565b60028054908290556040805182815260208101849052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a25050565b613bc061427d565b601d80546001600160a01b0319166001600160a01b039390931692909217909155601e55565b613bee6147b3565b6001600160a01b038116613c535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611119565b6112358161480d565b6016818154811061296257600080fd5b613c746147b3565b600e80546001600160a01b0319169055565b600083600254421015613cab5760405162461bcd60e51b8152600401611119906158b5565b60008111613ccb5760405162461bcd60e51b8152600401611119906158ec565b601c548690600160a01b900460ff1615613d7957601c5460405163df592f7d60e01b81526001600160a01b0383811660048301529091169063df592f7d9060240160206040518083038186803b158015613d2457600080fd5b505afa158015613d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5c9190615919565b15613d795760405162461bcd60e51b815260040161111990615936565b613d816143d0565b613d8961441d565b3360009081526028602052604090205460ff16613de85760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401611119565b6000613df3876123fb565b90506000613dff6120a6565b600554613e0c9084615843565b613e169190615862565b905080341015613e575760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401611119565b6000613e63823461596b565b90508860086000828254613e779190615982565b909155505060105415613e9c578860106000828254613e969190615982565b90915550505b600060105460085411613eb157601054613eb5565b6008545b90506011600001600f5481548110613ecf57613ecf615884565b9060005260206000200154811180613f0957506011600201600f5481548110613efa57613efa615884565b90600052602060002001544210155b1561402a576011600201600f5481548110613f2657613f26615884565b90600052602060002001544210613f6957896011600001600f5481548110613f5057613f50615884565b9060005260206000200154613f659190615982565b6010555b60065460ff1615613f7c57613f7c614477565b600060118101600f5481548110613f9557613f95615884565b90600052602060002001548211613fe4578a826011600001600f5481548110613fc057613fc0615884565b9060005260206000200154613fd5919061596b565b613fdf919061596b565b613fe7565b60005b60158054600181810183556000928352600080516020615c27833981519152909101839055600f80549394509092909190614023908490615982565b9091555050505b881561415657601c54600160a81b900460ff161561407a576001600160a01b038b1660009081526027602052604090205460ff1661407a5760405162461bcd60e51b81526004016111199061599a565b601b546005546001600160a01b03909116906391c61966908d9061409e908e615843565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140e457600080fd5b505af11580156140f8573d6000803e3d6000fd5b50505050896009600082825461410e9190615982565b90915550506040805184815260208101869052428183015290516000918c916001600160a01b038f1691600080516020615c07833981519152919081900360600190a46141cf565b600554614163908b615843565b6001600160a01b038c166000908152602460205260408120805490919061418b908490615982565b90915550506040805184815260208101869052428183015290516000918c916001600160a01b038f1691600080516020615c47833981519152919081900360600190a45b83600a60008282546141e19190615982565b909155506141f2905083898d6144e7565b8115614202576142028b8361468e565b60019650505050506142146001600055565b5050949350505050565b61422661427d565b601f95909555602093909355601d80546001600160a01b039093166001600160a01b031990931692909217909155601e55602180549215156101000261ff00199215159290921661ffff1990931692909217179055565b600e546001600160a01b03163314806142a057506001546001600160a01b031633145b6112a95760405162461bcd60e51b815260206004820152601b60248201527f63616c6c6572206e6f74206d616e61676572206f72206f776e657200000000006044820152606401611119565b600d546001600160a01b031633148061430f5750600e546001600160a01b031633145b8061432457506001546001600160a01b031633145b6112a95760405162461bcd60e51b815260206004820152602260248201527f63616c6c6572206e6f742061646d696e2c206d616e61676572206f72206f776e60448201526132b960f11b6064820152608401611119565b614383614e8e565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16156112a95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401611119565b600260005414156144705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611119565b6002600055565b60005b600f5460135461448a919061596b565b8110156112355760075461449e9082615843565b6144a89042615982565b600f546013906144b9908490615982565b815481106144c9576144c9615884565b600091825260209091200155806144df8161589a565b91505061447a565b601d546000906001600160a01b03161561451d57601d54601e5461451a9186916001600160a01b03909116906000614ede565b90505b600061452c8584866000614fdc565b90506145388183615982565b614542908661596b565b60175490955061458f57600c546001600160a01b03166145745760405162461bcd60e51b815260040161111990615b6d565b600c5461458a906001600160a01b03168661468e565b614687565b6000805b601754811015614629576000620186a0601683815481106145b6576145b6615884565b9060005260206000200154896145cc9190615843565b6145d69190615862565b9050614609601783815481106145ee576145ee615884565b6000918252602090912001546001600160a01b03168261468e565b6146138184615982565b92505080806146219061589a565b915050614593565b506000614636828861596b565b1115614685576017805461468591906146519060019061596b565b8154811061466157614661615884565b6000918252602090912001546001600160a01b0316614680838961596b565b61468e565b505b5050505050565b804710156146cc5760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401611119565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614719576040519150601f19603f3d011682016040523d82523d6000602084013e61471e565b606091505b5050905080611ccf5760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401611119565b600e546001600160a01b031633146112a95760405162461bcd60e51b815260206004820152601260248201527131b0b63632b9103737ba1036b0b730b3b2b960711b6044820152606401611119565b6001546001600160a01b031633146112a95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611119565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6148676143d0565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586143b33390565b601d546000906001600160a01b0316156148dc57601d54601e546018546148d99286926001600160a01b0391821692909116614ede565b90505b60006148f6843360185486906001600160a01b0316614fdc565b90506149028183615982565b61490c908561596b565b601754909450614a0c57600c546001600160a01b031661493e5760405162461bcd60e51b815260040161111990615b6d565b6018546000906001600160a01b0316335b600c5460405161496e92916001600160a01b0316908990602401615b49565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516149a39190615b9d565b6000604051808303816000865af19150503d80600081146149e0576040519150601f19603f3d011682016040523d82523d6000602084013e6149e5565b606091505b5050905080614a065760405162461bcd60e51b815260040161111990615bd8565b50611f8f565b6000805b601754811015614b5a576000620186a060168381548110614a3357614a33615884565b906000526020600020015488614a499190615843565b614a539190615862565b6018549091506000906001600160a01b03163360178581548110614a7957614a79615884565b600091825260209091200154604051614aa192916001600160a01b0316908690602401615b49565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251614ad69190615b9d565b6000604051808303816000865af19150503d8060008114614b13576040519150601f19603f3d011682016040523d82523d6000602084013e614b18565b606091505b5050905080614b395760405162461bcd60e51b815260040161111990615bd8565b614b438285615982565b935050508080614b529061589a565b915050614a10565b506000614b67828761596b565b1115614687576018546000906001600160a01b0316335b60178054614b8e9060019061596b565b81548110614b9e57614b9e615884565b6000918252602090912001546001600160a01b0316614bbd858a61596b565b604051602401614bcf93929190615b49565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251614c049190615b9d565b6000604051808303816000865af19150503d8060008114614c41576040519150601f19603f3d011682016040523d82523d6000602084013e614c46565b606091505b50509050806146855760405162461bcd60e51b815260040161111990615bd8565b601d546000906001600160a01b031615614ca157601d54601e54601954614c9e9286926001600160a01b0391821692909116614ede565b90505b6000614cbb843360195486906001600160a01b0316614fdc565b9050614cc78183615982565b614cd1908561596b565b601754909450614d1857600c546001600160a01b0316614d035760405162461bcd60e51b815260040161111990615b6d565b6019546000906001600160a01b03163361494f565b6000805b601754811015614e66576000620186a060168381548110614d3f57614d3f615884565b906000526020600020015488614d559190615843565b614d5f9190615862565b6019549091506000906001600160a01b03163360178581548110614d8557614d85615884565b600091825260209091200154604051614dad92916001600160a01b0316908690602401615b49565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251614de29190615b9d565b6000604051808303816000865af19150503d8060008114614e1f576040519150601f19603f3d011682016040523d82523d6000602084013e614e24565b606091505b5050905080614e455760405162461bcd60e51b815260040161111990615bd8565b614e4f8285615982565b935050508080614e5e9061589a565b915050614d1c565b506000614e73828761596b565b1115614687576019546000906001600160a01b031633614b7e565b600154600160a01b900460ff166112a95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401611119565b6000806064614eed8588615843565b614ef79190615862565b90506001600160a01b03831615614fc75760006001600160a01b038416338784604051602401614f2993929190615b49565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251614f5e9190615b9d565b6000604051808303816000865af19150503d8060008114614f9b576040519150601f19603f3d011682016040523d82523d6000602084013e614fa0565b606091505b5050905080614fc15760405162461bcd60e51b815260040161111990615bd8565b50614fd1565b614fd1858261468e565b90505b949350505050565b6000806000614feb868661507f565b9050614ff6816128d2565b61500257509050614fd4565b6150108782601f5487614ede565b61501a9083615982565b602154909250610100900460ff1661503457509050614fd4565b600061504182600061507f565b905061504c816128d2565b61505b57829350505050614fd4565b615069888260205488614ede565b6150739084615982565b98975050505050505050565b6001600160a01b038281166000908152602a60205260408120549091161580156150bb5750816001600160a01b0316836001600160a01b031614155b156150ef576001600160a01b038381166000908152602a6020526040902080546001600160a01b0319169184169190911790555b50506001600160a01b039081166000908152602a60205260409020541690565b5080546000825590600052602060002090810190611235919061517d565b826003810192821561516d579160200282015b8281111561516d578251805161515d918491602090910190615192565b5091602001919060010190615140565b506151799291506151d9565b5090565b5b80821115615179576000815560010161517e565b8280548282559060005260206000209081019282156151cd579160200282015b828111156151cd5782518255916020019190600101906151b2565b5061517992915061517d565b808211156151795760006151ed828261510f565b506001016151d9565b80356001600160a01b038116811461520d57600080fd5b919050565b60006020828403121561522457600080fd5b611154826151f6565b60006020828403121561523f57600080fd5b5035919050565b801515811461123557600080fd5b60006020828403121561526657600080fd5b813561115481615246565b6000806040838503121561528457600080fd5b61528d836151f6565b9150602083013561529d81615246565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156152e1576152e16152a8565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715615310576153106152a8565b604052919050565b600067ffffffffffffffff821115615332576153326152a8565b5060051b60200190565b600082601f83011261534d57600080fd5b8135602061536261535d83615318565b6152e7565b82815260059290921b8401810191818101908684111561538157600080fd5b8286015b8481101561539c5780358352918301918301615385565b509695505050505050565b6000602082840312156153b957600080fd5b813567ffffffffffffffff8111156153d057600080fd5b614fd48482850161533c565b6000806000606084860312156153f157600080fd5b83359250602084013561540381615246565b9150615411604085016151f6565b90509250925092565b6000602080838503121561542d57600080fd5b823567ffffffffffffffff8082111561544557600080fd5b818501915085601f83011261545957600080fd5b6154616152be565b80606084018881111561547357600080fd5b845b818110156154a75780358581111561548d5760008081fd5b6154998b82890161533c565b855250928601928601615475565b509098975050505050505050565b600080604083850312156154c857600080fd5b823567ffffffffffffffff808211156154e057600080fd5b818501915085601f8301126154f457600080fd5b8135602061550461535d83615318565b82815260059290921b8401810191818101908984111561552357600080fd5b948201945b8386101561554857615539866151f6565b82529482019490820190615528565b9650508601359250508082111561555e57600080fd5b5061556b8582860161533c565b9150509250929050565b6000806040838503121561558857600080fd5b615591836151f6565b946020939093013593505050565b60008083601f8401126155b157600080fd5b50813567ffffffffffffffff8111156155c957600080fd5b6020830191508360208260051b85010111156155e457600080fd5b9250929050565b60008060006040848603121561560057600080fd5b833561560b81615246565b9250602084013567ffffffffffffffff81111561562757600080fd5b6156338682870161559f565b9497909650939450505050565b6000806040838503121561565357600080fd5b50508035926020909101359150565b6000806000806040858703121561567857600080fd5b843567ffffffffffffffff8082111561569057600080fd5b61569c8883890161559f565b909650945060208701359150808211156156b557600080fd5b506156c28782880161559f565b95989497509550505050565b600080602083850312156156e157600080fd5b823567ffffffffffffffff8111156156f857600080fd5b6157048582860161559f565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156157485783518352928401929184019160010161572c565b50909695505050505050565b60008060006060848603121561576957600080fd5b83359250615403602085016151f6565b6000806000806080858703121561578f57600080fd5b615798856151f6565b93506020850135925060408501356157af81615246565b91506157bd606086016151f6565b905092959194509250565b60008060008060008060c087890312156157e157600080fd5b86359550602087013594506157f8604088016151f6565b935060608701359250608087013561580f81615246565b915060a087013561581f81615246565b809150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561585d5761585d61582d565b500290565b60008261587f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156158ae576158ae61582d565b5060010190565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b60006020828403121561592b57600080fd5b815161115481615246565b6020808252818101527f416464726573732070726573656e7420696e2073616e6374696f6e206c697374604082015260600190565b60008282101561597d5761597d61582d565b500390565b600082198211156159955761599561582d565b500190565b6020808252601e908201527f55736572206e6f742077686974656c697374656420666f72207374616b650000604082015260600190565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b805169ffffffffffffffffffff8116811461520d57600080fd5b600080600080600060a08688031215615a3257600080fd5b615a3b86615a00565b9450602086015193506040860151925060608601519150615a5e60808701615a00565b90509295509295909350565b60006001600160ff1b0381841382841380821686840486111615615a9057615a9061582d565b600160ff1b6000871282811687830589121615615aaf57615aaf61582d565b60008712925087820587128484161615615acb57615acb61582d565b87850587128184161615615ae157615ae161582d565b505050929093029392505050565b600060208284031215615b0157600080fd5b5051919050565b60208082526021908201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636040820152606560f81b606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526016908201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b604082015260600190565b6000825160005b81811015615bbe5760208186018101518583015201615ba4565b81811115615bcd576000828501525b509190910192915050565b602080825260149082015273151bdad95b881c185e5b595b9d0819985a5b195960621b60408201526060019056fe6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4754d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36a26469706673582212203448370fd6ca7cb90265436efd0e9d72ebe445cb9a2a9faef1bd095f3c5df5b064736f6c63430008090033
Verified Source Code Partial Match
Compiler: v0.8.9+commit.e5eed63a
EVM: london
Optimization: Yes (200 runs)
Presale.sol 1347 lines
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: 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 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File contracts/ETH/PresaleV1.sol // _ _____ _ // __ _____| |__|___ / _ __ __ _ _ _ _ __ ___ ___ _ __ | |_ ___ // \ \ /\ / / _ \ '_ \ |_ \| '_ \ / _` | | | | '_ ` _ \ / _ \ '_ \| __/ __| // \ V V / __/ |_) |__) | |_) | (_| | |_| | | | | | | __/ | | | |_\__ \ // \_/\_/ \___|_.__/____/| .__/ \__,_|\__, |_| |_| |_|\___|_| |_|\__|___/ // |_| |___/ // pragma solidity 0.8.9; interface Aggregator { function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } interface StakingManager { function depositByPresale(address _user, uint256 _amount) external; } interface ISanctionsList { function isSanctioned(address addr) external view returns (bool); } contract Presale is ReentrancyGuard, Ownable, Pausable { // Structs for input grouping only struct ContractAddresses { address oracle; address usdt; address usdc; } struct PresaleConfig { uint256 startTime; uint256 maxTokensToBuy; bool dynamicTimeFlag; uint256 timeConstant; } // Presale config uint256 public startTime; uint256 public claimStart; uint256 public maxTokensToBuy; uint256 public baseDecimals; bool public dynamicTimeFlag; uint256 public timeConstant; // Token and payment tracking uint256 public totalTokensSold; uint256 public totalBoughtAndStaked; uint256 public usdRaised; address public saleToken; address public paymentWallet; address public admin; address public manager; // Round and checkpoint data uint256 public currentStep; uint256 public checkPoint; uint256[][3] public rounds; uint256[] public prevCheckpoints; uint256[] public remainingTokensTracker; uint256[] public percentages; address[] public wallets; // Interfaces IERC20 public USDTInterface; IERC20 public USDCInterface; Aggregator public aggregatorInterface; StakingManager public stakingManagerInterface; ISanctionsList public sanctionsList; // Flags and lists bool public applySanctions; bool public stakingWhitelistStatus; //New Variables address public web3PaymentWallet; uint256 public web3PaymentPercentage; uint256 public referrerPercentage; uint256 public initialReferrerPercentage; bool public referrersMustBeBuyers; bool public payInitialReferrers; uint256 public seededAmount; uint256 public seededUsers; mapping(address => uint256) public userDeposits; mapping(address => bool) public hasClaimed; mapping(address => bool) public isBlacklisted; mapping(address => bool) public isWhitelisted; mapping(address => bool) public wertWhitelisted; mapping(address => bool) public blacklistedReferrers; mapping(address => address) public initialReferrers; // Events event SaleTokenUpdated(address token); event SaleTimeSet(uint256 _start, uint256 timestamp); event SaleTimeUpdated(bytes32 indexed key, uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBought(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensAdded(address indexed token, uint256 noOfTokens, uint256 timestamp); event TokensClaimed(address indexed user, uint256 amount, uint256 timestamp); event ClaimStartUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBoughtAndStaked(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensClaimedAndStaked(address indexed user, uint256 amount, uint256 timestamp); /** * @notice Constructor for the Presale contract. * @param _contracts Struct containing addresses of external contracts (oracle, USDT, USDC). * @param _config Struct containing configuration parameters for the presale (start/end times, max tokens, etc.). * @param _rounds A 3-dimensional array defining the rounds of the presale, containing price tiers or limits per round. */ constructor(ContractAddresses memory _contracts, PresaleConfig memory _config, uint256[][3] memory _rounds) { // --- Input Validations --- require(_contracts.oracle != address(0), 'Zero aggregator address'); require(_contracts.usdt != address(0), 'Zero USDT address'); require(_contracts.usdc != address(0), 'Zero USDC address'); require(_config.startTime > block.timestamp, 'Invalid time'); // --- Contract Interface Initializations --- aggregatorInterface = Aggregator(_contracts.oracle); USDTInterface = IERC20(_contracts.usdt); USDCInterface = IERC20(_contracts.usdc); // --- State Variable Initializations --- baseDecimals = (10 ** 18); startTime = _config.startTime; rounds = _rounds; maxTokensToBuy = _config.maxTokensToBuy; paymentWallet = msg.sender; dynamicTimeFlag = _config.dynamicTimeFlag; timeConstant = _config.timeConstant; manager = msg.sender; // --- Event Emission --- emit SaleTimeSet(startTime, block.timestamp); } //Role Check Functions //Info : Used functions instead of modifiers to reduce contract size function _onlyManagerOrOwner() internal view { require(msg.sender == manager || msg.sender == owner(), 'caller not manager or owner'); } function _onlyAdminOrManagerOrOwner() internal view { require(msg.sender == admin || msg.sender == manager || msg.sender == owner(), 'caller not admin, manager or owner'); } function _onlyManager() internal view { require(msg.sender == manager, 'caller not manager'); } /** * @dev To pause the presale */ function pause() external { _onlyManagerOrOwner(); _pause(); } /** * @dev To unpause the presale */ function unpause() external { _onlyManagerOrOwner(); _unpause(); } /** * @dev To calculate the price in USD for given amount of tokens. * @param _amount No of tokens */ function calculatePrice(uint256 _amount) public view returns (uint256) { uint256 USDTAmount; uint256 total = checkPoint == 0 ? totalTokensSold : checkPoint; require(_amount <= maxTokensToBuy, 'Amount exceeds max tokens to buy'); if (_amount + total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { require(currentStep < (rounds[0].length - 1), 'Wrong params'); if (block.timestamp >= rounds[2][currentStep]) { require(rounds[0][currentStep] + _amount <= rounds[0][currentStep + 1], 'Cant Purchase More in individual tx'); USDTAmount = _amount * rounds[1][currentStep + 1]; } else { uint256 tokenAmountForCurrentPrice = rounds[0][currentStep] - total; USDTAmount = tokenAmountForCurrentPrice * rounds[1][currentStep] + (_amount - tokenAmountForCurrentPrice) * rounds[1][currentStep + 1]; } } else USDTAmount = _amount * rounds[1][currentStep]; return USDTAmount; } /** * @dev To update the sale times * @param _startTime New start time */ function changeSaleTimes(uint256 _startTime) external { _onlyManagerOrOwner(); require(_startTime > 0, 'Invalid parameters'); require(block.timestamp < _startTime, 'Sale time in past'); uint256 prevValue = startTime; startTime = _startTime; emit SaleTimeUpdated(bytes32('START'), prevValue, _startTime, block.timestamp); } /** * @dev To get latest ETH price in 10**18 format */ function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = aggregatorInterface.latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } function setSplits(address[] memory _wallets, uint256[] memory _percentages) public { _onlyManager(); require(_wallets.length == _percentages.length, 'Mismatched arrays'); delete wallets; delete percentages; uint256 totalPercentage = 0; for (uint256 i = 0; i < _wallets.length; i++) { require(_percentages[i] > 0, 'Percentage must be greater than 0'); totalPercentage += _percentages[i]; wallets.push(_wallets[i]); percentages.push(_percentages[i]); } require(totalPercentage == 100000, 'Total percentage must equal 100'); } modifier checkSaleState(uint256 amount) { require(block.timestamp >= startTime, 'Invalid time for buying'); require(amount > 0, 'Invalid sale amount'); _; } /** * @dev To buy into a presale using USDT * @param amount No of tokens to buy * @param stake boolean flag for token staking * @param referrer Address of referrer, can pass zero address if no referrer */ function buyWithUSDT(uint256 amount, bool stake, address referrer) external checkSaleState(amount) checkSanction(_msgSender()) whenNotPaused returns (bool) { uint256 usdPrice = calculatePrice(amount); totalTokensSold += amount; uint256 price = usdPrice / (10 ** 12); if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } usdRaised += usdPrice; uint256 ourAllowance = USDTInterface.allowance(_msgSender(), address(this)); require(price <= ourAllowance, 'Make sure to add enough allowance'); splitUSDTValue(price, referrer); return true; } /** * @dev To buy into a presale using USDC * @param amount No of tokens to buy * @param stake boolean flag for token staking * @param referrer Address of referrer, can pass zero address if no referrer */ function buyWithUSDC(uint256 amount, bool stake, address referrer) external checkSaleState(amount) checkSanction(_msgSender()) whenNotPaused returns (bool) { uint256 usdPrice = calculatePrice(amount); totalTokensSold += amount; uint256 price = usdPrice / (10 ** 12); if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(USDCInterface), price, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(USDCInterface), price, usdPrice, block.timestamp); } usdRaised += usdPrice; uint256 ourAllowance = USDCInterface.allowance(_msgSender(), address(this)); require(price <= ourAllowance, 'Make sure to add enough allowance'); splitUSDCValue(price, referrer); return true; } /** * @dev To buy into a presale using ETH * @param amount No of tokens to buy * @param stake boolean flag for token staking * @param referrer Address of referrer, can pass zero address if no referrer */ function buyWithEth(uint256 amount, bool stake, address referrer) external payable checkSaleState(amount) checkSanction(_msgSender()) whenNotPaused nonReentrant returns (bool) { uint256 usdPrice = calculatePrice(amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; totalTokensSold += amount; if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount, referrer, _msgSender()); if (excess > 0) sendValue(payable(_msgSender()), excess); return true; } /** * @dev To buy ETH directly from wert .*wert contract address should be whitelisted if wertBuyRestrictionStatus is set true * @param _user address of the user * @param _amount No of ETH to buy * @param stake boolean flag for token staking * @param referrer Address of referrer, can pass zero address if no referrer */ function buyWithETHWert(address _user, uint256 _amount, bool stake, address referrer) external payable checkSaleState(_amount) checkSanction(_user) whenNotPaused nonReentrant returns (bool) { require(wertWhitelisted[_msgSender()], 'User not whitelisted for this tx'); uint256 usdPrice = calculatePrice(_amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; totalTokensSold += _amount; if (checkPoint != 0) checkPoint += _amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + _amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - _amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakingWhitelistStatus) { require(isWhitelisted[_user], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_user, _amount * baseDecimals); totalBoughtAndStaked += _amount; emit TokensBoughtAndStaked(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_user] += (_amount * baseDecimals); emit TokensBought(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount, referrer, _user); if (excess > 0) sendValue(payable(_user), excess); return true; } /** * @dev Helper function to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) external view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } /** * @dev Helper function to get USDT price for given amount * @param amount No of tokens to buy */ function usdtBuyHelper(uint256 amount) external view returns (uint256 usdPrice) { usdPrice = calculatePrice(amount); usdPrice = usdPrice / (10 ** 12); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Low balance'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'ETH Payment failed'); } function splitETHValue(uint256 _amount, address _referrer, address _user) internal { uint256 amountForWeb3PaymentWallet; if (web3PaymentWallet != address(0)) { amountForWeb3PaymentWallet = payReferrersHelper(_amount, web3PaymentWallet, web3PaymentPercentage, address(0)); } uint256 amountForReferrers = payReferrers(_amount, _user, _referrer, address(0)); _amount -= (amountForWeb3PaymentWallet + amountForReferrers); if (wallets.length == 0) { require(paymentWallet != address(0), 'Payment wallet not set'); sendValue(payable(paymentWallet), _amount); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100000; sendValue(payable(wallets[i]), amountToTransfer); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { sendValue(payable(wallets[wallets.length - 1]), _amount - tempCalc); } } } function splitUSDTValue(uint256 _amount, address _referrer) internal { uint256 amountForWeb3PaymentWallet; if (web3PaymentWallet != address(0)) { amountForWeb3PaymentWallet = payReferrersHelper(_amount, web3PaymentWallet, web3PaymentPercentage, address(USDTInterface)); } uint256 amountForReferrers = payReferrers(_amount, _msgSender(), _referrer, address(USDTInterface)); _amount -= (amountForWeb3PaymentWallet + amountForReferrers); if (wallets.length == 0) { require(paymentWallet != address(0), 'Payment wallet not set'); (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), paymentWallet, _amount)); require(success, 'Token payment failed'); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100000; (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[i], amountToTransfer)); require(success, 'Token payment failed'); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[wallets.length - 1], _amount - tempCalc)); require(success, 'Token payment failed'); } } } function splitUSDCValue(uint256 _amount, address _referrer) internal { uint256 amountForWeb3PaymentWallet; if (web3PaymentWallet != address(0)) { amountForWeb3PaymentWallet = payReferrersHelper(_amount, web3PaymentWallet, web3PaymentPercentage, address(USDCInterface)); } uint256 amountForReferrers = payReferrers(_amount, _msgSender(), _referrer, address(USDCInterface)); _amount -= (amountForWeb3PaymentWallet + amountForReferrers); if (wallets.length == 0) { require(paymentWallet != address(0), 'Payment wallet not set'); (bool success, ) = address(USDCInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), paymentWallet, _amount)); require(success, 'Token payment failed'); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100000; (bool success, ) = address(USDCInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[i], amountToTransfer)); require(success, 'Token payment failed'); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { (bool success, ) = address(USDCInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[wallets.length - 1], _amount - tempCalc)); require(success, 'Token payment failed'); } } } /** * @dev to initialize staking manager with new address * @param _stakingManagerAddress address of the staking smartcontract */ function setStakingManager(address _stakingManagerAddress) external { _onlyManagerOrOwner(); require(_stakingManagerAddress != address(0), 'staking manager cannot be initialized with zero address'); stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20(saleToken).approve(_stakingManagerAddress, type(uint256).max); } /** * @dev To set the claim start time and sale token address by the owner * @param noOfTokens no of tokens to add to the contract * @param _saleToken sale toke address */ function startClaim(uint256 noOfTokens, address _saleToken, address _stakingManagerAddress) external returns (bool) { _onlyManagerOrOwner(); require(_saleToken != address(0), 'Zero token address'); saleToken = _saleToken; stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20(_saleToken).approve(_stakingManagerAddress, type(uint256).max); bool success = IERC20(_saleToken).transferFrom(_msgSender(), address(this), noOfTokens); require(success, 'Token transfer failed'); emit TokensAdded(_saleToken, noOfTokens, block.timestamp); return true; } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setStakingWhitelistStatus(bool _status) external { _onlyManagerOrOwner(); stakingWhitelistStatus = _status; } function setSaleToken(address _saleToken) external { _onlyManagerOrOwner(); require(_saleToken != address(0), 'Zero token address'); saleToken = _saleToken; emit SaleTokenUpdated(saleToken); } /** * @dev To change the claim start time by the owner * @param _claimStart new claim start time */ function changeClaimStart(uint256 _claimStart) external returns (bool) { _onlyManagerOrOwner(); uint256 prevValue = claimStart; claimStart = _claimStart; emit ClaimStartUpdated(prevValue, _claimStart, block.timestamp); return true; } /** * @dev To claim tokens after claiming starts */ function claim() external whenNotPaused returns (bool) { require(saleToken != address(0), 'Sale token not added'); require(!isBlacklisted[_msgSender()], 'This Address is Blacklisted'); require((claimStart > 0 && block.timestamp >= claimStart) || isWhitelisted[_msgSender()], 'Claim has not started yet'); require(!hasClaimed[_msgSender()], 'Already claimed'); hasClaimed[_msgSender()] = true; uint256 amount = userDeposits[_msgSender()]; require(amount > 0, 'Nothing to claim'); delete userDeposits[_msgSender()]; bool success = IERC20(saleToken).transfer(_msgSender(), amount); require(success, 'Token transfer failed'); emit TokensClaimed(_msgSender(), amount, block.timestamp); return true; } function claimAndStake() external whenNotPaused returns (bool) { require(saleToken != address(0), 'Sale token not added'); require(!isBlacklisted[_msgSender()], 'This Address is Blacklisted'); if (stakingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } uint256 amount = userDeposits[_msgSender()]; require(amount > 0, 'Nothing to stake'); totalBoughtAndStaked += amount / baseDecimals; stakingManagerInterface.depositByPresale(_msgSender(), amount); delete userDeposits[_msgSender()]; emit TokensClaimedAndStaked(_msgSender(), amount, block.timestamp); return true; } /** * @dev To add wert contract addresses to whitelist * @param _whitelistStatus true for whitelisting, false to remove from whitelist * @param _addressesToWhitelist addresses of the contract */ function whitelistUsersForWERT(bool _whitelistStatus, address[] calldata _addressesToWhitelist) external { _onlyManagerOrOwner(); for (uint256 i = 0; i < _addressesToWhitelist.length; i++) { wertWhitelisted[_addressesToWhitelist[i]] = _whitelistStatus; } } function changeMaxTokensToBuy(uint256 _maxTokensToBuy) external { _onlyManagerOrOwner(); require(_maxTokensToBuy > 0, 'Zero max tokens to buy value'); maxTokensToBuy = _maxTokensToBuy; } function changeRoundsData(uint256[][3] memory _rounds) external { _onlyManagerOrOwner(); rounds = _rounds; } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _blacklistStatus true for blacklisting, false to remove from blacklist * @param _usersToBlacklist addresses of the users */ function blacklistUsers(bool _blacklistStatus, address[] calldata _usersToBlacklist) external { _onlyManagerOrOwner(); for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = _blacklistStatus; } } /** * @dev To add users to whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _whitelistStatus true for whitelisting, false to remove from whitelist * @param _usersToWhitelist addresses of the users */ function whitelistUsers(bool _whitelistStatus, address[] calldata _usersToWhitelist) external { _onlyManagerOrOwner(); for (uint256 i = 0; i < _usersToWhitelist.length; i++) { isWhitelisted[_usersToWhitelist[i]] = _whitelistStatus; } } /** * @dev To set payment wallet address * @param _newPaymentWallet new payment wallet address */ function changePaymentWallet(address _newPaymentWallet) external { _onlyManagerOrOwner(); require(_newPaymentWallet != address(0), 'address cannot be zero'); paymentWallet = _newPaymentWallet; } /** * @dev To manage time gap between two rounds */ function manageTimeDiff() internal { for (uint256 i; i < rounds[2].length - currentStep; i++) { rounds[2][currentStep + i] = block.timestamp + i * timeConstant; } } /** * @dev To set time constant for manageTimeDiff() * @param _timeConstant time in <days>*24*60*60 format */ function setTimeConstant(uint256 _timeConstant) external { _onlyManagerOrOwner(); timeConstant = _timeConstant; } /** * @dev To get array of round details at once * @param _no array index */ function roundDetails(uint256 _no) external view returns (uint256[] memory) { return rounds[_no]; } /** * @dev to update userDeposits for purchases made on other chains * @param _users array of users * @param _userDeposits array of userDeposits associated with users */ function userSeeder(address[] calldata _users, uint256[] calldata _userDeposits) external { _onlyManagerOrOwner(); require(_users.length == _userDeposits.length, 'Length mismatch'); uint256 totalDepositsInCall = 0; for (uint256 i = 0; i < _users.length; i++) { userDeposits[_users[i]] += _userDeposits[i]; totalDepositsInCall += _userDeposits[i]; } seededUsers += _users.length; seededAmount += totalDepositsInCall; } /** * @dev To increment the rounds from backend */ function incrementCurrentStep() external { _onlyAdminOrManagerOrOwner(); prevCheckpoints.push(checkPoint); if (dynamicTimeFlag) { manageTimeDiff(); } if (checkPoint < rounds[0][currentStep]) { if (currentStep == 0) { remainingTokensTracker.push(rounds[0][currentStep] - totalTokensSold); } else { remainingTokensTracker.push(rounds[0][currentStep] - checkPoint); } checkPoint = rounds[0][currentStep]; } currentStep++; } /** * @dev To set admin * @param _admin new admin wallet address */ function setAdmin(address _admin) external { _onlyManagerOrOwner(); admin = _admin; } /** * @dev To change details of the round * @param _step round for which you want to change the details * @param _checkpoint token tracker amount */ function setCurrentStep(uint256 _step, uint256 _checkpoint) external { _onlyManagerOrOwner(); currentStep = _step; checkPoint = _checkpoint; } /** * @dev To set time shift functionality on/off * @param _dynamicTimeFlag bool value */ function setDynamicTimeFlag(bool _dynamicTimeFlag) external { _onlyManagerOrOwner(); dynamicTimeFlag = _dynamicTimeFlag; } /** * @dev Function to return remainingTokenTracker Array */ function trackRemainingTokens() external view returns (uint256[] memory) { return remainingTokensTracker; } /** * @dev To update remainingTokensTracker Array (pass 0 to delete existing array) * @param _unsoldTokens input parameters in uint256 array format */ function setRemainingTokensArray(uint256[] memory _unsoldTokens) public { _onlyAdminOrManagerOrOwner(); require(_unsoldTokens.length != 0, 'cannot update invalid values'); if (_unsoldTokens.length == 1 && _unsoldTokens[0] == 0) { delete remainingTokensTracker; } else { delete remainingTokensTracker; for (uint256 i; i < _unsoldTokens.length; i++) { remainingTokensTracker.push(_unsoldTokens[i]); } } } /** * @dev Sets the sanction details * @param _sanctionContract addresses of the contract * @param _applySanction boolean on whether the contract has to consider sanction list or not */ function setSanctions(address _sanctionContract, bool _applySanction) external { _onlyManagerOrOwner(); require(_sanctionContract != address(0)); sanctionsList = ISanctionsList(_sanctionContract); applySanctions = _applySanction; } /** * @dev Checks if sanction list is enabled and if user is in sanction list, reverts the transaction. * @param _user addresses of the user */ modifier checkSanction(address _user) { if (applySanctions) { require(!sanctionsList.isSanctioned(_user), 'Address present in sanction list'); } _; } function changeManager(address _manager) external { _onlyManager(); manager = _manager; } function renounceManager() external onlyOwner { manager = address(0); } /** * @dev To Update referral Details in a single go * @param _refereePercentage new percentage for referrals. * @param _initialReferrerPercentage new percentage for initial referrals. * @param _paymentAddress new web3 payment wallet address * @param _percentage new percentage. * @param _referrersMustBeBuyers boolean value * @param _payInitialReferrers boolean value */ function referrerDetails(uint256 _refereePercentage, uint256 _initialReferrerPercentage, address _paymentAddress, uint256 _percentage, bool _referrersMustBeBuyers, bool _payInitialReferrers) external { _onlyManagerOrOwner(); referrerPercentage = _refereePercentage; initialReferrerPercentage = _initialReferrerPercentage; web3PaymentWallet = _paymentAddress; web3PaymentPercentage = _percentage; referrersMustBeBuyers = _referrersMustBeBuyers; payInitialReferrers = _payInitialReferrers; } /** * @dev To Update referral percentage * @param _refereePercentage new percentage for referrals. * @param _initialReferrerPercentage new percentage for initial referrals. */ function updateReferrerPercentage(uint256 _refereePercentage, uint256 _initialReferrerPercentage) external { _onlyManagerOrOwner(); referrerPercentage = _refereePercentage; initialReferrerPercentage = _initialReferrerPercentage; } /** * @dev To Update referrers should be buyers or not for referral * @param _referrersMustBeBuyers boolean value */ function updateReferrersMustBeBuyers(bool _referrersMustBeBuyers) external { _onlyManagerOrOwner(); referrersMustBeBuyers = _referrersMustBeBuyers; } /** * @dev To determine if initial referees are to be paid * @param _payInitialReferrers boolean value */ function shouldPayInitialReferrers(bool _payInitialReferrers) external { _onlyManagerOrOwner(); payInitialReferrers = _payInitialReferrers; } /** * @dev To Update web3 payment details * @param _paymentAddress new web3 payment wallet address * @param _percentage new percentage. */ function updateWeb3PaymentDetails(address _paymentAddress, uint256 _percentage) external { _onlyManagerOrOwner(); web3PaymentWallet = _paymentAddress; web3PaymentPercentage = _percentage; } /** * @dev To add users to blacklisted Referral mapping * @param _referrers addresses of the users */ function blacklistReferrer(address[] calldata _referrers) external { _onlyManagerOrOwner(); uint256 referrersLen = _referrers.length; for (uint256 i = 0; i < referrersLen; i++) { blacklistedReferrers[_referrers[i]] = true; } } /** * @dev To remove users from blacklisted Referral mapping * @param _referrers addresses of the users */ function removeFromBlacklistedReferrerMapping(address[] calldata _referrers) external { _onlyManagerOrOwner(); uint256 referrersLen = _referrers.length; for (uint256 i = 0; i < referrersLen; i++) { blacklistedReferrers[_referrers[i]] = false; } } /** * @dev Returns a boolean based on referral can be applied or not * @param _referrer addresses of the users */ function checkReferralStatus(address _referrer) public view returns (bool) { if (_referrer == address(0) || blacklistedReferrers[_referrer] || _referrer == _msgSender()) { return false; } if (!referrersMustBeBuyers) { return true; } return userDeposits[_referrer] > 0; } /** * @dev Pays referrers in USDT/ETH and returns the total amount paid. * @param _amount The base amount used for referral payment calculations. * @param _referred The address of the referred user. * @param _referrer The address of the referring user. */ function payReferrers(uint256 _amount, address _referred, address _referrer, address _token) internal returns (uint256) { uint256 totalPaid; address referrer = getOrInsertInitialReferrer(_referred, _referrer); if (!checkReferralStatus(referrer)) { return totalPaid; } totalPaid += payReferrersHelper(_amount, referrer, referrerPercentage, _token); if (!payInitialReferrers) { return totalPaid; } address initialReferrer = getOrInsertInitialReferrer(referrer, address(0)); if (!checkReferralStatus(initialReferrer)) { return totalPaid; } return (totalPaid + payReferrersHelper(_amount, initialReferrer, initialReferrerPercentage, _token)); } /** * @dev Helper function to pay a referrer and return the amount paid. * @param _amount The base amount for payment calculation. * @param _referrer The address of the referrer. * @param _percentage The percentage of the base amount to pay. */ function payReferrersHelper(uint256 _amount, address _referrer, uint256 _percentage, address _token) internal returns (uint256) { uint256 amountForReferrer = (_amount * _percentage) / 100; if (_token != address(0)) { (bool success, ) = _token.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), _referrer, amountForReferrer)); require(success, 'Token payment failed'); } else { sendValue(payable(_referrer), amountForReferrer); } return amountForReferrer; } /** * @dev Returns the initial referrer or inserts one if not present. * @param _referred The address of the referred user. * @param _referrer The address of the referrer to insert if missing. */ function getOrInsertInitialReferrer(address _referred, address _referrer) internal returns (address) { if (initialReferrers[_referred] == address(0) && _referred != _referrer) { initialReferrers[_referred] = _referrer; } retu... // [truncated — 50872 bytes total]
Read Contract
USDCInterface 0x25312e54 → address
USDTInterface 0xf597573f → address
admin 0xf851a440 → address
aggregatorInterface 0xc49cc645 → address
applySanctions 0x30e74f08 → bool
baseDecimals 0x33f76178 → uint256
blacklistedReferrers 0x032bd1f7 → bool
calculatePrice 0xae104265 → uint256
checkPoint 0xcff805ab → uint256
checkReferralStatus 0xbb695f2a → bool
claimStart 0xf04d688f → uint256
currentStep 0x5bc34f71 → uint256
dynamicTimeFlag 0x1fa2bc92 → bool
ethBuyHelper 0x29a5a0b6 → uint256
getLatestPrice 0x8e15f473 → uint256
hasClaimed 0x73b2e80e → bool
initialReferrerPercentage 0xe6e78d06 → uint256
initialReferrers 0xb4d94f44 → address
isBlacklisted 0xfe575a87 → bool
isWhitelisted 0x3af32abf → bool
manager 0x481c6a75 → address
maxTokensToBuy 0x9cfa0f7c → uint256
owner 0x8da5cb5b → address
paused 0x5c975abb → bool
payInitialReferrers 0x8dcf67ca → bool
paymentWallet 0xe32204dd → address
percentages 0xf8858386 → uint256
prevCheckpoints 0xe19648db → uint256
referrerPercentage 0x88c3e458 → uint256
referrersMustBeBuyers 0xca1600b6 → bool
remainingTokensTracker 0xc23326f3 → uint256
roundDetails 0xba166a39 → uint256[]
rounds 0xe6da9213 → uint256
saleToken 0xe985e367 → address
sanctionsList 0xec571c6a → address
seededAmount 0x37ba5094 → uint256
seededUsers 0xc6cc2672 → uint256
stakingManagerInterface 0x38646608 → address
stakingWhitelistStatus 0x232e95be → bool
startTime 0x78e97925 → uint256
timeConstant 0x43568eae → uint256
totalBoughtAndStaked 0x7f6fb253 → uint256
totalTokensSold 0x63b20117 → uint256
trackRemainingTokens 0xc8adff01 → uint256[]
usdRaised 0xeadd94ec → uint256
usdtBuyHelper 0x63e40879 → uint256
userDeposits 0x0ba36dcd → uint256
wallets 0x7ad71f72 → address
web3PaymentPercentage 0x4bc6191a → uint256
web3PaymentWallet 0x50429ee4 → address
wertWhitelisted 0x5df4f353 → bool
Write Contract 42 functions
These functions modify contract state and require a wallet transaction to execute.
blacklistReferrer 0xa2db6416
address[] _referrers
blacklistUsers 0x6e6973dd
bool _blacklistStatus
address[] _usersToBlacklist
buyWithETHWert 0xfe21a94f
address _user
uint256 _amount
bool stake
address referrer
returns: bool
buyWithEth 0x4151848f
uint256 amount
bool stake
address referrer
returns: bool
buyWithUSDC 0xf0120ff8
uint256 amount
bool stake
address referrer
returns: bool
buyWithUSDT 0xd1690fec
uint256 amount
bool stake
address referrer
returns: bool
changeClaimStart 0x07f18082
uint256 _claimStart
returns: bool
changeManager 0xa3fbbaae
address _manager
changeMaxTokensToBuy 0x278c278b
uint256 _maxTokensToBuy
changePaymentWallet 0xcad00556
address _newPaymentWallet
changeRoundsData 0xa6d42e4e
uint256[][3] _rounds
changeSaleTimes 0xf0566334
uint256 _startTime
claim 0x4e71d92d
No parameters
returns: bool
claimAndStake 0xcb1a4fc0
No parameters
returns: bool
incrementCurrentStep 0x641046f4
No parameters
pause 0x8456cb59
No parameters
referrerDetails 0xff14ca11
uint256 _refereePercentage
uint256 _initialReferrerPercentage
address _paymentAddress
uint256 _percentage
bool _referrersMustBeBuyers
bool _payInitialReferrers
removeFromBlacklistedReferrerMapping 0xd2589196
address[] _referrers
renounceManager 0xf8b91abe
No parameters
renounceOwnership 0x715018a6
No parameters
resetPresale 0x415eed46
uint256[][3] _rounds
returns: bool
setAdmin 0x704b6c02
address _admin
setCurrentStep 0x9a89c1fb
uint256 _step
uint256 _checkpoint
setDynamicTimeFlag 0x0a200fc7
bool _dynamicTimeFlag
setRemainingTokensArray 0x2dc358e8
uint256[] _unsoldTokens
setSaleToken 0xa29f481c
address _saleToken
setSanctions 0x2c73304d
address _sanctionContract
bool _applySanction
setSplits 0x5ddc5688
address[] _wallets
uint256[] _percentages
setStakingManager 0xb00bba6a
address _stakingManagerAddress
setStakingWhitelistStatus 0xeac0d115
bool _status
setTimeConstant 0x23a8f1c0
uint256 _timeConstant
shouldPayInitialReferrers 0x86fc6ea8
bool _payInitialReferrers
startClaim 0xefc86478
uint256 noOfTokens
address _saleToken
address _stakingManagerAddress
returns: bool
tokenTransfer 0x68cdafe6
address _token
uint256 amount
transferOwnership 0xf2fde38b
address newOwner
unpause 0x3f4ba83a
No parameters
updateReferrerPercentage 0xb8d612ec
uint256 _refereePercentage
uint256 _initialReferrerPercentage
updateReferrersMustBeBuyers 0x61ad0b7c
bool _referrersMustBeBuyers
updateWeb3PaymentDetails 0xf0ff8923
address _paymentAddress
uint256 _percentage
userSeeder 0xa1fe1dee
address[] _users
uint256[] _userDeposits
whitelistUsers 0xeb66e2ef
bool _whitelistStatus
address[] _usersToWhitelist
whitelistUsersForWERT 0x6ddcca29
bool _whitelistStatus
address[] _addressesToWhitelist
Recent Transactions
No transactions found for this address