Address Contract Verified
Address
0x8F3AdE4bEB7724Bd3e86C0062393F6B2e8753c26
Balance
0 ETH
Nonce
1
Code Size
10580 bytes
Creator
0x70961132...D3cB at tx 0xb4d2d472...ec90bc
Indexed Transactions
0 (1 on-chain, 1.6% indexed)
Contract Bytecode
10580 bytes
0x608060405234801561001057600080fd5b506004361061033f5760003560e01c80637ecebe00116101b8578063bebbf4d011610104578063d93f2445116100a2578063f75c26641161007c578063f75c266414610774578063f954734e1461077c578063fbfa77cf1461078f578063fca3b5aa146107a25761033f565b8063d93f24451461072e578063dd62ed3e14610736578063ec126c77146107615761033f565b8063cae9ca51116100de578063cae9ca51146106ed578063cfbd488514610700578063d0e30db014610713578063d505accf1461071b5761033f565b8063bebbf4d0146106be578063c3081240146106d1578063c4b740f5146106da5761033f565b806395d89b4111610171578063a29dff721161014b578063a29dff721461066c578063a9059cbb14610675578063aa271e1a14610688578063b6b55f25146106ab5761033f565b806395d89b411461063c5780639dc29fac14610644578063a045442c146106575761033f565b80637ecebe00146105d257806381a37c18146105f25780638623ec7b1461060557806387689e28146106185780638da5cb5b1461062157806391c5df49146106295761033f565b80633ccfd60b1161029257806360e232a9116102305780636a42b8f81161020a5780636a42b8f81461056f5780636e553f65146105785780636f307dc31461058b57806370a08231146105b25761033f565b806360e232a914610536578063628d6cba146105495780636817031b1461055c5761033f565b80634ca8f0ed1161026c5780634ca8f0ed146104dc57806352113ba7146104e55780635f9b105d14610510578063605629d6146105235761033f565b80633ccfd60b146104ae5780634000aea0146104b657806340c10f19146104c95761033f565b806318160ddd116102ff5780632ebe3fbb116102d95780632ebe3fbb1461041457806330adf81f14610427578063313ce5671461044e5780633644e515146104875761033f565b806318160ddd146103e657806323b872dd146103ee5780632e1a7d4d146104015761033f565b806239d6ec14610344578062bf26f41461036a578062f714ce1461039157806306fdde03146103a4578063095ea7b3146103b95780630d707df8146103dc575b600080fd5b61035761035236600461245c565b6107b5565b6040519081526020015b60405180910390f35b6103577f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b61035761039f36600461260e565b61080b565b6103ac61081f565b6040516103619190612722565b6103cc6103c7366004612433565b6108ad565b6040519015158152602001610361565b6103e4610907565b005b6103576109c3565b6103cc6103fc36600461238f565b6109ca565b61035761040f3660046125de565b610bb1565b6103e4610422366004612343565b610bc6565b6103577f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6104757f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610361565b6103577f7cac1b8c8ff6755c73e098a2f421f4715d2189b00c3831597ddb6ba01094cd1c81565b610357610c9d565b6103cc6104c4366004612497565b610cbe565b6103cc6104d7366004612433565b610e17565b610357600d5481565b600b546104f8906001600160a01b031681565b6040516001600160a01b039091168152602001610361565b6103cc61051e366004612343565b610e59565b6103cc6105313660046123ca565b610f2d565b6103cc610544366004612343565b61113d565b6103cc61055736600461260e565b611211565b6103e461056a366004612343565b6112d0565b61035760055481565b61035761058636600461260e565b611336565b6104f87f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b381565b6103576105c0366004612343565b60026020526000908152604090205481565b6103576105e0366004612343565b600f6020526000908152604090205481565b610357610600366004612519565b611377565b6104f86106133660046125de565b611451565b610357600c5481565b6104f861147b565b6009546104f8906001600160a01b031681565b6103ac611485565b6103cc610652366004612433565b611492565b61065f6114f1565b60405161036191906126d5565b610357600e5481565b6103cc610683366004612433565b611553565b6103cc610696366004612343565b60066020526000908152604090205460ff1681565b6103576106b93660046125de565b611629565b6103576106cc36600461260e565b61166a565b610357600a5481565b6103e46106e8366004612582565b6116a4565b6103cc6106fb366004612497565b6116f6565b6103e461070e366004612343565b6117d2565b61035761182b565b6103e46107293660046123ca565b61190e565b6103e4611a7c565b61035761074436600461235d565b601060209081526000928352604080842090915290825290205481565b6103cc61076f3660046125ba565b611ae7565b6104f8611b5c565b61035761078a366004612519565b611b89565b6008546104f8906001600160a01b031681565b6103e46107b0366004612343565b611c41565b60006107bf611b5c565b6001600160a01b0316336001600160a01b0316146107f85760405162461bcd60e51b81526004016107ef90612755565b60405180910390fd5b610803848484611ca7565b949350505050565b6000610818338484611ca7565b9392505050565b6000805461082c90612861565b80601f016020809104026020016040519081016040528092919081815260200182805461085890612861565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b505050505081565b3360008181526010602090815260408083206001600160a01b038716808552925280832085905551919290916000805160206128ff833981519152906108f69086815260200190565b60405180910390a350600192915050565b61090f611b5c565b6001600160a01b0316336001600160a01b03161461093f5760405162461bcd60e51b81526004016107ef90612755565b600a5442101561094e57600080fd5b600980546001600160a01b039081166000908152600660205260408120805460ff1916600190811790915592546007805494850181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b03191692909116919091179055565b6003545b90565b60006001600160a01b0383161515806109ec57506001600160a01b0383163014155b6109f557600080fd5b6001600160a01b0384163314610aeb576001600160a01b03841660009081526010602090815260408083203384529091529020546000198114610ae95782811015610a905760405162461bcd60e51b815260206004820152602560248201527f585377617045524332303a2072657175657374206578636565647320616c6c6f60448201526477616e636560d81b60648201526084016107ef565b6000610a9c848361281e565b6001600160a01b038716600081815260106020908152604080832033808552908352928190208590555184815293945090926000805160206128ff833981519152910160405180910390a3505b505b6001600160a01b03841660009081526002602052604090205482811015610b245760405162461bcd60e51b81526004016107ef906127bb565b610b2e838261281e565b6001600160a01b038087166000908152600260205260408082209390935590861681529081208054859290610b64908490612806565b92505081905550836001600160a01b0316856001600160a01b03166000805160206128df83398151915285604051610b9e91815260200190565b60405180910390a3506001949350505050565b6000610bbe338333611ca7565b90505b919050565b610bce611b5c565b6001600160a01b0316336001600160a01b031614610bfe5760405162461bcd60e51b81526004016107ef90612755565b60045460ff16610c0d57600080fd5b600880546001600160a01b039092166001600160a01b03199283168117909155600b80548316821790556000818152600660205260408120805460ff1990811660019081179092556007805492830181559092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801805490931690911790915542600c55600480549091169055565b336000818152600260205260408120549091610cb99181611ca7565b905090565b60006001600160a01b038516151580610ce057506001600160a01b0385163014155b610ce957600080fd5b3360009081526002602052604090205484811015610d195760405162461bcd60e51b81526004016107ef906127bb565b610d23858261281e565b33600090815260026020526040808220929092556001600160a01b03881681529081208054879290610d56908490612806565b90915550506040518581526001600160a01b0387169033906000805160206128df8339815191529060200160405180910390a3604051635260769b60e11b81526001600160a01b0387169063a4c0ed3690610dbb90339089908990899060040161268d565b602060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d919061259e565b9695505050505050565b3360009081526006602052604081205460ff16610e465760405162461bcd60e51b81526004016107ef90612755565b610e508383611cef565b50600192915050565b6000610e63611b5c565b6001600160a01b0316336001600160a01b031614610e935760405162461bcd60e51b81526004016107ef90612755565b6001600160a01b038216610eb95760405162461bcd60e51b81526004016107ef90612784565b600b80546001600160a01b0319166001600160a01b038416179055600554610ee19042612806565b600c819055600b546008546040516001600160a01b0392831692909116907f1d065115f314fb9bad9557bd5460b9e3c66f7223b1dd04e73e828f0bb5afe89f90600090a4506001919050565b600084421115610f7f5760405162461bcd60e51b815260206004820152601e60248201527f416e7973776170563345524332303a2045787069726564207065726d6974000060448201526064016107ef565b6001600160a01b0388166000908152600f6020526040812080547f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59918b918b918b919086610fcc8361289c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905061102d8982878787611dbd565b8061104057506110408982878787611ead565b61104957600080fd5b6001600160a01b03881615158061106957506001600160a01b0388163014155b61107257600080fd5b6001600160a01b038916600090815260026020526040902054878110156110ab5760405162461bcd60e51b81526004016107ef906127bb565b6110b5888261281e565b6001600160a01b03808c1660009081526002602052604080822093909355908b16815290812080548a92906110eb908490612806565b92505081905550886001600160a01b03168a6001600160a01b03166000805160206128df8339815191528a60405161112591815260200190565b60405180910390a35060019998505050505050505050565b6000611147611b5c565b6001600160a01b0316336001600160a01b0316146111775760405162461bcd60e51b81526004016107ef90612755565b6001600160a01b03821661119d5760405162461bcd60e51b81526004016107ef90612784565b600b80546001600160a01b0319166001600160a01b0384161790556005546111c59042612806565b600c819055600b546008546040516001600160a01b0392831692909116907f5c364079e7102c27c608f9b237c735a1b7bfa0b67f27c2ad26bad447bf965cac90600090a4506001919050565b600454600090610100900460ff16156112635760405162461bcd60e51b81526020600482015260146024820152730b0a6eec2e08aa48664607440dedcd8f282eae8d60631b60448201526064016107ef565b6001600160a01b0382166112895760405162461bcd60e51b81526004016107ef90612784565b6112933384611f68565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c888906020016108f6565b6112d8611b5c565b6001600160a01b0316336001600160a01b0316146113085760405162461bcd60e51b81526004016107ef90612755565b600b80546001600160a01b0319166001600160a01b0383161790556005546113309042612806565b600c5550565b600061136d6001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b31633308661203a565b61081883836120ab565b60405163d505accf60e01b81526000906001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3169063d505accf906113d2908b9030908c908c908c908c908c9060040161264c565b600060405180830381600087803b1580156113ec57600080fd5b505af1158015611400573d6000803e3d6000fd5b5061143b9250506001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b316905089308a61203a565b61144587836120ab565b98975050505050505050565b6007818154811061146157600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610cb9611b5c565b6001805461082c90612861565b3360009081526006602052604081205460ff166114c15760405162461bcd60e51b81526004016107ef90612755565b6001600160a01b0383166114e75760405162461bcd60e51b81526004016107ef90612784565b610e508383611f68565b6060600780548060200260200160405190810160405280929190818152602001828054801561154957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161152b575b5050505050905090565b60006001600160a01b03831615158061157557506001600160a01b0383163014155b61157e57600080fd5b33600090815260026020526040902054828110156115ae5760405162461bcd60e51b81526004016107ef906127bb565b6115b8838261281e565b33600090815260026020526040808220929092556001600160a01b038616815290812080548592906115eb908490612806565b90915550506040518381526001600160a01b0385169033906000805160206128df833981519152906020015b60405180910390a35060019392505050565b60006116606001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b31633308561203a565b610bbe82336120ab565b6000611674611b5c565b6001600160a01b0316336001600160a01b03161461136d5760405162461bcd60e51b81526004016107ef90612755565b6116ac611b5c565b6001600160a01b0316336001600160a01b0316146116dc5760405162461bcd60e51b81526004016107ef90612755565b600480549115156101000261ff0019909216919091179055565b3360008181526010602090815260408083206001600160a01b038916808552925280832087905551919290916000805160206128ff8339815191529061173f9088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f9061177790339088908890889060040161268d565b602060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061259e565b95945050505050565b6117da611b5c565b6001600160a01b0316336001600160a01b03161461180a5760405162461bcd60e51b81526004016107ef90612755565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6040516370a0823160e01b815233600482015260009081906001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b316906370a082319060240160206040518083038186803b15801561188f57600080fd5b505afa1580156118a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c791906125f6565b90506118fe6001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b31633308461203a565b61190881336120ab565b91505090565b8342111561195e5760405162461bcd60e51b815260206004820152601a60248201527f585377617045524332303a2045787069726564207065726d697400000000000060448201526064016107ef565b6001600160a01b0387166000908152600f6020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866119ab8361289c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050611a0c8882868686611dbd565b80611a1f5750611a1f8882868686611ead565b611a2857600080fd5b6001600160a01b038881166000818152601060209081526040808320948c16808452948252918290208a905590518981526000805160206128ff833981519152910160405180910390a35050505050505050565b611a84611b5c565b6001600160a01b0316336001600160a01b031614611ab45760405162461bcd60e51b81526004016107ef90612755565b600c54421015611ac357600080fd5b600b54600880546001600160a01b0319166001600160a01b03909216919091179055565b3360009081526006602052604081205460ff16611b165760405162461bcd60e51b81526004016107ef90612755565b611b208383611cef565b826001600160a01b0316847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d618460405161161791815260200190565b6000600c544210611b795750600b546001600160a01b03166109c7565b506008546001600160a01b031690565b60405163302b14eb60e11b81526000906001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3169063605629d690611be4908b9030908c908c908c908c908c9060040161264c565b602060405180830381600087803b158015611bfe57600080fd5b505af1158015611c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c36919061259e565b5061144587836120ab565b611c49611b5c565b6001600160a01b0316336001600160a01b031614611c795760405162461bcd60e51b81526004016107ef90612755565b600980546001600160a01b0319166001600160a01b038316179055600554611ca19042612806565b600a5550565b6000611cb38484611f68565b611ce76001600160a01b037f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3168385612128565b509092915050565b6001600160a01b038216611d455760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107ef565b8060036000828254611d579190612806565b90915550506001600160a01b03821660009081526002602052604081208054839290611d84908490612806565b90915550506040518181526001600160a01b038316906000906000805160206128df833981519152906020015b60405180910390a35050565b60405161190160f01b60208201527f7cac1b8c8ff6755c73e098a2f421f4715d2189b00c3831597ddb6ba01094cd1c602282015260428101859052600090819060620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0015b6020604051602081039080840390855afa158015611e6c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906114455750876001600160a01b0316816001600160a01b03161498975050505050505050565b600080611f2d866040517f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208201527f7cac1b8c8ff6755c73e098a2f421f4715d2189b00c3831597ddb6ba01094cd1c603c820152605c8101829052600090607c01604051602081830303815290604052805190602001209050919050565b6040805160008082526020820180845284905260ff89169282019290925260608101879052608081018690529192509060019060a001611e4a565b6001600160a01b038216611fc85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107ef565b6001600160a01b03821660009081526002602052604081208054839290611ff090849061281e565b925050819055508060036000828254612009919061281e565b90915550506040518181526000906001600160a01b038416906000805160206128df83398151915290602001611db1565b6040516001600160a01b03808516602483015283166044820152606481018290526120a59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261215d565b50505050565b60007f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b36001600160a01b03161580159061210e57507f0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b36001600160a01b03163014155b61211757600080fd5b6121218284611cef565b5090919050565b6040516001600160a01b03831660248201526044810182905261215890849063a9059cbb60e01b9060640161206e565b505050565b61216f826001600160a01b03166122e4565b6121bb5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740060448201526064016107ef565b600080836001600160a01b0316836040516121d69190612630565b6000604051808303816000865af19150503d8060008114612213576040519150601f19603f3d011682016040523d82523d6000602084013e612218565b606091505b50915091508161226a5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460448201526064016107ef565b8051156120a55780806020019051810190612285919061259e565b6120a55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107ef565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906108035750141592915050565b80356001600160a01b0381168114610bc157600080fd5b803560ff81168114610bc157600080fd5b600060208284031215612354578081fd5b6108188261231b565b6000806040838503121561236f578081fd5b6123788361231b565b91506123866020840161231b565b90509250929050565b6000806000606084860312156123a3578081fd5b6123ac8461231b565b92506123ba6020850161231b565b9150604084013590509250925092565b600080600080600080600060e0888a0312156123e4578283fd5b6123ed8861231b565b96506123fb6020890161231b565b9550604088013594506060880135935061241760808901612332565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612445578182fd5b61244e8361231b565b946020939093013593505050565b600080600060608486031215612470578283fd5b6124798461231b565b92506020840135915061248e6040850161231b565b90509250925092565b600080600080606085870312156124ac578384fd5b6124b58561231b565b935060208501359250604085013567ffffffffffffffff808211156124d8578384fd5b818701915087601f8301126124eb578384fd5b8135818111156124f9578485fd5b88602082850101111561250a578485fd5b95989497505060200194505050565b600080600080600080600060e0888a031215612533578283fd5b61253c8861231b565b9650602088013595506040880135945061255860608901612332565b93506080880135925060a0880135915061257460c0890161231b565b905092959891949750929550565b600060208284031215612593578081fd5b8135610818816128cd565b6000602082840312156125af578081fd5b8151610818816128cd565b6000806000606084860312156125ce578283fd5b833592506123ba6020850161231b565b6000602082840312156125ef578081fd5b5035919050565b600060208284031215612607578081fd5b5051919050565b60008060408385031215612620578182fd5b823591506123866020840161231b565b60008251612642818460208701612835565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6020808252825182820181905260009190848201906040850190845b818110156127165783516001600160a01b0316835292840192918401916001016126f1565b50909695505050505050565b6000602082528251806020840152612741816040850160208701612835565b601f01601f19169190910160400192915050565b6020808252601590820152742c29bbb0b822a92199181d102327a92124a22222a760591b604082015260600190565b60208082526018908201527f585377617045524332303a206164647265737328307830290000000000000000604082015260600190565b6020808252602b908201527f585377617045524332303a207472616e7366657220616d6f756e74206578636560408201526a6564732062616c616e636560a81b606082015260800190565b60008219821115612819576128196128b7565b500190565b600082821015612830576128306128b7565b500390565b60005b83811015612850578181015183820152602001612838565b838111156120a55750506000910152565b60028104600182168061287557607f821691505b6020821081141561289657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128b0576128b06128b7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b80151581146128db57600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204fe8f7b6c559effcfe680941e2858b52a40c6e0a426adc295094940e53dc3c4f64736f6c63430008020033
Verified Source Code Full Match
Compiler: v0.8.2+commit.661d1103
EVM: istanbul
Optimization: Yes (200 runs)
underlyingToken.sol 470 lines
/**
*Submitted for verification at Etherscan.io on 2025-10-09
*/
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.2;
interface IERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
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);
function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IERC2612 {
function nonces(address owner) external view returns (uint256);
}
interface IXSwapERC20 is IERC20, IERC2612 {
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
function transferAndCall(address to, uint value, bytes calldata data) external returns (bool);
}
interface ITransferReceiver {
function onTokenTransfer(address, uint, bytes calldata) external returns (bool);
}
interface IApprovalReceiver {
function onTokenApproval(address, uint, bytes calldata) external returns (bool);
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
}
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
contract XSwapUSDe is IXSwapERC20 {
using SafeERC20 for IERC20;
string public name;
string public symbol;
uint8 public immutable override decimals;
address public immutable underlying;
bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant TRANSFER_TYPEHASH = keccak256("Transfer(address owner,address to,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public immutable DOMAIN_SEPARATOR;
mapping (address => uint256) public override balanceOf;
uint256 private _totalSupply;
bool private _init;
bool private _vaultOnly;
uint public delay = 0;
mapping(address => bool) public isMinter;
address[] public minters;
address public vault;
address public pendingMinter;
uint public delayMinter;
address public pendingVault;
uint public delayVault;
uint public pendingDelay;
uint public delayDelay;
modifier onlyAuth() {
require(isMinter[msg.sender], "XSwapERC20: FORBIDDEN");
_;
}
modifier onlyVault() {
require(msg.sender == mpc(), "XSwapERC20: FORBIDDEN");
_;
}
function owner() public view returns (address) {
return mpc();
}
function mpc() public view returns (address) {
if (block.timestamp >= delayVault) {
return pendingVault;
}
return vault;
}
function setVaultOnly(bool enabled) external onlyVault {
_vaultOnly = enabled;
}
function initVault(address _vault) external onlyVault {
require(_init);
vault = _vault;
pendingVault = _vault;
isMinter[_vault] = true;
minters.push(_vault);
delayVault = block.timestamp;
_init = false;
}
function setMinter(address _auth) external onlyVault {
pendingMinter = _auth;
delayMinter = block.timestamp + delay;
}
function setVault(address _vault) external onlyVault {
pendingVault = _vault;
delayVault = block.timestamp + delay;
}
function applyVault() external onlyVault {
require(block.timestamp >= delayVault);
vault = pendingVault;
}
function applyMinter() external onlyVault {
require(block.timestamp >= delayMinter);
isMinter[pendingMinter] = true;
minters.push(pendingMinter);
}
function revokeMinter(address _auth) external onlyVault {
isMinter[_auth] = false;
}
function getAllMinters() external view returns (address[] memory) {
return minters;
}
function changeVault(address newVault) external onlyVault returns (bool) {
require(newVault != address(0), "XSwapERC20: address(0x0)");
pendingVault = newVault;
delayVault = block.timestamp + delay;
emit LogChangeVault(vault, pendingVault, delayVault);
return true;
}
function changeMPCOwner(address newVault) public onlyVault returns (bool) {
require(newVault != address(0), "XSwapERC20: address(0x0)");
pendingVault = newVault;
delayVault = block.timestamp + delay;
emit LogChangeMPCOwner(vault, pendingVault, delayVault);
return true;
}
function mint(address to, uint256 amount) external onlyAuth returns (bool) {
_mint(to, amount);
return true;
}
function burn(address from, uint256 amount) external onlyAuth returns (bool) {
require(from != address(0), "XSwapERC20: address(0x0)");
_burn(from, amount);
return true;
}
function Swapin(bytes32 txhash, address account, uint256 amount) public onlyAuth returns (bool) {
_mint(account, amount);
emit LogSwapin(txhash, account, amount);
return true;
}
function Swapout(uint256 amount, address bindaddr) public returns (bool) {
require(!_vaultOnly, "XSwapERC20: onlyAuth");
require(bindaddr != address(0), "XSwapERC20: address(0x0)");
_burn(msg.sender, amount);
emit LogSwapout(msg.sender, bindaddr, amount);
return true;
}
mapping (address => uint256) public override nonces;
mapping (address => mapping (address => uint256)) public override allowance;
event LogChangeVault(address indexed oldVault, address indexed newVault, uint indexed effectiveTime);
event LogChangeMPCOwner(address indexed oldOwner, address indexed newOwner, uint indexed effectiveHeight);
event LogSwapin(bytes32 indexed txhash, address indexed account, uint amount);
event LogSwapout(address indexed account, address indexed bindaddr, uint amount);
event LogAddAuth(address indexed auth, uint timestamp);
constructor(string memory _name, string memory _symbol, uint8 _decimals, address _underlying, address _vault) {
name = _name;
symbol = _symbol;
decimals = _decimals;
underlying = _underlying;
if (_underlying != address(0x0)) {
require(_decimals == IERC20(_underlying).decimals());
}
_init = true;
_vaultOnly = false;
vault = _vault;
pendingVault = _vault;
delayVault = block.timestamp;
uint256 chainId;
assembly {chainId := chainid()}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256(bytes("1")),
chainId,
address(this)));
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function depositWithPermit(address target, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external returns (uint) {
IERC20(underlying).permit(target, address(this), value, deadline, v, r, s);
IERC20(underlying).safeTransferFrom(target, address(this), value);
return _deposit(value, to);
}
function depositWithTransferPermit(address target, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external returns (uint) {
IERC20(underlying).transferWithPermit(target, address(this), value, deadline, v, r, s);
return _deposit(value, to);
}
function deposit() external returns (uint) {
uint _amount = IERC20(underlying).balanceOf(msg.sender);
IERC20(underlying).safeTransferFrom(msg.sender, address(this), _amount);
return _deposit(_amount, msg.sender);
}
function deposit(uint amount) external returns (uint) {
IERC20(underlying).safeTransferFrom(msg.sender, address(this), amount);
return _deposit(amount, msg.sender);
}
function deposit(uint amount, address to) external returns (uint) {
IERC20(underlying).safeTransferFrom(msg.sender, address(this), amount);
return _deposit(amount, to);
}
function depositVault(uint amount, address to) external onlyVault returns (uint) {
return _deposit(amount, to);
}
function _deposit(uint amount, address to) internal returns (uint) {
require(underlying != address(0x0) && underlying != address(this));
_mint(to, amount);
return amount;
}
function withdraw() external returns (uint) {
return _withdraw(msg.sender, balanceOf[msg.sender], msg.sender);
}
function withdraw(uint amount) external returns (uint) {
return _withdraw(msg.sender, amount, msg.sender);
}
function withdraw(uint amount, address to) external returns (uint) {
return _withdraw(msg.sender, amount, to);
}
function withdrawVault(address from, uint amount, address to) external onlyVault returns (uint) {
return _withdraw(from, amount, to);
}
function _withdraw(address from, uint amount, address to) internal returns (uint) {
_burn(from, amount);
IERC20(underlying).safeTransfer(to, amount);
return amount;
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
balanceOf[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
balanceOf[account] -= amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function approve(address spender, uint256 value) external override returns (bool) {
// _approve(msg.sender, spender, value);
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function approveAndCall(address spender, uint256 value, bytes calldata data) external override returns (bool) {
// _approve(msg.sender, spender, value);
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data);
}
function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {
require(block.timestamp <= deadline, "XSwapERC20: Expired permit");
bytes32 hashStruct = keccak256(
abi.encode(
PERMIT_TYPEHASH,
target,
spender,
value,
nonces[target]++,
deadline));
require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));
// _approve(owner, spender, value);
allowance[target][spender] = value;
emit Approval(target, spender, value);
}
function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override returns (bool) {
require(block.timestamp <= deadline, "AnyswapV3ERC20: Expired permit");
bytes32 hashStruct = keccak256(
abi.encode(
TRANSFER_TYPEHASH,
target,
to,
value,
nonces[target]++,
deadline));
require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));
require(to != address(0) || to != address(this));
uint256 balance = balanceOf[target];
require(balance >= value, "XSwapERC20: transfer amount exceeds balance");
balanceOf[target] = balance - value;
balanceOf[to] += value;
emit Transfer(target, to, value);
return true;
}
function verifyEIP712(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) {
bytes32 hash = keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
hashStruct));
address signer = ecrecover(hash, v, r, s);
return (signer != address(0) && signer == target);
}
function verifyPersonalSign(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) {
bytes32 hash = prefixed(hashStruct);
address signer = ecrecover(hash, v, r, s);
return (signer != address(0) && signer == target);
}
function prefixed(bytes32 hash) internal view returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", DOMAIN_SEPARATOR, hash));
}
function transfer(address to, uint256 value) external override returns (bool) {
require(to != address(0) || to != address(this));
uint256 balance = balanceOf[msg.sender];
require(balance >= value, "XSwapERC20: transfer amount exceeds balance");
balanceOf[msg.sender] = balance - value;
balanceOf[to] += value;
emit Transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint256 value) external override returns (bool) {
require(to != address(0) || to != address(this));
if (from != msg.sender) {
// _decreaseAllowance(from, msg.sender, value);
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) {
require(allowed >= value, "XSwapERC20: request exceeds allowance");
uint256 reduced = allowed - value;
allowance[from][msg.sender] = reduced;
emit Approval(from, msg.sender, reduced);
}
}
uint256 balance = balanceOf[from];
require(balance >= value, "XSwapERC20: transfer amount exceeds balance");
balanceOf[from] = balance - value;
balanceOf[to] += value;
emit Transfer(from, to, value);
return true;
}
function transferAndCall(address to, uint value, bytes calldata data) external override returns (bool) {
require(to != address(0) || to != address(this));
uint256 balance = balanceOf[msg.sender];
require(balance >= value, "XSwapERC20: transfer amount exceeds balance");
balanceOf[msg.sender] = balance - value;
balanceOf[to] += value;
emit Transfer(msg.sender, to, value);
return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data);
}
}
Read Contract
DOMAIN_SEPARATOR 0x3644e515 → bytes32
PERMIT_TYPEHASH 0x30adf81f → bytes32
TRANSFER_TYPEHASH 0x00bf26f4 → bytes32
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
delay 0x6a42b8f8 → uint256
delayDelay 0xa29dff72 → uint256
delayMinter 0xc3081240 → uint256
delayVault 0x87689e28 → uint256
getAllMinters 0xa045442c → address[]
isMinter 0xaa271e1a → bool
minters 0x8623ec7b → address
mpc 0xf75c2664 → address
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
owner 0x8da5cb5b → address
pendingDelay 0x4ca8f0ed → uint256
pendingMinter 0x91c5df49 → address
pendingVault 0x52113ba7 → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
underlying 0x6f307dc3 → address
vault 0xfbfa77cf → address
Write Contract 30 functions
These functions modify contract state and require a wallet transaction to execute.
Swapin 0xec126c77
bytes32 txhash
address account
uint256 amount
returns: bool
Swapout 0x628d6cba
uint256 amount
address bindaddr
returns: bool
applyMinter 0x0d707df8
No parameters
applyVault 0xd93f2445
No parameters
approve 0x095ea7b3
address spender
uint256 value
returns: bool
approveAndCall 0xcae9ca51
address spender
uint256 value
bytes data
returns: bool
burn 0x9dc29fac
address from
uint256 amount
returns: bool
changeMPCOwner 0x5f9b105d
address newVault
returns: bool
changeVault 0x60e232a9
address newVault
returns: bool
deposit 0x6e553f65
uint256 amount
address to
returns: uint256
deposit 0xb6b55f25
uint256 amount
returns: uint256
deposit 0xd0e30db0
No parameters
returns: uint256
depositVault 0xbebbf4d0
uint256 amount
address to
returns: uint256
depositWithPermit 0x81a37c18
address target
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
address to
returns: uint256
depositWithTransferPermit 0xf954734e
address target
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
address to
returns: uint256
initVault 0x2ebe3fbb
address _vault
mint 0x40c10f19
address to
uint256 amount
returns: bool
permit 0xd505accf
address target
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
revokeMinter 0xcfbd4885
address _auth
setMinter 0xfca3b5aa
address _auth
setVault 0x6817031b
address _vault
setVaultOnly 0xc4b740f5
bool enabled
transfer 0xa9059cbb
address to
uint256 value
returns: bool
transferAndCall 0x4000aea0
address to
uint256 value
bytes data
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 value
returns: bool
transferWithPermit 0x605629d6
address target
address to
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
returns: bool
withdraw 0x00f714ce
uint256 amount
address to
returns: uint256
withdraw 0x2e1a7d4d
uint256 amount
returns: uint256
withdraw 0x3ccfd60b
No parameters
returns: uint256
withdrawVault 0x0039d6ec
address from
uint256 amount
address to
returns: uint256
Recent Transactions
This address has 1 on-chain transactions, but only 1.6% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →