Address Contract Partially Verified
Address
0xbdF43ecAdC5ceF51B7D1772F722E40596BC1788B
Balance
0 ETH
Nonce
1
Code Size
12524 bytes
Creator
0x35549e6a...5332 at tx 0xa31701db...5b3297
Indexed Transactions
0
Contract Bytecode
12524 bytes
0x6080604052600436106102515760003560e01c80637d25a05e11610139578063bb0b6a53116100b6578063d045a0dc1161007a578063d045a0dc14610755578063d424388514610768578063dd62ed3e14610788578063f2fde38b146107ce578063fc0c546a14610461578063ff7bd03d146107ee57600080fd5b8063bb0b6a53146106b4578063bc70b354146106e1578063bd815db014610701578063c7c7f5b314610714578063ca5eb5e11461073557600080fd5b8063963efcaa116100fd578063963efcaa1461060c5780639f68b96414610640578063a9059cbb14610654578063b731ea0a14610674578063b98bd0701461069457600080fd5b80637d25a05e1461056a57806382413eac146105a5578063857749b0146105c55780638da5cb5b146105d957806395d89b41146105f757600080fd5b806323b872dd116101d25780635535d461116101965780635535d461146104745780635a0dfe4d146104945780635e280f11146104cb5780636fc1b31e146104ff57806370a082311461051f578063715018a61461055557600080fd5b806323b872dd146103d2578063313ce567146103f25780633400288b146104145780633b6f743b1461043457806352ae28791461046157600080fd5b8063134d4f2511610219578063134d4f251461032d578063156a0d0f1461035557806317442b701461037c57806318160ddd1461039e5780631f5e1334146103bd57600080fd5b806306fdde0314610256578063095ea7b3146102815780630d35b415146102b1578063111ecdad146102e057806313137d6514610318575b600080fd5b34801561026257600080fd5b5061026b61080e565b60405161027891906121b6565b60405180910390f35b34801561028d57600080fd5b506102a161029c3660046121de565b6108a0565b6040519015158152602001610278565b3480156102bd57600080fd5b506102d16102cc366004612222565b6108ba565b60405161027893929190612256565b3480156102ec57600080fd5b50600454610300906001600160a01b031681565b6040516001600160a01b039091168152602001610278565b61032b61032636600461234d565b61098b565b005b34801561033957600080fd5b50610342600281565b60405161ffff9091168152602001610278565b34801561036157600080fd5b506040805162b9270b60e21b81526001602082015201610278565b34801561038857600080fd5b5060408051600181526002602082015201610278565b3480156103aa57600080fd5b506007545b604051908152602001610278565b3480156103c957600080fd5b50610342600181565b3480156103de57600080fd5b506102a16103ed3660046123ee565b610a4b565b3480156103fe57600080fd5b5060125b60405160ff9091168152602001610278565b34801561042057600080fd5b5061032b61042f366004612448565b610a71565b34801561044057600080fd5b5061045461044f366004612472565b610a87565b60405161027891906124c3565b34801561046d57600080fd5b5030610300565b34801561048057600080fd5b5061026b61048f3660046124ec565b610aee565b3480156104a057600080fd5b506102a16104af366004612448565b63ffffffff919091166000908152600160205260409020541490565b3480156104d757600080fd5b506103007f0000000000000000000000001a44076050125825900e736c501f859c50fe728c81565b34801561050b57600080fd5b5061032b61051a36600461251f565b610b93565b34801561052b57600080fd5b506103af61053a36600461251f565b6001600160a01b031660009081526005602052604090205490565b34801561056157600080fd5b5061032b610bf0565b34801561057657600080fd5b5061058d610585366004612448565b600092915050565b6040516001600160401b039091168152602001610278565b3480156105b157600080fd5b506102a16105c036600461253c565b610c04565b3480156105d157600080fd5b506006610402565b3480156105e557600080fd5b506000546001600160a01b0316610300565b34801561060357600080fd5b5061026b610c19565b34801561061857600080fd5b506103af7f000000000000000000000000000000000000000000000000000000e8d4a5100081565b34801561064c57600080fd5b5060006102a1565b34801561066057600080fd5b506102a161066f3660046121de565b610c28565b34801561068057600080fd5b50600254610300906001600160a01b031681565b3480156106a057600080fd5b5061032b6106af3660046125e6565b610c36565b3480156106c057600080fd5b506103af6106cf366004612627565b60016020526000908152604090205481565b3480156106ed57600080fd5b5061026b6106fc366004612642565b610c50565b61032b61070f3660046125e6565b610df8565b6107276107223660046126a2565b610f82565b60405161027892919061270f565b34801561074157600080fd5b5061032b61075036600461251f565b61107d565b61032b61076336600461234d565b611103565b34801561077457600080fd5b5061032b61078336600461251f565b611132565b34801561079457600080fd5b506103af6107a3366004612761565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156107da57600080fd5b5061032b6107e936600461251f565b611188565b3480156107fa57600080fd5b506102a161080936600461278f565b6111c6565b60606008805461081d906127ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610849906127ab565b80156108965780601f1061086b57610100808354040283529160200191610896565b820191906000526020600020905b81548152906001019060200180831161087957829003601f168201915b5050505050905090565b6000336108ae8185856111fc565b60019150505b92915050565b604080518082019091526000808252602082015260606108ed604051806040016040528060008152602001600081525090565b60408051808201825260008082526001600160401b03602080840182905284518381529081019094529195509182610948565b6040805180820190915260008152606060208201528152602001906001900390816109205790505b50935060008061096d604089013560608a013561096860208c018c612627565b61120e565b60408051808201909152918252602082015296989597505050505050565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031633146109db576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b602087018035906109f5906109f0908a612627565b611252565b14610a3357610a076020880188612627565b60405163309afaf360e21b815263ffffffff9091166004820152602088013560248201526044016109d2565b610a428787878787878761128e565b50505050505050565b600033610a598582856113f5565b610a64858585611473565b60019150505b9392505050565b610a796114d2565b610a8382826114ff565b5050565b60408051808201909152600080825260208201526000610ab7604085013560608601356109686020880188612627565b915050600080610ac78684611554565b9092509050610ae4610adc6020880188612627565b838388611677565b9695505050505050565b600360209081526000928352604080842090915290825290208054610b12906127ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3e906127ab565b8015610b8b5780601f10610b6057610100808354040283529160200191610b8b565b820191906000526020600020905b815481529060010190602001808311610b6e57829003601f168201915b505050505081565b610b9b6114d2565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610bf86114d2565b610c026000611758565b565b6001600160a01b03811630145b949350505050565b60606009805461081d906127ab565b6000336108ae818585611473565b610c3e6114d2565b610a83610c4b8284612896565b6117a8565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610c84906127ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb0906127ab565b8015610cfd5780601f10610cd257610100808354040283529160200191610cfd565b820191906000526020600020905b815481529060010190602001808311610ce057829003601f168201915b505050505090508051600003610d4d5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610c119350505050565b6000839003610d5d579050610c11565b60028310610ddb57610da484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118af92505050565b80610db284600281886129bf565b604051602001610dc4939291906129e9565b604051602081830303815290604052915050610c11565b8383604051639a6d49cd60e01b81526004016109d2929190612a3a565b60005b81811015610f015736838383818110610e1657610e16612a4e565b9050602002810190610e289190612a64565b9050610e5b610e3a6020830183612627565b602083013563ffffffff919091166000908152600160205260409020541490565b610e655750610ef9565b3063d045a0dc60c08301358360a0810135610e84610100830183612a85565b610e95610100890160e08a0161251f565b610ea36101208a018a612a85565b6040518963ffffffff1660e01b8152600401610ec59796959493929190612ae0565b6000604051808303818588803b158015610ede57600080fd5b505af1158015610ef2573d6000803e3d6000fd5b5050505050505b600101610dfb565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f40573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f689190810190612b66565b604051638351eea760e01b81526004016109d291906121b6565b610f8a61211f565b6040805180820190915260008082526020820152600080610fc133604089013560608a0135610fbc60208c018c612627565b6118db565b91509150600080610fd28984611554565b9092509050610ffe610fe760208b018b612627565b8383610ff8368d90038d018d612bd3565b8b611901565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a9061104c908d018d612627565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6110856114d2565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c169063ca5eb5e190602401600060405180830381600087803b1580156110e857600080fd5b505af11580156110fc573d6000803e3d6000fd5b5050505050565b3330146111235760405163029a949d60e31b815260040160405180910390fd5b610a4287878787878787610a33565b61113a6114d2565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610be5565b6111906114d2565b6001600160a01b0381166111ba57604051631e4fbdf760e01b8152600060048201526024016109d2565b6111c381611758565b50565b60006020820180359060019083906111de9086612627565b63ffffffff1681526020810191909152604001600020541492915050565b6112098383836001611a0c565b505050565b60008061121a85611ae1565b91508190508381101561124a576040516371c4efed60e01b815260048101829052602481018590526044016109d2565b935093915050565b63ffffffff8116600090815260016020526040812054806108b45760405163f6ff4fb760e01b815263ffffffff841660048201526024016109d2565b60006112a061129d8787611b18565b90565b905060006112cc826112ba6112b58a8a611b30565b611b53565b6112c760208d018d612627565b611b88565b905060288611156113935760006113096112ec60608c0160408d01612c06565b6112f960208d018d612627565b846113048c8c611bb0565b611bfb565b604051633e5ac80960e11b81529091506001600160a01b037f0000000000000000000000001a44076050125825900e736c501f859c50fe728c1690637cb590129061135f9086908d906000908790600401612c23565b600060405180830381600087803b15801561137957600080fd5b505af115801561138d573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6113cc60208d018d612627565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b6001600160a01b03838116600090815260066020908152604080832093861683529290522054600019811461146d578181101561145e57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016109d2565b61146d84848484036000611a0c565b50505050565b6001600160a01b03831661149d57604051634b637e8f60e11b8152600060048201526024016109d2565b6001600160a01b0382166114c75760405163ec442f0560e01b8152600060048201526024016109d2565b611209838383611c2d565b6000546001600160a01b03163314610c025760405163118cdaa760e01b81523360048201526024016109d2565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b910160405180910390a15050565b60608060006115b1856020013561156a86611d57565b61157760a0890189612a85565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d8392505050565b90935090506000816115c45760016115c7565b60025b90506115e76115d96020880188612627565b826106fc60808a018a612a85565b6004549093506001600160a01b0316801561166d5760405163043a78eb60e01b81526001600160a01b0382169063043a78eb9061162a9088908890600401612c54565b602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b9190612c79565b505b5050509250929050565b60408051808201909152600080825260208201527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663ddc28c586040518060a001604052808863ffffffff1681526020016116da89611252565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b815260040161170f929190612c96565b6040805180830381865afa15801561172b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174f9190612d40565b95945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b815181101561187f576117da8282815181106117c9576117c9612a4e565b6020026020010151604001516118af565b8181815181106117ec576117ec612a4e565b6020026020010151604001516003600084848151811061180e5761180e612a4e565b60200260200101516000015163ffffffff1663ffffffff168152602001908152602001600020600084848151811061184857611848612a4e565b60200260200101516020015161ffff1661ffff16815260200190815260200160002090816118769190612da3565b506001016117ab565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610be59190612e61565b600281015161ffff8116600314610a835781604051639a6d49cd60e01b81526004016109d291906121b6565b6000806118e985858561120e565b90925090506118f88683611dfd565b94509492505050565b61190961211f565b60006119188460000151611e33565b602085015190915015611932576119328460200151611e5b565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016119828c611252565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b81526004016119be929190612c96565b60806040518083038185885af11580156119dc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a019190612ef1565b979650505050505050565b6001600160a01b038416611a365760405163e602df0560e01b8152600060048201526024016109d2565b6001600160a01b038316611a6057604051634a1406b160e11b8152600060048201526024016109d2565b6001600160a01b038085166000908152600660209081526040808320938716835292905220829055801561146d57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611ad391815260200190565b60405180910390a350505050565b60007f000000000000000000000000000000000000000000000000000000e8d4a51000611b0e8184612f53565b6108b49190612f75565b6000611b2760208284866129bf565b610a6a91612f8c565b6000611b406028602084866129bf565b611b4991612faa565b60c01c9392505050565b60006108b47f000000000000000000000000000000000000000000000000000000e8d4a510006001600160401b038416612f75565b60006001600160a01b038416611b9e5761dead93505b611ba88484611f3d565b509092915050565b6060611bbf82602881866129bf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001611c149493929190612fe2565b6040516020818303038152906040529050949350505050565b6001600160a01b038316611c58578060076000828254611c4d9190613031565b90915550611cca9050565b6001600160a01b03831660009081526005602052604090205481811015611cab5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016109d2565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b038216611ce657600780548290039055611d05565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d4a91815260200190565b60405180910390a3505050565b60006108b47f000000000000000000000000000000000000000000000000000000e8d4a5100083612f53565b8051606090151580611dcc578484604051602001611db892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611df3565b84843385604051602001611de39493929190613044565b6040516020818303038152906040525b9150935093915050565b6001600160a01b038216611e2757604051634b637e8f60e11b8152600060048201526024016109d2565b610a8382600083611c2d565b6000813414611e57576040516304fb820960e51b81523460048201526024016109d2565b5090565b60007f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf9190613087565b90506001600160a01b038116611f08576040516329b99a9560e11b815260040160405180910390fd5b610a836001600160a01b038216337f0000000000000000000000001a44076050125825900e736c501f859c50fe728c85611f73565b6001600160a01b038216611f675760405163ec442f0560e01b8152600060048201526024016109d2565b610a8360008383611c2d565b604080516001600160a01b038581166024830152848116604483015260648083018590528351808403909101815260849092019092526020810180516001600160e01b03166323b872dd60e01b17905261146d91869190600090611fd990841683612027565b90508051600014158015611ffe575080806020019051810190611ffc9190612c79565b155b1561120957604051635274afe760e01b81526001600160a01b03841660048201526024016109d2565b6060610a6a8383600084600080856001600160a01b0316848660405161204d91906130a4565b60006040518083038185875af1925050503d806000811461208a576040519150601f19603f3d011682016040523d82523d6000602084013e61208f565b606091505b5091509150610ae48683836060826120af576120aa826120f6565b610a6a565b81511580156120c657506001600160a01b0384163b155b156120ef57604051639996b31560e01b81526001600160a01b03851660048201526024016109d2565b5080610a6a565b8051156121065780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60405180606001604052806000801916815260200160006001600160401b03168152602001612161604051806040016040528060008152602001600081525090565b905290565b60005b83811015612181578181015183820152602001612169565b50506000910152565b600081518084526121a2816020860160208601612166565b601f01601f19169290920160200192915050565b602081526000610a6a602083018461218a565b6001600160a01b03811681146111c357600080fd5b600080604083850312156121f157600080fd5b82356121fc816121c9565b946020939093013593505050565b600060e0828403121561221c57600080fd5b50919050565b60006020828403121561223457600080fd5b81356001600160401b0381111561224a57600080fd5b610c118482850161220a565b8351815260208085015190820152600060a0820160a0604084015280855180835260c08501915060c08160051b86010192506020870160005b828110156122d75760bf1987860301845281518051865260208101519050604060208701526122c1604087018261218a565b955050602093840193919091019060010161228f565b5050855160608601525050602084015160808401529050610c11565b60006060828403121561221c57600080fd5b60008083601f84011261231757600080fd5b5081356001600160401b0381111561232e57600080fd5b60208301915083602082850101111561234657600080fd5b9250929050565b600080600080600080600060e0888a03121561236857600080fd5b61237289896122f3565b96506060880135955060808801356001600160401b0381111561239457600080fd5b6123a08a828b01612305565b90965094505060a08801356123b4816121c9565b925060c08801356001600160401b038111156123cf57600080fd5b6123db8a828b01612305565b989b979a50959850939692959293505050565b60008060006060848603121561240357600080fd5b833561240e816121c9565b9250602084013561241e816121c9565b929592945050506040919091013590565b803563ffffffff8116811461244357600080fd5b919050565b6000806040838503121561245b57600080fd5b6121fc8361242f565b80151581146111c357600080fd5b6000806040838503121561248557600080fd5b82356001600160401b0381111561249b57600080fd5b6124a78582860161220a565b92505060208301356124b881612464565b809150509250929050565b8151815260208083015190820152604081016108b4565b803561ffff8116811461244357600080fd5b600080604083850312156124ff57600080fd5b6125088361242f565b9150612516602084016124da565b90509250929050565b60006020828403121561253157600080fd5b8135610a6a816121c9565b60008060008060a0858703121561255257600080fd5b61255c86866122f3565b935060608501356001600160401b0381111561257757600080fd5b61258387828801612305565b9094509250506080850135612597816121c9565b939692955090935050565b60008083601f8401126125b457600080fd5b5081356001600160401b038111156125cb57600080fd5b6020830191508360208260051b850101111561234657600080fd5b600080602083850312156125f957600080fd5b82356001600160401b0381111561260f57600080fd5b61261b858286016125a2565b90969095509350505050565b60006020828403121561263957600080fd5b610a6a8261242f565b6000806000806060858703121561265857600080fd5b6126618561242f565b935061266f602086016124da565b925060408501356001600160401b0381111561268a57600080fd5b61269687828801612305565b95989497509550505050565b600080600083850360808112156126b857600080fd5b84356001600160401b038111156126ce57600080fd5b6126da8782880161220a565b9450506040601f19820112156126ef57600080fd5b506020840191506060840135612704816121c9565b809150509250925092565b600060c082019050835182526001600160401b036020850151166020830152604084015161274a604084018280518252602090810151910152565b5082516080830152602083015160a0830152610a6a565b6000806040838503121561277457600080fd5b823561277f816121c9565b915060208301356124b8816121c9565b6000606082840312156127a157600080fd5b610a6a83836122f3565b600181811c908216806127bf57607f821691505b60208210810361221c57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612817576128176127df565b60405290565b604080519081016001600160401b0381118282101715612817576128176127df565b604051601f8201601f191681016001600160401b0381118282101715612867576128676127df565b604052919050565b60006001600160401b03821115612888576128886127df565b50601f01601f191660200190565b60006001600160401b038311156128af576128af6127df565b8260051b6128bf6020820161283f565b848152908301906020810190368311156128d857600080fd5b845b838110156129b55780356001600160401b038111156128f857600080fd5b8601606036829003121561290b57600080fd5b6129136127f5565b61291c8261242f565b815261292a602083016124da565b602082015260408201356001600160401b0381111561294857600080fd5b919091019036601f83011261295c57600080fd5b813561296f61296a8261286f565b61283f565b81815236602083860101111561298457600080fd5b81602085016020830137600060208383010152806040840152505080855250506020830192506020810190506128da565b5095945050505050565b600080858511156129cf57600080fd5b838611156129dc57600080fd5b5050820193919092039150565b600084516129fb818460208901612166565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610c11602083018486612a11565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112612a7b57600080fd5b9190910192915050565b6000808335601e19843603018112612a9c57600080fd5b8301803591506001600160401b03821115612ab657600080fd5b60200191503681900382131561234657600080fd5b6001600160401b03811681146111c357600080fd5b63ffffffff612aee8961242f565b1681526020888101359082015260006040890135612b0b81612acb565b6001600160401b03811660408401525087606083015260e06080830152612b3660e083018789612a11565b6001600160a01b03861660a084015282810360c0840152612b58818587612a11565b9a9950505050505050505050565b600060208284031215612b7857600080fd5b81516001600160401b03811115612b8e57600080fd5b8201601f81018413612b9f57600080fd5b8051612bad61296a8261286f565b818152856020838501011115612bc257600080fd5b61174f826020830160208601612166565b60006040828403128015612be657600080fd5b50612bef61281d565b823581526020928301359281019290925250919050565b600060208284031215612c1857600080fd5b8135610a6a81612acb565b60018060a01b038516815283602082015261ffff83166040820152608060608201526000610ae4608083018461218a565b604081526000612c67604083018561218a565b828103602084015261174f818561218a565b600060208284031215612c8b57600080fd5b8151610a6a81612464565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152612ccc60e084018261218a565b90506060850151603f198483030160a0850152612ce9828261218a565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215612d2157600080fd5b612d2961281d565b825181526020928301519281019290925250919050565b600060408284031215612d5257600080fd5b610a6a8383612d0f565b601f82111561120957806000526020600020601f840160051c81016020851015612d835750805b601f840160051c820191505b818110156110fc5760008155600101612d8f565b81516001600160401b03811115612dbc57612dbc6127df565b612dd081612dca84546127ab565b84612d5c565b6020601f821160018114612e045760008315612dec5750848201515b600019600385901b1c1916600184901b1784556110fc565b600084815260208120601f198516915b82811015612e345787850151825560209485019460019092019101612e14565b5084821015612e525786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612ee557603f19878603018452815163ffffffff815116865261ffff60208201511660208701526040810151905060606040870152612ecf606087018261218a565b9550506020938401939190910190600101612e89565b50929695505050505050565b60006080828403128015612f0457600080fd5b50612f0d6127f5565b825181526020830151612f1f81612acb565b6020820152612f318460408501612d0f565b60408201529392505050565b634e487b7160e01b600052601160045260246000fd5b600082612f7057634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176108b4576108b4612f3d565b803560208310156108b457600019602084900360031b1b1692915050565b80356001600160c01b03198116906008841015612fdb576001600160c01b0319600885900360031b81901b82161691505b5092915050565b6001600160401b0360c01b8560c01b16815263ffffffff60e01b8460e01b16600882015282600c8201526000825161302181602c850160208701612166565b91909101602c0195945050505050565b808201808211156108b4576108b4612f3d565b8481526001600160401b0360c01b8460c01b16602082015282602882015260008251613077816048850160208701612166565b9190910160480195945050505050565b60006020828403121561309957600080fd5b8151610a6a816121c9565b60008251612a7b81846020870161216656fea2646970667358221220b9efd82bc53ca84c3514103e346d5b0ee527ee1945cad2e6a246c69e4d1da1dd64736f6c634300081c0033
Verified Source Code Partial Match
Compiler: v0.8.28+commit.7893614a
EVM: paris
Optimization: Yes (200 runs)
OFTImplementation.sol 3396 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 ^0.8.20;
// ../node_modules/@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppMsgInspector.sol
/**
* @title IOAppMsgInspector
* @dev Interface for the OApp Message Inspector, allowing examination of message and options contents.
*/
interface IOAppMsgInspector {
// Custom error message for inspection failure
error InspectionFailed(bytes message, bytes options);
/**
* @notice Allows the inspector to examine LayerZero message contents and optionally throw a revert if invalid.
* @param _message The message payload to be inspected.
* @param _options Additional options or parameters for inspection.
* @return valid A boolean indicating whether the inspection passed (true) or failed (false).
*
* @dev Optionally done as a revert, OR use the boolean provided to handle the failure.
*/
function inspect(bytes calldata _message, bytes calldata _options) external view returns (bool valid);
}
// ../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol
struct SetConfigParam {
uint32 eid;
uint32 configType;
bytes config;
}
interface IMessageLibManager {
struct Timeout {
address lib;
uint256 expiry;
}
event LibraryRegistered(address newLib);
event DefaultSendLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
event SendLibrarySet(address sender, uint32 eid, address newLib);
event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
function registerLibrary(address _lib) external;
function isRegisteredLibrary(address _lib) external view returns (bool);
function getRegisteredLibraries() external view returns (address[] memory);
function setDefaultSendLibrary(uint32 _eid, address _newLib) external;
function defaultSendLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function defaultReceiveLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;
function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);
function isSupportedEid(uint32 _eid) external view returns (bool);
function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);
/// ------------------- OApp interfaces -------------------
function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;
function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);
function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);
function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);
function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;
function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);
function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;
function getConfig(
address _oapp,
address _lib,
uint32 _eid,
uint32 _configType
) external view returns (bytes memory config);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingChannel.sol
interface IMessagingChannel {
event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
function eid() external view returns (uint32);
// this is an emergency function if a message cannot be verified for some reasons
// required to provide _nextNonce to avoid race condition
function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
function inboundPayloadHash(
address _receiver,
uint32 _srcEid,
bytes32 _sender,
uint64 _nonce
) external view returns (bytes32);
function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingComposer.sol
interface IMessagingComposer {
event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
event LzComposeAlert(
address indexed from,
address indexed to,
address indexed executor,
bytes32 guid,
uint16 index,
uint256 gas,
uint256 value,
bytes message,
bytes extraData,
bytes reason
);
function composeQueue(
address _from,
address _to,
bytes32 _guid,
uint16 _index
) external view returns (bytes32 messageHash);
function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;
function lzCompose(
address _from,
address _to,
bytes32 _guid,
uint16 _index,
bytes calldata _message,
bytes calldata _extraData
) external payable;
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingContext.sol
interface IMessagingContext {
function isSendingMessage() external view returns (bool);
function getSendContext() external view returns (uint32 dstEid, address sender);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/libs/AddressCast.sol
library AddressCast {
error AddressCast_InvalidSizeForAddress();
error AddressCast_InvalidAddress();
function toBytes32(bytes calldata _addressBytes) internal pure returns (bytes32 result) {
if (_addressBytes.length > 32) revert AddressCast_InvalidAddress();
result = bytes32(_addressBytes);
unchecked {
uint256 offset = 32 - _addressBytes.length;
result = result >> (offset * 8);
}
}
function toBytes32(address _address) internal pure returns (bytes32 result) {
result = bytes32(uint256(uint160(_address)));
}
function toBytes(bytes32 _addressBytes32, uint256 _size) internal pure returns (bytes memory result) {
if (_size == 0 || _size > 32) revert AddressCast_InvalidSizeForAddress();
result = new bytes(_size);
unchecked {
uint256 offset = 256 - _size * 8;
assembly {
mstore(add(result, 32), shl(offset, _addressBytes32))
}
}
}
function toAddress(bytes32 _addressBytes32) internal pure returns (address result) {
result = address(uint160(uint256(_addressBytes32)));
}
function toAddress(bytes calldata _addressBytes) internal pure returns (address result) {
if (_addressBytes.length != 20) revert AddressCast_InvalidAddress();
result = address(bytes20(_addressBytes));
}
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol
/**
* @dev Struct representing enforced option parameters.
*/
struct EnforcedOptionParam {
uint32 eid; // Endpoint ID
uint16 msgType; // Message Type
bytes options; // Additional options
}
/**
* @title IOAppOptionsType3
* @dev Interface for the OApp with Type 3 Options, allowing the setting and combining of enforced options.
*/
interface IOAppOptionsType3 {
// Custom error message for invalid options
error InvalidOptions(bytes options);
// Event emitted when enforced options are set
event EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);
/**
* @notice Sets enforced options for specific endpoint and message type combinations.
* @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
*/
function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) external;
/**
* @notice Combines options for a given endpoint and message type.
* @param _eid The endpoint ID.
* @param _msgType The OApp message type.
* @param _extraOptions Additional options passed by the caller.
* @return options The combination of caller specified options AND enforced options.
*/
function combineOptions(
uint32 _eid,
uint16 _msgType,
bytes calldata _extraOptions
) external view returns (bytes memory options);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/oapp-evm/contracts/precrime/interfaces/IPreCrime.sol
struct PreCrimePeer {
uint32 eid;
bytes32 preCrime;
bytes32 oApp;
}
// TODO not done yet
interface IPreCrime {
error OnlyOffChain();
// for simulate()
error PacketOversize(uint256 max, uint256 actual);
error PacketUnsorted();
error SimulationFailed(bytes reason);
// for preCrime()
error SimulationResultNotFound(uint32 eid);
error InvalidSimulationResult(uint32 eid, bytes reason);
error CrimeFound(bytes crime);
function getConfig(bytes[] calldata _packets, uint256[] calldata _packetMsgValues) external returns (bytes memory);
function simulate(
bytes[] calldata _packets,
uint256[] calldata _packetMsgValues
) external payable returns (bytes memory);
function buildSimulationResult() external view returns (bytes memory);
function preCrime(
bytes[] calldata _packets,
uint256[] calldata _packetMsgValues,
bytes[] calldata _simulations
) external;
function version() external view returns (uint64 major, uint8 minor);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/oft-evm/contracts/libs/OFTComposeMsgCodec.sol
library OFTComposeMsgCodec {
// Offset constants for decoding composed messages
uint8 private constant NONCE_OFFSET = 8;
uint8 private constant SRC_EID_OFFSET = 12;
uint8 private constant AMOUNT_LD_OFFSET = 44;
uint8 private constant COMPOSE_FROM_OFFSET = 76;
/**
* @dev Encodes a OFT composed message.
* @param _nonce The nonce value.
* @param _srcEid The source endpoint ID.
* @param _amountLD The amount in local decimals.
* @param _composeMsg The composed message.
* @return _msg The encoded Composed message.
*/
function encode(
uint64 _nonce,
uint32 _srcEid,
uint256 _amountLD,
bytes memory _composeMsg // 0x[composeFrom][composeMsg]
) internal pure returns (bytes memory _msg) {
_msg = abi.encodePacked(_nonce, _srcEid, _amountLD, _composeMsg);
}
/**
* @dev Retrieves the nonce for the composed message.
* @param _msg The message.
* @return The nonce value.
*/
function nonce(bytes calldata _msg) internal pure returns (uint64) {
return uint64(bytes8(_msg[:NONCE_OFFSET]));
}
/**
* @dev Retrieves the source endpoint ID for the composed message.
* @param _msg The message.
* @return The source endpoint ID.
*/
function srcEid(bytes calldata _msg) internal pure returns (uint32) {
return uint32(bytes4(_msg[NONCE_OFFSET:SRC_EID_OFFSET]));
}
/**
* @dev Retrieves the amount in local decimals from the composed message.
* @param _msg The message.
* @return The amount in local decimals.
*/
function amountLD(bytes calldata _msg) internal pure returns (uint256) {
return uint256(bytes32(_msg[SRC_EID_OFFSET:AMOUNT_LD_OFFSET]));
}
/**
* @dev Retrieves the composeFrom value from the composed message.
* @param _msg The message.
* @return The composeFrom value.
*/
function composeFrom(bytes calldata _msg) internal pure returns (bytes32) {
return bytes32(_msg[AMOUNT_LD_OFFSET:COMPOSE_FROM_OFFSET]);
}
/**
* @dev Retrieves the composed message.
* @param _msg The message.
* @return The composed message.
*/
function composeMsg(bytes calldata _msg) internal pure returns (bytes memory) {
return _msg[COMPOSE_FROM_OFFSET:];
}
/**
* @dev Converts an address to bytes32.
* @param _addr The address to convert.
* @return The bytes32 representation of the address.
*/
function addressToBytes32(address _addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(_addr)));
}
/**
* @dev Converts bytes32 to an address.
* @param _b The bytes32 value to convert.
* @return The address representation of bytes32.
*/
function bytes32ToAddress(bytes32 _b) internal pure returns (address) {
return address(uint160(uint256(_b)));
}
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/oft-evm/contracts/libs/OFTMsgCodec.sol
library OFTMsgCodec {
// Offset constants for encoding and decoding OFT messages
uint8 private constant SEND_TO_OFFSET = 32;
uint8 private constant SEND_AMOUNT_SD_OFFSET = 40;
/**
* @dev Encodes an OFT LayerZero message.
* @param _sendTo The recipient address.
* @param _amountShared The amount in shared decimals.
* @param _composeMsg The composed message.
* @return _msg The encoded message.
* @return hasCompose A boolean indicating whether the message has a composed payload.
*/
function encode(
bytes32 _sendTo,
uint64 _amountShared,
bytes memory _composeMsg
) internal view returns (bytes memory _msg, bool hasCompose) {
hasCompose = _composeMsg.length > 0;
// @dev Remote chains will want to know the composed function caller ie. msg.sender on the src.
_msg = hasCompose
? abi.encodePacked(_sendTo, _amountShared, addressToBytes32(msg.sender), _composeMsg)
: abi.encodePacked(_sendTo, _amountShared);
}
/**
* @dev Checks if the OFT message is composed.
* @param _msg The OFT message.
* @return A boolean indicating whether the message is composed.
*/
function isComposed(bytes calldata _msg) internal pure returns (bool) {
return _msg.length > SEND_AMOUNT_SD_OFFSET;
}
/**
* @dev Retrieves the recipient address from the OFT message.
* @param _msg The OFT message.
* @return The recipient address.
*/
function sendTo(bytes calldata _msg) internal pure returns (bytes32) {
return bytes32(_msg[:SEND_TO_OFFSET]);
}
/**
* @dev Retrieves the amount in shared decimals from the OFT message.
* @param _msg The OFT message.
* @return The amount in shared decimals.
*/
function amountSD(bytes calldata _msg) internal pure returns (uint64) {
return uint64(bytes8(_msg[SEND_TO_OFFSET:SEND_AMOUNT_SD_OFFSET]));
}
/**
* @dev Retrieves the composed message from the OFT message.
* @param _msg The OFT message.
* @return The composed message.
*/
function composeMsg(bytes calldata _msg) internal pure returns (bytes memory) {
return _msg[SEND_AMOUNT_SD_OFFSET:];
}
/**
* @dev Converts an address to bytes32.
* @param _addr The address to convert.
* @return The bytes32 representation of the address.
*/
function addressToBytes32(address _addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(_addr)));
}
/**
* @dev Converts bytes32 to an address.
* @param _b The bytes32 value to convert.
* @return The address representation of bytes32.
*/
function bytes32ToAddress(bytes32 _b) internal pure returns (address) {
return address(uint160(uint256(_b)));
}
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
* @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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// ../node_modules/@openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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);
}
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
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);
}
// /Users/benhaslam/ambient/oft_tools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol
enum MessageLibType {
Send,
Receive,
SendAndReceive
}
interface IMessageLib is IERC165 {
function setConfig(address _oapp, SetConfigParam[] calldata _config) external;
function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view returns (bytes memory config);
function isSupportedEid(uint32 _eid) external view returns (bool);
// message libs of same major version are compatible
function version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);
function messageLibType() external view returns (MessageLibType);
}
// ../node_modules/@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol
/**
* @title OAppOptionsType3
* @dev Abstract contract implementing the IOAppOptionsType3 interface with type 3 options.
*/
abstract contract OAppOptionsType3 is IOAppOptionsType3, Ownable {
uint16 internal constant OPTION_TYPE_3 = 3;
// @dev The "msgType" should be defined in the child contract.
mapping(uint32 eid => mapping(uint16 msgType => bytes enforcedOption)) public enforcedOptions;
/**
* @dev Sets the enforced options for specific endpoint and message type combinations.
* @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
*
* @dev Only the owner/admin of the OApp can call this function.
* @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc.
* @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType.
* eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay
* if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose().
*/
function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) public virtual onlyOwner {
_setEnforcedOptions(_enforcedOptions);
}
/**
* @dev Sets the enforced options for specific endpoint and message type combinations.
* @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
*
* @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc.
* @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType.
* eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay
* if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose().
*/
function _setEnforcedOptions(EnforcedOptionParam[] memory _enforcedOptions) internal virtual {
for (uint256 i = 0; i < _enforcedOptions.length; i++) {
// @dev Enforced options are only available for optionType 3, as type 1 and 2 dont support combining.
_assertOptionsType3(_enforcedOptions[i].options);
enforcedOptions[_enforcedOptions[i].eid][_enforcedOptions[i].msgType] = _enforcedOptions[i].options;
}
emit EnforcedOptionSet(_enforcedOptions);
}
/**
* @notice Combines options for a given endpoint and message type.
* @param _eid The endpoint ID.
* @param _msgType The OAPP message type.
* @param _extraOptions Additional options passed by the caller.
* @return options The combination of caller specified options AND enforced options.
*
* @dev If there is an enforced lzReceive option:
* - {gasLimit: 200k, msg.value: 1 ether} AND a caller supplies a lzReceive option: {gasLimit: 100k, msg.value: 0.5 ether}
* - The resulting options will be {gasLimit: 300k, msg.value: 1.5 ether} when the message is executed on the remote lzReceive() function.
* @dev This presence of duplicated options is handled off-chain in the verifier/executor.
*/
function combineOptions(
uint32 _eid,
uint16 _msgType,
bytes calldata _extraOptions
) public view virtual returns (bytes memory) {
bytes memory enforced = enforcedOptions[_eid][_msgType];
// No enforced options, pass whatever the caller supplied, even if it's empty or legacy type 1/2 options.
if (enforced.length == 0) return _extraOptions;
// No caller options, return enforced
if (_extraOptions.length == 0) return enforced;
// @dev If caller provided _extraOptions, must be type 3 as its the ONLY type that can be combined.
if (_extraOptions.length >= 2) {
_assertOptionsType3(_extraOptions);
// @dev Remove the first 2 bytes containing the type from the _extraOptions and combine with enforced.
return bytes.concat(enforced, _extraOptions[2:]);
}
// No valid set of options was found.
revert InvalidOptions(_extraOptions);
}
/**
* @dev Internal function to assert that options are of type 3.
* @param _options The options to be checked.
*/
function _assertOptionsType3(bytes memory _options) internal pure virtual {
uint16 optionsType;
assembly {
optionsType := mload(add(_options, 2))
}
if (optionsType != OPTION_TYPE_3) revert InvalidOptions(_options);
}
}
// ../node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrea...
// [truncated — 139093 bytes total]
Read Contract
SEND 0x1f5e1334 → uint16
SEND_AND_CALL 0x134d4f25 → uint16
allowInitializePath 0xbfe94e81 → bool
allowance 0xdd62ed3e → uint256
approvalRequired 0x9f68b964 → bool
balanceOf 0x70a08231 → uint256
combineOptions 0xbc70b354 → bytes
decimalConversionRate 0x963efcaa → uint256
decimals 0x313ce567 → uint8
endpoint 0x5e280f11 → address
enforcedOptions 0x5535d461 → bytes
isComposeMsgSender 0x8833c245 → bool
isPeer 0x5a0dfe4d → bool
msgInspector 0x111ecdad → address
name 0x06fdde03 → string
nextNonce 0x7d25a05e → uint64
oApp 0x52ae2879 → address
oAppVersion 0x17442b70 → uint64, uint64
oftVersion 0x156a0d0f → bytes4, uint64
owner 0x8da5cb5b → address
peers 0xbb0b6a53 → bytes32
preCrime 0xb731ea0a → address
quoteOFT 0xe6343d44 → tuple, tuple[], tuple
quoteSend 0x2f603a24 → tuple
sharedDecimals 0x857749b0 → uint8
symbol 0x95d89b41 → string
token 0xfc0c546a → address
totalSupply 0x18160ddd → uint256
Write Contract 14 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 value
returns: bool
lzReceive 0xbf282d99
tuple _origin
bytes32 _guid
bytes _message
address _executor
bytes _extraData
lzReceiveAndRevert 0x215f7f2f
tuple[] _packets
lzReceiveSimulate 0xa454778b
tuple _origin
bytes32 _guid
bytes _message
address _executor
bytes _extraData
renounceOwnership 0x715018a6
No parameters
send 0xccfc9451
tuple _sendParam
tuple _fee
address _refundAddress
returns: tuple, tuple
setDelegate 0xca5eb5e1
address _delegate
setEnforcedOptions 0xd833f371
tuple[] _enforcedOptions
setMsgInspector 0x6fc1b31e
address _msgInspector
setPeer 0x3400288b
uint32 _eid
bytes32 _peer
setPreCrime 0xd4243885
address _preCrime
transfer 0xa9059cbb
address to
uint256 value
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 value
returns: bool
transferOwnership 0xf2fde38b
address newOwner
Recent Transactions
No transactions found for this address