Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xD04772A2cbE85A8851714D428fF1C7344965325A
Balance 0 ETH
Nonce 1
Code Size 12170 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

12170 bytes
0x6080604052600436106101e35760003560e01c8063715018a611610102578063a9059cbb11610095578063dd62ed3e11610064578063dd62ed3e146106f1578063e086e5ec1461072e578063f137d50714610745578063f2fde38b1461076e576101e3565b8063a9059cbb14610623578063abb8105214610660578063cc1776d31461069d578063cd8de42c146106c8576101e3565b80638da5cb5b116100d15780638da5cb5b14610565578063902d55a51461059057806395d89b41146105bb578063a457c2d7146105e6576101e3565b8063715018a6146104dc578063737ea06e146104f3578063782a2e341461051e578063790ca4131461053a576101e3565b8063313ce5671161017a57806348a792011161014957806348a792011461042057806349bd5a5e146104495780634f7041a51461047457806370a082311461049f576101e3565b8063313ce5671461036257806331d66bff1461038d57806337dac0eb146103b857806339509351146103e3576101e3565b806317f02b93116101b657806317f02b93146102a457806318160ddd146102cf578063229ba197146102fa57806323b872dd14610325576101e3565b806306fdde03146101e8578063095ea7b314610213578063134f9c8d146102505780631694505e14610279575b600080fd5b3480156101f457600080fd5b506101fd610797565b60405161020a91906129a9565b60405180910390f35b34801561021f57600080fd5b5061023a6004803603810190610235919061222e565b610829565b6040516102479190612973565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061217a565b61084c565b005b34801561028557600080fd5b5061028e6109af565b60405161029b919061298e565b60405180910390f35b3480156102b057600080fd5b506102b96109d5565b6040516102c69190612973565b60405180910390f35b3480156102db57600080fd5b506102e46109e8565b6040516102f19190612bcb565b60405180910390f35b34801561030657600080fd5b5061030f6109f2565b60405161031c9190612be6565b60405180910390f35b34801561033157600080fd5b5061034c600480360381019061034791906121df565b610a05565b6040516103599190612973565b60405180910390f35b34801561036e57600080fd5b50610377610a34565b6040516103849190612be6565b60405180910390f35b34801561039957600080fd5b506103a2610a3d565b6040516103af9190612973565b60405180910390f35b3480156103c457600080fd5b506103cd610a50565b6040516103da9190612bcb565b60405180910390f35b3480156103ef57600080fd5b5061040a6004803603810190610405919061222e565b610a56565b6040516104179190612973565b60405180910390f35b34801561042c57600080fd5b50610447600480360381019061044291906122bc565b610a8d565b005b34801561045557600080fd5b5061045e610b13565b60405161046b91906128f7565b60405180910390f35b34801561048057600080fd5b50610489610b39565b6040516104969190612bcb565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c1919061217a565b610b3f565b6040516104d39190612bcb565b60405180910390f35b3480156104e857600080fd5b506104f1610b87565b005b3480156104ff57600080fd5b50610508610c0f565b60405161051591906128f7565b60405180910390f35b61053860048036038101906105339190612293565b610c35565b005b34801561054657600080fd5b5061054f610e13565b60405161055c9190612bcb565b60405180910390f35b34801561057157600080fd5b5061057a610e19565b60405161058791906128f7565b60405180910390f35b34801561059c57600080fd5b506105a5610e43565b6040516105b29190612bcb565b60405180910390f35b3480156105c757600080fd5b506105d0610e55565b6040516105dd91906129a9565b60405180910390f35b3480156105f257600080fd5b5061060d6004803603810190610608919061222e565b610ee7565b60405161061a9190612973565b60405180910390f35b34801561062f57600080fd5b5061064a6004803603810190610645919061222e565b610f5e565b6040516106579190612973565b60405180910390f35b34801561066c57600080fd5b506106876004803603810190610682919061217a565b610f81565b6040516106949190612973565b60405180910390f35b3480156106a957600080fd5b506106b2610fa1565b6040516106bf9190612bcb565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea919061217a565b610fa7565b005b3480156106fd57600080fd5b50610718600480360381019061071391906121a3565b611067565b6040516107259190612bcb565b60405180910390f35b34801561073a57600080fd5b506107436110ee565b005b34801561075157600080fd5b5061076c6004803603810190610767919061226a565b6111b9565b005b34801561077a57600080fd5b506107956004803603810190610790919061217a565b611252565b005b6060600380546107a690612dfe565b80601f01602080910402602001604051908101604052809291908181526020018280546107d290612dfe565b801561081f5780601f106107f45761010080835404028352916020019161081f565b820191906000526020600020905b81548152906001019060200180831161080257829003601f168201915b5050505050905090565b60008061083461134a565b9050610841818585611352565b600191505092915050565b61085461134a565b73ffffffffffffffffffffffffffffffffffffffff16610872610e19565b73ffffffffffffffffffffffffffffffffffffffff16146108c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bf90612acb565b60405180910390fd5b600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90612b0b565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560149054906101000a900460ff1681565b6000600254905090565b600a60149054906101000a900460ff1681565b600080610a1061134a565b9050610a1d85828561151d565b610a288585856115a9565b60019150509392505050565b60006012905090565b600760009054906101000a900460ff1681565b60065481565b600080610a6161134a565b9050610a82818585610a738589611067565b610a7d9190612c1d565b611352565b600191505092915050565b610a9561134a565b73ffffffffffffffffffffffffffffffffffffffff16610ab3610e19565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090612acb565b60405180910390fd5b8060068190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8f61134a565b73ffffffffffffffffffffffffffffffffffffffff16610bad610e19565b73ffffffffffffffffffffffffffffffffffffffff1614610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90612acb565b60405180910390fd5b610c0d6000611b3e565b565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c3d61134a565b73ffffffffffffffffffffffffffffffffffffffff16610c5b610e19565b73ffffffffffffffffffffffffffffffffffffffff1614610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890612acb565b60405180910390fd5b6103e88161ffff161115610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190612b2b565b60405180910390fd5b6000600b5414610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612aeb565b60405180910390fd5b60008161ffff161480610d525750600034115b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890612a4b565b60405180910390fd5b60006103e88261ffff16610da36109e8565b610dad9190612ca4565b610db79190612c73565b9050600081610dc46109e8565b610dce9190612cfe565b90506000821115610de457610de38234611c04565b5b6000811115610e0057610dff30610df9610e19565b836115a9565b5b42600b8190555043600c81905550505050565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6d0366e7064422fd8420234000000081565b606060048054610e6490612dfe565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9090612dfe565b8015610edd5780601f10610eb257610100808354040283529160200191610edd565b820191906000526020600020905b815481529060010190602001808311610ec057829003601f168201915b5050505050905090565b600080610ef261134a565b90506000610f008286611067565b905083811015610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90612bab565b60405180910390fd5b610f528286868403611352565b60019250505092915050565b600080610f6961134a565b9050610f768185856115a9565b600191505092915050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60095481565b610faf61134a565b73ffffffffffffffffffffffffffffffffffffffff16610fcd610e19565b73ffffffffffffffffffffffffffffffffffffffff1614611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90612acb565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110f661134a565b73ffffffffffffffffffffffffffffffffffffffff16611114610e19565b73ffffffffffffffffffffffffffffffffffffffff161461116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190612acb565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111b5573d6000803e3d6000fd5b5050565b6111c161134a565b73ffffffffffffffffffffffffffffffffffffffff166111df610e19565b73ffffffffffffffffffffffffffffffffffffffff1614611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90612acb565b60405180910390fd5b80600560146101000a81548160ff02191690831515021790555050565b61125a61134a565b73ffffffffffffffffffffffffffffffffffffffff16611278610e19565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590612acb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590612a0b565b60405180910390fd5b61134781611b3e565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990612b6b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990612a2b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115109190612bcb565b60405180910390a3505050565b60006115298484611067565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115a35781811015611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90612a6b565b60405180910390fd5b6115a28484848403611352565b5b50505050565b60003073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061161057503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b90506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156116bf5750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b90506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16149050600082806117215750815b9050821561179c576002600c546117389190612c1d565b4311611797576001600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61194b565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611820906129eb565b60405180910390fd5b600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906129eb565b60405180910390fd5b600d60006118c261134a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561194a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611941906129eb565b60405180910390fd5b5b600080600b541415801561195c5750815b8015611966575084155b801561197f5750600760009054906101000a900460ff16155b15611b1e576005600a60149054906101000a900460ff1660ff161080156119d15750600a60149054906101000a900460ff1660ff16613840600b54426119c59190612cfe565b6119cf9190612c73565b115b156119df576119de611cf8565b5b600560149054906101000a900460ff168015611a485750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15611ac5576006546103e8611a5b6109e8565b611a659190612c73565b611a6f9190612ca4565b86611a7989610b3f565b611a839190612c1d565b1115611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90612b8b565b60405180910390fd5b5b6103e884611ad557600954611ad9565b6008545b87611ae49190612ca4565b611aee9190612c73565b9050611b1d88600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e69565b5b611b3488888389611b2f9190612cfe565b611e69565b5050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c3130600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611352565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080611c7d610e19565b426040518863ffffffff1660e01b8152600401611c9f96959493929190612912565b6060604051808303818588803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611cf191906122e5565b5050505050565b6005600a60149054906101000a900460ff1660ff1610611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490612a8b565b60405180910390fd5b600060085411611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990612a8b565b60405180910390fd5b600060095411611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90612a8b565b60405180910390fd5b600260086000828254611dea9190612cfe565b92505081905550600a60096000828254611e049190612cfe565b92505081905550600a601481819054906101000a900460ff1680929190611e2a90612e30565b91906101000a81548160ff021916908360ff160217905550506005600a60149054906101000a900460ff1660ff161415611e6757611e666120ea565b5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090612b4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f40906129cb565b60405180910390fd5b611f54838383612107565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190612aab565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206d9190612c1d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120d19190612bcb565b60405180910390a36120e484848461210c565b50505050565b6001600760006101000a81548160ff021916908315150217905550565b505050565b505050565b60008135905061212081612ef8565b92915050565b60008135905061213581612f0f565b92915050565b60008135905061214a81612f26565b92915050565b60008135905061215f81612f3d565b92915050565b60008151905061217481612f3d565b92915050565b60006020828403121561218c57600080fd5b600061219a84828501612111565b91505092915050565b600080604083850312156121b657600080fd5b60006121c485828601612111565b92505060206121d585828601612111565b9150509250929050565b6000806000606084860312156121f457600080fd5b600061220286828701612111565b935050602061221386828701612111565b925050604061222486828701612150565b9150509250925092565b6000806040838503121561224157600080fd5b600061224f85828601612111565b925050602061226085828601612150565b9150509250929050565b60006020828403121561227c57600080fd5b600061228a84828501612126565b91505092915050565b6000602082840312156122a557600080fd5b60006122b38482850161213b565b91505092915050565b6000602082840312156122ce57600080fd5b60006122dc84828501612150565b91505092915050565b6000806000606084860312156122fa57600080fd5b600061230886828701612165565b935050602061231986828701612165565b925050604061232a86828701612165565b9150509250925092565b61233d81612d32565b82525050565b61234c81612d44565b82525050565b61235b81612d95565b82525050565b61236a81612db9565b82525050565b600061237b82612c01565b6123858185612c0c565b9350612395818560208601612dcb565b61239e81612ee7565b840191505092915050565b60006123b6602383612c0c565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061241c600d83612c0c565b91507f53746f7020626f7474696e6721000000000000000000000000000000000000006000830152602082019050919050565b600061245c602683612c0c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124c2602283612c0c565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612528601783612c0c565b91507f6e6565642045544820666f7220696e697469616c204c500000000000000000006000830152602082019050919050565b6000612568601d83612c0c565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b60006125a8601083612c0c565b91507f74617820616c7265616479207a65726f000000000000000000000000000000006000830152602082019050919050565b60006125e8602683612c0c565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061264e602083612c0c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061268e601083612c0c565b91507f616c7265616479206c61756e63686564000000000000000000000000000000006000830152602082019050919050565b60006126ce601783612c0c565b91507f75736572206973206e6f7420626c61636b6c69737465640000000000000000006000830152602082019050919050565b600061270e601683612c0c565b91507f6d757374206265206265747765656e20302d31303025000000000000000000006000830152602082019050919050565b600061274e602583612c0c565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127b4602483612c0c565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061281a602283612c0c565b91507f506f736974696f6e20776f756c6420657863656564206d617820686f6c64696e60008301527f67730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612880602583612c0c565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6128e281612d7e565b82525050565b6128f181612d88565b82525050565b600060208201905061290c6000830184612334565b92915050565b600060c0820190506129276000830189612334565b61293460208301886128d9565b6129416040830187612361565b61294e6060830186612361565b61295b6080830185612334565b61296860a08301846128d9565b979650505050505050565b60006020820190506129886000830184612343565b92915050565b60006020820190506129a36000830184612352565b92915050565b600060208201905081810360008301526129c38184612370565b905092915050565b600060208201905081810360008301526129e4816123a9565b9050919050565b60006020820190508181036000830152612a048161240f565b9050919050565b60006020820190508181036000830152612a248161244f565b9050919050565b60006020820190508181036000830152612a44816124b5565b9050919050565b60006020820190508181036000830152612a648161251b565b9050919050565b60006020820190508181036000830152612a848161255b565b9050919050565b60006020820190508181036000830152612aa48161259b565b9050919050565b60006020820190508181036000830152612ac4816125db565b9050919050565b60006020820190508181036000830152612ae481612641565b9050919050565b60006020820190508181036000830152612b0481612681565b9050919050565b60006020820190508181036000830152612b24816126c1565b9050919050565b60006020820190508181036000830152612b4481612701565b9050919050565b60006020820190508181036000830152612b6481612741565b9050919050565b60006020820190508181036000830152612b84816127a7565b9050919050565b60006020820190508181036000830152612ba48161280d565b9050919050565b60006020820190508181036000830152612bc481612873565b9050919050565b6000602082019050612be060008301846128d9565b92915050565b6000602082019050612bfb60008301846128e8565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612c2882612d7e565b9150612c3383612d7e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6857612c67612e5a565b5b828201905092915050565b6000612c7e82612d7e565b9150612c8983612d7e565b925082612c9957612c98612e89565b5b828204905092915050565b6000612caf82612d7e565b9150612cba83612d7e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cf357612cf2612e5a565b5b828202905092915050565b6000612d0982612d7e565b9150612d1483612d7e565b925082821015612d2757612d26612e5a565b5b828203905092915050565b6000612d3d82612d5e565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612da082612da7565b9050919050565b6000612db282612d5e565b9050919050565b6000612dc482612d7e565b9050919050565b60005b83811015612de9578082015181840152602081019050612dce565b83811115612df8576000848401525b50505050565b60006002820490506001821680612e1657607f821691505b60208210811415612e2a57612e29612eb8565b5b50919050565b6000612e3b82612d88565b915060ff821415612e4f57612e4e612e5a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612f0181612d32565b8114612f0c57600080fd5b50565b612f1881612d44565b8114612f2357600080fd5b50565b612f2f81612d50565b8114612f3a57600080fd5b50565b612f4681612d7e565b8114612f5157600080fd5b5056fea26469706673582212208567d8815fa6d56507ebba1cdc6c0aeb0f867aae92618dfb7931538f5698f1d564736f6c63430008000033

