Address Contract Verified
Address
0xb5C5fc6d3576ae31B24DC18e5bcb8a4822F13333
Balance
0 ETH
Nonce
1
Code Size
16731 bytes
Creator
0x8231181E...9104 at tx 0x2fc655e9...777520
Indexed Transactions
0
Contract Bytecode
16731 bytes
0x60806040526004361061016e5760003560e01c80635c89dfe1116100cb578063a9059cbb1161007f578063db7c4dda11610059578063db7c4dda146103ca578063dd62ed3e146103dd578063f2fde38b1461042357600080fd5b8063a9059cbb1461036a578063af66394d1461038a578063ccec3716146103aa57600080fd5b806378f8484b116100b057806378f8484b1461030d5780638da5cb5b1461032d57806395d89b411461035557600080fd5b80635c89dfe1146102b557806370a08231146102d757600080fd5b806323b872dd1161012257806344ee3a1c1161010757806344ee3a1c1461026d5780634839c8b31461028d578063505f5c08146102a257600080fd5b806323b872dd1461022b578063313ce5671461024b57600080fd5b80630b45260e116101535780630b45260e146101d557806318160ddd146101ec57806320ffb26d1461020b57600080fd5b806306fdde031461017a578063095ea7b3146101a557600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061018f610443565b60405161019c9190612ac6565b60405180910390f35b3480156101b157600080fd5b506101c56101c0366004612b2a565b6104d5565b604051901515815260200161019c565b3480156101e157600080fd5b506101ea6104ec565b005b3480156101f857600080fd5b506016545b60405190815260200161019c565b34801561021757600080fd5b506101ea610226366004612b56565b6106ee565b34801561023757600080fd5b506101c5610246366004612b6f565b6107d3565b34801561025757600080fd5b5060155460405160ff909116815260200161019c565b34801561027957600080fd5b506101ea610288366004612b56565b61087b565b34801561029957600080fd5b506101ea6109b1565b6101ea6102b0366004612bbe565b610be4565b3480156102c157600080fd5b506102ca610e91565b60405161019c9190612bee565b3480156102e357600080fd5b506101fd6102f2366004612cb4565b6001600160a01b031660009081526006602052604090205490565b34801561031957600080fd5b506101ea610328366004612cd8565b610fde565b34801561033957600080fd5b506000546040516001600160a01b03909116815260200161019c565b34801561036157600080fd5b5061018f61118d565b34801561037657600080fd5b506101c5610385366004612b2a565b61119c565b34801561039657600080fd5b506101ea6103a5366004612cfa565b6111a9565b3480156103b657600080fd5b506101ea6103c5366004612cb4565b6113bd565b6101ea6103d8366004612d7c565b61150b565b3480156103e957600080fd5b506101fd6103f8366004612dbe565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561042f57600080fd5b506101ea61043e366004612cb4565b611bbc565b60606017805461045290612dec565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90612dec565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050905090565b60006104e2338484611c88565b5060015b92915050565b6000546001600160a01b0316331461052f5760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105535750602054600160c81b900460ff16155b80156105685750602054600160a01b900460ff165b6105985760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa158015610628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064c9190612e26565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612e3f565b6106ec5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610526565b565b6000546001600160a01b03163314801561070a57506000602254115b80156107165750600081115b6107465760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b80602260008282546107589190612e72565b9091555050602254606410156107955760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610526565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107c891815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561082b5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610526565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610866918691610861908690612e85565b611c88565b610871848484611d0f565b5060019392505050565b6000546001600160a01b031633146108b95760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160c81b900460ff161580156108dd5750602054600160c01b900460ff16155b80156108f25750602054600160a01b900460ff165b6109225760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b42602154620151806109349190612e98565b6014546109419190612e72565b10156109675762015180601454426109599190612e85565b6109639190612eaf565b6021555b80602160008282546109799190612e72565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107c8565b6000546001600160a01b031633146109ef5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160c81b900460ff16158015610a135750602054600160c01b900460ff16155b8015610a285750602054600160a01b900460ff165b610a585760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b42602154603c610a689190612e98565b610a7390603c612e98565b610a7e906018612e98565b601454610a8b9190612e72565b10156106ec5760208054600160c81b60ff60c81b198216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b109190612e26565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb19190612e3f565b610be15760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610526565b50565b6000546001600160a01b031633148015610c085750602054600160c01b900460ff16155b8015610c1e5750602054600160c81b900460ff16155b8015610c385750602054600160a01b900460ff1615156001145b8015610c475750621275008210155b610c775760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b6020546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce49190612e26565b60205460035460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612e3f565b506003546020546001600160a01b0391821691635af06fed913491163385610d878942612e72565b600089610d95576000610da2565b6009546001600160a01b03165b60405160e089901b6001600160e01b03191681526001600160a01b0396871660048201529486166024860152604485019390935260648401919091521515608483015290911660a482015260c40160206040518083038185885af1158015610e0e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e339190612e26565b60028190556020805460ff60c81b1916600160c81b1790556040517f9fc733699b939bbf6d10d904b8bb75429cf5094449a53d601449b6edeb1097a791610e84918690918252602082015260400190565b60405180910390a1505050565b610f2b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610f6a61227a565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b0316331480156110015750602054600160b01b900460ff165b6110315760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b601d54612710836016546110459190612e98565b61104f9190612eaf565b1015801561105f57506127108211155b61108f5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b601e54612710826016546110a39190612e98565b6110ad9190612eaf565b101580156110bd57506127108111155b6110ed5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610526565b612710826016546110fe9190612e98565b6111089190612eaf565b601d556016546127109061111d908390612e98565b6111279190612eaf565b601e556127108214801561113c575080612710145b1561114f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461045290612dec565b60006104e2338484611d0f565b6000546001600160a01b031633146111e75760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b6022541580156111f75750600082115b8015611204575060648211155b6112345760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610526565b6202a3008160200151101580156112515750620d2f008160200151105b6112815760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610526565b6022829055338152604051600090829061129a90612ab9565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f0801580156112d3573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b03908116908216036113d857600080fd5b306001600160a01b038216036113ed57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190612e26565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612e3f565b6115035760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610526565b610be16122da565b6000546001600160a01b031633146115495760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160a01b900460ff16156115875760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610526565b6001544710156115bd5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610526565b816115d057600e8310156115d057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361163557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561171057506020805460ff60c01b1916600160c01b1790556000611723565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190612e3f565b6117b257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561182c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118509190612ed1565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190612ed1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190612ed1565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190612e3f565b611ac25760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610526565b601f546001600160a01b031663f305d71947308460008088611ae542603c612e72565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611b52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b779190612eee565b50506025805460ff1916600190811790915584151590039050611bb257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b03163314611bfa5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b038316611c9b57600080fd5b6001600160a01b038216611cae57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611d2f57506001600160a01b03821615155b611d3857600080fd5b6001600160a01b038316600090815260066020526040902054811115611d855760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610526565b602054600090600160a01b900460ff168015611daa5750602054600160b01b900460ff165b8015611dcf57506001600160a01b03841660009081526004602052604090205460ff16155b8015611df457506001600160a01b03831660009081526004602052604090205460ff16155b15611e305781601e541015611e305760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610526565b602054600160a01b900460ff168015611e525750602054600160b01b900460ff165b8015611e7757506001600160a01b03831660009081526005602052604090205460ff16155b15611ed657601d546001600160a01b038416600090815260066020526040902054611ea3908490612e72565b1115611ed65760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610526565b6000546001600160a01b03858116911614801590611f0257506000546001600160a01b03848116911614155b8015611f15575060255460ff1615156001145b15611fd8576020546001600160a01b038581169116148015611f455750601f546001600160a01b03848116911614155b15611f8657600a8054906000611f5a83612f1c565b9190505550611f6960016123a2565b6064600e5483611f799190612e98565b611f839190612eaf565b90505b6020546001600160a01b038481169116148015611fac57506001600160a01b0384163014155b15611fd857611fbb60006123a2565b606460115483611fcb9190612e98565b611fd59190612eaf565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff1615801561201557506020546001600160a01b038681169116145b801561202a57506001600160a01b0386163014155b80156120365750600082115b80156120455750601a54600a54115b156120c357601b54821180612080575062015180601454426120679190612e85565b1180156120745750601054155b80156120805750601354155b156120c3576019544311156120c357601c548210156120a7576120a2826125a4565b6120b2565b6120b2601c546125a4565b6120bb47612763565b504360195560015b821561213e57306000908152600660205260409020546120e4908490612e72565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121359087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054612162908590612e85565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390612194908690612e72565b61219e9190612e85565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6121e88688612e85565b60405190815260200160405180910390a38015612272576000612234600860009054906101000a90046001600160a01b0316620186a04760405180602001604052806000815250612a9f565b90508015612270576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff166122945750600090565b600062015180601454426122a89190612e85565b6122b29190612eaf565b90506021548111156122c657600091505090565b806021546122d49190612e85565b91505090565b602054600160a81b900460ff161580156122fd5750602054600160a01b900460ff165b156106ec57478015610be15761231281612763565b6008546040516000916001600160a01b03169047908381818185875af1925050503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b50509050801561239e576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001611181565b5050565b600080600083156123c157600f5492506010549150600e5490506123d1565b6012549250601354915060115490505b81811461259e57600b5460000361247e57600c546014546123f29190612e72565b42106123ff575080612588565b6002600c5461240e9190612eaf565b60145461241b9190612e72565b421061244857600461242d8385612e85565b6124379190612eaf565b6124419083612e72565b9050612588565b6004600c546124579190612eaf565b6014546124649190612e72565b421061247657600261242d8385612e85565b50815b612588565b600b546001036124ba57600d54600a54111561249b57508061249e565b50815b6014546124ad90611c20612e72565b4210612479575080612588565b600b5460020361258557600d54600a5411806124e55750600c546014546124e19190612e72565b4210155b156124f1575080612588565b6002600d546125009190612eaf565b600a54118061252a57506002600c546125199190612eaf565b6014546125269190612e72565b4210155b1561253b57600461242d8385612e85565b6004600d5461254a9190612eaf565b600a54118061257457506004600c546125639190612eaf565b6014546125709190612e72565b4210155b1561247657600261242d8385612e85565b50805b831561259857600e81905561259e565b60118190555b50505050565b6020805460ff60a81b1916600160a81b178155604080516002808252606082018352600093919290918301908036833701905050905030816000815181106125ee576125ee612f35565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266b9190612ed1565b8160018151811061267e5761267e612f35565b6001600160a01b0390921660209283029190910190910152602754156126cf5760c8602754836126ae9190612e98565b6126b89190612eaf565b60268190556126c79083612e85565b602481905591505b601f546126e79030906001600160a01b031684611c88565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612720908590600090869030904290600401612f4b565b600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff1615156001151514801561279b57506276a700601454426127999190612e85565b105b1561287c5760646127ad86600a612e98565b6127b79190612eaf565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a6846040516127ea91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461283f576040519150601f19603f3d011682016040523d82523d6000602084013e612844565b606091505b505090508061287a5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610526565b505b600060275411801561289057506000602654115b1561299657602454856026546128a69190612e98565b6128b09190612eaf565b60268054600091829055602491909155601f5491945091506128dd9030906001600160a01b031683611c88565b601f546001600160a01b031663f305d7198430846000808361290042603c612e72565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af115801561296d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129929190612eee565b5050505b6023546001600160a01b031615612a9857602254606490846129b88789612e85565b6129c29190612e85565b6129cc9190612e98565b6129d69190612eaf565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612a28576040519150601f19603f3d011682016040523d82523d6000602084013e612a2d565b606091505b5050905080612a635760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610526565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612fbf83390190565b60006020808352835180602085015260005b81811015612af457858101830151858201604001528201612ad8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610be157600080fd5b60008060408385031215612b3d57600080fd5b8235612b4881612b15565b946020939093013593505050565b600060208284031215612b6857600080fd5b5035919050565b600080600060608486031215612b8457600080fd5b8335612b8f81612b15565b92506020840135612b9f81612b15565b929592945050506040919091013590565b8015158114610be157600080fd5b60008060408385031215612bd157600080fd5b823591506020830135612be381612bb0565b809150509250929050565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151612c3b60a084018215159052565b5060c083015160c083015260e0830151612c5960e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b600060208284031215612cc657600080fd5b8135612cd181612b15565b9392505050565b60008060408385031215612ceb57600080fd5b50508035926020909101359150565b6000808284036060811215612d0e57600080fd5b833592506040601f1982011215612d2457600080fd5b506040516040810181811067ffffffffffffffff82111715612d5657634e487b7160e01b600052604160045260246000fd5b6040526020840135612d6781612b15565b81526040939093013560208401525092909150565b600080600060608486031215612d9157600080fd5b833592506020840135612da381612bb0565b91506040840135612db381612b15565b809150509250925092565b60008060408385031215612dd157600080fd5b8235612ddc81612b15565b91506020830135612be381612b15565b600181811c90821680612e0057607f821691505b602082108103612e2057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e3857600080fd5b5051919050565b600060208284031215612e5157600080fd5b8151612cd181612bb0565b634e487b7160e01b600052601160045260246000fd5b808201808211156104e6576104e6612e5c565b818103818111156104e6576104e6612e5c565b80820281158282048414176104e6576104e6612e5c565b600082612ecc57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612ee357600080fd5b8151612cd181612b15565b600080600060608486031215612f0357600080fd5b8351925060208401519150604084015190509250925092565b600060018201612f2e57612f2e612e5c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612f9d5784516001600160a01b031683529383019391830191600101612f78565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122048e77e6bf63327f12ec0d67053073aa278ed2c3d262bc481049ec22fbf4d3c4864736f6c63430008190033
Verified Source Code Full Match
Compiler: v0.8.25+commit.b61c2a91
EVM: paris
Optimization: Yes (800 runs)
IERC20.sol 29 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address _owner) external view returns (uint256 balance);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function transfer(address _to, uint256 _value) external returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint256 remaining);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
IStaking.sol 27 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface IStaking {
struct StakingParams {
address owner;
uint256 withdrawTimeout;
}
struct StakingDetails {
uint256 claimable;
uint256 withdrawable;
uint256 unstakedAmount;
uint256 totalRewards;
uint256 timeToWithdraw;
uint256 stakedAmount;
}
function transferOwnership(address _newOwner) external;
function owner() external view returns (address);
function rescueERC20(address _address) external;
function stake(uint256 _amount) external;
function unstake(uint256 _amount) external;
function restake() external;
function withdraw() external;
function claimRewards() external;
//function refreshPool() external;
function getUserDetails(address) external view returns (StakingDetails memory);
}
DeployyyyerToken.sol 833 lines
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/
pragma solidity ^0.8.23;
import {IStaking} from "../interfaces/IStaking.sol";
import {StakingPool} from "./StakingPool.sol";
library SafeCall {
/**
* @notice Perform a low level call without copying any returndata
*
* @param _target Address to call
* @param _gas Amount of gas to pass to the call
* @param _value Amount of value to pass to the call
* @param _calldata Calldata to pass to the call
*/
function call(
address _target,
uint256 _gas,
uint256 _value,
bytes memory _calldata
) internal returns (bool) {
bool _success;
assembly {
_success := call(
_gas, // gas
_target, // recipient
_value, // ether value
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
}
return _success;
}
}
interface IHelper {
function isValidRouter(address router) external view returns (bool);
}
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address _owner) external view returns (uint256 balance);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function transfer(address _to, uint256 _value) external returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint256 remaining);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed ownerAddress, address indexed spender, uint256 value);
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
interface ITeamFinanceLocker {
function lockToken(
address _tokenAddress,
address _withdrawalAddress,
uint256 _amount,
uint256 _unlockTime,
bool _mintNFT,
address referrer
) external payable returns (uint256 _id);
}
/// @title DeployyyyerToken
/// @notice Contains methods related to ERC20
/// @dev
contract DeployyyyerToken is IERC20 {
address owner_;
uint256 minLiq;
uint256 lockerId;
address teamFinanceLocker;
mapping(address => bool) isExTxLimit; //is excluded from transaction limit
mapping(address => bool) isExWaLimit; //is excluded from wallet limit
mapping (address => uint256) balances; //ERC20 balance
mapping (address => mapping (address => uint256)) allowances; //ERC20 balance
address payable taxWallet; //tax wallet for the token
address payable deployyyyerCa; //deployyyyer contract address
// Reduction Rules
uint256 buyCount;
uint256 initTaxType; //0-time,1-buyCount,2-hybrid,3-none
//interval*1, lastIntEnd+(interval*2), lastIntEnd+(interval*3)
uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
uint256 countInterval; //0-100
//current taxes
uint256 taxBuy;
uint256 maxBuyTax; //40%
uint256 minBuyTax; //0
uint256 taxSell;
uint256 maxSellTax; //40%
uint256 minSellTax; //0
uint256 tradingOpened;
// Token Information
uint8 decimals_;
uint256 tTotal;
string name_;
string symbol_;
// Contract Swap Rules
uint256 lastSwapBlock;
uint256 preventSwap; //50
uint256 taxSwapThreshold; //0.1%
uint256 maxTaxSwap; //1%
uint256 maxWallet; //1%
uint256 maxTx;
IUniswapV2Router02 uniswapV2Router;
address uniswapV2Pair;
bool tradingOpen; //true if liquidity pool is created
bool inSwap;
bool walletLimited;
bool isFreeTier;
bool isBurnt;
bool isRetrieved;
uint256 lockPeriod_;
uint256 stakingShare;
address stakingContract;
uint256 lastSwap;
bool liquidityOpen;
uint256 halfLp;
uint256 lpTax;
event TradingEnabled(address pair, uint256 liq, uint256 lockPeriod, bool isBurnt, address router);
event TaxMade(uint256 amount);
event TaxGiven(uint256 amount);
event StakingMade(uint256 amount);
event ExternalLocked(uint256 id, uint256 lockPeriod);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event IncreasedLimits(uint256 maxWallet, uint256 maxTx);
event LockUpdated(uint256 ldays);
event LockRetrieved();
event SocialsSet(string telegram, string twitter, string website);
event LpBurnt();
event StakingLaunched(address stakingPool, address owner, uint256 share);
event StakingShareIncreased(uint256 share);
event StakingArgs(IStaking.StakingParams params);
struct InitParams {
address owner;
address taxWallet;
address teamFinanceLocker;
uint256 minLiq;
uint256 supply;
uint256 initTaxType; //0-time,1-buyCount,2-hybrid
uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
uint256 countInterval; //0-100
uint256 maxBuyTax; //40%
uint256 minBuyTax; //0
uint256 maxSellTax; //40%
uint256 minSellTax; //0
uint256 lpTax;
uint256 maxWallet;
uint256 maxTx;
uint256 preventSwap;
uint256 maxSwap;
uint256 taxSwapThreshold;
string name;
string symbol;
bool isFreeTier;
}
struct LPDetails {
address pair;
uint256 buycount;
uint256 taxBuy;
uint256 taxSell;
uint256 lockDays;
bool isBurnt;
uint256 tradingOpened;
bool walletLimited;
address stakingContract; //address(0) backward comp
uint256 stakingShare; //external lock id here
uint256 maxTx;
uint256 maxWallet;
address router;
address presale; //address(0) backward comp
}
//reentrancy lock
modifier lockTheSwap {
inSwap = true;
_;
inSwap = false;
}
/// @notice Constructor of Diamond Proxy for a launched token
constructor(InitParams memory params) {
owner_ = params.owner;
emit OwnershipTransferred(address(0), owner_);
teamFinanceLocker = params.teamFinanceLocker;
// adding ERC165 data
deployyyyerCa = payable(msg.sender);
minLiq = params.minLiq;
taxBuy = params.maxBuyTax; //20%
maxBuyTax = params.maxBuyTax;
minBuyTax = params.minBuyTax;
taxSell = params.maxSellTax; //20%
maxSellTax = params.maxSellTax;
minSellTax = params.minSellTax;
lpTax = params.lpTax;
initTaxType = params.initTaxType;
initInterval = params.initInterval;
countInterval = params.countInterval;
// Reduction Rules
buyCount = 0;
isFreeTier = params.isFreeTier;
// Token Information
decimals_ = 18;
taxWallet = payable(params.taxWallet);
name_ = params.name;
symbol_ = params.symbol;
tTotal = params.supply;
// Contract Swap Rules
taxSwapThreshold = params.taxSwapThreshold; //0.1%
maxTaxSwap = params.maxSwap; //1%
walletLimited = true;
maxWallet = tTotal * params.maxWallet / 10000; //1% (allow 1 - 100)
maxTx = tTotal * params.maxTx / 10000;
if (params.maxWallet == 10000 && params.maxTx == 10000) {
walletLimited = false;
}
emit IncreasedLimits(params.maxWallet, params.maxTx);
balances[address(this)] = tTotal;
emit Transfer(address(0), address(this), tTotal);
preventSwap = params.preventSwap;
}
/// @notice Create liquidity pool and start trading for the token
/// @dev
function startTrading(uint256 lockPeriod, bool shouldBurn, address router) external payable {
require(msg.sender == owner_, "o");
require(!tradingOpen, "1");
require(address(this).balance >= minLiq, "2");
if(!shouldBurn) {
require(lockPeriod >= 14);
}
tradingOpen = true;
uint256 maxTxTemp = maxTx;
uint256 maxWalletTemp = maxWallet;
bool walletLimitedTemp = walletLimited;
if(walletLimited == true) {
maxTx = tTotal;
maxWallet = tTotal;
walletLimited = false;
}
isExTxLimit[address(this)] = true;
isExTxLimit[owner_] = true;
isExTxLimit[address(0x000000000000000000000000000000000000dEaD)] = true;
isExWaLimit[address(this)] = true;
isExWaLimit[owner_] = true;
isExWaLimit[address(0x000000000000000000000000000000000000dEaD)] = true;
//0x000000000000000000000000000000000000dEaD or address(0)
address liqOwner = address(this);
if(shouldBurn) {
liqOwner = address(0);
isBurnt = true;
} else {
lockPeriod_ = lockPeriod;
isBurnt = false;
}
uint256 liqBalance = balances[address(this)];
tradingOpened = block.timestamp;
require(IHelper(deployyyyerCa).isValidRouter(router));
uniswapV2Router = IUniswapV2Router02(router);
allowances[address(this)][address(uniswapV2Router)] = tTotal;
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
isExWaLimit[address(uniswapV2Pair)] = true;
isExTxLimit[address(uniswapV2Pair)] = true;
isExTxLimit[address(uniswapV2Router)] = true;
isExWaLimit[address(uniswapV2Router)] = true;
emit TradingEnabled(uniswapV2Pair, address(this).balance, lockPeriod_, shouldBurn, address(uniswapV2Router));
require(IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max), "3");
uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),liqBalance,0,0,liqOwner,block.timestamp+60);
liquidityOpen = true;
if(walletLimitedTemp == true) {
maxTx = maxTxTemp;
maxWallet = maxWalletTemp;
walletLimited = true;
}
}
function lockOnTeamFinance(uint256 lps, bool ref) external payable {
require(msg.sender == owner_ && isBurnt == false && isRetrieved == false && tradingOpen == true && lps >= 3600 * 24 * 14, "o");
//require(isBurnt == false && isRetrieved == false && tradingOpen == true, "lt");
//require(lps >= 3600 * 24 * 14, "ls");
uint256 lpBalance = IERC20(uniswapV2Pair).balanceOf(address(this));
IERC20(uniswapV2Pair).approve(teamFinanceLocker, lpBalance);
lockerId = ITeamFinanceLocker(teamFinanceLocker).lockToken{value: msg.value}(uniswapV2Pair, msg.sender, lpBalance, block.timestamp + lps, false, ref?address(deployyyyerCa):address(0));
isRetrieved = true;
emit ExternalLocked(lockerId, lps);
//emit ExternalLocked(lockPeriodSec);
}
/// @notice Burn the liquidity pool tokens of the token
function burnLP() external {
require(msg.sender == owner_, "o");
require(!isBurnt && !isRetrieved && tradingOpen, "a");
isBurnt = true;
emit LpBurnt();
require(IERC20(uniswapV2Pair).transfer(address(0x000000000000000000000000000000000000dEaD), IERC20( uniswapV2Pair).balanceOf(address(this))), "o2");
}
/// @notice Get lp lock period remaining
/// @return lpldays lock days remaining
function getLockleft() private view returns (uint256) {
if(!tradingOpen) {
return 0;
}
//time traversed in days
uint256 tt = ((block.timestamp - tradingOpened)/86400);
if (tt > lockPeriod_) {
return 0;
} else {
return lockPeriod_ - tt;
}
}
/// @notice Extend LP lock
/// @dev should not be already retrieved or burnt
/// @param ldays no of days to extend
function extendLock(uint256 ldays) external {
require(msg.sender == owner_, "o");
require(!isRetrieved && !isBurnt && tradingOpen, "a");
//expired lock
if((tradingOpened + (lockPeriod_*86400)) < block.timestamp) {
lockPeriod_ = (block.timestamp - tradingOpened)/86400;
}
lockPeriod_ += ldays;
emit LockUpdated(lockPeriod_);
}
/// @notice Retrieve LP tokens
/// @dev should not be already retrieved or burnt
function retrieveLock() external {
require(msg.sender == owner_, "o");
require(!isRetrieved && !isBurnt && tradingOpen, "a");
if((tradingOpened + (lockPeriod_*60*60*24)) < block.timestamp) {
isRetrieved = true;
uint256 bal = IERC20(uniswapV2Pair).balanceOf(address(this));
emit LockRetrieved();
require(IERC20(uniswapV2Pair).transfer(msg.sender, bal), "b");
}
}
function increaseLimits(uint256 maxwallet, uint256 maxtx) external {
require(msg.sender == owner_ && walletLimited, "o");
//require(walletLimited);
require(tTotal * maxwallet / 10000 >= maxWallet && maxwallet <= 10000, "a");
require(tTotal * maxtx / 10000 >= maxTx && maxtx <= 10000, "b");
maxWallet = tTotal * maxwallet / 10000;
maxTx = tTotal * maxtx / 10000;
if (maxwallet == 10000 && maxtx == 10000) {
walletLimited = false;
}
emit IncreasedLimits(maxwallet, maxtx);
}
///@dev Returns the name of the token.
function name() external view override returns (string memory) {
return name_;
}
///@dev Returns the symbol of the token, usually a shorter version of name.
function symbol() external view override returns (string memory) {
return symbol_;
}
///@dev Returns the number of decimals used to get its user representation.
function decimals() external view override returns (uint8) {
return decimals_;
}
///@dev Returns the value of tokens in existence.
function totalSupply() public view override returns (uint256) {
return tTotal;
}
///@dev Returns the value of tokens owned by account.
function balanceOf(address account) public view override returns (uint256) {
return balances[account];
}
///@dev Moves a amount of tokens from the caller's account to receipient.
function transfer(address recipient, uint256 amount) external override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
///@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
function allowance(address owner, address spender) external view override returns (uint256) {
return allowances[owner][spender];
}
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's token
*
* 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 override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
require(amount <= allowances[sender][msg.sender], "25");
_approve(sender, msg.sender,allowances[sender][msg.sender] - amount);
_transfer(sender, recipient, amount);
return true;
}
function _approve(address _owner, address _spender, uint256 _amount) private {
require(_owner != address(0));
require(_spender != address(0));
allowances[_owner][_spender] = _amount;
emit Approval(_owner, _spender, _amount);
}
/// @notice sets tax for the trade
/// @dev
function _setTax(bool isBuy) private {
uint256 maxTax;
uint256 minTax;
uint256 tax;
if(isBuy) {
maxTax = maxBuyTax;
minTax = minBuyTax;
tax = taxBuy;
} else {
maxTax = maxSellTax;
minTax = minSellTax;
tax = taxSell;
}
if(tax != minTax) {
if(initTaxType == 0) {
if (block.timestamp >= (tradingOpened + (initInterval))) {
tax = minTax;
}
else if (block.timestamp >= (tradingOpened + (initInterval/2))) {
tax = minTax + (maxTax - minTax)/4;
}
else if (block.timestamp >= (tradingOpened + (initInterval/4))) {
tax = minTax + ((maxTax - minTax)/2);
}
else {
tax = maxTax;
}
} else if(initTaxType == 1) {
if (buyCount > (countInterval)) {
tax = minTax;
} else {
tax = maxTax;
}
//this is forced after 2hrs
if(block.timestamp >= (tradingOpened + 7200)) {
tax = minTax;
}
} else if(initTaxType == 2){
if (buyCount > (countInterval) || block.timestamp >= (tradingOpened + (initInterval))) {
tax = minTax;
}
else if (buyCount > (countInterval/2) || block.timestamp >= (tradingOpened + (initInterval/2))) {
tax = minTax + (maxTax - minTax)/4;
}
else if (buyCount > (countInterval/4) || block.timestamp >= (tradingOpened + (initInterval/4))) {
tax = minTax + ((maxTax - minTax)/2);
}
else {
tax = maxTax;
}
// } else if( initTaxType == 3) { //check block number}
} else {
tax = minTax;
}
if(isBuy) {
taxBuy = tax;
} else {
taxSell = tax;
}
}
}
/// @notice internal method of transfer
/// @dev
function _transfer(address from, address to, uint256 amount) private {
require(from != address(0) && to != address(0));
//require(to != address(0));
//require(amount > 0); //compliance erc20
require(balances[from] >= amount, "66");
uint256 taxAmount=0;
if (tradingOpen && walletLimited && !isExTxLimit[from] && !isExTxLimit[to])
require(maxTx >= amount, "30");
if (tradingOpen && walletLimited && !isExWaLimit[to])
require((balances[to] + amount) <= maxWallet, "31");
if (from != owner_ && to != owner_ && liquidityOpen == true) {
if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
//buy from uniswap, only if amount > 0
buyCount++;
_setTax(true);
taxAmount = amount * taxBuy / 100;
//console.log("_setTaxDone");
}
if(to == uniswapV2Pair && from!= address(this)) {
//sell from uniswap
_setTax(false);
taxAmount = amount * taxSell / 100;
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool swapped = false;
if (!inSwap && to == uniswapV2Pair && from!= address(this) && contractTokenBalance > 0 && buyCount > preventSwap) {
//we swap only on sell to uniswap pool
if(contractTokenBalance > taxSwapThreshold || ((block.timestamp - tradingOpened) > (86400) && minBuyTax == 0 && minSellTax == 0)) {
if(block.number > lastSwapBlock) {
if(contractTokenBalance < maxTaxSwap) {
swapTokensForEth(contractTokenBalance);
}
else {
swapTokensForEth(maxTaxSwap);
}
sendETHToFee(address(this).balance);
swapped = true;
lastSwapBlock = block.number;
}
}
}
if(taxAmount > 0) {
balances[address(this)] = balances[address(this)] + (taxAmount);
emit Transfer(from, address(this), taxAmount);
}
//from can be taxWallet
balances[from] = balances[from] - amount;
balances[to] = balances[to] + amount - taxAmount;
emit Transfer(from, to, amount - taxAmount);
if(swapped) {
//everything else is taken care, anything left is for token's tax wallet
//this call needs to be safe from reverts, consuming all gas and return bombs
bool ttax = SafeCall.call(taxWallet, 100000, address(this).balance, "");
if(ttax)
emit TaxMade(address(this).balance);
}
}
/// @notice swaps tokens from tax into eth
/// @dev this is nonrentrant using lockTheSwap
function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
if(lpTax > 0) {
halfLp = tokenAmount * lpTax / 200;
tokenAmount -= halfLp;
lastSwap = tokenAmount;
}
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
/// @notice sends the eth to respective tax wallets
/// @dev
function sendETHToFee(uint256 amount) private {
uint256 da = 0;
uint256 ethLpShare = 0;
uint256 spshare = 0;
uint256 halfLpTemp;
//s.isFreeTier &&
if(isFreeTier == true && ((block.timestamp - tradingOpened) < (86400*90))) {
da = amount * 10 / 100;
emit TaxGiven(da);
(bool stax, ) = deployyyyerCa.call{value: da}("");
require(stax, "99");
}
if(lpTax > 0 && halfLp > 0) {
//newly added liquidity is also locked
//address liqOwner = address(this);
//we should also be keeping half of lp in tokens, so that u add equal amount of eth and token to lp
ethLpShare = halfLp * amount / lastSwap;
halfLpTemp = halfLp;
halfLp = 0;
lastSwap = 0;
_approve(address(this), address(uniswapV2Router), halfLpTemp);
uniswapV2Router.addLiquidityETH{ value: ethLpShare }(
address(this),
halfLpTemp,
0,
0,
address(this),
block.timestamp + 60
);
}
if(stakingContract != address(0)) {
spshare = (amount - da - ethLpShare) * stakingShare / 100;
//stakingContract is safe since its our own!
(bool sent, ) = stakingContract.call{value: spshare}("");
require(sent, "s9");
emit StakingMade(spshare);
}
}
/// @notice recovers eth to tax wallet if any
/// @dev
function recoverEth() private {
//blocked while trading is disabled
if(!inSwap && tradingOpen) {
uint256 contractETHBalance = address(this).balance;
if(contractETHBalance > 0) {
sendETHToFee(contractETHBalance);
(bool ttax, ) = taxWallet.call{value: address(this).balance}("");
if(ttax)
emit TaxMade(address(this).balance);
}
}
}
/// @notice rescues any erc20 tokens sent to contract, also recovers eth to tax wallet if any
/// @dev trying to rescue own token or own lp tokens will revert
function rescueERC20(address _address) external {
//block pulling out lp
require(_address != uniswapV2Pair);
require(_address != address(this));
require(IERC20(_address).transfer(taxWallet, IERC20(_address).balanceOf(address(this))), "r");
recoverEth();
}
/// @notice Set the address of the new owner of the contract
/// @param _newOwner The address of the new owner of the contract
function transferOwnership(address _newOwner) external {
require(msg.sender == owner_, "o");
emit OwnershipTransferred(owner_, _newOwner);
//isExTxLimit[owner_] = false;
//isExWaLimit[owner_] = false;
owner_ = _newOwner;
isExTxLimit[owner_] = true;
isExWaLimit[owner_] = true;
}
/// @notice Get the address of the owner
/// @return The address of the owner.
function owner() public view returns (address) {
//address _owner = owner_;
return owner_;
}
/// @notice Get liquidity pool details of the token
/// @return IOwnership.LPDetails
/// @dev
function getLPDetails() external view returns (LPDetails memory) {
return LPDetails(uniswapV2Pair, buyCount, taxBuy, taxSell, getLockleft(), isBurnt, tradingOpened, walletLimited, stakingContract, stakingShare, maxTx, maxWallet, address(uniswapV2Router), address(0));
}
/// @notice increase revenue share to staking pool for the token
/// @dev
function increaseStakingShare(uint256 share) external {
require(msg.sender == owner_ && stakingShare > 0 && share > 0, "o");
//staking pool is live
//require(stakingShare > 0 && share > 0);
stakingShare += share;
require(stakingShare <= 100, "os");
emit StakingShareIncreased(stakingShare);
}
/// @notice launch staking pool for the token
/// @dev
function launchStaking(uint256 share, IStaking.StakingParams memory params) external {
require(msg.sender == owner_, "o");
require(stakingShare == 0 && share > 0 && share <= 100, "y");
//require(stakingShare == 0, "o12");
require(params.withdrawTimeout >= 2 days && params.withdrawTimeout < 10 days, "z");
stakingShare = share;
params.owner = msg.sender;
StakingPool stakingPool = new StakingPool(params);
isExTxLimit[address(stakingPool)] = true;
isExWaLimit[address(stakingPool)] = true;
emit StakingLaunched(address(stakingPool), msg.sender, stakingShare);
emit StakingArgs(params);
stakingContract = payable(address(stakingPool));
}
/// @notice receive eth
receive() external payable {}
}
StakingPool.sol 209 lines
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/
pragma solidity ^0.8.23;
import "../interfaces/IStaking.sol";
import { IERC20 } from "../interfaces/IERC20.sol";
struct AppStorageStaking {
address token;
address owner;
uint256 accRewardsPrecision;
uint256 totalStakedAmount;
uint256 withdrawTimeout;
uint256 unallocatedETH;
uint256 accRewardsPerShare;
uint256 totalETHCollected;
mapping(address => uint256) totalRewards;
mapping(address => uint256) rewardDebt;
mapping(address => uint256) stakedAmount;
mapping(address => uint256) claimedAmount;
mapping(address => uint256) claimableRewards;
mapping(address => uint256) lastUnstakeTime;
mapping(address => uint256) unstakedAmount;
}
contract Modifiers {
AppStorageStaking internal s;
}
/// @title StakingPool
/// @dev
contract StakingPool is IStaking, Modifiers {
event Stake(address indexed user, uint256 amount);
event Unstake(address indexed user, uint256 amount);
event Withdraw(address indexed user, uint256 amount);
event ClaimRewards(address indexed user, uint256 amount);
event RewardsReceived(address indexed sender, uint256 amount, uint256 accRewardsPerShare);
//event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(IStaking.StakingParams memory params) {
require(params.owner != address(0));
s.owner = params.owner;
//init appStorage
s.accRewardsPrecision = 1e18;
s.token = msg.sender;
s.withdrawTimeout = params.withdrawTimeout;
}
//tracking ownership in subgraph is not needed here, since ownership is unimportant
/// @notice transfer ownership
/// @dev
function transferOwnership(address _newOwner) external override {
require(msg.sender == s.owner);
s.owner = _newOwner;
}
/// @notice return owner address
/// @dev
function owner() external override view returns (address owner_) {
owner_ = s.owner;
}
/// @notice rescue erc20 tokens from the contract
/// @dev
function rescueERC20(address _address) external {
//only use of owner: as the rescue wallet!
bool ret = IERC20(_address).transfer(s.owner, IERC20(_address).balanceOf(address(this)));
require(ret, "1");
}
/// @notice stake tokens
/// @dev
function stake(uint256 _amount) external override {
uint256 pending = 0;
require(_amount > 0);
if (s.stakedAmount[msg.sender] > 0) {
pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
}
uint256 unstakedAmount = s.unstakedAmount[msg.sender];
if (unstakedAmount >= _amount) {
s.unstakedAmount[msg.sender] -= _amount;
} else {
uint256 tokensNeeded = _amount - unstakedAmount;
s.unstakedAmount[msg.sender] = 0;
//requires staking contract to be approved by user
require(IERC20(s.token).transferFrom(msg.sender, address(this), tokensNeeded), "2");
}
s.stakedAmount[msg.sender] += _amount;
s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
s.totalStakedAmount += _amount;
if(pending > 0) {
s.claimableRewards[msg.sender] += pending;
}
emit Stake(msg.sender, _amount);
}
/// @notice unstake staked tokens
/// @dev
function unstake(uint256 _amount) external override {
require(_amount > 0 && s.stakedAmount[msg.sender] >= _amount, "3");
uint256 pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
s.stakedAmount[msg.sender] -= _amount;
s.lastUnstakeTime[msg.sender] = block.timestamp;
s.unstakedAmount[msg.sender] += _amount;
s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
s.totalStakedAmount -= _amount;
if(pending > 0) {
s.claimableRewards[msg.sender] += pending;
}
emit Unstake(msg.sender, _amount);
}
/// @notice restake unstaked tokens
/// @dev
function restake() external override {
uint256 pending = 0;
uint256 amountToRestake = s.unstakedAmount[msg.sender];
require(amountToRestake > 0, "4");
//allocateRewards();
if (s.stakedAmount[msg.sender] > 0) {
pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
}
s.unstakedAmount[msg.sender] = 0;
s.stakedAmount[msg.sender] += amountToRestake;
s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
s.totalStakedAmount += amountToRestake;
if(pending > 0) {
s.claimableRewards[msg.sender] += pending;
}
emit Stake(msg.sender, amountToRestake);
}
/// @notice withdraw unstaked tokens
/// @dev
function withdraw() external override {
uint256 toWithdraw = s.unstakedAmount[msg.sender];
require(toWithdraw > 0, "5");
require(block.timestamp >= s.lastUnstakeTime[msg.sender] + s.withdrawTimeout, "6");
s.unstakedAmount[msg.sender] = 0;
emit Withdraw(msg.sender, toWithdraw);
require(IERC20(s.token).transfer(msg.sender, toWithdraw), "7");
}
/// @notice claim rewards in eth
/// @dev
function claimRewards() external override {
s.claimableRewards[msg.sender] += ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
uint256 claimable = s.claimableRewards[msg.sender];
require(claimable > 0, "8");
s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
uint256 amount = address(this).balance > claimable ? claimable : address(this).balance;
s.claimableRewards[msg.sender] -= amount;
s.claimedAmount[msg.sender] += amount;
emit ClaimRewards(msg.sender, amount);
(bool sent,) = payable(msg.sender).call{value: amount}("");
require(sent, "9");
}
/// @notice get details related to the user
/// @dev
function getUserDetails(address _user) external view returns (IStaking.StakingDetails memory) {
uint256 withdrawable = 0;
uint256 timeToWithdraw = 0;
uint256 claimable = s.claimableRewards[_user] + ((s.stakedAmount[_user] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[_user];
if (block.timestamp >= s.lastUnstakeTime[_user] + s.withdrawTimeout) {
withdrawable = s.unstakedAmount[_user];
} else {
timeToWithdraw = block.timestamp - s.lastUnstakeTime[_user] + s.withdrawTimeout;
}
return IStaking.StakingDetails(claimable, withdrawable, s.unstakedAmount[_user], s.totalRewards[_user], timeToWithdraw, s.stakedAmount[_user]);
}
/// @notice receive
/// @dev staing rewards in eth, sets accRewardsPerShare
receive() external payable {
uint256 amount = msg.value;
require(amount > 0, "r");
s.totalRewards[msg.sender] += amount;
s.totalETHCollected += amount;
if (s.totalStakedAmount == 0) {
s.unallocatedETH += amount;
} else {
s.accRewardsPerShare += ((amount+s.unallocatedETH) * s.accRewardsPrecision) / s.totalStakedAmount;
s.unallocatedETH = 0;
}
emit RewardsReceived(msg.sender, amount, s.accRewardsPerShare);
}
}
Read Contract
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
getLPDetails 0x5c89dfe1 → tuple
name 0x06fdde03 → string
owner 0x8da5cb5b → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
Write Contract 13 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burnLP 0x0b45260e
No parameters
extendLock 0x44ee3a1c
uint256 ldays
increaseLimits 0x78f8484b
uint256 maxwallet
uint256 maxtx
increaseStakingShare 0x20ffb26d
uint256 share
launchStaking 0xa3d57c72
uint256 share
tuple params
lockOnTeamFinance 0x505f5c08
uint256 lps
bool ref
rescueERC20 0xccec3716
address _address
retrieveLock 0x4839c8b3
No parameters
startTrading 0xdb7c4dda
uint256 lockPeriod
bool shouldBurn
address router
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address _newOwner
Recent Transactions
No transactions found for this address