Address Contract Partially Verified
Address
0x371D62F8aC252Db7F88786e39F0880c35146C6c5
Balance
0 ETH
Nonce
1
Code Size
9808 bytes
Creator
0x5230D553...cd6e at tx 0x51ec31e4...8e496b
Indexed Transactions
0
Contract Bytecode
9808 bytes
0x608060405260043610610236575f3560e01c8063896f1a9511610129578063cc1776d3116100a8578063e77f35c41161006d578063e77f35c41461068e578063ea414b28146106ad578063f166104b146106cc578063f1f5cd91146106e1578063ff511828146106f6575f5ffd5b8063cc1776d3146105e9578063d34a0e7e146105fe578063dd62ed3e14610617578063dfc2544d1461065b578063e206a8d81461066f575f5ffd5b80639cd441da116100ee5780639cd441da146105645780639fe0fde814610577578063a9059cbb14610596578063aace8f55146105b5578063ca2b3973146105ca575f5ffd5b8063896f1a95146104d55780638a8c523c146104e95780638da5cb5b146104fd5780638f9a55c01461052357806395d89b4114610538575f5ffd5b80634f7041a5116101b557806370a082311161017a57806370a082311461042b578063715018a61461045f578063768dc710146104735780638124f7ac146104a157806382bf293c146104b6575f5ffd5b80634f7041a5146103af57806351bc3c85146103c457806354cd55a0146103d85780635d525afc146103ed578063709c8ea91461040c575f5ffd5b806323b872dd116101fb57806323b872dd14610317578063313ce56714610336578063437823ec14610351578063464ab73f146103705780634ada218b1461038f575f5ffd5b806306fdde0314610241578063095ea7b3146102865780630b78f9c0146102b5578063152fb630146102d657806318160ddd146102f5575f5ffd5b3661023d57005b5f5ffd5b34801561024c575f5ffd5b5060408051808201909152600b81526a576f726b6c6f6f7020414960a81b60208201525b60405161027d919061215b565b60405180910390f35b348015610291575f5ffd5b506102a56102a03660046121a4565b610715565b604051901515815260200161027d565b3480156102c0575f5ffd5b506102d46102cf3660046121ce565b61072b565b005b3480156102e1575f5ffd5b506102d46102f03660046121ee565b610768565b348015610300575f5ffd5b50610309610796565b60405190815260200161027d565b348015610322575f5ffd5b506102a5610331366004612205565b6107b6565b348015610341575f5ffd5b506040516009815260200161027d565b34801561035c575f5ffd5b506102d461036b366004612243565b61081d565b34801561037b575f5ffd5b506102d461038a36600461226b565b610869565b34801561039a575f5ffd5b50600e546102a590600160a01b900460ff1681565b3480156103ba575f5ffd5b5061030960055481565b3480156103cf575f5ffd5b506102d46108a5565b3480156103e3575f5ffd5b50610309600a5481565b3480156103f8575f5ffd5b506102d46104073660046121ee565b610a53565b348015610417575f5ffd5b506102d46104263660046121ee565b610a81565b348015610436575f5ffd5b50610309610445366004612243565b6001600160a01b03165f9081526001602052604090205490565b34801561046a575f5ffd5b506102d4610aaf565b34801561047e575f5ffd5b506102a561048d366004612243565b60036020525f908152604090205460ff1681565b3480156104ac575f5ffd5b5061030960085481565b3480156104c1575f5ffd5b506102d46104d03660046121ee565b610b20565b3480156104e0575f5ffd5b506102d4610b6f565b3480156104f4575f5ffd5b506102d4610bc4565b348015610508575f5ffd5b505f546040516001600160a01b03909116815260200161027d565b34801561052e575f5ffd5b5061030960095481565b348015610543575f5ffd5b5060408051808201909152600481526304c4f4f560e41b6020820152610270565b6102d46105723660046121ce565b610c5e565b348015610582575f5ffd5b506102d46105913660046121ee565b611440565b3480156105a1575f5ffd5b506102a56105b03660046121a4565b61146e565b3480156105c0575f5ffd5b50610309600c5481565b3480156105d5575f5ffd5b506102d46105e43660046121ee565b61147a565b3480156105f4575f5ffd5b5061030960065481565b348015610609575f5ffd5b506017546102a59060ff1681565b348015610622575f5ffd5b50610309610631366004612286565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610666575f5ffd5b506102d46114a8565b34801561067a575f5ffd5b506102d4610689366004612243565b611520565b348015610699575f5ffd5b506102d46106a83660046121ee565b611630565b3480156106b8575f5ffd5b506102d46106c7366004612243565b61165e565b3480156106d7575f5ffd5b50610309600b5481565b3480156106ec575f5ffd5b5061030960075481565b348015610701575f5ffd5b506102d4610710366004612243565b6116a9565b5f6107213384846116f2565b5060015b92915050565b5f546001600160a01b0316331461075d5760405162461bcd60e51b8152600401610754906122bd565b60405180910390fd5b600591909155600655565b5f546001600160a01b031633146107915760405162461bcd60e51b8152600401610754906122bd565b601655565b5f6107a36009600a6123e9565b6107b1906305f5e1006123f7565b905090565b5f6107c2848484611815565b610813843361080e856040518060600160405280602881526020016125f3602891396001600160a01b038a165f9081526002602090815260408083203384529091529020549190611ec2565b6116f2565b5060019392505050565b5f546001600160a01b031633146108465760405162461bcd60e51b8152600401610754906122bd565b6001600160a01b03165f908152600360205260409020805460ff19166001179055565b5f546001600160a01b031633146108925760405162461bcd60e51b8152600401610754906122bd565b6017805460ff1916911515919091179055565b5f546001600160a01b031633146108ce5760405162461bcd60e51b8152600401610754906122bd565b305f9081526001602052604081205490505f5f600e5f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610931573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109559190612429565b5060175491935091505f90610100900460ff166109725782610974565b815b6017549091505f90610100900460ff1661098e5782610990565b835b600d54600c546040516385f8c25960e01b815260048101919091526001600160701b038084166024830152851660448201529192505f916001600160a01b03909116906385f8c25990606401602060405180830381865afa1580156109f7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1b9190612475565b9050610a3a610a3582610a3089600a54611efa565b611efa565b611f11565b478015610a4a57610a4a47612081565b50505050505050565b5f546001600160a01b03163314610a7c5760405162461bcd60e51b8152600401610754906122bd565b600a55565b5f546001600160a01b03163314610aaa5760405162461bcd60e51b8152600401610754906122bd565b600c55565b5f546001600160a01b03163314610ad85760405162461bcd60e51b8152600401610754906122bd565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314610b495760405162461bcd60e51b8152600401610754906122bd565b80612710610b55610796565b610b5f919061248c565b610b6991906123f7565b60095550565b5f546001600160a01b03163314610b985760405162461bcd60e51b8152600401610754906122bd565b60405133904780156108fc02915f818181858888f19350505050158015610bc1573d5f5f3e3d5ffd5b50565b5f546001600160a01b03163314610bed5760405162461bcd60e51b8152600401610754906122bd565b600e54600160a01b900460ff1615610c3d5760405162461bcd60e51b815260206004820152601360248201527221b0b71031b0b6361037b7363c9037b731b29760691b6044820152606401610754565b4260135543601455600e805462ff00ff60a01b19166201000160a01b179055565b5f546001600160a01b03163314610c875760405162461bcd60e51b8152600401610754906122bd565b80341015610cd05760405162461bcd60e51b8152602060048201526016602482015275053656e6420656e6f7567682045544820666f72204c560541b6044820152606401610754565b5f5f600e5f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d469190612429565b5060175491935091505f90610100900460ff16610d635782610d65565b815b6001600160701b031690505f600d5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de591906124ab565b9050806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e20575f5ffd5b505af1158015610e32573d5f5f3e3d5ffd5b50505050505f5f5f841115611192578787115f8082610e52578a8a610e55565b898b5b9092509050620186a05f82610e6a83866123f7565b610e74919061248c565b9050841561101c5780891115610f0f575f610e8f828b61248c565b600e546040516323b872dd60e01b815291925030916323b872dd91610ec49133916001600160a01b03169086906004016124c6565b6020604051808303815f875af1158015610ee0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0491906124ea565b50899750955061112a565b600e546001600160a01b03808a169163a9059cbb9116610f2f8c85612505565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610f77573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9b91906124ea565b50600e546040516323b872dd60e01b815230916323b872dd91610fd09133916001600160a01b039091169087906004016124c6565b6020604051808303815f875af1158015610fec573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101091906124ea565b5080965081955061112a565b8189111561102f575f610e8f828b6123f7565b600e5430906323b872dd9033906001600160a01b031661104f8d86612505565b6040518463ffffffff1660e01b815260040161106d939291906124c6565b6020604051808303815f875af1158015611089573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ad91906124ea565b50600e5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529089169063a9059cbb906044016020604051808303815f875af11580156110fe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061112291906124ea565b508196508095505b600e5f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611176575f5ffd5b505af1158015611188573d5f5f3e3d5ffd5b5050505050505050505b6040516323b872dd60e01b815230906323b872dd906111b990339084908d906004016124c6565b6020604051808303815f875af11580156111d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f991906124ea565b50600d5460405163095ea7b360e01b81526001600160a01b0391821660048201523460248201529084169063095ea7b3906044016020604051808303815f875af1158015611249573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126d91906124ea565b50600d546112869030906001600160a01b03168a6116f2565b600d546001600160a01b031663e8e3370084306112a3868c612505565b6112ad868e612505565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152604483015260648201525f6084820181905260a48201523360c48201524260e4820152610104016060604051808303815f875af115801561131d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113419190612518565b50506040516370a0823160e01b81523060048201525f91506001600160a01b038516906370a0823190602401602060405180830381865afa158015611388573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ac9190612475565b9050801561143557604051632e1a7d4d60e01b8152600481018290526001600160a01b03851690632e1a7d4d906024015f604051808303815f87803b1580156113f3575f5ffd5b505af1158015611405573d5f5f3e3d5ffd5b505060405133925083156108fc02915083905f818181858888f19350505050158015611433573d5f5f3e3d5ffd5b505b505050505050505050565b5f546001600160a01b031633146114695760405162461bcd60e51b8152600401610754906122bd565b600b55565b5f610721338484611815565b5f546001600160a01b031633146114a35760405162461bcd60e51b8152600401610754906122bd565b601555565b5f546001600160a01b031633146114d15760405162461bcd60e51b8152600401610754906122bd565b6114dd6009600a6123e9565b6114eb906305f5e1006123f7565b600955600460058190556006555f6008555f196015556017805460ff19169055612710611516610796565b611469919061248c565b5f546001600160a01b031633146115495760405162461bcd60e51b8152600401610754906122bd565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561158d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190612475565b6004805460405163a9059cbb60e01b81526001600160a01b0391821692810192909252602482018390529192509083169063a9059cbb906044016020604051808303815f875af1158015611607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906124ea565b505050565b5f546001600160a01b031633146116595760405162461bcd60e51b8152600401610754906122bd565b600855565b5f546001600160a01b031633146116875760405162461bcd60e51b8152600401610754906122bd565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146116d25760405162461bcd60e51b8152600401610754906122bd565b6001600160a01b03165f908152600360205260409020805460ff19169055565b6001600160a01b0383166117545760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610754565b6001600160a01b0382166117b55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610754565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118795760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610754565b6001600160a01b0382166118db5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610754565b5f811161193c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610754565b6001600160a01b0382165f9081526003602052604081205460ff1615801561197c57506001600160a01b0384165f9081526003602052604090205460ff16155b15611d8557600e54600160a01b900460ff16611996575f5ffd5b6064600854836119a691906123f7565b6119b0919061248c565b600e549091506001600160a01b0390811690841603611c0b576064600654836119d991906123f7565b6119e3919061248c565b90506014544303611a0b576064600754836119fe91906123f7565b611a08919061248c565b90505b305f90815260016020526040902054600e54600160a81b900460ff16158015611a3d5750600e54600160b01b900460ff165b8015611a5757504260135460b4611a549190612543565b11155b8015611a655750600b548110155b15611c0557601254431115611a79575f600f555b601654600f541015611c05575f5f600e5f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ad7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611afb9190612429565b5060175491935091505f90610100900460ff16611b185782611b1a565b815b6017549091505f90610100900460ff16611b345782611b36565b835b600d54600c546040516385f8c25960e01b815260048101919091526001600160701b038084166024830152851660448201529192505f916001600160a01b03909116906385f8c25990606401602060405180830381865afa158015611b9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc19190612475565b9050611bd6610a3582610a3089600a54611efa565b478015611be657611be647612081565b600f8054905f611bf583612556565b9091555050436012555050505050505b50611c85565b60095482611c2d856001600160a01b03165f9081526001602052604090205490565b611c379190612543565b1115611c855760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610754565b600e546001600160a01b0390811690851603611d8557606460055483611cab91906123f7565b611cb5919061248c565b90506014544303611cdd57606460075483611cd091906123f7565b611cda919061248c565b90505b60175460ff161580611cf75750326001600160a01b038416145b611cff575f5ffd5b601154431115611d0e575f6010555b60108054905f611d1d83612556565b90915550504360115560155460105410611d855760405162461bcd60e51b8152602060048201526024808201527f4578636565646564206d6178696d756d20627579636f756e742070657220626c60448201526337b1b59760e11b6064820152608401610754565b8015611dfd57305f90815260016020526040902054611da490826120bc565b305f81815260016020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611df49085815260200190565b60405180910390a35b6001600160a01b0384165f90815260016020526040902054611e1f908361211a565b6001600160a01b0385165f90815260016020526040902055611e62611e44838361211a565b6001600160a01b0385165f90815260016020526040902054906120bc565b6001600160a01b038085165f8181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611eab858561211a565b60405190815260200160405180910390a350505050565b5f8184841115611ee55760405162461bcd60e51b8152600401610754919061215b565b505f611ef18486612505565b95945050505050565b5f818311611f085782611f0a565b815b9392505050565b600e805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110611f5757611f5761256e565b6001600160a01b03928316602091820292909201810191909152600d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611fae573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd291906124ab565b81600181518110611fe557611fe561256e565b6001600160a01b039283166020918202929092010152600d5461200b91309116846116f2565b600d5460405163791ac94760e01b81526001600160a01b039091169063791ac947906120439085905f90869030904290600401612582565b5f604051808303815f87803b15801561205a575f5ffd5b505af115801561206c573d5f5f3e3d5ffd5b5050600e805460ff60a81b1916905550505050565b6004546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156120b8573d5f5f3e3d5ffd5b5050565b5f806120c88385612543565b905083811015611f0a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610754565b5f611f0a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ec2565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610bc1575f5ffd5b5f5f604083850312156121b5575f5ffd5b82356121c081612190565b946020939093013593505050565b5f5f604083850312156121df575f5ffd5b50508035926020909101359150565b5f602082840312156121fe575f5ffd5b5035919050565b5f5f5f60608486031215612217575f5ffd5b833561222281612190565b9250602084013561223281612190565b929592945050506040919091013590565b5f60208284031215612253575f5ffd5b8135611f0a81612190565b8015158114610bc1575f5ffd5b5f6020828403121561227b575f5ffd5b8135611f0a8161225e565b5f5f60408385031215612297575f5ffd5b82356122a281612190565b915060208301356122b281612190565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561234157808504811115612325576123256122f2565b600184161561233357908102905b60019390931c92800261230a565b935093915050565b5f8261235757506001610725565b8161236357505f610725565b816001811461237957600281146123835761239f565b6001915050610725565b60ff841115612394576123946122f2565b50506001821b610725565b5060208310610133831016604e8410600b84101617156123c2575081810a610725565b6123ce5f198484612306565b805f19048211156123e1576123e16122f2565b029392505050565b5f611f0a60ff841683612349565b8082028115828204841417610725576107256122f2565b80516001600160701b0381168114612424575f5ffd5b919050565b5f5f5f6060848603121561243b575f5ffd5b6124448461240e565b92506124526020850161240e565b9150604084015163ffffffff8116811461246a575f5ffd5b809150509250925092565b5f60208284031215612485575f5ffd5b5051919050565b5f826124a657634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156124bb575f5ffd5b8151611f0a81612190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f602082840312156124fa575f5ffd5b8151611f0a8161225e565b81810381811115610725576107256122f2565b5f5f5f6060848603121561252a575f5ffd5b5050815160208301516040909301519094929350919050565b80820180821115610725576107256122f2565b5f60018201612567576125676122f2565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156125d25783516001600160a01b03168352602093840193909201916001016125ab565b50506001600160a01b03959095166060840152505060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220a74975bbfc316bfd2b21cffe887c055beff3cecdf94ea18ccb2e9333e94c46be64736f6c634300081e0033
Verified Source Code Partial Match
Compiler: v0.8.30+commit.73712a01
EVM: prague
Optimization: Yes (200 runs)
WorkLoopAI.sol 611 lines
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠠⣾⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣷⠄⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣾⣿⣿⣷⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⠿⠿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⣸⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⡄⠀⠀⠀⣿⣿⣿⣿⣿⠃⠀⠀⠸⣿⣿⣿⣿⣿⠀⠀⠀⢰⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣧⠀⠀⠀⣿⣿⣿⣿⣿⡄⠀⠀⢰⣿⣿⣿⣿⣿⠀⠀⠀⣼⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⡆⠀⠀⠸⣿⣿⣿⣿⣧⡀⢀⣼⣿⣿⣿⣿⠇⠀⠀⣰⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⡀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⢠⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣇⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⣼⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⡄⠀⣀⣠⣾⣿⣿⣿⣿⣿⣿⣧⣄⡀⠀⢰⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁⠈⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⡿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⢿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//
// Workloop AI
// Discord: https://discord.gg/WorkloopAI
// X: https://x.com/WorkloopAI
// Website: https://www.workloopai.com
// SPDX-License-Identifier: UNLICENSE
pragma solidity 0.8.30;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Pair {
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function token0() external view returns (address);
function token1() external view returns (address);
function sync() external;
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
}
interface IWETH {
function deposit() external payable;
function withdraw(uint256 wad) external;
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function totalSupply() external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
}
contract WorkLoopAI is Context, IERC20, Ownable {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) public _isExcludedFromFee;
address payable private _taxWallet;
uint256 public buyTax = 45;
uint256 public sellTax = 45;
uint256 public sniperTax = 80;
uint256 public transferTax = 10;
uint8 private constant _decimals = 9;
uint256 private constant _tTotal = 100_000_000 * 10 ** _decimals;
string private constant _name = unicode"Workloop AI";
string private constant _symbol = unicode"LOOP";
uint256 public _maxWalletSize = (_tTotal * 5) / 10000; // 0.05%
uint256 public _taxSwapUpperLimit = (_tTotal * 1) / 1000; // 0.1%
uint256 public _taxSwapLowerLimit = (_tTotal * 5) / 10000; // 0.05%
uint256 public _taxETHSwapLimit = 1e18; // 1 eth = 1000000000000000000
IUniswapV2Router02 private uniswapV2Router;
address private uniswapV2Pair;
bool public tradingEnabled;
bool private inSwap = false;
bool private swapEnabled = false;
uint256 private sellCount;
uint256 private buyCount;
uint256 private lastBuyBlock;
uint256 private lastSellBlock;
uint256 private launchTimestamp;
uint256 private launchBlock;
uint256 private maxBuyCountPerBlock = 25;
uint256 private taxSellPerBlockLimit = 2;
bool public allowOnlyTxOrigin = true;
bool private isToken0;
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
constructor() {
_taxWallet = payable(_msgSender());
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[address(this)] = true;
_isExcludedFromFee[_taxWallet] = true;
uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
_isExcludedFromFee[address(uniswapV2Router)] = true;
_approve(msg.sender, address(this), _tTotal);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
address(this),
uniswapV2Router.WETH()
);
isToken0 = IUniswapV2Pair(uniswapV2Pair).token0() == address(this);
IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint256).max);
_balances[owner()] = _tTotal;
emit Transfer(address(0), owner(), _tTotal);
}
function name() public pure returns (string memory) {
return _name;
}
function symbol() public pure returns (string memory) {
return _symbol;
}
function decimals() public pure returns (uint8) {
return _decimals;
}
function totalSupply() public pure override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")
);
return true;
}
function _approve(
address owner,
address spender,
uint256 amount
) private {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _transfer(
address from,
address to,
uint256 amount
) private {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
uint256 taxAmount = 0;
if (!_isExcludedFromFee[to] && !_isExcludedFromFee[from]) {
require(tradingEnabled);
taxAmount = (amount * transferTax) / 100;
// if sell
if (to == uniswapV2Pair) {
taxAmount = (amount * sellTax) / 100;
if (block.number == launchBlock) {
taxAmount = amount * sniperTax / 100;
}
uint256 contractTokenBalance = balanceOf(address(this));
if (
!inSwap &&
swapEnabled &&
launchTimestamp + 180 <= block.timestamp &&
contractTokenBalance >= _taxSwapLowerLimit
) {
if (block.number > lastSellBlock) {
sellCount = 0;
}
if (sellCount < taxSellPerBlockLimit) {
(uint112 r0, uint112 r1, ) = IUniswapV2Pair(uniswapV2Pair).getReserves();
uint112 ethReserves = isToken0 ? r1 : r0;
uint112 tokenReserves = isToken0 ? r0 : r1;
uint256 maxTokenSwapByEthAmount = uniswapV2Router.getAmountIn(
_taxETHSwapLimit,
tokenReserves,
ethReserves
);
swapTokensForEth(
min(maxTokenSwapByEthAmount, min(contractTokenBalance, _taxSwapUpperLimit))
);
uint256 contractETHBalance = address(this).balance;
if (contractETHBalance > 0) {
sendETHToFee(address(this).balance);
}
sellCount++;
lastSellBlock = block.number;
}
}
} else {
require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
}
// if buy
if (from == uniswapV2Pair) {
taxAmount = (amount * buyTax) / 100;
if (block.number == launchBlock) {
taxAmount = amount * sniperTax / 100;
}
require(!allowOnlyTxOrigin || tx.origin == to);
if (block.number > lastBuyBlock) {
buyCount = 0;
}
buyCount++;
lastBuyBlock = block.number;
require(buyCount < maxBuyCountPerBlock, "Exceeded maximum buycount per block.");
}
}
if (taxAmount > 0) {
_balances[address(this)] = _balances[address(this)].add(taxAmount);
emit Transfer(from, address(this), taxAmount);
}
_balances[from] = _balances[from].sub(amount);
_balances[to] = _balances[to].add(amount.sub(taxAmount));
emit Transfer(from, to, amount.sub(taxAmount));
}
function enableTrading() external onlyOwner {
require(!tradingEnabled, "Can call only once.");
launchTimestamp = block.timestamp;
launchBlock = block.number;
tradingEnabled = true;
swapEnabled = true;
}
function min(uint256 a, uint256 b) private pure returns (uint256) {
return (a > b) ? b : a;
}
function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function updateTransferTax(uint256 newTax) external onlyOwner {
transferTax = newTax;
}
// lift against buying to multiple wallets from a contract
function setAllowOnlyTxOrigin(bool value) external onlyOwner {
allowOnlyTxOrigin = value;
}
function setTaxSwapLowerLimit(uint256 newLimit) external onlyOwner {
_taxSwapLowerLimit = newLimit;
}
function setTaxSwapUpperLimit(uint256 newLimit) external onlyOwner {
_taxSwapUpperLimit = newLimit;
}
function setTaxSellCountLimit(uint256 newNumber) external onlyOwner {
taxSellPerBlockLimit = newNumber;
}
function setMaxBuyCountPerBlock(uint256 newNumber) external onlyOwner {
maxBuyCountPerBlock = newNumber;
}
function setMaxWalletPercent(uint256 newPercent) external onlyOwner {
// 0.01% = 1
// 1% = 100
// 100% = 100_000
_maxWalletSize = (totalSupply() / 10000) * newPercent;
}
function setTaxETHSwapLimit(uint256 newLimit) external onlyOwner {
_taxETHSwapLimit = newLimit;
}
function setEverythingToNormal() external onlyOwner {
_maxWalletSize = _tTotal;
buyTax = 4;
sellTax = 4;
transferTax = 0;
maxBuyCountPerBlock = type(uint256).max;
allowOnlyTxOrigin = false;
_taxSwapLowerLimit = totalSupply() / 10_000; // 0.01% default value
}
function sendETHToFee(uint256 amount) private {
_taxWallet.transfer(amount);
}
function setFees(uint256 _newBuyFee, uint256 _newSellFee) external onlyOwner {
buyTax = _newBuyFee;
sellTax = _newSellFee;
}
receive() external payable {}
function saveERC20(address _address) external onlyOwner {
uint256 _amount = IERC20(_address).balanceOf(address(this));
IERC20(_address).transfer(_taxWallet, _amount);
}
function saveETH() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function setTaxWallet(address newWallet) external onlyOwner {
_taxWallet = payable(newWallet);
}
function excludeFromFee(address account) external onlyOwner {
_isExcludedFromFee[account] = true;
}
function includeFromFee(address account) external onlyOwner {
_isExcludedFromFee[account] = false;
}
// manual unclog
function manualSwap() external onlyOwner {
uint256 contractTokenBalance = balanceOf(address(this));
(uint112 r0, uint112 r1, ) = IUniswapV2Pair(uniswapV2Pair).getReserves();
uint112 ethReserves = isToken0 ? r1 : r0;
uint112 tokenReserves = isToken0 ? r0 : r1;
uint256 maxTokenSwapByEthAmount = uniswapV2Router.getAmountIn(
_taxETHSwapLimit,
tokenReserves,
ethReserves
);
swapTokensForEth(min(maxTokenSwapByEthAmount, min(contractTokenBalance, _taxSwapUpperLimit)));
uint256 contractETHBalance = address(this).balance;
if (contractETHBalance > 0) {
sendETHToFee(address(this).balance);
}
}
function addLiquidity(uint256 tokenDesired, uint256 ethDesired) external payable onlyOwner {
require(msg.value >= ethDesired, "Send enough ETH for LP");
(uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(uniswapV2Pair).getReserves();
uint256 wethReserve = isToken0 ? reserve1 : reserve0;
IWETH weth = IWETH(uniswapV2Router.WETH());
weth.deposit{value: msg.value}();
uint256 alreadyAddedEth;
uint256 alreadyAddedTokens;
if (wethReserve > 0) {
bool isEthReserveHigher = ethDesired > tokenDesired;
(uint256 higherReserve, uint256 lowerReserve) = isEthReserveHigher
? (ethDesired, tokenDesired)
: (tokenDesired, ethDesired);
uint256 ratioBaseUnit = 100_000;
uint256 ratio = (higherReserve * ratioBaseUnit) / lowerReserve;
if (isEthReserveHigher) {
// if they sent more eth than our base unit
if (wethReserve > ratio) {
uint256 tokenTransferNeeded = wethReserve / ratio;
IERC20(address(this)).transferFrom(msg.sender, uniswapV2Pair, tokenTransferNeeded);
alreadyAddedEth = wethReserve;
alreadyAddedTokens = tokenTransferNeeded;
} else {
weth.transfer(uniswapV2Pair, ratio - wethReserve);
IERC20(address(this)).transferFrom(msg.sender, uniswapV2Pair, ratioBaseUnit);
alreadyAddedEth = ratio;
alreadyAddedTokens = ratioBaseUnit;
}
} else {
// if they sent more eth than our base unit
if (wethReserve > ratioBaseUnit) {
uint256 tokenTransferNeeded = wethReserve * ratio;
IERC20(address(this)).transferFrom(msg.sender, uniswapV2Pair, tokenTransferNeeded);
alreadyAddedEth = wethReserve;
alreadyAddedTokens = tokenTransferNeeded;
} else {
IERC20(address(this)).transferFrom(msg.sender, uniswapV2Pair, ratio - wethReserve);
weth.transfer(uniswapV2Pair, ratioBaseUnit);
alreadyAddedEth = ratioBaseUnit;
alreadyAddedTokens = ratio;
}
}
IUniswapV2Pair(uniswapV2Pair).sync();
// lp is fixed to our desired ratio now
}
IERC20(address(this)).transferFrom(msg.sender, address(this), tokenDesired);
weth.approve(address(uniswapV2Router), msg.value);
_approve(address(this), address(uniswapV2Router), tokenDesired);
uniswapV2Router.addLiquidity(
address(weth),
address(this),
ethDesired - alreadyAddedEth,
tokenDesired - alreadyAddedTokens,
0,
0,
msg.sender,
block.timestamp
);
// send back reamining eth, if any
uint256 balanceLeft = weth.balanceOf(address(this));
if (balanceLeft > 0) {
weth.withdraw(balanceLeft);
payable(msg.sender).transfer(balanceLeft);
}
}
}
Read Contract
_isExcludedFromFee 0x768dc710 → bool
_maxWalletSize 0x8f9a55c0 → uint256
_taxETHSwapLimit 0xaace8f55 → uint256
_taxSwapLowerLimit 0xf166104b → uint256
_taxSwapUpperLimit 0x54cd55a0 → uint256
allowOnlyTxOrigin 0xd34a0e7e → bool
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
buyTax 0x4f7041a5 → uint256
decimals 0x313ce567 → uint8
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellTax 0xcc1776d3 → uint256
sniperTax 0xf1f5cd91 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
tradingEnabled 0x4ada218b → bool
transferTax 0x8124f7ac → uint256
Write Contract 22 functions
These functions modify contract state and require a wallet transaction to execute.
addLiquidity 0x9cd441da
uint256 tokenDesired
uint256 ethDesired
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
enableTrading 0x8a8c523c
No parameters
excludeFromFee 0x437823ec
address account
includeFromFee 0xff511828
address account
manualSwap 0x51bc3c85
No parameters
renounceOwnership 0x715018a6
No parameters
saveERC20 0xe206a8d8
address _address
saveETH 0x896f1a95
No parameters
setAllowOnlyTxOrigin 0x464ab73f
bool value
setEverythingToNormal 0xdfc2544d
No parameters
setFees 0x0b78f9c0
uint256 _newBuyFee
uint256 _newSellFee
setMaxBuyCountPerBlock 0xca2b3973
uint256 newNumber
setMaxWalletPercent 0x82bf293c
uint256 newPercent
setTaxETHSwapLimit 0x709c8ea9
uint256 newLimit
setTaxSellCountLimit 0x152fb630
uint256 newNumber
setTaxSwapLowerLimit 0x9fe0fde8
uint256 newLimit
setTaxSwapUpperLimit 0x5d525afc
uint256 newLimit
setTaxWallet 0xea414b28
address newWallet
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
updateTransferTax 0xe77f35c4
uint256 newTax
Recent Transactions
No transactions found for this address