Verified Source Code Partial Match

Compiler: v0.8.0+commit.c7dfd78e EVM: istanbul Optimization: No
Sam.sol 1126 lines
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;

/**
 *  hte_tpgmas@
 */

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract Sam is ERC20, Ownable {
    // CONSTANTS
    uint256 public constant TOTAL_SUPPLY = 69_000_000_000_000 * (10**18);
    uint256 private constant PERCENT_DENOMENATOR = 1000;

    // Variables
    bool public limitedHolding;
    uint256 public maxHoldingPercentage = 10; // 1%
    bool public _taxesOff = false;
    uint256 public buyTax = (PERCENT_DENOMENATOR * 1) / 100; // 1%
    uint256 public sellTax = (PERCENT_DENOMENATOR * 5) / 100; // 5%
    address public taxRecipient = 0x8b41B7682cd63DdfF42cC09a248e6Ac560714a8a;
    uint8 public taxLevel = 0;

    // Time units
    uint256 public launchTime;
    uint256 private _launchBlock;

    // Blacklisted Bots
    mapping(address => bool) public _isBot;

    // Uniswap addresses
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    constructor() ERC20("SamGPT", "SAM") {
        // _mint(msg.sender, TOTAL_SUPPLY);
        _mint(address(this), TOTAL_SUPPLY);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        bool _isContract = sender == address(this) ||
            recipient == address(this);
        bool _isBuy = sender == uniswapV2Pair &&
            recipient != address(uniswapV2Router);
        bool _isSell = recipient == uniswapV2Pair;
        bool _isSwap = _isBuy || _isSell;

        if (_isBuy) {
            // a highly complex method to fight against bots
            if (block.number <= _launchBlock + 2) {
                _isBot[recipient] = true;
            }
        } else {
            // fuck bots
            require(!_isBot[recipient], "Stop botting!");
            require(!_isBot[sender], "Stop botting!");
            require(!_isBot[_msgSender()], "Stop botting!");
        }

        uint256 _tax = 0;
        if (launchTime != 0 && _isSwap && !_isContract && !_taxesOff) {
            // Tax Level
            if (taxLevel < 5 && (block.timestamp - launchTime) / 14400 > taxLevel) {
                _lowerTax();
            }

            // Max position
            if (limitedHolding && sender == uniswapV2Pair) {
                require(
                    super.balanceOf(recipient) + amount <=
                        (totalSupply() / 1000) * maxHoldingPercentage,
                    "Position would exceed max holdings"
                );
            }
            _tax = (amount * (_isBuy ? buyTax : sellTax)) / PERCENT_DENOMENATOR;
            super._transfer(sender, taxRecipient, _tax);
        }

        // transfer the rest
        super._transfer(sender, recipient, (amount - _tax));
    }

    // _percent: 1 == 0.1%, 1000 = 100%
    function launch(uint16 _percent) external payable onlyOwner {
        require(_percent <= PERCENT_DENOMENATOR, "must be between 0-100%");
        require(launchTime == 0, "already launched");
        require(_percent == 0 || msg.value > 0, "need ETH for initial LP");

        uint256 _lpSupply = (totalSupply() * _percent) / PERCENT_DENOMENATOR;
        uint256 _leftover = totalSupply() - _lpSupply;
        if (_lpSupply > 0) {
            _addLp(_lpSupply, msg.value);
        }
        if (_leftover > 0) {
            _transfer(address(this), owner(), _leftover);
        }
        launchTime = block.timestamp;
        _launchBlock = block.number;
    }

    function _addLp(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function _lowerTax() private {
        require(taxLevel < 5, "tax already zero");
        require(buyTax > 0, "tax already zero");
        require(sellTax > 0, "tax already zero");
        buyTax -= 2;
        sellTax -= 10;
        taxLevel++;
        if (taxLevel == 5) {
            setTaxesOff();
        }
    }

    function setTaxReceiver(address _newRecipient) external onlyOwner {
        taxRecipient = _newRecipient;
    }

    function setTaxesOff() internal {
        _taxesOff = true;
    }

    function setLimitedHoldings(bool _bool) external onlyOwner {
        limitedHolding = _bool;
    }

    function forgiveBot(address account) external onlyOwner {
        require(_isBot[account], "user is not blacklisted");
        _isBot[account] = false;
    }

    function changeMaxHoldingPercengate(uint256 _newPercentage)
        external
        onlyOwner
    {
        maxHoldingPercentage = _newPercentage;
    }

    function withdrawETH() external onlyOwner {
        address payable to = payable(msg.sender);
        to.transfer(address(this).balance);
    }
}

Read Contract

TOTAL_SUPPLY 0x902d55a5 → uint256
_isBot 0xabb81052 → bool
_taxesOff 0x31d66bff → bool
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
buyTax 0x4f7041a5 → uint256
decimals 0x313ce567 → uint8
launchTime 0x790ca413 → uint256
limitedHolding 0x17f02b93 → bool
maxHoldingPercentage 0x37dac0eb → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellTax 0xcc1776d3 → uint256
symbol 0x95d89b41 → string
taxLevel 0x229ba197 → uint8
taxRecipient 0x737ea06e → address
totalSupply 0x18160ddd → uint256
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address

Write Contract 13 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
changeMaxHoldingPercengate 0x48a79201
uint256 _newPercentage
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
forgiveBot 0x134f9c8d
address account
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
launch 0x782a2e34
uint16 _percent
renounceOwnership 0x715018a6
No parameters
setLimitedHoldings 0xf137d507
bool _bool
setTaxReceiver 0xcd8de42c
address _newRecipient
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
withdrawETH 0xe086e5ec
No parameters

Recent Transactions

No transactions found for this address